changeset 32580:08b6fd5e36ae

propagate from branch 'im.pidgin.pidgin' (head ef660d19c58b200a67bf94b3e8cbf0fd562a7f1d) to branch 'im.pidgin.cpw.qulogic.gtk3' (head 3e0647ac67738fe7125b4c3197af282eda9634e6)
author Elliott Sales de Andrade <qulogic@pidgin.im>
date Sun, 28 Jun 2009 04:41:07 +0000
parents 38e3ec8251d3 (current diff) 2eee06628764 (diff)
children 0743266f682e
files libpurple/protocols/yahoo/yahoo_auth.c libpurple/protocols/yahoo/yahoo_auth.h libpurple/protocols/yahoo/yahoo_crypt.c libpurple/protocols/yahoo/yahoo_crypt.h pidgin/gtkblist.c pidgin/gtkconv.c pidgin/gtkdocklet-x11.c pidgin/gtkprefs.c
diffstat 193 files changed, 36170 insertions(+), 6010 deletions(-) [+]
line wrap: on
line diff
--- a/.mtn-ignore	Sun May 10 06:24:26 2009 +0000
+++ b/.mtn-ignore	Sun Jun 28 04:41:07 2009 +0000
@@ -52,6 +52,7 @@
 libpurple/dbus-types.h
 libpurple/example/nullclient
 libpurple/gconf/purple.schemas$
+libpurple/marshallers.[ch]
 libpurple/plugins/dbus-example-bindings.c
 libpurple/plugins/perl/common/Makefile.PL$
 libpurple/plugins/perl/common/Makefile.old
--- a/COPYRIGHT	Sun May 10 06:24:26 2009 +0000
+++ b/COPYRIGHT	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 Pidgin, Finch, and libpurple
-Copyright (C) 1998-2008 by the following:
+Copyright (C) 1998-2009 by the following:
 
 If you have contributed to this project then you deserve to be on this
 list.  Contact us (see: AUTHORS) and we'll add you.
@@ -224,6 +224,7 @@
 Jochen Kemnade
 Yann Kerherve
 Gordian Klein
+Krzysztof Klinikowski
 Akuke Kok
 Kir Kolyshkin
 F.W. Kong
@@ -332,7 +333,9 @@
 Luke Petre
 Diego Petten
 Nathan Peterson
+Dmitry Petroff
 Sebastián E. Peyrott
+Andrea Piccinelli
 Celso Pinto
 Joao Luís Marques Pinto
 Aleksander Piotrowski
@@ -451,6 +454,7 @@
 Mark Tiefenbruck
 Andrew Tinney
 Jeffery To
+Krzysztof Tobola (kreez)
 Warren Togami
 Stu Tomlinson
 Bill Tompkins
@@ -508,6 +512,7 @@
 Ma Xuan
 Jared Yanovich
 Timmy Yee
+Li Yuan
 Nickolai Zeldovich
 Tom Zickel
 Marco Ziech
--- a/ChangeLog	Sun May 10 06:24:26 2009 +0000
+++ b/ChangeLog	Sun Jun 28 04:41:07 2009 +0000
@@ -7,18 +7,36 @@
 	* Voice & Video framework in libpurple, thanks to Mike Ruprecht's summer
 	  of code project in 2008.
 	* It should no longer be possible to end up with duplicates of buddies
-	  in a group on the buddy list.
+	  in a group on the buddy list. (Paul Aurich)
 	* Removed the unmaintained and unneeded toc protocol plugin.
 	* Fixed NTLM authentication on big-endian systems.
 
 	libpurple:
 	* Various memory cleanups when unloading libpurple. (Nick Hebner)
 	* Report idle time 'From last message sent' should work properly.
+	* Show the invite message for buddies that requested authorization
+	  from you on MSN.
+	* DNS servers are re-read when DNS queries fail in case the system has
+	  moved to a new network and the old servers are not accessible.
+	* GnuTLS logging (disabled by default) can be controlled through the
+	  PURPLE_GNUTLS_DEBUG environment variable, which is an integer between
+	  0 and 9 (higher is more verbose). Higher values may reveal sensitive
+	  information.
+
+	Gadu-Gadu:
+	* Accounts can specify a server to which to connect.
+	  (Krzysztof "kreez" Tobola)
+	* Correctly show tooltip status for contacts with status messages.
+	  (Krzysztof "kkszysiu" Klinikowski)
+	* Support for fetching buddy icons.  (Krzysztof "kkszysiu" Klinikowski)
 
 	XMPP:
-	* Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177), and
-	  voice support with GTalk and GMail. (Mike "Maiku" Ruprecht)
-	* Support for in-band bytestreams for file transfers (XEP-0047).
+	* Voice & Video support with Jingle (XEP-0166, 0167, 0176, & 0177), voice
+	  support with GTalk and voice and video support with the GMail web
+	  client. (Mike "Maiku" Ruprecht)
+	* Added a Service Discovery Browser plugin for Pidgin. (Andrei Mozzhuhin)
+	* Support for in-band bytestreams for file transfers (XEP-0047). (Marcus
+	  Lundblad)
 	* Support for sending and receiving attentions (equivalent to "buzz"
 	  and "nudge") using the command /buzz. (XEP-0224)
 	* Support for connecting using BOSH. (Tobias Markmann)
@@ -34,17 +52,29 @@
 	* /affiliate and /role will now list the room members with the specified
 	  affiliation/role if possible. (Andrei Mozzhuhin)
 	* Put section breaks between resources in "Get Info" to improve readability.
+	* Silently remove invalid XML 1.0 entities (e.g. ASCII control characters)
+	  from sent messages.
 	* XHTML markup is only included in outgoing messages when the message
 	  contains formatting.
 	* Show when the user was last logged in when doing "Get Info" on an offline
 	  buddy, provided the server supports it.
+	* Support custom smileys in MUCs (only when all participants support the
+	  "Bits of Binary" extension, and a maximum of 10 participants are in the
+	  chat to avoid getting too many fetch requests).
+	* Fix an issue with Jabber (pre-XMPP) servers and the user's preference
+	  to require SSL not being respected.
+	* Fix an issue where Cyrus SASL DIGEST MD5 authentication might fail if
+	  the username, password, or realm (the JID domain) contain non-ASCII
+	  characters.
+	* Show emblem for mobile, handheld, and web clients and bots (if the other
+	  client supports it).
 
 	Yahoo:
-	* P2P file transfers. (Sulabh Mahajan)
-	* MSN Interoperability by adding MSN buddies as 'msn/user@example.com'.
-	  (Sulabh Mahajan)
+	* P2P file transfers.  (Sulabh Mahajan)
 	* Sending text messages (address to +<countrycode><phone number>).
 	  (Sulabh Mahajan)
+	* Addition of MSN buddies to Yahoo accounts by adding them as
+	  'msn/buddy@somedomain.com' is now supported.  (Sulabh Mahajan)
 
 	Pidgin:
 	* Added -f command line option to tell Pidgin to ignore NetworkManager
@@ -67,12 +97,96 @@
 	  rejoin.
 	* Always set unseen-count and unseen-state on conversations.
 	  (Joshua Stein)
+	* Fix a bug in 'Conversation Colors' plugin for RTL messages.
+	* Pressing the Left and Right arrow keys in the buddy list will expand and
+	  collapse buddy groups or contacts. (Peter Ruibal)
+	* Support saving animated custom smileys as animated images or animated
+	  custom smileys. (Andrea Piccinelli)
+	* Support for keyboard navigation on the status icon. (Li Yuan)
+	* IMG tags without 'id' attributes are turned into links to the image URL.
+	  (Dmitry Petroff)
+	* Draw the user's buddy icon at the bottom of the Buddy List with rounded
+	  corners for visual consistency with the actual icons in the Buddy List.
+	  (Kosta Arvanitis)
 
 	Finch:
 	* The hardware cursor is updated correctly. This will be useful
 	  especially for users of braille terminals, screen readers etc.
 	* Added a TinyURL plugin, which aids copying longer URLs.
 
+	Pidgin GTK+ Theme Control Plugin:
+	* Removed mouse cursor color preferences.
+	* Added "Typing Notification Color" preference.
+	* Added "Disable Typing Notification Text" preference.
+	* Preferences have been reorganized into three tabs for Colors, Fonts, and
+	  Miscellaneous categories.
+
+version 2.5.8 (06/27/2009):
+	ICQ:
+	* Fix misparsing a web message as an SMS message. (Yuriy Kaminskiy)
+
+	MSN:
+	* Increase NS command history size to prevent crashes on buddy lists that
+	  have a lot of buddies on other networks like Yahoo!.
+
+	MySpace:
+	* Accounts with empty buddy lists are now properly marked as connected.
+	* Fix receiving messages from users of MySpace IM's web client.
+
+	Yahoo:
+	* Fixed phantom online buddies.  They should now properly disappear when
+	  signing out.
+	* Fixed the crashes some users were seeing with cn.scs.msg.yahoo.com in
+	  2.5.7.
+	* Fixed compiling on systems with glib 2.4.x or older.
+	* Fixed an issue with file transfers.  This may not resolve all issues,
+	  but it should resolve at least some of the most common ones.
+	* The pager server will automatically update to scsa.msg.yahoo.com if the
+	  user empties the field or if it is scs.msg.yahoo.com.  This should ease
+	  the pain of transition to the new login method.
+
+	XMPP:
+	* Fix an incompatibility betweeen Prosody and libpurple clients.
+
+version 2.5.7 (06/20/2009):
+	* Yahoo Protocol 16 support, including new HTTPS login method; this should
+	  fix a number of login problems that have recently cropped up.  (Sulabh
+	  Mahajan, Mike "Maiku" Ruprecht)
+	* Only display the AIM "Unable to Retrieve Buddy List" message once per
+	  connection.  (Rob Taft)
+	* Blocking MSN users not on your buddy list no longer disconnects you.
+	* When performing operations on MSN, assume users are on the MSN/Passport
+	  network if we don't get network ID's for them.
+
+version 2.5.6 (05/19/2009):
+	libpurple:
+	* Improve sleep behavior by aggregation of longer timeouts on second
+	  boundaries to allow better power saving.  (Arunan Balasubramaniam)
+	* Fix various crashes on exit.
+	* Make XML parsing more resilient to interactions with other libraries.
+	  This, along with the fix for libxml2 bug 564217, fixes the crashes
+	  on connect in XMPP with recent gst-plugins-bad (see #8830 for details).
+	* Many security related fixes.
+
+	IRC:
+	* Correctly handle WHOIS for users who are joined to a large number of
+	  channels.
+	* Notify the user if a /nick command fails, rather than trying
+	  fallback nicks.
+
+	MSN:
+	* Fix a race condition causing occasional Pidgin crashes.
+	* Fix some errors about the friendly name changing too fast caused
+	  by MSN/Yahoo integration buddies.
+
+	XMPP:
+	* Less likely to pop up a new conversation window in disregard of
+	  the "Hide new IM conversations" preference.
+
+	Yahoo:
+	* Fix a crash when sending very long messages.
+	* Fix a bug where UTF-8 status messages get garbled when going idle.
+
 version 2.5.5 (03/01/2009):
 	libpurple:
 	* Fix a crash when removing an account with an unknown protocol id.
--- a/ChangeLog.API	Sun May 10 06:24:26 2009 +0000
+++ b/ChangeLog.API	Sun Jun 28 04:41:07 2009 +0000
@@ -15,6 +15,7 @@
 			* account-destroying
 		* blist-node-added and blist-node-removed signals (see
 		  blist-signals.dox)
+		* Jabber plugin signals (see jabber-signals.dox)
 		* purple_buddy_destroy
 		* purple_buddy_get_protocol_data
 		* purple_buddy_set_protocol_data
@@ -32,11 +33,14 @@
 		* purple_global_proxy_set_info
 		* purple_group_destroy
 		* purple_log_get_activity_score
+		* purple_markup_is_rtl
 		* purple_network_force_online
 		* purple_network_set_stun_server
 		* purple_network_set_turn_server
 		* purple_network_get_stun_ip
 		* purple_network_get_turn_ip
+		* purple_network_remove_port_mapping
+		* purple_proxy_connect_udp
 		* purple_prpl_get_media_caps
 		* purple_prpl_got_account_actions
 		* purple_prpl_initiate_media
@@ -44,6 +48,8 @@
 		* purple_request_field_get_ui_data
 		* purple_request_field_set_ui_data
 		* purple_strequal
+		* purple_utf8_strip_unprintables
+		* purple_util_fetch_url_request_len_with_account
 		* xmlnode_from_file
 		* xmlnode_get_parent
 		* xmlnode_set_attrib_full
@@ -54,6 +60,15 @@
 		  which was completely non-deterministic.  If you want to remove
 		  the attribute with no namespace, then use NULL with
 		  xmlnode_remove_with_namespace.
+		* Plugins may now emit the jabber-sending-xmlnode signal in order
+		  to send stanzas; this method is preferred to the prpl send_raw
+		  function as other plugins listening to the signal see them.
+		* The conversation-updated signal with a PURPLE_CONV_UPDATE_TYPING
+		  update type is emitted when receiving an IM.  Previously, the
+		  typing state was modified (and the buddy-typing-stopped signal
+		  emitted), but this signal was not emitted.
+		* Added a client_type field in the get_ui_info core UI op. See
+		  core.h for details.
 
 		Deprecated:
 		* buddy-added and buddy-removed blist signals
@@ -69,6 +84,7 @@
 		* purple_status_set_attr_string
 		* purple_presence_add_status
 		* purple_presence_add_list
+		* purple_util_fetch_url_request_len
 		* xmlnode_set_attrib_with_namespace
 		* xmlnode_set_attrib_with_prefix
 
@@ -83,6 +99,7 @@
 		* pidgin_blist_set_theme
 		* pidgin_blist_get_theme
 		* pidgin_prefs_labeled_password
+		* pidgin_smiley_editor_set_data
 		* pidgin_sound_is_customized
 		* pidgin_utils_init, pidgin_utils_uninit
 		* pidgin_notify_pounce_add
@@ -111,6 +128,15 @@
 			* Purple::Request::Field::string_new
 			* Purple::Request::Field::group_new
 
+version 2.5.8 (06/27/2009):
+	No changes
+
+version 2.5.7 (06/20/2009):
+	No changes
+
+version 2.5.6 (05/19/2009):
+	No changes
+
 version 2.5.5 (03/01/2009):
 	libpurple:
 		Changed:
--- a/ChangeLog.win32	Sun May 10 06:24:26 2009 +0000
+++ b/ChangeLog.win32	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,14 @@
 version 2.6.0 (??/??/2009):
 
+version 2.5.8 (06/27/2009):
+	* No changes
+
+version 2.5.7 (06/20/2009):
+	* No changes
+
+version 2.5.6 (05/19/2009):
+	* No changes
+
 version 2.5.5 (03/01/2009):
 	* Remove the "Flash window when chat messages are received" pref from
 	  the Windows Pidgin Options plugin - the Message Notification plugin
--- a/Makefile.mingw	Sun May 10 06:24:26 2009 +0000
+++ b/Makefile.mingw	Sun Jun 28 04:41:07 2009 +0000
@@ -96,15 +96,15 @@
 	 -not \( -false $(EXTERNAL_DLLS_FIND_EXP) \) -exec $(STRIP) --strip-unneeded {} ';'
 
 installer: create_release_install_dir
-	$(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DWITH_GTK /DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
+	$(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DWITH_GTK $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
 	mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION).exe ./
 
 installer_nogtk: create_release_install_dir
-	$(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
+	$(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(STRIPPED_RELEASE_DIR)" $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
 	mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-no-gtk.exe ./
 
 installer_debug: install
-	$(MAKENSIS) /V3 /DPIDGIN_VERSION="$(PIDGIN_VERSION)" /DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" /DPIDGIN_INSTALL_DIR="$(PIDGIN_INSTALL_DIR)" /DDEBUG /DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
+	$(MAKENSIS) $(MAKENSISOPT)V3 $(MAKENSISOPT)DPIDGIN_VERSION="$(PIDGIN_VERSION)" $(MAKENSISOPT)DPIDGIN_PRODUCT_VERSION="$(PIDGIN_PRODUCT_VERSION)" $(MAKENSISOPT)DPIDGIN_INSTALL_DIR="$(PIDGIN_INSTALL_DIR)" $(MAKENSISOPT)DDEBUG $(MAKENSISOPT)DGTK_INSTALL_VERSION="$(GTK_INSTALL_VERSION)" pidgin/win32/nsis/pidgin-installer.nsi
 	mv pidgin/win32/nsis/pidgin-$(PIDGIN_VERSION)-debug.exe ./
 
 installer_zip: create_release_install_dir
--- a/NEWS	Sun May 10 06:24:26 2009 +0000
+++ b/NEWS	Sun Jun 28 04:41:07 2009 +0000
@@ -2,6 +2,39 @@
 
 Our development blog is available at: http://planet.pidgin.im
 
+2.5.8 (06/27/2009):
+	John:  This release is another somewhat rushed bugfix release to fix
+	a number of bugs that have come up since we released Pidgin 2.5.7.
+	Hopefully anything I broke there is fixed now, or at least made to be
+	less broken.  Enjoy!
+
+2.5.7 (06/20/2009):
+	John:  This release is really just a rushed fix for the broken Yahoo
+	protocol plugin.  I spent way more time on this release than I care
+	to admit, so I hope that time is well spent and this fixes the issues
+	people have been having.
+
+2.5.6 (05/19/2009):
+	Ka-Hing: Many much bugfixes. Hooray. (Paul told me to say that)
+	Oh, no one has met Paul yet? He's awesome, he backported my fixes
+	to the release branch so I didn't have to checkout a
+	workspace... except I just did to NEWS to tell you all about
+	that. Oh and I actually did do something for this release, none of
+	which is user visible though. This basically applies to the rest
+	of the release as well, nothing exciting, but you definitely want
+	it.
+
+	Daniel: This should fix a number of annoying issues that some users
+	have encountered.  We also would like to thank Veracode
+	(http://www.veracode.com) who performed a code analysis and found some
+	bugs that were addressed in this release.
+
+	Elliott: I feel like I'm repeating myself, but there are some more MSN
+	fixes that should make things better behaved at login as well, and
+	maybe you'll stop getting some of those annoying errors (though not all
+	are fixed yet).  Some other bugfixes, plus the craziness that is the
+	libxml "structured error handler" make up the rest of this release.
+
 2.5.5 (03/01/2009):
 	John: Well, yet another release with bug fixing and patches.  Hopefully
 	one of the fixed bugs is one that irritated you.  Also, thank Dimmuxx
--- a/configure.ac	Sun May 10 06:24:26 2009 +0000
+++ b/configure.ac	Sun Jun 28 04:41:07 2009 +0000
@@ -144,7 +144,7 @@
 	;;
 esac
 
-ALL_LINGUAS="af am ar az be@latin bg bn bs ca ca@valencia cs da de dz el en_AU en_CA en_GB eo es et eu fa fi fr ga gl gu he hi hu id it ja ka km kn ko ku lo lt mk mn my_MM nb ne nl nn oc pa pl pt_BR pt ps ro ru si sk sl sq sr sr@latin sv ta te th tr uk ur vi xh zh_CN zh_HK zh_TW"
+ALL_LINGUAS="af am ar az be@latin bg bn bs ca ca@valencia cs da de dz el en_AU en_CA en_GB eo es et eu fa fi fr ga gl gu he hi hu hy id it ja ka km kn ko ku lo lt mk mn my_MM nb ne nl nn oc pa pl pt_BR pt ps ro ru si sk sl sq sr sr@latin sv sw ta te th tr uk ur vi xh zh_CN zh_HK zh_TW"
 AM_GLIB_GNU_GETTEXT
 
 dnl If we don't have msgfmt, then po/ is going to fail -- ensure that
@@ -1663,7 +1663,7 @@
 	[enable_nss="$enableval"],
 	[enable_nss="yes"])
 
-msg_ssl="None. MSN, Novell Groupwise and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!"
+msg_ssl="None. MSN, Yahoo!, Novell Groupwise and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!"
 looked_for_gnutls="no"
 dnl #
 dnl # Check for GnuTLS if it's specified.
@@ -2057,19 +2057,19 @@
 	AC_MSG_ERROR([
 Neither GnuTLS or NSS SSL development headers found.
 Use --disable-nss --disable-gnutls if you do not need SSL support.
-MSN, Novell Groupwise and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!
+MSN, Yahoo!, Novell Groupwise and Google Talk will not work without GnuTLS or NSS. OpenSSL is NOT usable!
 ])
 elif test "x$looked_for_gnutls" = "xyes" -a "x$force_deps" = "xyes" ; then
 	AC_MSG_ERROR([
 GnuTLS SSL development headers not found.
 Use --disable-gnutls if you do not need SSL support.
-MSN, Novell Groupwise and Google Talk will not work without SSL support.
+MSN, Yahoo!, Novell Groupwise and Google Talk will not work without SSL support.
 ])
 elif test "x$looked_for_nss" = "xyes" -a "x$force_deps" = "xyes" ; then
 	AC_MSG_ERROR([
 NSS SSL development headers not found.
 Use --disable-nss if you do not need SSL support.
-MSN, Novell Groupwise and Google Talk will not work without SSL support.
+MSN, Yahoo!, Novell Groupwise and Google Talk will not work without SSL support.
 ])
 fi
 
@@ -2476,6 +2476,7 @@
 		   pidgin/pixmaps/emotes/small/16/Makefile
 		   pidgin/plugins/Makefile
 		   pidgin/plugins/cap/Makefile
+		   pidgin/plugins/disco/Makefile
 		   pidgin/plugins/gestures/Makefile
 		   pidgin/plugins/gevolution/Makefile
 		   pidgin/plugins/musicmessaging/Makefile
--- a/finch/finch.c	Sun May 10 06:24:26 2009 +0000
+++ b/finch/finch.c	Sun Jun 28 04:41:07 2009 +0000
@@ -65,6 +65,7 @@
 		g_hash_table_insert(ui_info, "version", VERSION);
 		g_hash_table_insert(ui_info, "website", "http://pidgin.im");
 		g_hash_table_insert(ui_info, "dev_website", "http://developer.pidgin.im");
+		g_hash_table_insert(ui_info, "client_type", "console");
 	}
 
 	return ui_info;
--- a/finch/gntblist.c	Sun May 10 06:24:26 2009 +0000
+++ b/finch/gntblist.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1921,11 +1921,11 @@
 		if (gnt_tree_is_searching(GNT_TREE(ggblist->tree)))
 			gnt_bindable_perform_action_named(GNT_BINDABLE(ggblist->tree), "end-search", NULL);
 		remove_peripherals(ggblist);
-	} else if (strcmp(text, GNT_KEY_CTRL_O) == 0) {
-		purple_prefs_set_bool(PREF_ROOT "/showoffline",
-				!purple_prefs_get_bool(PREF_ROOT "/showoffline"));
 	} else if (strcmp(text, GNT_KEY_INS) == 0) {
-		purple_blist_request_add_buddy(NULL, NULL, NULL, NULL);
+		PurpleBlistNode *node = gnt_tree_get_selection_data(GNT_TREE(ggblist->tree));
+		purple_blist_request_add_buddy(NULL, NULL,
+				node && PURPLE_BLIST_NODE_IS_GROUP(node) ? purple_group_get_name(PURPLE_GROUP(node)) : NULL,
+				NULL);
 	} else if (!gnt_tree_is_searching(GNT_TREE(ggblist->tree))) {
 		if (strcmp(text, "t") == 0) {
 			finch_blist_toggle_tag_buddy(gnt_tree_get_selection_data(GNT_TREE(ggblist->tree)));
--- a/finch/gntnotify.c	Sun May 10 06:24:26 2009 +0000
+++ b/finch/gntnotify.c	Sun Jun 28 04:41:07 2009 +0000
@@ -208,6 +208,9 @@
 	void *ret;
 	static int key = 0;
 
+	if (count == 0)
+		return NULL;
+
 	if (!detailed)
 	{
 		g_string_append_printf(message,
--- a/finch/plugins/gnthistory.c	Sun May 10 06:24:26 2009 +0000
+++ b/finch/plugins/gnthistory.c	Sun Jun 28 04:41:07 2009 +0000
@@ -31,6 +31,7 @@
 #include "util.h"
 #include "version.h"
 
+#include "gntconv.h"
 #include "gntplugin.h"
 #include "gntrequest.h"
 
@@ -54,6 +55,9 @@
 	if (convtype == PURPLE_CONV_TYPE_IM) {
 		GSList *buddies;
 		GSList *cur;
+		FinchConv *fc = FINCH_CONV(c);
+		if (fc->list && fc->list->next) /* We were already in the middle of a conversation. */
+			return;
 
 		/* If we're not logging, don't show anything.
 		 * Otherwise, we might show a very old log. */
--- a/finch/plugins/gnttinyurl.c	Sun May 10 06:24:26 2009 +0000
+++ b/finch/plugins/gnttinyurl.c	Sun Jun 28 04:41:07 2009 +0000
@@ -228,12 +228,15 @@
 	if (!(*flags & PURPLE_MESSAGE_RECV) || *flags & PURPLE_MESSAGE_INVISIBLE)
 		return FALSE;
 
-	t = g_string_new(*message);
 	urls = purple_conversation_get_data(conv, "TinyURLs");
 	if (urls != NULL) /* message was cancelled somewhere? Reset. */
 		g_list_foreach(urls, free_urls, NULL);
 	g_list_free(urls);
-	urls = extract_urls(t->str);
+	urls = extract_urls(*message);
+	if (!urls)
+		return FALSE;
+
+	t = g_string_new(*message);
 	g_free(*message);
 	for (iter = urls; iter; iter = iter->next) {
 		if (g_utf8_strlen((char *)iter->data, -1) >= purple_prefs_get_int(PREF_LENGTH)) {
--- a/libpurple/account.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/account.c	Sun Jun 28 04:41:07 2009 +0000
@@ -99,7 +99,7 @@
 	const char *name;
 	PurpleAccountSetting *setting;
 	xmlnode *node, *child;
-	char buf[20];
+	char buf[21];
 
 	name    = (const char *)key;
 	setting = (PurpleAccountSetting *)value;
@@ -110,7 +110,7 @@
 
 	if (setting->type == PURPLE_PREF_INT) {
 		xmlnode_set_attrib(child, "type", "int");
-		snprintf(buf, sizeof(buf), "%d", setting->value.integer);
+		g_snprintf(buf, sizeof(buf), "%d", setting->value.integer);
 		xmlnode_insert_data(child, buf, -1);
 	}
 	else if (setting->type == PURPLE_PREF_STRING && setting->value.string != NULL) {
@@ -119,7 +119,7 @@
 	}
 	else if (setting->type == PURPLE_PREF_BOOLEAN) {
 		xmlnode_set_attrib(child, "type", "bool");
-		snprintf(buf, sizeof(buf), "%d", setting->value.boolean);
+		g_snprintf(buf, sizeof(buf), "%d", setting->value.boolean);
 		xmlnode_insert_data(child, buf, -1);
 	}
 }
@@ -281,7 +281,7 @@
 	PurpleProxyType proxy_type;
 	const char *value;
 	int int_value;
-	char buf[20];
+	char buf[21];
 
 	proxy_type = purple_proxy_info_get_type(proxy_info);
 
@@ -304,7 +304,7 @@
 
 	if ((int_value = purple_proxy_info_get_port(proxy_info)) != 0)
 	{
-		snprintf(buf, sizeof(buf), "%d", int_value);
+		g_snprintf(buf, sizeof(buf), "%d", int_value);
 		child = xmlnode_new_child(node, "port");
 		xmlnode_insert_data(child, buf, -1);
 	}
@@ -342,7 +342,7 @@
 		return node;
 
 	child = xmlnode_new_child(node, "type");
-	snprintf(type_str, sizeof(type_str), "%u", err->type);
+	g_snprintf(type_str, sizeof(type_str), "%u", err->type);
 	xmlnode_insert_data(child, type_str, -1);
 
 	child = xmlnode_new_child(node, "description");
--- a/libpurple/blist.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/blist.c	Sun Jun 28 04:41:07 2009 +0000
@@ -125,7 +125,7 @@
 	const char *name;
 	PurpleValue *value;
 	xmlnode *node, *child;
-	char buf[20];
+	char buf[21];
 
 	name    = (const char *)key;
 	value   = (PurpleValue *)hvalue;
@@ -138,7 +138,7 @@
 
 	if (purple_value_get_type(value) == PURPLE_TYPE_INT) {
 		xmlnode_set_attrib(child, "type", "int");
-		snprintf(buf, sizeof(buf), "%d", purple_value_get_int(value));
+		g_snprintf(buf, sizeof(buf), "%d", purple_value_get_int(value));
 		xmlnode_insert_data(child, buf, -1);
 	}
 	else if (purple_value_get_type(value) == PURPLE_TYPE_STRING) {
@@ -147,7 +147,7 @@
 	}
 	else if (purple_value_get_type(value) == PURPLE_TYPE_BOOLEAN) {
 		xmlnode_set_attrib(child, "type", "bool");
-		snprintf(buf, sizeof(buf), "%d", purple_value_get_boolean(value));
+		g_snprintf(buf, sizeof(buf), "%d", purple_value_get_boolean(value));
 		xmlnode_insert_data(child, buf, -1);
 	}
 }
@@ -303,7 +303,7 @@
 	node = xmlnode_new("account");
 	xmlnode_set_attrib(node, "proto", purple_account_get_protocol_id(account));
 	xmlnode_set_attrib(node, "name", purple_account_get_username(account));
-	snprintf(buf, sizeof(buf), "%d", account->perm_deny);
+	g_snprintf(buf, sizeof(buf), "%d", account->perm_deny);
 	xmlnode_set_attrib(node, "mode", buf);
 
 	for (cur = account->permit; cur; cur = cur->next)
@@ -977,18 +977,26 @@
 	PurpleConversation *conv;
 	PurpleBlistNode *bnode;
 	char *old_alias;
+	char *new_alias = NULL;
 
 	g_return_if_fail(contact != NULL);
 
-	if (!purple_strings_are_different(contact->alias, alias))
+	if ((alias != NULL) && (*alias != '\0'))
+		new_alias = purple_utf8_strip_unprintables(alias);
+
+	if (!purple_strings_are_different(contact->alias, new_alias)) {
+		g_free(new_alias);
 		return;
+	}
 
 	old_alias = contact->alias;
 
-	if ((alias != NULL) && (*alias != '\0'))
-		contact->alias = g_strdup(alias);
-	else
+	if ((new_alias != NULL) && (*new_alias != '\0'))
+		contact->alias = new_alias;
+	else {
 		contact->alias = NULL;
+		g_free(new_alias); /* could be "\0" */
+	}
 
 	purple_blist_schedule_save();
 
@@ -1014,18 +1022,26 @@
 {
 	PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
 	char *old_alias;
+	char *new_alias = NULL;
 
 	g_return_if_fail(chat != NULL);
 
-	if (!purple_strings_are_different(chat->alias, alias))
+	if ((alias != NULL) && (*alias != '\0'))
+		new_alias = purple_utf8_strip_unprintables(alias);
+
+	if (!purple_strings_are_different(chat->alias, new_alias)) {
+		g_free(new_alias);
 		return;
+	}
 
 	old_alias = chat->alias;
 
-	if ((alias != NULL) && (*alias != '\0'))
-		chat->alias = g_strdup(alias);
-	else
+	if ((new_alias != NULL) && (*new_alias != '\0'))
+		chat->alias = new_alias;
+	else {
 		chat->alias = NULL;
+		g_free(new_alias); /* could be "\0" */
+	}
 
 	purple_blist_schedule_save();
 
@@ -1042,18 +1058,26 @@
 	PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
 	PurpleConversation *conv;
 	char *old_alias;
+	char *new_alias = NULL;
 
 	g_return_if_fail(buddy != NULL);
 
-	if (!purple_strings_are_different(buddy->alias, alias))
+	if ((alias != NULL) && (*alias != '\0'))
+		new_alias = purple_utf8_strip_unprintables(alias);
+
+	if (!purple_strings_are_different(buddy->alias, new_alias)) {
+		g_free(new_alias);
 		return;
+	}
 
 	old_alias = buddy->alias;
 
-	if ((alias != NULL) && (*alias != '\0'))
+	if ((new_alias != NULL) && (*new_alias != '\0'))
 		buddy->alias = g_strdup(alias);
-	else
+	else {
 		buddy->alias = NULL;
+		g_free(new_alias); /* could be "\0" */
+	}
 
 	purple_blist_schedule_save();
 
@@ -1075,18 +1099,26 @@
 	PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
 	PurpleConversation *conv;
 	char *old_alias;
+	char *new_alias = NULL;
 
 	g_return_if_fail(buddy != NULL);
 
-	if (!purple_strings_are_different(buddy->server_alias, alias))
+	if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL))
+		new_alias = purple_utf8_strip_unprintables(alias);
+
+	if (!purple_strings_are_different(buddy->server_alias, new_alias)) {
+		g_free(new_alias);
 		return;
+	}
 
 	old_alias = buddy->server_alias;
 
-	if ((alias != NULL) && (*alias != '\0') && g_utf8_validate(alias, -1, NULL))
-		buddy->server_alias = g_strdup(alias);
-	else
+	if ((new_alias != NULL) && (*new_alias != '\0'))
+		buddy->server_alias = new_alias;
+	else {
 		buddy->server_alias = NULL;
+		g_free(new_alias); /* could be "\0"; */
+	}
 
 	purple_blist_schedule_save();
 
@@ -1106,19 +1138,24 @@
 /*
  * TODO: If merging, prompt the user if they want to merge.
  */
-void purple_blist_rename_group(PurpleGroup *source, const char *new_name)
+void purple_blist_rename_group(PurpleGroup *source, const char *name)
 {
 	PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
 	PurpleGroup *dest;
 	gchar *old_name;
+	gchar *new_name;
 	GList *moved_buddies = NULL;
 	GSList *accts;
 
 	g_return_if_fail(source != NULL);
-	g_return_if_fail(new_name != NULL);
-
-	if (*new_name == '\0' || purple_strequal(new_name, source->name))
+	g_return_if_fail(name != NULL);
+
+	new_name = purple_utf8_strip_unprintables(name);
+
+	if (*new_name == '\0' || purple_strequal(new_name, source->name)) {
+		g_free(new_name);
 		return;
+	}
 
 	dest = purple_find_group(new_name);
 	if (dest != NULL && purple_utf8_strcasecmp(source->name, dest->name) != 0) {
@@ -1160,6 +1197,7 @@
 		old_name = g_strdup(source->name);
 		purple_blist_remove_group(source);
 		source = dest;
+		g_free(new_name);
 	} else {
 		/* A simple rename */
 		PurpleBlistNode *cnode, *bnode;
@@ -1172,7 +1210,7 @@
 		}
 
 		old_name = source->name;
-		source->name = g_strdup(new_name);
+		source->name = new_name;
 	}
 
 	/* Save our changes */
@@ -1184,7 +1222,7 @@
 
 	/* Notify all PRPLs */
 	/* TODO: Is this condition needed?  Seems like it would always be TRUE */
-	if(old_name && purple_strequal(source->name, old_name)) {
+	if(old_name && !purple_strequal(source->name, old_name)) {
 		for (accts = purple_group_get_accounts(source); accts; accts = g_slist_remove(accts, accts->data)) {
 			PurpleAccount *account = accts->data;
 			PurpleConnection *gc = NULL;
@@ -1246,7 +1284,7 @@
 	chat = g_new0(PurpleChat, 1);
 	chat->account = account;
 	if ((alias != NULL) && (*alias != '\0'))
-		chat->alias = g_strdup(alias);
+		chat->alias = purple_utf8_strip_unprintables(alias);
 	chat->components = components;
 	purple_blist_node_initialize_settings((PurpleBlistNode *)chat);
 	((PurpleBlistNode *)chat)->type = PURPLE_BLIST_CHAT_NODE;
@@ -1273,13 +1311,13 @@
 	PurpleBlistUiOps *ops = purple_blist_get_ui_ops();
 	PurpleBuddy *buddy;
 
-	g_return_val_if_fail(account != NULL, FALSE);
-	g_return_val_if_fail(name != NULL, FALSE);
+	g_return_val_if_fail(account != NULL, NULL);
+	g_return_val_if_fail(name != NULL, NULL);
 
 	buddy = g_new0(PurpleBuddy, 1);
 	buddy->account  = account;
-	buddy->name     = g_strdup(name);
-	buddy->alias    = g_strdup(alias);
+	buddy->name     = purple_utf8_strip_unprintables(name);
+	buddy->alias    = purple_utf8_strip_unprintables(alias);
 	buddy->presence = purple_presence_new_for_buddy(buddy);
 	((PurpleBlistNode *)buddy)->type = PURPLE_BLIST_BUDDY_NODE;
 
@@ -1705,7 +1743,7 @@
 		return group;
 
 	group = g_new0(PurpleGroup, 1);
-	group->name = g_strdup(name);
+	group->name = purple_utf8_strip_unprintables(name);
 	group->totalsize = 0;
 	group->currentsize = 0;
 	group->online = 0;
--- a/libpurple/cipher.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/cipher.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1862,6 +1862,261 @@
 };
 
 /*******************************************************************************
+ * SHA-256
+ ******************************************************************************/
+#define SHA256_HMAC_BLOCK_SIZE	64
+#define SHA256_ROTR(X,n) ((((X) >> (n)) | ((X) << (32-(n)))) & 0xFFFFFFFF)
+
+static const guint32 sha256_K[64] =
+{
+	0x428a2f98, 0x71374491, 0xb5c0fbcf, 0xe9b5dba5, 0x3956c25b, 0x59f111f1, 0x923f82a4, 0xab1c5ed5,
+	0xd807aa98, 0x12835b01, 0x243185be, 0x550c7dc3, 0x72be5d74, 0x80deb1fe, 0x9bdc06a7, 0xc19bf174,
+	0xe49b69c1, 0xefbe4786, 0x0fc19dc6, 0x240ca1cc, 0x2de92c6f, 0x4a7484aa, 0x5cb0a9dc, 0x76f988da,
+	0x983e5152, 0xa831c66d, 0xb00327c8, 0xbf597fc7, 0xc6e00bf3, 0xd5a79147, 0x06ca6351, 0x14292967,
+	0x27b70a85, 0x2e1b2138, 0x4d2c6dfc, 0x53380d13, 0x650a7354, 0x766a0abb, 0x81c2c92e, 0x92722c85,
+	0xa2bfe8a1, 0xa81a664b, 0xc24b8b70, 0xc76c51a3, 0xd192e819, 0xd6990624, 0xf40e3585, 0x106aa070,
+	0x19a4c116, 0x1e376c08, 0x2748774c, 0x34b0bcb5, 0x391c0cb3, 0x4ed8aa4a, 0x5b9cca4f, 0x682e6ff3,
+	0x748f82ee, 0x78a5636f, 0x84c87814, 0x8cc70208, 0x90befffa, 0xa4506ceb, 0xbef9a3f7, 0xc67178f2
+};
+
+struct SHA256Context {
+	guint32 H[8];
+	guint32 W[64];
+
+	gint lenW;
+
+	guint32 sizeHi;
+	guint32 sizeLo;
+};
+
+static void
+sha256_hash_block(struct SHA256Context *sha256_ctx) {
+	gint i;
+	guint32 A, B, C, D, E, F, G, H, T1, T2;
+
+	for(i = 16; i < 64; i++) {
+		sha256_ctx->W[i] =
+			  (SHA256_ROTR(sha256_ctx->W[i-2], 17) ^ SHA256_ROTR(sha256_ctx->W[i-2],  19) ^ (sha256_ctx->W[i-2] >> 10))
+			+ sha256_ctx->W[i-7]
+			+ (SHA256_ROTR(sha256_ctx->W[i-15], 7) ^ SHA256_ROTR(sha256_ctx->W[i-15], 18) ^ (sha256_ctx->W[i-15] >> 3))
+			+ sha256_ctx->W[i-16];
+	}
+
+	A = sha256_ctx->H[0];
+	B = sha256_ctx->H[1];
+	C = sha256_ctx->H[2];
+	D = sha256_ctx->H[3];
+	E = sha256_ctx->H[4];
+	F = sha256_ctx->H[5];
+	G = sha256_ctx->H[6];
+	H = sha256_ctx->H[7];
+
+	for(i = 0; i < 64; i++) {
+        T1 = H
+			+ (SHA256_ROTR(E, 6) ^ SHA256_ROTR(E, 11) ^ SHA256_ROTR(E, 25))
+			+ ((E & F) ^ ((~E) & G))
+			+ sha256_K[i] + sha256_ctx->W[i];
+        T2 = (SHA256_ROTR(A, 2) ^ SHA256_ROTR(A, 13) ^ SHA256_ROTR(A, 22))
+			+ ((A & B) ^ (A & C) ^ (B & C));
+		H = G;
+		G = F;
+		F = E;
+		E = D + T1;
+		D = C;
+		C = B;
+		B = A;
+		A = T1 + T2;
+	}
+
+	sha256_ctx->H[0] += A;
+	sha256_ctx->H[1] += B;
+	sha256_ctx->H[2] += C;
+	sha256_ctx->H[3] += D;
+	sha256_ctx->H[4] += E;
+	sha256_ctx->H[5] += F;
+	sha256_ctx->H[6] += G;
+	sha256_ctx->H[7] += H;
+}
+
+static void
+sha256_set_opt(PurpleCipherContext *context, const gchar *name, void *value) {
+	struct SHA256Context *ctx;
+
+	ctx = purple_cipher_context_get_data(context);
+
+	if(!strcmp(name, "sizeHi")) {
+		ctx->sizeHi = GPOINTER_TO_INT(value);
+	} else if(!strcmp(name, "sizeLo")) {
+		ctx->sizeLo = GPOINTER_TO_INT(value);
+	} else if(!strcmp(name, "lenW")) {
+		ctx->lenW = GPOINTER_TO_INT(value);
+	}
+}
+
+static void *
+sha256_get_opt(PurpleCipherContext *context, const gchar *name) {
+	struct SHA256Context *ctx;
+
+	ctx = purple_cipher_context_get_data(context);
+
+	if(!strcmp(name, "sizeHi")) {
+		return GINT_TO_POINTER(ctx->sizeHi);
+	} else if(!strcmp(name, "sizeLo")) {
+		return GINT_TO_POINTER(ctx->sizeLo);
+	} else if(!strcmp(name, "lenW")) {
+		return GINT_TO_POINTER(ctx->lenW);
+	}
+
+	return NULL;
+}
+
+static void
+sha256_init(PurpleCipherContext *context, void *extra) {
+	struct SHA256Context *sha256_ctx;
+
+	sha256_ctx = g_new0(struct SHA256Context, 1);
+
+	purple_cipher_context_set_data(context, sha256_ctx);
+
+	purple_cipher_context_reset(context, extra);
+}
+
+static void
+sha256_reset(PurpleCipherContext *context, void *extra) {
+	struct SHA256Context *sha256_ctx;
+	gint i;
+
+	sha256_ctx = purple_cipher_context_get_data(context);
+
+	g_return_if_fail(sha256_ctx);
+
+	sha256_ctx->lenW = 0;
+	sha256_ctx->sizeHi = 0;
+	sha256_ctx->sizeLo = 0;
+
+	sha256_ctx->H[0] = 0x6a09e667;
+	sha256_ctx->H[1] = 0xbb67ae85;
+	sha256_ctx->H[2] = 0x3c6ef372;
+	sha256_ctx->H[3] = 0xa54ff53a;
+	sha256_ctx->H[4] = 0x510e527f;
+	sha256_ctx->H[5] = 0x9b05688c;
+	sha256_ctx->H[6] = 0x1f83d9ab;
+	sha256_ctx->H[7] = 0x5be0cd19;
+
+	for(i = 0; i < 64; i++)
+		sha256_ctx->W[i] = 0;
+}
+
+static void
+sha256_uninit(PurpleCipherContext *context) {
+	struct SHA256Context *sha256_ctx;
+
+	purple_cipher_context_reset(context, NULL);
+
+	sha256_ctx = purple_cipher_context_get_data(context);
+
+	memset(sha256_ctx, 0, sizeof(struct SHA256Context));
+
+	g_free(sha256_ctx);
+	sha256_ctx = NULL;
+}
+
+
+static void
+sha256_append(PurpleCipherContext *context, const guchar *data, size_t len) {
+	struct SHA256Context *sha256_ctx;
+	gint i;
+
+	sha256_ctx = purple_cipher_context_get_data(context);
+
+	g_return_if_fail(sha256_ctx);
+
+	for(i = 0; i < len; i++) {
+		sha256_ctx->W[sha256_ctx->lenW / 4] <<= 8;
+		sha256_ctx->W[sha256_ctx->lenW / 4] |= data[i];
+
+		if((++sha256_ctx->lenW) % 64 == 0) {
+			sha256_hash_block(sha256_ctx);
+			sha256_ctx->lenW = 0;
+		}
+
+		sha256_ctx->sizeLo += 8;
+		sha256_ctx->sizeHi += (sha256_ctx->sizeLo < 8);
+	}
+}
+
+static gboolean
+sha256_digest(PurpleCipherContext *context, size_t in_len, guchar digest[32],
+			size_t *out_len)
+{
+	struct SHA256Context *sha256_ctx;
+	guchar pad0x80 = 0x80, pad0x00 = 0x00;
+	guchar padlen[8];
+	gint i;
+
+	g_return_val_if_fail(in_len >= 32, FALSE);
+
+	sha256_ctx = purple_cipher_context_get_data(context);
+
+	g_return_val_if_fail(sha256_ctx, FALSE);
+
+	padlen[0] = (guchar)((sha256_ctx->sizeHi >> 24) & 255);
+	padlen[1] = (guchar)((sha256_ctx->sizeHi >> 16) & 255);
+	padlen[2] = (guchar)((sha256_ctx->sizeHi >> 8) & 255);
+	padlen[3] = (guchar)((sha256_ctx->sizeHi >> 0) & 255);
+	padlen[4] = (guchar)((sha256_ctx->sizeLo >> 24) & 255);
+	padlen[5] = (guchar)((sha256_ctx->sizeLo >> 16) & 255);
+	padlen[6] = (guchar)((sha256_ctx->sizeLo >> 8) & 255);
+	padlen[7] = (guchar)((sha256_ctx->sizeLo >> 0) & 255);
+
+	/* pad with a 1, then zeroes, then length */
+	purple_cipher_context_append(context, &pad0x80, 1);
+	while(sha256_ctx->lenW != 56)
+		purple_cipher_context_append(context, &pad0x00, 1);
+	purple_cipher_context_append(context, padlen, 8);
+
+	for(i = 0; i < 32; i++) {
+		digest[i] = (guchar)(sha256_ctx->H[i / 4] >> 24);
+		sha256_ctx->H[i / 4] <<= 8;
+	}
+
+	purple_cipher_context_reset(context, NULL);
+
+	if(out_len)
+		*out_len = 32;
+
+	return TRUE;
+}
+
+static size_t
+sha256_get_block_size(PurpleCipherContext *context)
+{
+	/* This does not change (in this case) */
+	return SHA256_HMAC_BLOCK_SIZE;
+}
+
+static PurpleCipherOps SHA256Ops = {
+	sha256_set_opt,	/* Set Option		*/
+	sha256_get_opt,	/* Get Option		*/
+	sha256_init,	/* init				*/
+	sha256_reset,	/* reset			*/
+	sha256_uninit,	/* uninit			*/
+	NULL,			/* set iv			*/
+	sha256_append,	/* append			*/
+	sha256_digest,	/* digest			*/
+	NULL,			/* encrypt			*/
+	NULL,			/* decrypt			*/
+	NULL,			/* set salt			*/
+	NULL,			/* get salt size	*/
+	NULL,			/* set key			*/
+	NULL,			/* get key size		*/
+	NULL,			/* set batch mode */
+	NULL,			/* get batch mode */
+	sha256_get_block_size,	/* get block size */
+	NULL			/* set key with len */
+};
+
+/*******************************************************************************
  * RC4
  ******************************************************************************/
 
@@ -2228,6 +2483,7 @@
 
 	purple_ciphers_register_cipher("md5", &MD5Ops);
 	purple_ciphers_register_cipher("sha1", &SHA1Ops);
+	purple_ciphers_register_cipher("sha256", &SHA256Ops);
 	purple_ciphers_register_cipher("md4", &MD4Ops);
 	purple_ciphers_register_cipher("hmac", &HMACOps);
 	purple_ciphers_register_cipher("des", &DESOps);
--- a/libpurple/connection.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/connection.c	Sun Jun 28 04:41:07 2009 +0000
@@ -309,7 +309,7 @@
 	g_free(gc->password);
 	g_free(gc->display_name);
 
-	if (gc->disconnect_timeout)
+	if (gc->disconnect_timeout > 0)
 		purple_timeout_remove(gc->disconnect_timeout);
 
 	PURPLE_DBUS_UNREGISTER_POINTER(gc);
@@ -515,11 +515,20 @@
 static gboolean
 purple_connection_disconnect_cb(gpointer data)
 {
-	PurpleAccount *account = data;
-	char *password = g_strdup(purple_account_get_password(account));
+	PurpleAccount *account;
+	PurpleConnection *gc;
+	char *password;
+
+	account = data;
+	gc = purple_account_get_connection(account);
+
+	gc->disconnect_timeout = 0;
+
+	password = g_strdup(purple_account_get_password(account));
 	purple_account_disconnect(account);
 	purple_account_set_password(account, password);
 	g_free(password);
+
 	return FALSE;
 }
 
@@ -564,7 +573,7 @@
 	}
 
 	/* If we've already got one error, we don't need any more */
-	if (gc->disconnect_timeout)
+	if (gc->disconnect_timeout > 0)
 		return;
 
 	gc->wants_to_die = purple_connection_error_is_fatal (reason);
--- a/libpurple/connection.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/connection.h	Sun Jun 28 04:41:07 2009 +0000
@@ -560,6 +560,9 @@
  * Checks if gc is still a valid pointer to a gc.
  *
  * @return @c TRUE if gc is valid.
+ *
+ * @deprecated Do not use this.  Instead, cancel your asynchronous request
+ *             when the PurpleConnection is destroyed.
  */
 /*
  * TODO: Eventually this bad boy will be removed, because it is
--- a/libpurple/conversation.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/conversation.c	Sun Jun 28 04:41:07 2009 +0000
@@ -55,7 +55,6 @@
 	im = PURPLE_CONV_IM(c);
 
 	purple_conv_im_set_typing_state(im, PURPLE_NOT_TYPING);
-	purple_conv_im_update_typing(im);
 	purple_conv_im_stop_typing_timeout(im);
 
 	return FALSE;
@@ -1050,6 +1049,8 @@
 								   "buddy-typing-stopped", im->conv->account, im->conv->name);
 				break;
 		}
+
+		purple_conv_im_update_typing(im);
 	}
 }
 
--- a/libpurple/core.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/core.h	Sun Jun 28 04:41:07 2009 +0000
@@ -186,6 +186,12 @@
  *
  *   <dt><tt>dev_website</tt></dt>
  *   <dd>the UI's development/support website, such as http://developer.pidgin.im.</dd>
+ *
+ *   <dt><tt>client_type</tt></dt>
+ *   <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	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/dbus-analyze-functions.py	Sun Jun 28 04:41:07 2009 +0000
@@ -31,6 +31,15 @@
     "purple_account_unregister",
     "purple_connection_new_unregister",
 
+    # These functions are excluded because they involve setting arbitrary
+    # data via pointers for protocols and UIs.  This just won't work.
+    "purple_blist_get_ui_data",
+    "purple_blist_set_ui_data",
+    "purple_blist_node_get_ui_data",
+    "purple_blist_node_set_ui_data",
+    "purple_buddy_get_protocol_data",
+    "purple_buddy_set_protocol_data",
+
     # This is excluded because this script treats PurpleLogReadFlags*
     # as pointer to a struct, instead of a pointer to an enum.  This
     # causes a compilation error. Someone should fix this script.
--- a/libpurple/dnsquery.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/dnsquery.c	Sun Jun 28 04:41:07 2009 +0000
@@ -32,6 +32,10 @@
 #include "prefs.h"
 #include "util.h"
 
+#ifndef _WIN32
+#include <resolv.h>
+#endif
+
 #if (defined(__APPLE__) || defined (__unix__)) && !defined(__osf__)
 #define PURPLE_DNSQUERY_USE_FORK
 #endif
@@ -256,6 +260,9 @@
 		 * library.
 		 */
 		hints.ai_socktype = SOCK_STREAM;
+#ifdef AI_ADDRCONFIG
+		hints.ai_flags |= AI_ADDRCONFIG;
+#endif /* AI_ADDRCONFIG */
 		rc = getaddrinfo(dns_params.hostname, servname, &hints, &res);
 		write_to_parent(child_out, &rc, sizeof(rc));
 		if (rc != 0) {
@@ -325,7 +332,7 @@
 		return;
 	already_done = TRUE;
 	ppid = getppid();
-	snprintf(s, sizeof(s), "/proc/%d/exe", ppid);
+	g_snprintf(s, sizeof(s), "/proc/%d/exe", ppid);
 	n = readlink(s, e, sizeof(e));
 	if(n < 0)
 		return;
@@ -568,8 +575,10 @@
 		g_snprintf(message, sizeof(message), _("Error resolving %s: %d"),
 				query_data->hostname, err);
 #endif
+		/* Re-read resolv.conf and friends in case DNS servers have changed */
+		res_init();
+
 		purple_dnsquery_failed(query_data, message);
-
 	} else if (rc > 0) {
 		/* Success! */
 		while (rc > 0) {
@@ -706,6 +715,9 @@
 	 * library.
 	 */
 	hints.ai_socktype = SOCK_STREAM;
+#ifdef AI_ADDRCONFIG
+	hints.ai_flags |= AI_ADDRCONFIG;
+#endif /* AI_ADDRCONFIG */
 	if ((rc = getaddrinfo(query_data->hostname, servname, &hints, &res)) == 0) {
 		tmp = res;
 		while(res) {
--- a/libpurple/dnssrv.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/dnssrv.c	Sun Jun 28 04:41:07 2009 +0000
@@ -141,7 +141,14 @@
 	}
 
 	size = res_query( query.query, C_IN, query.type, (u_char*)&answer, sizeof( answer));
-	
+	if (size == -1) {
+		write(out, &(query.type), sizeof(query.type));
+		write(out, &size, sizeof(int));
+		close(out);
+		close(in);
+		_exit(0);
+	}
+
 	qdcount = ntohs(answer.hdr.qdcount);
 	ancount = ntohs(answer.hdr.ancount);
 	cp = (guchar*)&answer + sizeof(HEADER);
@@ -223,59 +230,73 @@
 	PurpleSrvQueryData *query_data = (PurpleSrvQueryData*)data;
 	int i;
 	int status;
-	
+
 	if (read(source, &type, sizeof(type)) == sizeof(type)) {
-		if (type == T_SRV) {
-			PurpleSrvResponse *res;
-			PurpleSrvResponse *tmp;
-			PurpleSrvCallback cb = query_data->cb.srv;
-			if (read(source, &size, sizeof(int)) == sizeof(int)) {
-				ssize_t red;
-				purple_debug_info("dnssrv","found %d SRV entries\n", size);
-				tmp = res = g_new0(PurpleSrvResponse, size);
-				for (i = 0; i < size; i++) {
-					red = read(source, tmp++, sizeof(PurpleSrvResponse));
-					if (red != sizeof(PurpleSrvResponse)) {
-						purple_debug_error("dnssrv","unable to read srv "
-								"response: %s\n", g_strerror(errno));
-						size = 0;
-						g_free(res);
-						res = NULL;
+		if (read(source, &size, sizeof(size)) == sizeof(size)) {
+			if (size == -1 || size == 0) {
+				if (size == -1) {
+					purple_debug_warning("dnssrv", "res_query returned an error\n");
+					/* Re-read resolv.conf and friends in case DNS servers have changed */
+					res_init();
+				} else
+					purple_debug_info("dnssrv", "Found 0 entries, errno is %i\n", errno);
+
+				if (type == T_SRV) {
+					PurpleSrvCallback cb = query_data->cb.srv;
+					cb(NULL, 0, query_data->extradata);
+				} else if (type == T_TXT) {
+					PurpleTxtCallback cb = query_data->cb.txt;
+					cb(NULL, query_data->extradata);
+				} else {
+					purple_debug_error("dnssrv", "type unknown of DNS result entry; errno is %i\n", errno);
+				}
+
+			} else if (size) {
+				if (type == T_SRV) {
+					PurpleSrvResponse *res;
+					PurpleSrvResponse *tmp;
+					PurpleSrvCallback cb = query_data->cb.srv;
+					ssize_t red;
+					purple_debug_info("dnssrv","found %d SRV entries\n", size);
+					tmp = res = g_new0(PurpleSrvResponse, size);
+					for (i = 0; i < size; i++) {
+						red = read(source, tmp++, sizeof(PurpleSrvResponse));
+						if (red != sizeof(PurpleSrvResponse)) {
+							purple_debug_error("dnssrv","unable to read srv "
+									"response: %s\n", g_strerror(errno));
+							size = 0;
+							g_free(res);
+							res = NULL;
+						}
 					}
+
+					cb(res, size, query_data->extradata);
+				} else if (type == T_TXT) {
+					GSList *responses = NULL;
+					PurpleTxtResponse *res;
+					PurpleTxtCallback cb = query_data->cb.txt;
+					ssize_t red;
+					purple_debug_info("dnssrv","found %d TXT entries\n", size);
+					res = g_new0(PurpleTxtResponse, 1);
+					for (i = 0; i < size; i++) {
+						red = read(source, res, sizeof(PurpleTxtResponse));
+						if (red != sizeof(PurpleTxtResponse)) {
+							purple_debug_error("dnssrv","unable to read txt "
+									"response: %s\n", g_strerror(errno));
+							size = 0;
+							g_free(res);
+							g_slist_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
+							g_slist_free(responses);
+							responses = NULL;
+							break;
+						}
+					}
+
+					cb(responses, query_data->extradata);
+				} else {
+					purple_debug_error("dnssrv", "type unknown of DNS result entry; errno is %i\n", errno);
 				}
-			} else {
-				purple_debug_info("dnssrv","found 0 SRV entries; errno is %i\n", errno);
-				size = 0;
-				res = NULL;
 			}
-			cb(res, size, query_data->extradata);
-		} else if (type == T_TXT) {
-			GSList *responses = NULL;
-			PurpleTxtResponse *res;
-			PurpleTxtCallback cb = query_data->cb.txt;
-			if (read(source, &size, sizeof(int)) == sizeof(int)) {
-				ssize_t red;
-				purple_debug_info("dnssrv","found %d TXT entries\n", size);
-				res = g_new0(PurpleTxtResponse, 1);
-				for (i = 0; i < size; i++) {
-					red = read(source, res, sizeof(PurpleTxtResponse));
-					if (red != sizeof(PurpleTxtResponse)) {
-						purple_debug_error("dnssrv","unable to read txt "
-								"response: %s\n", g_strerror(errno));
-						size = 0;
-						g_free(res);
-						g_slist_foreach(responses, (GFunc)purple_txt_response_destroy, NULL);
-						g_slist_free(responses);
-						responses = NULL;
-						break;
-					}
-				}
-			} else {
-				purple_debug_info("dnssrv","found 0 TXT entries; errno is %i\n", errno);
-			}
-			cb(responses, query_data->extradata);			
-		} else {
-			purple_debug_info("dnssrv","type unknown of DNS result entry; errno is %i\n", errno);
 		}
 	}
 
--- a/libpurple/media.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/media.c	Sun Jun 28 04:41:07 2009 +0000
@@ -43,6 +43,7 @@
 #ifdef USE_VV
 
 #include <gst/farsight/fs-conference-iface.h>
+#include <gst/farsight/fs-element-added-notifier.h>
 
 /** @copydoc _PurpleMediaSession */
 typedef struct _PurpleMediaSession PurpleMediaSession;
@@ -2380,6 +2381,18 @@
 	stream->connected_cb_id = purple_timeout_add(0,
 			(GSourceFunc)purple_media_connected_cb, stream);
 }
+
+static void
+purple_media_element_added_cb(FsElementAddedNotifier *self,
+		GstBin *bin, GstElement *element, gpointer user_data)
+{
+	/*
+	 * Hack to make H264 work with Gmail video.
+	 */
+	if (!strncmp(GST_ELEMENT_NAME(element), "x264", 4)) {
+		g_object_set(GST_OBJECT(element), "cabac", FALSE, NULL);
+	}
+}
 #endif  /* USE_VV */
 
 gboolean
@@ -2403,7 +2416,7 @@
 
 	if (!session) {
 		GError *err = NULL;
-		GList *codec_conf = NULL;
+		GList *codec_conf = NULL, *iter = NULL;
 		gchar *filename = NULL;
 		PurpleMediaSessionType session_type;
 		GstElement *src = NULL;
@@ -2420,15 +2433,6 @@
 			return FALSE;
 		}
 
-	/* XXX: SPEEX has a latency of 5 or 6 seconds for me */
-#if 0
-	/* SPEEX is added through the configuration */
-		codec_conf = g_list_prepend(codec_conf, fs_codec_new(FS_CODEC_ID_ANY,
-				"SPEEX", FS_MEDIA_TYPE_AUDIO, 8000));
-		codec_conf = g_list_prepend(codec_conf, fs_codec_new(FS_CODEC_ID_ANY,
-				"SPEEX", FS_MEDIA_TYPE_AUDIO, 16000));
-#endif
-
 		filename = g_build_filename(purple_user_dir(), "fs-codec.conf", NULL);
 		codec_conf = fs_codec_list_from_keyfile(filename, &err);
 		g_free(filename);
@@ -2445,6 +2449,25 @@
 			g_error_free(err);
 		}
 
+		/*
+		 * Add SPEEX if the configuration file doesn't exist or
+		 * there isn't a speex entry.
+		 */
+		for (iter = codec_conf; iter; iter = g_list_next(iter)) {
+			FsCodec *codec = iter->data;
+			if (!g_ascii_strcasecmp(codec->encoding_name, "speex"))
+				break;
+		}
+
+		if (iter == NULL) {
+			codec_conf = g_list_prepend(codec_conf,
+					fs_codec_new(FS_CODEC_ID_ANY,
+					"SPEEX", FS_MEDIA_TYPE_AUDIO, 8000));
+			codec_conf = g_list_prepend(codec_conf,
+					fs_codec_new(FS_CODEC_ID_ANY,
+					"SPEEX", FS_MEDIA_TYPE_AUDIO, 16000));
+		}
+
 		fs_session_set_codec_preferences(session->session, codec_conf, NULL);
 
 		/*
@@ -2456,6 +2479,19 @@
 			g_object_set(G_OBJECT(session->session),
 					"no-rtcp-timeout", 0, NULL);
 
+		/*
+		 * Hack to make x264 work with Gmail video.
+		 */
+		if (is_nice && !strcmp(sess_id, "google-video")) {
+			FsElementAddedNotifier *notifier =
+					fs_element_added_notifier_new();
+			g_signal_connect(G_OBJECT(notifier), "element-added",
+					G_CALLBACK(purple_media_element_added_cb),
+					stream);
+			fs_element_added_notifier_add(notifier,
+					GST_BIN(media->priv->conference));
+		}
+
 		fs_codec_list_destroy(codec_conf);
 
 		session->id = g_strdup(sess_id);
@@ -2670,7 +2706,8 @@
 	PurpleMediaStream *stream;
 	g_return_val_if_fail(PURPLE_IS_MEDIA(media), NULL);
 	stream = purple_media_get_stream(media, sess_id, participant);
-	return purple_media_candidate_list_from_fs(stream->local_candidates);
+	return stream ? purple_media_candidate_list_from_fs(
+			stream->local_candidates) : NULL;
 #else
 	return NULL;
 #endif
--- a/libpurple/nat-pmp.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/nat-pmp.c	Sun Jun 28 04:41:07 2009 +0000
@@ -200,7 +200,7 @@
 
     if (!(buf = malloc(needed)))
 	{
-		purple_debug_warning("nat-pmp", "Failed to malloc %i\n", needed);
+		purple_debug_warning("nat-pmp", "Failed to malloc %" G_GSIZE_FORMAT "\n", needed);
 		return NULL;
     }
 
--- a/libpurple/network.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/network.c	Sun Jun 28 04:41:07 2009 +0000
@@ -105,6 +105,10 @@
 static gchar *stun_ip = NULL;
 static gchar *turn_ip = NULL;
 
+/* Keep track of port mappings done with UPnP and NAT-PMP */
+static GHashTable *upnp_port_mappings = NULL;
+static GHashTable *nat_pmp_port_mappings = NULL;
+
 const unsigned char *
 purple_network_ip_atoi(const char *ip)
 {
@@ -257,6 +261,15 @@
 		return;
 	}
 
+	if (success) {
+		/* add port mapping to hash table */
+		gint *key = g_new(gint, 1);
+		gint *value = g_new(gint, 1);
+		*key = purple_network_get_port_from_fd(listen_data->listenfd);
+		*value = listen_data->socket_type;
+		g_hash_table_insert(upnp_port_mappings, key, value);
+	}
+
 	if (listen_data->cb)
 		listen_data->cb(listen_data->listenfd, listen_data->cb_data);
 
@@ -270,9 +283,16 @@
 purple_network_finish_pmp_map_cb(gpointer data)
 {
 	PurpleNetworkListenData *listen_data;
+	gint *key = g_new(gint, 1);
+	gint *value = g_new(gint, 1);
 
 	listen_data = data;
 
+	/* add port mapping to hash table */
+	*key = purple_network_get_port_from_fd(listen_data->listenfd);
+	*value = listen_data->socket_type;
+	g_hash_table_insert(nat_pmp_port_mappings, key, value);
+
 	if (listen_data->cb)
 		listen_data->cb(listen_data->listenfd, listen_data->cb_data);
 
@@ -303,7 +323,7 @@
 	/*
 	 * Get a list of addresses on this machine.
 	 */
-	snprintf(serv, sizeof(serv), "%hu", port);
+	g_snprintf(serv, sizeof(serv), "%hu", port);
 	memset(&hints, 0, sizeof(struct addrinfo));
 	hints.ai_flags = AI_PASSIVE;
 	hints.ai_family = AF_UNSPEC;
@@ -892,6 +912,61 @@
 	return &handle;
 }
 
+static void
+purple_network_upnp_mapping_remove_cb(gboolean sucess, gpointer data)
+{
+	purple_debug_info("network", "done removing UPnP port mapping\n");
+}
+
+/* the reason for these functions to have these signatures is to be able to
+ use them for g_hash_table_foreach to clean remaining port mappings, which is
+ not yet done */
+static void
+purple_network_upnp_mapping_remove(gpointer key, gpointer value,
+	gpointer user_data)
+{
+	gint port = (gint) *((gint *) key);
+	gint protocol = (gint) *((gint *) value);
+	purple_debug_info("network", "removing UPnP port mapping for port %d\n",
+		port);
+	purple_upnp_remove_port_mapping(port, 
+		protocol == SOCK_STREAM ? "TCP" : "UDP", 
+		purple_network_upnp_mapping_remove_cb, NULL);
+	g_hash_table_remove(upnp_port_mappings, key);
+}
+
+static void
+purple_network_nat_pmp_mapping_remove(gpointer key, gpointer value,
+	gpointer user_data)
+{
+	gint port = (gint) *((gint *) key);
+	gint protocol = (gint) *((gint *) value);
+	purple_debug_info("network", "removing NAT-PMP port mapping for port %d\n",
+		port);
+	purple_pmp_destroy_map(
+		protocol == SOCK_STREAM ? PURPLE_PMP_TYPE_TCP : PURPLE_PMP_TYPE_UDP, 
+		port);
+	g_hash_table_remove(nat_pmp_port_mappings, key);
+}
+
+void
+purple_network_remove_port_mapping(gint fd)
+{
+	int port = purple_network_get_port_from_fd(fd);
+	gint *protocol = g_hash_table_lookup(upnp_port_mappings, &port);
+
+	if (protocol) {
+		purple_network_upnp_mapping_remove(&port, protocol, NULL);
+		g_hash_table_remove(upnp_port_mappings, protocol);
+	} else {
+		protocol = g_hash_table_lookup(nat_pmp_port_mappings, &port);
+		if (protocol) {
+			purple_network_nat_pmp_mapping_remove(&port, protocol, NULL);
+			g_hash_table_remove(nat_pmp_port_mappings, protocol);
+		}
+	}
+}
+	
 void
 purple_network_init(void)
 {
@@ -964,8 +1039,15 @@
 		purple_prefs_get_string("/purple/network/stun_server"));
 	purple_network_set_turn_server(
 		purple_prefs_get_string("/purple/network/turn_server"));
+
+	upnp_port_mappings = 
+		g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
+	nat_pmp_port_mappings =
+		g_hash_table_new_full(g_int_hash, g_int_equal, g_free, g_free);
 }
 
+
+
 void
 purple_network_uninit(void)
 {
@@ -1008,4 +1090,10 @@
 	
 	if (stun_ip)
 		g_free(stun_ip);
+
+	g_hash_table_destroy(upnp_port_mappings);
+	g_hash_table_destroy(nat_pmp_port_mappings);
+
+	/* TODO: clean up remaining port mappings, note calling 
+	 purple_upnp_remove_port_mapping from here doesn't quite work... */
 }
--- a/libpurple/network.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/network.h	Sun Jun 28 04:41:07 2009 +0000
@@ -246,10 +246,10 @@
  * Update the TURN server IP given the host name
  * Will result in a DNS query being executed asynchronous
  * 
- * @param stun_server The host name of the STUN server to set
+ * @param turn_server The host name of the STUN server to set
  * @since 2.6.0
  */
-void purple_network_set_turn_server(const gchar *stun_server);
+void purple_network_set_turn_server(const gchar *turn_server);
 	
 /**
  * Get the IP address of the STUN server as a string representation
@@ -259,7 +259,14 @@
  */
 const gchar *purple_network_get_turn_ip(void);
 		
-	
+/**
+ * Remove a port mapping (UPnP or NAT-PMP) associated with listening socket
+ *
+ * @param fd Socket to remove the port mapping for
+ * @since 2.6.0
+ */
+void purple_network_remove_port_mapping(gint fd);	
+
 /**
  * Initializes the network subsystem.
  */
--- a/libpurple/notify.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/notify.h	Sun Jun 28 04:41:07 2009 +0000
@@ -427,7 +427,9 @@
  * Displays a notification for multiple emails to the user.
  *
  * @param handle    The plugin or connection handle.
- * @param count     The number of emails.
+ * @param count     The number of emails.  '0' can be used to signify that
+ *                  the user has no unread emails and the UI should remove
+ *                  the mail notification.
  * @param detailed  @c TRUE if there is information for each email in the
  *                  arrays.
  * @param subjects  The array of subjects.
--- a/libpurple/plugins/perl/common/Certificate.xs	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/perl/common/Certificate.xs	Sun Jun 28 04:41:07 2009 +0000
@@ -214,7 +214,7 @@
 		GByteArray *gba = NULL;
 	CODE:
 		gba = purple_certificate_get_fingerprint_sha1(crt);
-		RETVAL = newSVpv(gba->data, gba->len);
+		RETVAL = newSVpv((gchar *)gba->data, gba->len);
 		g_byte_array_free(gba, TRUE);
 	OUTPUT:
 		RETVAL
--- a/libpurple/plugins/perl/common/Cipher.xs	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/perl/common/Cipher.xs	Sun Jun 28 04:41:07 2009 +0000
@@ -66,9 +66,9 @@
 		guchar *data = NULL;
 		size_t data_len;
 	CODE:
-		data = SvPV(data_sv, data_len);
+		data = (guchar *)SvPV(data_sv, data_len);
 		SvUPGRADE(digest, SVt_PV);
-		buff = SvGROW(digest, in_len);
+		buff = (guchar *)SvGROW(digest, in_len);
 		ret = purple_cipher_digest_region(name, data, data_len, in_len, buff, &RETVAL);
 		if(!ret) {
 			SvSetSV_nosteal(digest, &PL_sv_undef);
@@ -181,7 +181,7 @@
 		guchar *buff = NULL;
 	CODE:
 		SvUPGRADE(digest, SVt_PV);
-		buff = SvGROW(digest, in_len);
+		buff = (guchar *)SvGROW(digest, in_len);
 		ret = purple_cipher_context_digest(context, in_len, buff, &RETVAL);
 		if(!ret) {
 			SvSetSV_nosteal(digest, &PL_sv_undef);
@@ -225,9 +225,9 @@
 		guchar *buff = NULL;
 		guchar *data = NULL;
 	CODE:
-		data = SvPV(data_sv, datalen);
+		data = (guchar *)SvPV(data_sv, datalen);
 		SvUPGRADE(output, SVt_PV);
-		buff = SvGROW(output, datalen);
+		buff = (guchar *)SvGROW(output, datalen);
 		RETVAL = purple_cipher_context_encrypt(context, data, datalen, buff, &outlen);
 		if(outlen != 0) {
 			SvPOK_only(output);
@@ -249,9 +249,9 @@
 		guchar *buff = NULL;
 		guchar *data = NULL;
 	CODE:
-		data = SvPV(data_sv, datalen);
+		data = (guchar *)SvPV(data_sv, datalen);
 		SvUPGRADE(output, SVt_PV);
-		buff = SvGROW(output, datalen);
+		buff = (guchar *)SvGROW(output, datalen);
 		RETVAL = purple_cipher_context_decrypt(context, data, datalen, buff, &outlen);
 		if(outlen != 0) {
 			SvPOK_only(output);
--- a/libpurple/plugins/perl/common/Util.xs	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/perl/common/Util.xs	Sun Jun 28 04:41:07 2009 +0000
@@ -69,7 +69,7 @@
 	PREINIT:
 		char *message = NULL;
 		gboolean ret;
-		gssize len;
+		gsize len;
 	CODE:
 		message = SvPV(msg, len);
 		message = g_strndup(message, len);
@@ -239,7 +239,7 @@
 	CODE:
 		ret = purple_base16_decode(str, &len);
 		if(len) {
-			RETVAL = newSVpv(ret, len);
+			RETVAL = newSVpv((gchar *)ret, len);
 		} else {
 			g_free(ret);
 			XSRETURN_UNDEF;
@@ -257,7 +257,7 @@
 	CODE:
 		ret = purple_base64_decode(str, &len);
 		if(len) {
-			RETVAL = newSVpv(ret, len);
+			RETVAL = newSVpv((gchar *)ret, len);
 		} else {
 			g_free(ret);
 			XSRETURN_UNDEF;
@@ -275,7 +275,7 @@
 	CODE:
 		ret = purple_quotedp_decode(str, &len);
 		if(len) {
-			RETVAL = newSVpv(ret, len);
+			RETVAL = newSVpv((gchar *)ret, len);
 		} else {
 			g_free(ret);
 			XSRETURN_UNDEF;
@@ -499,11 +499,11 @@
 	gpointer unused
 
 const char*
-purple_util_get_image_extension(gconstpointer data, size_t length(data))
+purple_util_get_image_extension(const char *data, size_t length(data))
 	PROTOTYPE: $
 
 gchar_own*
-purple_util_get_image_filename(gconstpointer image_data, size_t length(image_data))
+purple_util_get_image_filename(const char *image_data, size_t length(image_data))
 	PROTOTYPE: $
 
 Purple::XMLNode
--- a/libpurple/plugins/perl/perl-handlers.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/perl/perl-handlers.c	Sun Jun 28 04:41:07 2009 +0000
@@ -284,6 +284,8 @@
 	DATATYPE **copy_args;
 
 	dSP;
+	PERL_SET_CONTEXT(my_perl);
+	SPAGAIN;
 	ENTER;
 	SAVETMPS;
 	PUSHMARK(sp);
@@ -364,7 +366,8 @@
 					break;
 
 				case PURPLE_TYPE_STRING:
-					if (strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) {
+					if (!*((char **)copy_args[i]) || !SvPVX(sv_args[i]) ||
+							strcmp(*((char **)copy_args[i]), SvPVX(sv_args[i]))) {
 						g_free(*((char **)copy_args[i]));
 						*((char **)copy_args[i]) =
 							g_strdup(SvPVutf8_nolen(sv_args[i]));
--- a/libpurple/plugins/psychic.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/psychic.c	Sun Jun 28 04:41:07 2009 +0000
@@ -74,6 +74,7 @@
 			      time(NULL));
     }
 
+    /* Necessary because we may be creating a new conversation window. */
     purple_conv_im_set_typing_state(PURPLE_CONV_IM(gconv), PURPLE_TYPING);
   }
 }
--- a/libpurple/plugins/signals-test.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/signals-test.c	Sun Jun 28 04:41:07 2009 +0000
@@ -624,6 +624,70 @@
 }
 
 /**************************************************************************
+ * Jabber signals callbacks
+ **************************************************************************/
+static gboolean
+jabber_iq_received(PurpleConnection *pc, const char *type, const char *id,
+                   const char *from, xmlnode *iq)
+{
+	purple_debug_misc("signals test", "jabber IQ (type=%s, id=%s, from=%s) %p\n",
+	                  type, id, from ? from : "(null)", iq);
+
+	/* We don't want the plugin to stop processing */
+	return FALSE;
+}
+
+static gboolean
+jabber_message_received(PurpleConnection *pc, const char *type, const char *id,
+                        const char *from, const char *to, xmlnode *message)
+{
+	purple_debug_misc("signals test", "jabber message (type=%s, id=%s, "
+	                  "from=%s to=%s) %p\n",
+	                  type ? type : "(null)", id ? id : "(null)",
+	                  from ? from : "(null)", to ? to : "(null)", message);
+
+	/* We don't want the plugin to stop processing */
+	return FALSE;
+}
+
+static gboolean
+jabber_presence_received(PurpleConnection *pc, const char *type,
+                         const char *from, xmlnode *presence)
+{
+	purple_debug_misc("signals test", "jabber presence (type=%s, from=%s) %p\n",
+	                  type ? type : "(null)", from ? from : "(null)", presence);
+
+	/* We don't want the plugin to stop processing */
+	return FALSE;
+}
+
+static gboolean
+jabber_watched_iq(PurpleConnection *pc, const char *type, const char *id,
+                  const char *from, xmlnode *child)
+{
+	purple_debug_misc("signals test", "jabber watched IQ (type=%s, id=%s, from=%s)\n"
+	                  "child %p name=%s, namespace=%s\n",
+	                  type, id, from, child, child->name,
+	                  xmlnode_get_namespace(child));
+
+	if (g_str_equal(type, "get") || g_str_equal(type, "set")) {
+		/* Send the requisite reply */
+		xmlnode *iq = xmlnode_new("iq");
+		xmlnode_set_attrib(iq, "to", from);
+		xmlnode_set_attrib(iq, "id", id);
+		xmlnode_set_attrib(iq, "type", "result");
+
+		purple_signal_emit(purple_connection_get_prpl(pc),
+		                   "jabber-sending-xmlnode", pc, &iq);
+		if (iq != NULL)
+			xmlnode_free(iq);
+	}
+
+	/* Cookie monster eats IQ stanzas; the prpl shouldn't keep processing */
+	return TRUE;
+}
+
+/**************************************************************************
  * Plugin stuff
  **************************************************************************/
 static gboolean
@@ -638,6 +702,7 @@
 	void *ft_handle       = purple_xfers_get_handle();
 	void *sound_handle    = purple_sounds_get_handle();
 	void *notify_handle   = purple_notify_get_handle();
+	void *jabber_handle   = purple_plugins_find_with_id("prpl-jabber");
 
 	/* Accounts subsystem signals */
 	purple_signal_connect(accounts_handle, "account-connecting",
@@ -783,6 +848,45 @@
 	purple_signal_connect(notify_handle, "displaying-emails-notification",
 						plugin, PURPLE_CALLBACK(notify_emails_cb), NULL);
 
+	/* Jabber signals */
+	if (jabber_handle) {
+		purple_signal_connect(jabber_handle, "jabber-receiving-iq", plugin,
+		                      PURPLE_CALLBACK(jabber_iq_received), NULL);
+		purple_signal_connect(jabber_handle, "jabber-receiving-message", plugin,
+		                      PURPLE_CALLBACK(jabber_message_received), NULL);
+		purple_signal_connect(jabber_handle, "jabber-receiving-presence", plugin,
+		                      PURPLE_CALLBACK(jabber_presence_received), NULL);
+
+		/* IQ namespace signals */
+		purple_signal_emit(jabber_handle, "jabber-register-namespace-watcher",
+		                   "bogus_node", "super-duper-namespace");
+		/* The above is equivalent to doing:
+			int result = GPOINTER_TO_INT(purple_plugin_ipc_call(jabber_handle, "register_namespace_watcher", &ok, "bogus_node", "super-duper-namespace"));
+		 */
+
+		purple_signal_connect(jabber_handle, "jabber-watched-iq", plugin,
+		                      PURPLE_CALLBACK(jabber_watched_iq), NULL);
+	}
+
+	return TRUE;
+}
+
+static gboolean
+plugin_unload(PurplePlugin *plugin)
+{
+	void *jabber_handle = purple_plugins_find_with_id("prpl-jabber");
+
+	purple_signals_disconnect_by_handle(plugin);
+
+	if (jabber_handle) {
+		/* Unregister watched namespaces */
+		purple_signal_emit(jabber_handle, "jabber-unregister-namespace-watcher",
+		                   "bogus_node", "super-duper-namespace");
+		/* The above is equivalent to doing:
+		   int result = GPOINTER_TO_INT(purple_plugin_ipc_call(jabber_handle, "unregister_namespace_watcher", &ok, "bogus_node", "super-duper-namespace"));
+		 */
+	}
+
 	return TRUE;
 }
 
@@ -808,7 +912,7 @@
 	PURPLE_WEBSITE,                                     /**< homepage       */
 
 	plugin_load,                                      /**< load           */
-	NULL,                                             /**< unload         */
+	plugin_unload,                                    /**< unload         */
 	NULL,                                             /**< destroy        */
 
 	NULL,                                             /**< ui_info        */
--- a/libpurple/plugins/ssl/ssl-gnutls.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/plugins/ssl/ssl-gnutls.c	Sun Jun 28 04:41:07 2009 +0000
@@ -43,8 +43,17 @@
 static gnutls_certificate_client_credentials xcred;
 
 static void
+ssl_gnutls_log(int level, const char *str)
+{
+	/* GnuTLS log messages include the '\n' */
+	purple_debug_misc("gnutls", "lvl %d: %s", level, str);
+}
+
+static void
 ssl_gnutls_init_gnutls(void)
 {
+	const char *debug_level;
+
 	/* Configure GnuTLS to use glib memory management */
 	/* I expect that this isn't really necessary, but it may prevent
 	   some bugs */
@@ -59,6 +68,20 @@
 		(gnutls_free_function)    g_free     /* free */
 		);
 
+	debug_level = g_getenv("PURPLE_GNUTLS_DEBUG");
+	if (debug_level) {
+		int level = atoi(debug_level);
+		if (level < 0) {
+			purple_debug_warning("gnutls", "Assuming log level 0 instead of %d\n",
+			                     level);
+			level = 0;
+		}
+
+		/* "The level is an integer between 0 and 9. Higher values mean more verbosity." */
+		gnutls_global_set_log_level(level);
+		gnutls_global_set_log_function(ssl_gnutls_log);
+	}
+
 	gnutls_global_init();
 
 	gnutls_certificate_allocate_credentials(&xcred);
@@ -576,7 +599,6 @@
 							  out_buf, out_size);
 
 	g_free(out_buf);
-	g_return_val_if_fail(success, FALSE);
 	return success;
 }
 
--- a/libpurple/prefs.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/prefs.c	Sun Jun 28 04:41:07 2009 +0000
@@ -118,7 +118,7 @@
 {
 	xmlnode *node, *childnode;
 	struct purple_pref *child;
-	char buf[20];
+	char buf[21];
 	GList *cur;
 
 	/* Create a new node */
@@ -128,7 +128,7 @@
 	/* Set the type of this node (if type == PURPLE_PREF_NONE then do nothing) */
 	if (pref->type == PURPLE_PREF_INT) {
 		xmlnode_set_attrib(node, "type", "int");
-		snprintf(buf, sizeof(buf), "%d", pref->value.integer);
+		g_snprintf(buf, sizeof(buf), "%d", pref->value.integer);
 		xmlnode_set_attrib(node, "value", buf);
 	}
 	else if (pref->type == PURPLE_PREF_STRING) {
@@ -161,7 +161,7 @@
 	}
 	else if (pref->type == PURPLE_PREF_BOOLEAN) {
 		xmlnode_set_attrib(node, "type", "bool");
-		snprintf(buf, sizeof(buf), "%d", pref->value.boolean);
+		g_snprintf(buf, sizeof(buf), "%d", pref->value.boolean);
 		xmlnode_set_attrib(node, "value", buf);
 	}
 
--- a/libpurple/protocols/bonjour/bonjour_ft.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/bonjour/bonjour_ft.c	Sun Jun 28 04:41:07 2009 +0000
@@ -880,7 +880,9 @@
 	purple_proxy_info_set_type(xf->proxy_info, PURPLE_PROXY_SOCKS5);
 	purple_proxy_info_set_host(xf->proxy_info, xf->proxy_host);
 	purple_proxy_info_set_port(xf->proxy_info, xf->proxy_port);
-	xf->proxy_connection = purple_proxy_connect_socks5(NULL, xf->proxy_info,
+	xf->proxy_connection = purple_proxy_connect_socks5(
+							   purple_account_get_connection(account),
+							   xf->proxy_info,
 							   dstaddr, 0,
 							   bonjour_bytestreams_connect_cb, xfer);
 
--- a/libpurple/protocols/bonjour/jabber.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/bonjour/jabber.c	Sun Jun 28 04:41:07 2009 +0000
@@ -926,7 +926,9 @@
 		}
 		purple_proxy_info_set_type(proxy_info, PURPLE_PROXY_NONE);
 
-		connect_data = purple_proxy_connect(NULL, jdata->account,
+		connect_data = purple_proxy_connect(
+						    purple_account_get_connection(jdata->account),
+						    jdata->account,
 						    ip, bb->port_p2pj, _connected_to_buddy, pb);
 
 		if (connect_data == NULL) {
--- a/libpurple/protocols/bonjour/mdns_avahi.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/bonjour/mdns_avahi.c	Sun Jun 28 04:41:07 2009 +0000
@@ -357,14 +357,16 @@
 	AvahiBuddyImplData *idata = buddy->mdns_impl_data;
 
 	switch (event) {
+		case AVAHI_BROWSER_CACHE_EXHAUSTED:
+		case AVAHI_BROWSER_ALL_FOR_NOW:
+			/* Ignore these "meta" informational events */
+			return;
 		case AVAHI_BROWSER_NEW:
 			bonjour_buddy_got_buddy_icon(buddy, rdata, size);
 			break;
 		case AVAHI_BROWSER_REMOVE:
-		case AVAHI_BROWSER_CACHE_EXHAUSTED:
-		case AVAHI_BROWSER_ALL_FOR_NOW:
 		case AVAHI_BROWSER_FAILURE:
-			purple_debug_error("bonjour", "Error rerieving buddy icon record: %s\n",
+			purple_debug_error("bonjour", "Error retrieving buddy icon record: %s\n",
 				avahi_strerror(avahi_client_errno(avahi_record_browser_get_client(b))));
 			break;
 	}
--- a/libpurple/protocols/gg/buddylist.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/gg/buddylist.c	Sun Jun 28 04:41:07 2009 +0000
@@ -40,57 +40,33 @@
 {
 	GGPInfo *info = gc->proto_data;
 	PurpleAccount *account = purple_connection_get_account(gc);
-
-	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleBuddy *buddy;
-	uin_t *userlist = NULL;
-	gchar *types = NULL;
-	int size = 0, ret = 0;
+	GSList *buddies;
+	uin_t *userlist;
+	gchar *types;
+	int i = 0, ret = 0;
+	int size;
 
-	for (gnode = purple_blist_get_root();
-	     gnode != NULL;
-	     gnode = purple_blist_node_get_sibling_next(gnode))
-	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-
-		for (cnode = purple_blist_node_get_first_child(gnode);
-		     cnode != NULL;
-		     cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
+	buddies = purple_find_buddies(account, NULL);
 
-			for (bnode = purple_blist_node_get_first_child(cnode);
-			     bnode != NULL;
-			     bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				const gchar *name = NULL;
-
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-
-				buddy = (PurpleBuddy *)bnode;
+	size = g_slist_length(buddies);
+	userlist = g_new(uin_t, size);
+	types    = g_new(gchar, size);
 
-				if (purple_buddy_get_account(buddy) != account)
-					continue;
-
-				name = purple_buddy_get_name(buddy);
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies), ++i)
+	{
+		PurpleBuddy *buddy = buddies->data;
+		const gchar *name = purple_buddy_get_name(buddy);
 
-				size++;
-				userlist = (uin_t *) g_renew(uin_t, userlist, size);
-				types    = (gchar *) g_renew(gchar, types, size);
-				userlist[size - 1] = ggp_str_to_uin(name);
-				types[size - 1]    = GG_USER_NORMAL;
-				purple_debug_info("gg", "ggp_buddylist_send: adding %d\n",
-						userlist[size - 1]);
-			}
-		}
+		userlist[i] = ggp_str_to_uin(name);
+		types[i]    = GG_USER_NORMAL;
+		purple_debug_info("gg", "ggp_buddylist_send: adding %d\n",
+		                  userlist[i]);
 	}
 
 	ret = gg_notify_ex(info->session, userlist, types, size);
 	purple_debug_info("gg", "send: ret=%d; size=%d\n", ret, size);
-	
+
 	if (userlist) {
 		g_free(userlist);
 		g_free(types);
@@ -178,105 +154,28 @@
 }
 /* }}} */
 
-/* void ggp_buddylist_offline(PurpleConnection *gc) {{{ */
-void ggp_buddylist_offline(PurpleConnection *gc)
-{
-	PurpleAccount *account = purple_connection_get_account(gc);
-	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleBuddy *buddy;
-
-	for (gnode = purple_blist_get_root();
-	     gnode != NULL;
-	     gnode = purple_blist_node_get_sibling_next(gnode))
-	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-
-		for (cnode = purple_blist_node_get_first_child(gnode);
-		     cnode != NULL;
-		     cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-
-			for (bnode = purple_blist_node_get_first_child(cnode);
-			     bnode != NULL;
-			     bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				const gchar *name = NULL;
-
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-
-				buddy = (PurpleBuddy *)bnode;
-				
-				name = purple_buddy_get_name(buddy);
-
-				if (purple_buddy_get_account(buddy) != account)
-					continue;
-
-				purple_prpl_got_user_status(
-					account, name, "offline", NULL);
-
-				purple_debug_info("gg",
-					"ggp_buddylist_offline: gone: %s\n",
-					name);
-			}
-		}
-	}
-}
-/* }}} */
-
 /* char *ggp_buddylist_dump(PurpleAccount *account) {{{ */
 char *ggp_buddylist_dump(PurpleAccount *account)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleGroup *group;
-	PurpleBuddy *buddy;
+	GSList *buddies;
 	GString *buddylist = g_string_sized_new(1024);
 	char *ptr;
 
-	for (gnode = purple_blist_get_root();
-	     gnode != NULL;
-	     gnode = purple_blist_node_get_sibling_next(gnode))
-	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-
-		group = (PurpleGroup *)gnode;
-
-		for (cnode = purple_blist_node_get_first_child(gnode);
-		     cnode != NULL;
-		     cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *buddy = buddies->data;
+		PurpleGroup *group = purple_buddy_get_group(buddy);
+		const char *bname = purple_buddy_get_name(buddy);
+		const char *gname = purple_group_get_name(group);
+		const char *alias = purple_buddy_get_alias(buddy);
 
-			for (bnode = purple_blist_node_get_first_child(cnode);
-			     bnode != NULL;
-			     bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				const gchar *name, *alias, *gname;
-
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-
-				buddy = (PurpleBuddy *)bnode;
-				if (purple_buddy_get_account(buddy) != account)
-					continue;
+		if (alias == NULL)
+			alias = bname;
 
-				name = purple_buddy_get_name(buddy);
-				alias = purple_buddy_get_alias(buddy);
-				if(alias == NULL)
-					alias = name;
-				gname = purple_group_get_name(group);
-
-				g_string_append_printf(buddylist,
-						"%s;%s;%s;%s;%s;%s;%s;%s%s\r\n",
-						alias, alias, alias, alias,
-						"", gname, name, "", "");
-			}
-		}
+		g_string_append_printf(buddylist,
+				"%s;%s;%s;%s;%s;%s;%s;%s%s\r\n",
+				alias, alias, alias, alias,
+				"", gname, bname, "", "");
 	}
 
 	ptr = charset_convert(buddylist->str, "UTF-8", "CP1250");
--- a/libpurple/protocols/gg/buddylist.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/gg/buddylist.h	Sun Jun 28 04:41:07 2009 +0000
@@ -31,7 +31,7 @@
 ggp_buddylist_send(PurpleConnection *gc);
 
 /**
- * Load buddylist from server into the rooster.
+ * Load buddylist from server into the roster.
  *
  * @param gc PurpleConnection
  * @param buddylist Pointer to the buddylist that will be loaded.
@@ -41,14 +41,6 @@
 ggp_buddylist_load(PurpleConnection *gc, char *buddylist);
 
 /**
- * Set offline status for all buddies.
- *
- * @param gc Connection handler
- */
-void
-ggp_buddylist_offline(PurpleConnection *gc);
-
-/**
  * Get all the buddies in the current account.
  *
  * @param account Current account.
--- a/libpurple/protocols/gg/gg.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/gg/gg.c	Sun Jun 28 04:41:07 2009 +0000
@@ -7,6 +7,7 @@
  *
  * Some parts of the code are adapted or taken from the previous implementation
  * of this plugin written by Arkadiusz Miskiewicz <misiek@pld.org.pl>
+ * Some parts Copyright (C) 2009  Krzysztof Klinikowski <grommasher@gmail.com>
  *
  * Thanks to Google's Summer of Code Program.
  *
@@ -36,6 +37,7 @@
 #include "debug.h"
 #include "util.h"
 #include "request.h"
+#include "xmlnode.h"
 
 #include <libgadu.h>
 
@@ -858,6 +860,133 @@
 static void ggp_set_status(PurpleAccount *account, PurpleStatus *status);
 static int ggp_to_gg_status(PurpleStatus *status, char **msg);
 
+struct gg_fetch_avatar_data
+{
+	PurpleConnection *gc;
+	gchar *uin;
+	gchar *avatar_url;
+};
+
+
+static void gg_fetch_avatar_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
+               const gchar *data, size_t len, const gchar *error_message) {
+	struct gg_fetch_avatar_data *d = user_data;
+	PurpleAccount *account;
+	PurpleBuddy *buddy;
+	gpointer buddy_icon_data;
+
+	/* FIXME: This shouldn't be necessary */
+	if (!PURPLE_CONNECTION_IS_VALID(d->gc)) {
+		g_free(d->uin);
+		g_free(d->avatar_url);
+		g_free(d);
+		g_return_if_reached();
+	}
+
+	account = purple_connection_get_account(d->gc);
+	buddy = purple_find_buddy(account, d->uin);
+
+	if (buddy == NULL)
+		goto out;
+
+	buddy_icon_data = g_memdup(data, len);
+
+	purple_buddy_icons_set_for_user(account, purple_buddy_get_name(buddy),
+			buddy_icon_data, len, d->avatar_url);
+	purple_debug_info("gg", "UIN: %s should have avatar now\n", d->uin);
+
+out:
+	g_free(d->uin);
+	g_free(d->avatar_url);
+	g_free(d);
+}
+
+static void gg_get_avatar_url_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data,
+               const gchar *url_text, size_t len, const gchar *error_message) {
+	struct gg_fetch_avatar_data *data;
+	PurpleConnection *gc = user_data;
+	PurpleAccount *account;
+	PurpleBuddy *buddy;
+	const char *uin;
+	const char *is_blank;
+	const char *checksum;
+
+	gchar *bigavatar = NULL;
+	xmlnode *xml = NULL;
+	xmlnode *xmlnode_users;
+	xmlnode *xmlnode_user;
+	xmlnode *xmlnode_avatars;
+	xmlnode *xmlnode_avatar;
+	xmlnode *xmlnode_bigavatar;
+
+	g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc));
+	account = purple_connection_get_account(gc);
+
+	if (error_message != NULL)
+		purple_debug_error("gg", "gg_get_avatars_cb error: %s\n", error_message);
+	else if (len > 0 && url_text && *url_text) {
+		xml = xmlnode_from_str(url_text, -1);
+		if (xml == NULL)
+			goto out;
+
+		xmlnode_users = xmlnode_get_child(xml, "users");
+		if (xmlnode_users == NULL)
+			goto out;
+
+		xmlnode_user = xmlnode_get_child(xmlnode_users, "user");
+		if (xmlnode_user == NULL)
+			goto out;
+
+		uin = xmlnode_get_attrib(xmlnode_user, "uin");
+
+		xmlnode_avatars = xmlnode_get_child(xmlnode_user, "avatars");
+		if (xmlnode_avatars == NULL)
+			goto out;
+
+		xmlnode_avatar = xmlnode_get_child(xmlnode_avatars, "avatar");
+		if (xmlnode_avatar == NULL)
+			goto out;
+
+		xmlnode_bigavatar = xmlnode_get_child(xmlnode_avatar, "bigAvatar");
+		if (xmlnode_bigavatar == NULL)
+			goto out;
+
+		is_blank = xmlnode_get_attrib(xmlnode_avatar, "blank");
+		bigavatar = xmlnode_get_data(xmlnode_bigavatar);
+
+		purple_debug_info("gg", "gg_get_avatar_url_cb: UIN %s, IS_BLANK %s, "
+		                        "URL %s\n",
+		                  uin ? uin : "(null)", is_blank ? is_blank : "(null)",
+		                  bigavatar ? bigavatar : "(null)");
+
+		if (uin != NULL && bigavatar != NULL) {
+			buddy = purple_find_buddy(account, uin);
+			if (buddy == NULL)
+				goto out;
+
+			checksum = purple_buddy_icons_get_checksum_for_user(buddy);
+
+			if (purple_strequal(is_blank, "1")) {
+				purple_buddy_icons_set_for_user(account,
+						purple_buddy_get_name(buddy), NULL, 0, NULL);
+			} else if (!purple_strequal(checksum, bigavatar)) {
+				data = g_new0(struct gg_fetch_avatar_data, 1);
+				data->gc = gc;
+				data->uin = g_strdup(uin);
+				data->avatar_url = g_strdup(bigavatar);
+
+				url_data = purple_util_fetch_url_request_len_with_account(account,
+						bigavatar, TRUE, "Mozilla/4.0 (compatible; MSIE 5.0)",
+						FALSE, NULL, FALSE, -1, gg_fetch_avatar_cb, data);
+			}
+		}
+	}
+
+out:
+	if (xml)
+		xmlnode_free(xml);
+	g_free(bigavatar);
+}
 
 /**
  * Handle change of the status of the buddy.
@@ -873,8 +1002,19 @@
 	gchar *from;
 	const char *st;
 	gchar *msg;
-
-	from = g_strdup_printf("%ld", (unsigned long int)uin);
+	gchar *avatarurl;
+	PurpleUtilFetchUrlData *url_data;
+
+	from = g_strdup_printf("%u", uin);
+	avatarurl = g_strdup_printf("http://api.gadu-gadu.pl/avatars/%s/0.xml", from);
+
+	url_data = purple_util_fetch_url_request_len_with_account(
+			purple_connection_get_account(gc), avatarurl, TRUE,
+			"Mozilla/4.0 (compatible; MSIE 5.5)", FALSE, NULL, FALSE, -1,
+			gg_get_avatar_url_cb, gc);
+
+	g_free(avatarurl);
+
 	switch (status) {
 		case GG_STATUS_NOT_AVAIL:
 		case GG_STATUS_NOT_AVAIL_DESCR:
@@ -931,12 +1071,15 @@
 	purple_debug_info("gg", "ggp_status_by_id: %d\n", id);
 	switch (id) {
 		case GG_STATUS_NOT_AVAIL:
+		case GG_STATUS_NOT_AVAIL_DESCR:
 			st = _("Offline");
 			break;
 		case GG_STATUS_AVAIL:
+		case GG_STATUS_AVAIL_DESCR:
 			st = _("Available");
 			break;
 		case GG_STATUS_BUSY:
+		case GG_STATUS_BUSY_DESCR:
 			st = _("Away");
 			break;
 		default:
@@ -1759,6 +1902,7 @@
 	PurpleStatus *status;
 	struct gg_login_params *glp;
 	GGPInfo *info;
+	const char *address;
 
 	if (ggp_setup_proxy(account) == -1)
 		return;
@@ -1789,6 +1933,26 @@
 	glp->status = ggp_to_gg_status(status, &glp->status_descr);
 	glp->tls = 0;
 
+	address = purple_account_get_string(account, "gg_server", "");
+	if (address && *address) {
+		struct in_addr *addr = gg_gethostbyname(address);
+
+		purple_debug_info("gg", "Using gg server given by user (%s)\n", address);
+
+		if (addr == NULL) {
+			purple_debug_error("gg", "gg_gethostbyname returned error (%d): %s\n",
+			                   errno, g_strerror(errno));
+			purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, /* should this be a settings error? */
+				_("Unable to resolve server"));
+			return;
+		}
+
+		glp->server_addr = inet_addr(inet_ntoa(*addr));
+		glp->server_port = 8074;
+	} else
+		purple_debug_info("gg", "Trying to retrieve address from gg appmsg service\n");
+
 	info->session = gg_login(glp);
 	if (info->session == NULL) {
 		purple_connection_error_reason (gc,
@@ -1837,8 +2001,6 @@
 	if (gc->inpa > 0)
 		purple_input_remove(gc->inpa);
 
-	ggp_buddylist_offline(gc);
-
 	purple_debug_info("gg", "Connection closed.\n");
 }
 
@@ -2369,6 +2531,11 @@
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
 						   option);
 
+	option = purple_account_option_string_new(_("GG server"),
+			"gg_server", "");
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+			option);
+
 	my_protocol = plugin;
 
 	gg_debug_handler = purple_gg_debug_handler;
--- a/libpurple/protocols/irc/cmds.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/irc/cmds.c	Sun Jun 28 04:41:07 2009 +0000
@@ -142,10 +142,10 @@
 		if (purple_conversation_get_type(convo) == PURPLE_CONV_TYPE_CHAT)
 			serv_got_chat_in(gc, purple_conv_chat_get_id(PURPLE_CONV_CHAT(convo)),
 			                 purple_connection_get_display_name(gc),
-			                 0, action, time(NULL));
+			                 PURPLE_MESSAGE_SEND, action, time(NULL));
 		else
 			purple_conv_im_write(PURPLE_CONV_IM(convo), purple_connection_get_display_name(gc),
-			                     action, 0, time(NULL));
+			                     action, PURPLE_MESSAGE_SEND, time(NULL));
 		g_free(action);
 	}
 
--- a/libpurple/protocols/irc/irc.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/irc/irc.c	Sun Jun 28 04:41:07 2009 +0000
@@ -306,7 +306,7 @@
 	if (strpbrk(username, " \t\v\r\n") != NULL) {
 		purple_connection_error_reason (gc,
 			PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
-			_("IRC nicks may not contain whitespace"));
+			_("IRC nick and server may not contain whitespace"));
 		return;
 	}
 
--- a/libpurple/protocols/irc/msgs.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/irc/msgs.c	Sun Jun 28 04:41:07 2009 +0000
@@ -78,7 +78,7 @@
 {
 	PurpleConnection *gc;
 	PurpleStatus *status;
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	GSList *buddies;
 	PurpleAccount *account;
 
 	if ((gc = purple_account_get_connection(irc->account)) == NULL
@@ -97,33 +97,13 @@
 	}
 
 	/* this used to be in the core, but it's not now */
-	for (gnode = purple_blist_get_root();
-	     gnode;
-	     gnode = purple_blist_node_get_sibling_next(gnode))
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies))
 	{
-		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for(cnode = purple_blist_node_get_first_child(gnode);
-		    cnode;
-		    cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for(bnode = purple_blist_node_get_first_child(cnode);
-			    bnode;
-			    bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				PurpleBuddy *b;
-				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				b = (PurpleBuddy *)bnode;
-				if(purple_buddy_get_account(b) == account) {
-					struct irc_buddy *ib = g_new0(struct irc_buddy, 1);
-					ib->name = g_strdup(purple_buddy_get_name(b));
-					g_hash_table_insert(irc->buddies, ib->name, ib);
-				}
-			}
-		}
+		PurpleBuddy *b = buddies->data;
+		struct irc_buddy *ib = g_new0(struct irc_buddy, 1);
+		ib->name = g_strdup(purple_buddy_get_name(b));
+		g_hash_table_insert(irc->buddies, ib->name, ib);
 	}
 
 	irc_blist_timeout(irc);
--- a/libpurple/protocols/jabber/auth.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/auth.c	Sun Jun 28 04:41:07 2009 +0000
@@ -689,6 +689,18 @@
 	JabberIq *iq;
 	xmlnode *query, *username;
 
+	/* We can end up here without encryption if the server doesn't support
+	 * <stream:features/> and we're not using old-style SSL.  If the user
+	 * is requiring SSL/TLS, we need to enforce it.
+	 */
+	if (!jabber_stream_is_ssl(js) &&
+			purple_account_get_bool(purple_connection_get_account(js->gc), "require_tls", FALSE)) {
+		purple_connection_error_reason (js->gc,
+			PURPLE_CONNECTION_ERROR_ENCRYPTION_ERROR,
+			_("You require encryption, but it is not available on this server."));
+		return;
+	}
+
 #ifdef HAVE_CYRUS_SASL
 	/* If we have Cyrus SASL, then passwords will have been set
 	 * to OPTIONAL for this protocol. So, we need to do our own
@@ -977,7 +989,24 @@
 			response = xmlnode_new("response");
 			xmlnode_set_namespace(response, "urn:ietf:params:xml:ns:xmpp-sasl");
 			if (clen > 0) {
-				enc_out = purple_base64_encode((unsigned char*)c_out, clen);
+				/* Cyrus SASL 2.1.22 appears to contain code to add the charset
+				 * to the response for DIGEST-MD5 but there is no possibility
+				 * it will be executed.
+				 *
+				 * My reading of the digestmd5 plugin indicates the username and
+				 * realm are always encoded in UTF-8 (they seem to be the values
+				 * we pass in), so we need to ensure charset=utf-8 is set.
+				 */
+				if (!js->current_mech || !g_str_equal(js->current_mech, "DIGEST-MD5") ||
+						strstr(c_out, ",charset="))
+					/* If we're not using DIGEST-MD5 or Cyrus SASL is fixed */
+					enc_out = purple_base64_encode((unsigned char*)c_out, clen);
+				else {
+					char *tmp = g_strdup_printf("%s,charset=utf-8", c_out);
+					enc_out = purple_base64_encode((unsigned char*)tmp, clen + 14);
+					g_free(tmp);
+				}
+
 				xmlnode_insert_data(response, enc_out, -1);
 				g_free(enc_out);
 			}
--- a/libpurple/protocols/jabber/bosh.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/bosh.c	Sun Jun 28 04:41:07 2009 +0000
@@ -57,7 +57,7 @@
 	/* decoded URL */
 	char *host;
 	int port;
-	char *path; 
+	char *path;
 
 	/* Must be big enough to hold 2^53 - 1 */
 	guint64 rid;
@@ -243,7 +243,7 @@
 	/* Easy solution: Does everyone involved support pipelining? Hooray! Just use
 	 * one TCP connection! */
 	if (conn->pipelining)
-		return conn->connections[0];
+		return conn->connections[0]->ready ? conn->connections[0] : NULL;
 
 	/* First loop, look for a connection that's ready */
 	for (i = 0; i < MAX_HTTP_CONNECTIONS; ++i) {
@@ -267,8 +267,8 @@
 }
 
 static void
-jabber_bosh_connection_send(PurpleBOSHConnection *conn, PurpleBOSHPacketType type,
-                            const char *data)
+jabber_bosh_connection_send(PurpleBOSHConnection *conn,
+                            PurpleBOSHPacketType type, const char *data)
 {
 	PurpleHTTPConnection *chosen;
 	GString *packet = NULL;
@@ -277,14 +277,16 @@
 
 	if (type != PACKET_NORMAL && !chosen) {
 		/*
-		 * For non-ordinary traffic, we don't want to 'buffer' it, so use the first
-		 * connection.
+		 * For non-ordinary traffic, we don't want to 'buffer' it, so use the
+		 * first connection.
 		 */
 		chosen = conn->connections[0];
-	
-		if (!chosen->ready)
-			purple_debug_warning("jabber", "First BOSH connection wasn't ready. Bad "
-					"things may happen.\n");
+
+		if (!chosen->ready) {
+			purple_debug_info("jabber", "Unable to find a ready BOSH "
+					"connection. Ignoring send of type 0x%02x.\n", type);
+			return;
+		}
 	}
 
 	if (type == PACKET_NORMAL && (!chosen ||
@@ -296,12 +298,12 @@
 		 */
 		if (data) {
 			int len = data ? strlen(data) : 0;
-			purple_circ_buffer_append(conn->pending, data, len); 
+			purple_circ_buffer_append(conn->pending, data, len);
 		}
 		return;
 	}
 
-	packet = g_string_new("");
+	packet = g_string_new(NULL);
 
 	g_string_printf(packet, "<body "
 	                "rid='%" G_GUINT64_FORMAT "' "
@@ -349,7 +351,7 @@
 	const char *type;
 
 	type = xmlnode_get_attrib(node, "type");
-	
+
 	if (type != NULL && !strcmp(type, "terminate")) {
 		conn->ready = FALSE;
 		purple_connection_error_reason (conn->js->gc,
@@ -418,7 +420,7 @@
 			jabber_process_packet(js, &child);
 		}
 	} else {
-		purple_debug_warning("jabber", "Received unexepcted empty BOSH packet.\n");	
+		purple_debug_warning("jabber", "Received unexepcted empty BOSH packet.\n");
 	}
 }
 
@@ -448,11 +450,14 @@
 
 	if (version) {
 		const char *dot = strstr(version, ".");
-		int major = atoi(version);
-		int minor = atoi(dot + 1);
+		int major, minor = 0;
 
 		purple_debug_info("jabber", "BOSH connection manager version %s\n", version);
 
+		major = atoi(version);
+		if (dot)
+			minor = atoi(dot + 1);
+
 		if (major != 1 || minor < 6) {
 			purple_connection_error_reason(conn->js->gc,
 			        PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -484,11 +489,11 @@
 	packet = xmlnode_get_child(node, "features");
 	conn->js->use_bosh = TRUE;
 	conn->receive_cb = auth_response_cb;
-	jabber_stream_features_parse(conn->js, packet);		
+	jabber_stream_features_parse(conn->js, packet);
 }
 
 static void jabber_bosh_connection_boot(PurpleBOSHConnection *conn) {
-	GString *buf = g_string_new("");
+	GString *buf = g_string_new(NULL);
 
 	g_string_printf(buf, "<body content='text/xml; charset=utf-8' "
 	                "secure='true' "
@@ -627,13 +632,24 @@
 
 	if (!conn->headers_done) {
 		const char *content_length = purple_strcasestr(cursor, "\r\nContent-Length");
-		const char *end_of_headers = purple_strcasestr(cursor, "\r\n\r\n");
+		const char *end_of_headers = strstr(cursor, "\r\n\r\n");
 
 		/* Make sure Content-Length is in headers, not body */
-		if (content_length && content_length < end_of_headers) {
-			char *sep = strstr(content_length, ": ");
-			int len = atoi(sep + 2);
-			if (len == 0) 
+		if (content_length && (!end_of_headers || content_length < end_of_headers)) {
+			const char *sep;
+			const char *eol;
+			int len;
+
+			if ((sep = strstr(content_length, ": ")) == NULL ||
+					(eol = strstr(sep, "\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);
+			if (len == 0)
 				purple_debug_warning("jabber", "Found mangled Content-Length header.\n");
 
 			conn->body_len = len;
@@ -686,26 +702,24 @@
 	int cnt, count = 0;
 
 	if (!conn->buf)
-		conn->buf = g_string_new("");
+		conn->buf = g_string_new(NULL);
 
-	/* Read once to prime cnt before the loop */
-	if (conn->psc)
-		cnt = purple_ssl_read(conn->psc, buffer, sizeof(buffer));
-	else
-		cnt = read(conn->fd, buffer, sizeof(buffer));
-	while (cnt > 0) {
-		count += cnt;
-		g_string_append_len(conn->buf, buffer, cnt);
-
+	do {
 		if (conn->psc)
 			cnt = purple_ssl_read(conn->psc, buffer, sizeof(buffer));
 		else
 			cnt = read(conn->fd, buffer, sizeof(buffer));
-	}
+
+		if (cnt > 0) {
+			count += cnt;
+			g_string_append_len(conn->buf, buffer, cnt);
+		}
+	} while (cnt > 0);
 
 	if (cnt == 0 || (cnt < 0 && errno != EAGAIN)) {
 		if (cnt < 0)
-			purple_debug_info("jabber", "bosh read=%d, errno=%d\n", cnt, errno);
+			purple_debug_info("jabber", "bosh read=%d, errno=%d, error=%s\n",
+			                  cnt, errno, g_strerror(errno));
 		else
 			purple_debug_info("jabber", "bosh server closed the connection\n");
 
@@ -718,8 +732,8 @@
 		/* Process what we do have */
 	}
 
-
-	jabber_bosh_http_connection_process(conn);
+	if (conn->buf->len > 0)
+		jabber_bosh_http_connection_process(conn);
 }
 
 static void
--- a/libpurple/protocols/jabber/buddy.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.c	Sun Jun 28 04:41:07 2009 +0000
@@ -47,7 +47,7 @@
 	char *jid;
 	GSList *ids;
 	GHashTable *resources;
-	int timeout_handle;
+	guint timeout_handle;
 	GSList *vcard_imgids;
 	PurpleNotifyUserInfo *user_info;
 	long last_seconds;
@@ -69,20 +69,21 @@
 		gboolean create)
 {
 	JabberBuddy *jb;
-	const char *realname;
+	char *realname;
 
 	if (js->buddies == NULL)
 		return NULL;
 
-	if(!(realname = jabber_normalize(js->gc->account, name)))
+	if(!(realname = jabber_get_bare_jid(name)))
 		return NULL;
 
 	jb = g_hash_table_lookup(js->buddies, realname);
 
 	if(!jb && create) {
 		jb = g_new0(JabberBuddy, 1);
-		g_hash_table_insert(js->buddies, g_strdup(realname), jb);
-	}
+		g_hash_table_insert(js->buddies, realname, jb);
+	} else
+		g_free(realname);
 
 	return jb;
 }
@@ -1044,14 +1045,14 @@
 
 	if (!jbi->jb->resources) {
 		/* the buddy is offline */
-		gchar *status = 
-			g_strdup_printf("%s%s%s",	_("Offline"), 
+		gchar *status =
+			g_strdup_printf("%s%s%s",	_("Offline"),
 				jbi->last_message ? ": " : "",
 				jbi->last_message ? jbi->last_message : "");
 		if (jbi->last_seconds > 0) {
 			char *last = purple_str_seconds_to_string(jbi->last_seconds);
 			gchar *message = g_strdup_printf(_("%s ago"), last);
-			purple_notify_user_info_prepend_pair(user_info, 
+			purple_notify_user_info_prepend_pair(user_info,
 				_("Logged off"), message);
 			g_free(last);
 			g_free(message);
@@ -1101,8 +1102,12 @@
 	char *txt, *vcard_hash = NULL;
 
 	if (type == JABBER_IQ_ERROR) {
-		purple_debug_warning("jabber", "Server returned error while retrieving vCard");
-		return;
+		xmlnode *error;
+		purple_debug_warning("jabber", "Server returned error while retrieving vCard\n");
+
+		error = xmlnode_get_child(packet, "error");
+		if (!error || !xmlnode_get_child(error, "item-not-found"))
+			return;
 	}
 
 	if((vcard = xmlnode_get_child(packet, "vCard")) ||
@@ -1460,49 +1465,50 @@
 				if(seconds) {
 					char *end = NULL;
 					long sec = strtol(seconds, &end, 10);
-                    JabberBuddy *jb = NULL;
-                    char *resource = NULL;
-                    char *buddy_name = NULL;
+					JabberBuddy *jb = NULL;
+					char *resource = NULL;
+					char *buddy_name = NULL;
 					JabberBuddyResource *jbr = NULL;
 
-                    if(end != seconds) {
+					if(end != seconds) {
 						JabberBuddyInfoResource *jbir = g_hash_table_lookup(jbi->resources, resource_name);
 						if(jbir) {
 							jbir->idle_seconds = sec;
 						}
 					}
-                    /* Update the idle time of the buddy resource, if we got it. 
-                     This will correct the value when a server doesn't mark 
-                     delayed presence and we got the presence when signing on */
-                    jb = jabber_buddy_find(js, from, FALSE);
-                    if (jb) {
-                        resource = jabber_get_resource(from);
-                        buddy_name = jabber_get_bare_jid(from);
-                        /* if the resource already has an idle time set, we
-                         must have gotten it originally from a presence. In
-                         this case we update it. Otherwise don't update it, to
-                         avoid setting an idle and not getting informed about
-                         the resource getting unidle */
-                        if (resource && buddy_name) {
-                            jbr = jabber_buddy_find_resource(jb, resource);
-                            
-                            if (jbr->idle) {
-                                if (sec) {
-                                    jbr->idle = time(NULL) - sec;
-                                } else {
-                                    jbr->idle = 0;
-                                }
-                            
-                                if (jbr == 
-                                    jabber_buddy_find_resource(jb, NULL)) {
-                                    purple_prpl_got_user_idle(js->gc->account, 
-                                        buddy_name, jbr->idle, jbr->idle);
-                                }
-                            }
-                        }
-                        g_free(resource);
-                        g_free(buddy_name);
-                    }
+					/* Update the idle time of the buddy resource, if we got it.
+					 This will correct the value when a server doesn't mark
+					 delayed presence and we got the presence when signing on */
+					jb = jabber_buddy_find(js, from, FALSE);
+					if (jb) {
+						resource = jabber_get_resource(from);
+						buddy_name = jabber_get_bare_jid(from);
+						/* if the resource already has an idle time set, we
+						 must have gotten it originally from a presence. In
+						 this case we update it. Otherwise don't update it, to
+						 avoid setting an idle and not getting informed about
+						 the resource getting unidle */
+						if (resource && buddy_name) {
+							jbr = jabber_buddy_find_resource(jb, resource);
+							if (jbr) {
+								if (jbr->idle) {
+									if (sec) {
+										jbr->idle = time(NULL) - sec;
+									} else {
+										jbr->idle = 0;
+									}
+
+									if (jbr ==
+										jabber_buddy_find_resource(jb, NULL)) {
+										purple_prpl_got_user_idle(js->gc->account,
+											buddy_name, jbr->idle, jbr->idle);
+									}
+								}
+							}
+						}
+						g_free(resource);
+						g_free(buddy_name);
+					}
 				}
 			}
 		}
@@ -1741,7 +1747,7 @@
 		g_free(full_jid);
 	}
 
-	if (!jb->resources) {
+	if (!jb->resources && strchr(jid, '/') == NULL) {
 		/* user is offline, send a jabber:iq:last to find out last time online */
 		iq = jabber_iq_new_query(js, JABBER_IQ_GET, "jabber:iq:last");
 		xmlnode_set_attrib(iq->node, "to", jid);
@@ -1749,7 +1755,7 @@
 		jbi->ids = g_slist_prepend(jbi->ids, g_strdup(iq->id));
 		jabber_iq_send(iq);
 	}
-	
+
 	js->pending_buddy_info_requests = g_slist_prepend(js->pending_buddy_info_requests, jbi);
 	jbi->timeout_handle = purple_timeout_add_seconds(30, jabber_buddy_get_info_timeout, jbi);
 }
@@ -2500,7 +2506,7 @@
 	if (node)
 		purple_debug_info("jabber", "Found cap: %s\n", cap);
 	else
-		purple_debug_info("jabber", "Cap %s not found\n", cap); 
+		purple_debug_info("jabber", "Cap %s not found\n", cap);
 
 	return (node != NULL);
 }
@@ -2519,3 +2525,22 @@
 	return jabber_resource_has_capability(jbr, cap);
 }
 
+const gchar *
+jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr,
+	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 = 
+				(JabberIdentity *) iter->data;
+		
+			if (strcmp(identity->category, category) == 0) {
+				return identity->type;
+			}
+		}
+	}
+		
+	return NULL;
+}
--- a/libpurple/protocols/jabber/buddy.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/buddy.h	Sun Jun 28 04:41:07 2009 +0000
@@ -123,4 +123,8 @@
 										const gchar *cap);
 gboolean jabber_buddy_has_capability(const JabberBuddy *jb, const gchar *cap);
 
+const gchar *
+jabber_resource_get_identity_category_type(const JabberBuddyResource *jbr,
+	const gchar *category);
+
 #endif /* PURPLE_JABBER_BUDDY_H_ */
--- a/libpurple/protocols/jabber/caps.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/caps.c	Sun Jun 28 04:41:07 2009 +0000
@@ -41,7 +41,7 @@
 
 /**
  *	Processes a query-node and returns a JabberCapsClientInfo object with all relevant info.
- *	
+ *
  *	@param 	query 	A query object.
  *	@return 		A JabberCapsClientInfo object.
  */
@@ -192,7 +192,7 @@
 		xmlnode *feature = xmlnode_new_child(client, "feature");
 		xmlnode_set_attrib(feature, "var", feat);
 	}
-	
+
 	for(iter = props->forms; iter; iter = g_list_next(iter)) {
 		/* FIXME: See #7814 */
 		xmlnode *xdata = iter->data;
@@ -329,7 +329,7 @@
 
 void jabber_caps_init(void)
 {
-	nodetable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_caps_node_exts_unref); 
+	nodetable = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, (GDestroyNotify)jabber_caps_node_exts_unref);
 	capstable = g_hash_table_new_full(jabber_caps_hash, jabber_caps_compare, NULL, (GDestroyNotify)jabber_caps_client_info_destroy);
 	jabber_caps_load();
 }
@@ -534,6 +534,31 @@
 		return;
 	}
 
+	node_exts = (userdata->data->info ? userdata->data->info->exts :
+	                                    userdata->data->node_exts);
+
+	/* TODO: I don't see how this can actually happen, but it crashed khc. */
+	if (!node_exts) {
+		purple_debug_error("jabber", "Couldn't find JabberCapsNodeExts. If you "
+				"see this, please tell darkrain42 and save your debug log.\n"
+				"JabberCapsClientInfo = %p\n", userdata->data->info);
+
+
+		/* Try once more to find the exts and then fail */
+		node_exts = jabber_caps_find_exts_by_node(userdata->data->node);
+		if (node_exts) {
+			purple_debug_info("jabber", "Found the exts on the second try.\n");
+			if (userdata->data->info)
+				userdata->data->info->exts = node_exts;
+			else
+				userdata->data->node_exts = node_exts;
+		} else {
+			cbplususerdata_unref(userdata->data);
+			g_free(userdata);
+			g_return_if_reached();
+		}
+	}
+
 	/* So, we decrement this after checking for an error, which means that
 	 * if there *is* an error, we'll never call the callback passed to
 	 * jabber_caps_get_info. We will still free all of our data, though.
@@ -547,8 +572,6 @@
 			features = g_list_prepend(features, g_strdup(var));
 	}
 
-	node_exts = (userdata->data->info ? userdata->data->info->exts :
-	                                    userdata->data->node_exts);
 	g_hash_table_insert(node_exts->exts, g_strdup(userdata->name), features);
 	schedule_caps_save();
 
@@ -589,9 +612,7 @@
 	}
 
 	userdata = g_new0(jabber_caps_cbplususerdata, 1);
-	/* This ref is given to fetching the basic node#ver info if we need it 
-	 * or unrefed at the bottom of this function */
-	cbplususerdata_ref(userdata);
+	/* We start out with 0 references. Every query takes one */
 	userdata->cb = cb;
 	userdata->cb_data = user_data;
 	userdata->who = g_strdup(who);
@@ -617,6 +638,8 @@
 		g_free(nodever);
 		xmlnode_set_attrib(iq->node, "to", who);
 
+		cbplususerdata_ref(userdata);
+
 		jabber_iq_set_callback(iq, jabber_caps_client_iqcb, userdata);
 		jabber_iq_send(iq);
 	}
@@ -659,7 +682,7 @@
 				jabber_iq_set_callback(iq, jabber_caps_ext_iqcb, cbdata);
 				jabber_iq_send(iq);
 
-				++userdata->extOutstanding;	
+				++userdata->extOutstanding;
 			}
 			exts[i] = NULL;
 		}
@@ -669,6 +692,10 @@
 	}
 
 	if (userdata->info && userdata->extOutstanding == 0) {
+		/* Start with 1 ref so the below functions are happy */
+		userdata->ref = 1;
+
+		/* We have everything we need right now */
 		jabber_caps_get_info_complete(userdata);
 		cbplususerdata_unref(userdata);
 	}
@@ -681,7 +708,7 @@
 	const JabberIdentity *bc;
 	gint cat_cmp;
 	gint typ_cmp;
-	
+
 	ac = a;
 	bc = b;
 
@@ -723,7 +750,7 @@
 
 	aformtype = jabber_caps_get_formtype(aformtypefield);
 	bformtype = jabber_caps_get_formtype(bformtypefield);
-	
+
 	result = strcmp(aformtype, bformtype);
 	g_free(aformtype);
 	g_free(bformtype);
@@ -737,7 +764,7 @@
 
 	if (!query || strcmp(query->xmlns, "http://jabber.org/protocol/disco#info"))
 		return 0;
-	
+
 	info = g_new0(JabberCapsClientInfo, 1);
 
 	for(child = query->child; child; child = child->next) {
@@ -846,7 +873,7 @@
 		char *type = g_markup_escape_text(id->type, -1);
 		char *lang = NULL;
 		char *name = NULL;
-		
+
 		if (id->lang)
 			lang = g_markup_escape_text(id->lang, -1);
 		if (id->name)
@@ -878,7 +905,7 @@
 
 		while (fields) {
 			GList *value;
-			JabberDataFormField *field = (JabberDataFormField*)fields->data; 
+			JabberDataFormField *field = (JabberDataFormField*)fields->data;
 
 			if (strcmp(field->var, "FORM_TYPE")) {
 				/* Append the "var" attribute */
--- a/libpurple/protocols/jabber/chat.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/chat.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1162,5 +1162,59 @@
 	g_free(room_jid);
 }
 
+typedef struct {
+	const gchar *cap;
+	gboolean *all_support;
+	JabberBuddy *jb;
+} JabberChatCapsData;
 
+static void
+jabber_chat_all_participants_have_capability_foreach(gpointer key,
+                                                     gpointer value,
+                                                     gpointer user_data)
+{
+	const gchar *cap = ((JabberChatCapsData *) user_data)->cap;
+	gboolean *all_support = ((JabberChatCapsData *) user_data)->all_support;
+	JabberBuddy *jb = ((JabberChatCapsData *) user_data)->jb;
+	JabberChatMember *member = (JabberChatMember *) value;
+	const gchar *resource = member->handle;
+	JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, resource);
 
+	if (jbr) {
+		*all_support &= jabber_resource_has_capability(jbr, cap);
+	} else {
+		*all_support = FALSE;
+	}
+}
+
+gboolean
+jabber_chat_all_participants_have_capability(const JabberChat *chat,
+	const gchar *cap)
+{
+	gchar *chat_jid = NULL;
+	JabberBuddy *jb = NULL;
+	gboolean all_support = TRUE;
+	JabberChatCapsData data;
+
+	chat_jid = g_strdup_printf("%s@%s", chat->room, chat->server);
+	jb = jabber_buddy_find(chat->js, chat_jid, FALSE);
+
+	if (jb) {
+		data.cap = cap;
+		data.all_support = &all_support;
+		data.jb = jb;
+
+		g_hash_table_foreach(chat->members,
+			jabber_chat_all_participants_have_capability_foreach, &data);
+	} else {
+		all_support = FALSE;
+	}
+	g_free(chat_jid);
+	return all_support;
+}
+
+guint
+jabber_chat_get_num_participants(const JabberChat *chat)
+{
+	return g_hash_table_size(chat->members);
+}
--- a/libpurple/protocols/jabber/chat.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/chat.h	Sun Jun 28 04:41:07 2009 +0000
@@ -95,5 +95,8 @@
 
 char *jabber_roomlist_room_serialize(PurpleRoomlistRoom *room);
 
+gboolean jabber_chat_all_participants_have_capability(const JabberChat *chat,
+	const gchar *cap);
+guint jabber_chat_get_num_participants(const JabberChat *chat);
 
 #endif /* PURPLE_JABBER_CHAT_H_ */
--- a/libpurple/protocols/jabber/data.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/data.c	Sun Jun 28 04:41:07 2009 +0000
@@ -237,7 +237,7 @@
 	remote_data_by_cid = g_hash_table_new_full(g_str_hash, g_str_equal,
 		g_free, jabber_data_delete);
 
-	jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse);	
+	jabber_iq_register_handler("data", XEP_0231_NAMESPACE, jabber_data_parse);
 }
 
 void
--- a/libpurple/protocols/jabber/disco.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/disco.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 /*
- * purple - Jabber Protocol Plugin
+ * purple - Jabber Service Discovery
  *
  * Copyright (C) 2003, Nathan Walp <faceprint@faceprint.com>
  *
@@ -22,6 +22,7 @@
 #include "internal.h"
 #include "prefs.h"
 #include "debug.h"
+#include "request.h"
 
 #include "adhoccommands.h"
 #include "buddy.h"
@@ -40,6 +41,11 @@
 	JabberDiscoInfoCallback *callback;
 };
 
+struct _jabber_disco_items_cb_data {
+	gpointer data;
+	JabberDiscoItemsCallback *callback;
+};
+
 #define SUPPORT_FEATURE(x) { \
 	feature = xmlnode_new_child(query, "feature"); \
 	xmlnode_set_attrib(feature, "var", x); \
@@ -148,14 +154,26 @@
 			 */
 			xmlnode *feature = xmlnode_new_child(query, "feature");
 			xmlnode_set_attrib(feature, "var", "http://www.google.com/xmpp/protocol/voice/v1");
+		} else if (g_str_equal(node, CAPS0115_NODE "#" "video-v1")) {
+			/*
+			 * HUGE HACK! We advertise this ext (see jabber_presence_create_js
+			 * where we add <c/> to the <presence/>) for the Google Talk
+			 * clients that don't actually check disco#info features.
+			 *
+			 * This specific feature is redundant but is what
+			 * node='http://mail.google.com/xmpp/client/caps', ver='1.1'
+			 * advertises as 'video-v1'.
+			 */
+			xmlnode *feature = xmlnode_new_child(query, "feature");
+			xmlnode_set_attrib(feature, "var", "http://www.google.com/xmpp/protocol/video/v1");
 #endif
 		} else {
 			xmlnode *error, *inf;
-				
+
 			/* XXX: gross hack, implement jabber_iq_set_type or something */
 			xmlnode_set_attrib(iq->node, "type", "error");
 			iq->type = JABBER_IQ_ERROR;
-			
+
 			error = xmlnode_new_child(query, "error");
 			xmlnode_set_attrib(error, "code", "404");
 			xmlnode_set_attrib(error, "type", "cancel");
@@ -164,13 +182,42 @@
 		}
 		g_free(node_uri);
 		jabber_iq_send(iq);
-	} else if(type == JABBER_IQ_RESULT) {
+	} else if (type == JABBER_IQ_SET) {
+		/* wtf? seriously. wtf‽ */
+		JabberIq *iq = jabber_iq_new(js, JABBER_IQ_ERROR);
+		xmlnode *error, *bad_request;
+
+		/* Free the <query/> */
+		xmlnode_free(xmlnode_get_child(iq->node, "query"));
+		/* Add an error */
+		error = xmlnode_new_child(iq->node, "error");
+		xmlnode_set_attrib(error, "type", "modify");
+		bad_request = xmlnode_new_child(error, "bad-request");
+		xmlnode_set_namespace(bad_request, "urn:ietf:params:xml:ns:xmpp-stanzas");
+
+		jabber_iq_set_id(iq, id);
+		xmlnode_set_attrib(iq->node, "to", from);
+
+		jabber_iq_send(iq);
+	}
+}
+
+static void jabber_disco_info_cb(JabberStream *js, const char *from,
+                                 JabberIqType type, const char *id,
+                                 xmlnode *packet, gpointer data)
+{
+	struct _jabber_disco_info_cb_data *jdicd = data;
+	xmlnode *query;
+
+	query = xmlnode_get_child_with_namespace(packet, "query",
+				"http://jabber.org/protocol/disco#info");
+
+	if (type == JABBER_IQ_RESULT && query) {
 		xmlnode *child;
 		JabberID *jid;
 		JabberBuddy *jb;
 		JabberBuddyResource *jbr = NULL;
 		JabberCapabilities capabilities = JABBER_CAP_NONE;
-		struct _jabber_disco_info_cb_data *jdicd;
 
 		if((jid = jabber_id_new(from))) {
 			if(jid->resource && (jb = jabber_buddy_find(js, from, TRUE)))
@@ -181,7 +228,7 @@
 		if(jbr)
 			capabilities = jbr->capabilities;
 
-		for(child = in_query->child; child; child = child->next) {
+		for(child = query->child; child; child = child->next) {
 			if(child->type != XMLNODE_TYPE_TAG)
 				continue;
 
@@ -233,6 +280,8 @@
 					capabilities |= JABBER_CAP_IQ_REGISTER;
 				else if(!strcmp(var, "urn:xmpp:ping"))
 					capabilities |= JABBER_CAP_PING;
+				else if(!strcmp(var, "http://jabber.org/protocol/disco#items"))
+					capabilities |= JABBER_CAP_ITEMS;
 				else if(!strcmp(var, "http://jabber.org/protocol/commands")) {
 					capabilities |= JABBER_CAP_ADHOC;
 				}
@@ -248,19 +297,12 @@
 		if(jbr)
 			jbr->capabilities = capabilities;
 
-		if((jdicd = g_hash_table_lookup(js->disco_callbacks, from))) {
-			jdicd->callback(js, from, capabilities, jdicd->data);
-			g_hash_table_remove(js->disco_callbacks, from);
-		}
-	} else if(type == JABBER_IQ_ERROR) {
+		jdicd->callback(js, from, capabilities, jdicd->data);
+	} else { /* type == JABBER_IQ_ERROR or query == NULL */
 		JabberID *jid;
 		JabberBuddy *jb;
 		JabberBuddyResource *jbr = NULL;
 		JabberCapabilities capabilities = JABBER_CAP_NONE;
-		struct _jabber_disco_info_cb_data *jdicd;
-
-		if(!(jdicd = g_hash_table_lookup(js->disco_callbacks, from)))
-			return;
 
 		if((jid = jabber_id_new(from))) {
 			if(jid->resource && (jb = jabber_buddy_find(js, from, TRUE)))
@@ -272,7 +314,6 @@
 			capabilities = jbr->capabilities;
 
 		jdicd->callback(js, from, capabilities, jdicd->data);
-		g_hash_table_remove(js->disco_callbacks, from);
 	}
 }
 
@@ -517,10 +558,10 @@
 	jdicd->data = data;
 	jdicd->callback = callback;
 
-	g_hash_table_insert(js->disco_callbacks, g_strdup(who), jdicd);
-
 	iq = jabber_iq_new_query(js, JABBER_IQ_GET, "http://jabber.org/protocol/disco#info");
 	xmlnode_set_attrib(iq->node, "to", who);
 
+	jabber_iq_set_callback(iq, jabber_disco_info_cb, jdicd);
 	jabber_iq_send(iq);
 }
+
--- a/libpurple/protocols/jabber/disco.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/disco.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 /**
- * @file iq.h JabberID handlers
+ * @file disco.h Jabber Service Discovery
  *
  * purple
  *
@@ -24,9 +24,18 @@
 
 #include "jabber.h"
 
+typedef struct _JabberDiscoItem {
+	const char *jid;  /* MUST */
+	const char *node; /* SHOULD */
+	const char *name; /* MAY */
+} JabberDiscoItem;
+
 typedef void (JabberDiscoInfoCallback)(JabberStream *js, const char *who,
 		JabberCapabilities capabilities, gpointer data);
 
+typedef void (JabberDiscoItemsCallback)(JabberStream *js, const char *jid,
+		const char *node, GSList *items, gpointer data);
+
 void jabber_disco_info_parse(JabberStream *js, const char *from,
                              JabberIqType type, const char *id, xmlnode *in_query);
 void jabber_disco_items_parse(JabberStream *js, const char *from,
--- a/libpurple/protocols/jabber/google.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/google.c	Sun Jun 28 04:41:07 2009 +0000
@@ -36,6 +36,9 @@
 
 #ifdef USE_VV
 
+#define NS_GOOGLE_VIDEO "http://www.google.com/session/video"
+#define NS_GOOGLE_PHONE "http://www.google.com/session/phone"
+
 typedef struct {
 	char *id;
 	char *initiator;
@@ -53,16 +56,17 @@
 	GoogleSessionId id;
 	GoogleSessionState state;
 	PurpleMedia *media;
-	JabberStream *js; 
+	JabberStream *js;
 	char *remote_jid;
+	gboolean video;
 } GoogleSession;
 
-static gboolean 
+static gboolean
 google_session_id_equal(gconstpointer a, gconstpointer b)
 {
 	GoogleSessionId *c = (GoogleSessionId*)a;
 	GoogleSessionId *d = (GoogleSessionId*)b;
-	
+
 	return !strcmp(c->id, d->id) && !strcmp(c->initiator, d->initiator);
 }
 
@@ -95,18 +99,22 @@
 	xmlnode_set_attrib(iq->node, "to", session->remote_jid);
 	sess = google_session_create_xmlnode(session, "terminate");
 	xmlnode_insert_child(iq->node, sess);
-	
+
 	jabber_iq_send(iq);
 	google_session_destroy(session);
 }
 
-static void 
+static void
 google_session_send_candidates(PurpleMedia *media, gchar *session_id,
 		gchar *participant, GoogleSession *session)
 {
-	GList *candidates = purple_media_get_local_candidates(session->media, "google-voice",
-							      session->remote_jid);
+	GList *candidates = purple_media_get_local_candidates(
+			session->media, session_id, session->remote_jid);
 	PurpleMediaCandidate *transport;
+	gboolean video = FALSE;
+
+	if (!strcmp(session_id, "google-video"))
+		video = TRUE;
 
 	for (;candidates;candidates = candidates->next) {
 		JabberIq *iq;
@@ -114,11 +122,10 @@
 		PurpleMediaCandidateType type;
 		xmlnode *sess;
 		xmlnode *candidate;
+		guint component_id;
 		transport = (PurpleMediaCandidate*)(candidates->data);
-
-		if (purple_media_candidate_get_component_id(transport)
-				!= PURPLE_MEDIA_COMPONENT_RTP)
-			continue;
+		component_id = purple_media_candidate_get_component_id(
+				transport);
 
 		iq = jabber_iq_new(session->js, JABBER_IQ_SET);
 		sess = google_session_create_xmlnode(session, "candidates");
@@ -139,7 +146,11 @@
 
 		xmlnode_set_attrib(candidate, "address", ip);
 		xmlnode_set_attrib(candidate, "port", port);
-		xmlnode_set_attrib(candidate, "name", "rtp");
+		xmlnode_set_attrib(candidate, "name",
+				component_id == PURPLE_MEDIA_COMPONENT_RTP ?
+				video ? "video_rtp" : "rtp" :
+				component_id == PURPLE_MEDIA_COMPONENT_RTCP ?
+				video ? "video_rtcp" : "rtcp" : "none");
 		xmlnode_set_attrib(candidate, "username", username);
 		/*
 		 * As of this writing, Farsight 2 in Google compatibility
@@ -205,13 +216,38 @@
 			google_session_send_candidates(session->media,
 					"google-voice", session->remote_jid,
 					session);
+			google_session_send_candidates(session->media,
+					"google-video", session->remote_jid,
+					session);
 			xmlnode_set_attrib(iq->node, "to", session->remote_jid);
 			xmlnode_set_attrib(iq->node, "from", me);
 			sess = google_session_create_xmlnode(session, "accept");
 		}
 		xmlnode_insert_child(iq->node, sess);
 		desc = xmlnode_new_child(sess, "description");
-		xmlnode_set_namespace(desc, "http://www.google.com/session/phone");
+		if (session->video)
+			xmlnode_set_namespace(desc, NS_GOOGLE_VIDEO);
+		else
+			xmlnode_set_namespace(desc, NS_GOOGLE_PHONE);
+
+		codecs = purple_media_get_codecs(media, "google-video");
+
+		for (iter = codecs; iter; iter = g_list_next(iter)) {
+			PurpleMediaCodec *codec = (PurpleMediaCodec*)iter->data;
+			gchar *id = g_strdup_printf("%d",
+					purple_media_codec_get_id(codec));
+			gchar *encoding_name =
+					purple_media_codec_get_encoding_name(codec);
+			payload = xmlnode_new_child(desc, "payload-type");
+			xmlnode_set_attrib(payload, "id", id);
+			xmlnode_set_attrib(payload, "name", encoding_name);
+			xmlnode_set_attrib(payload, "width", "320");
+			xmlnode_set_attrib(payload, "height", "200");
+			xmlnode_set_attrib(payload, "framerate", "30");
+			g_free(encoding_name);
+			g_free(id);
+		}
+		purple_media_codec_list_free(codecs);
 
 		codecs = purple_media_get_codecs(media, "google-voice");
 
@@ -224,8 +260,17 @@
 			gchar *clock_rate = g_strdup_printf("%d",
 					purple_media_codec_get_clock_rate(codec));
 			payload = xmlnode_new_child(desc, "payload-type");
+			if (session->video)
+				xmlnode_set_namespace(payload, NS_GOOGLE_PHONE);
 			xmlnode_set_attrib(payload, "id", id);
-			xmlnode_set_attrib(payload, "name", encoding_name);
+			/*
+			 * Hack to make Gmail accept speex as the codec.
+			 * It shouldn't have to be case sensitive.
+			 */
+			if (purple_strequal(encoding_name, "SPEEX"))
+				xmlnode_set_attrib(payload, "name", "speex");
+			else
+				xmlnode_set_attrib(payload, "name", encoding_name);
 			xmlnode_set_attrib(payload, "clockrate", clock_rate);
 			g_free(clock_rate);
 			g_free(encoding_name);
@@ -235,10 +280,14 @@
 
 		jabber_iq_send(iq);
 
-		if (is_initiator)
+		if (is_initiator) {
 			google_session_send_candidates(session->media,
 					"google-voice", session->remote_jid,
 					session);
+			google_session_send_candidates(session->media,
+					"google-video", session->remote_jid,
+					session);
+		}
 
 		g_signal_handlers_disconnect_by_func(G_OBJECT(session->media),
 				G_CALLBACK(google_session_ready), session);
@@ -339,6 +388,9 @@
 	session->js = js;
 	session->remote_jid = jid;
 
+	if (type & PURPLE_MEDIA_VIDEO)
+		session->video = TRUE;
+
 	session->media = purple_media_manager_create_media(
 			purple_media_manager_get(),
 			purple_connection_get_account(js->gc),
@@ -349,8 +401,12 @@
 	params = jabber_google_session_get_params(js, &num_params);
 
 	if (purple_media_add_stream(session->media, "google-voice",
-				session->remote_jid, PURPLE_MEDIA_AUDIO,
-				TRUE, "nice", num_params, params) == FALSE) {
+			session->remote_jid, PURPLE_MEDIA_AUDIO,
+			TRUE, "nice", num_params, params) == FALSE ||
+			(session->video && purple_media_add_stream(
+			session->media, "google-video",
+			session->remote_jid, PURPLE_MEDIA_VIDEO,
+			TRUE, "nice", num_params, params) == FALSE)) {
 		purple_media_error(session->media, "Error adding stream.");
 		purple_media_stream_info(session->media,
 				PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE);
@@ -378,18 +434,31 @@
 google_session_handle_initiate(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id)
 {
 	JabberIq *result;
-	GList *codecs = NULL;
+	GList *codecs = NULL, *video_codecs = NULL;
 	xmlnode *desc_element, *codec_element;
 	PurpleMediaCodec *codec;
-	const char *id, *encoding_name,  *clock_rate;
+	const char *xmlns;
 	GParameter *params;
-	guint num_params;	
+	guint num_params;
 
 	if (session->state != UNINIT) {
 		purple_debug_error("jabber", "Received initiate for active session.\n");
 		return;
 	}
 
+	desc_element = xmlnode_get_child(sess, "description");
+	xmlns = xmlnode_get_namespace(desc_element);
+
+	if (purple_strequal(xmlns, NS_GOOGLE_PHONE))
+		session->video = FALSE;
+	else if (purple_strequal(xmlns, NS_GOOGLE_VIDEO))
+		session->video = TRUE;
+	else {
+		purple_debug_error("jabber", "Received initiate with "
+				"invalid namespace %s.\n", xmlns);
+		return;
+	}
+
 	session->media = purple_media_manager_create_media(
 			purple_media_manager_get(),
 			purple_connection_get_account(js->gc),
@@ -401,7 +470,11 @@
 
 	if (purple_media_add_stream(session->media, "google-voice",
 			session->remote_jid, PURPLE_MEDIA_AUDIO, FALSE,
-			"nice", num_params, params) == FALSE) {
+			"nice", num_params, params) == FALSE ||
+			(session->video && purple_media_add_stream(
+			session->media, "google-video",
+			session->remote_jid, PURPLE_MEDIA_VIDEO,
+			FALSE, "nice", num_params, params) == FALSE)) {
 		purple_media_error(session->media, "Error adding stream.");
 		purple_media_stream_info(session->media,
 				PURPLE_MEDIA_INFO_HANGUP, NULL, NULL, TRUE);
@@ -412,23 +485,55 @@
 
 	g_free(params);
 
-	desc_element = xmlnode_get_child(sess, "description");
+	for (codec_element = xmlnode_get_child(desc_element, "payload-type");
+	     codec_element; codec_element = codec_element->next) {
+		const char *id, *encoding_name,  *clock_rate,
+				*width, *height, *framerate;
+		gboolean video;
+		if (codec_element->name &&
+				strcmp(codec_element->name, "payload-type"))
+			continue;
 
-	for (codec_element = xmlnode_get_child(desc_element, "payload-type"); 
-	     codec_element; 
-	     codec_element = xmlnode_get_next_twin(codec_element)) {
+		xmlns = xmlnode_get_namespace(codec_element);
 		encoding_name = xmlnode_get_attrib(codec_element, "name");
 		id = xmlnode_get_attrib(codec_element, "id");
-		clock_rate = xmlnode_get_attrib(codec_element, "clockrate");
+
+		if (!session->video ||
+				(xmlns && !strcmp(xmlns, NS_GOOGLE_PHONE))) {
+			clock_rate = xmlnode_get_attrib(
+					codec_element, "clockrate");
+			video = FALSE;
+		} else {
+			width = xmlnode_get_attrib(codec_element, "width");
+			height = xmlnode_get_attrib(codec_element, "height");
+			framerate = xmlnode_get_attrib(
+					codec_element, "framerate");
+			clock_rate = "90000";
+			video = TRUE;
+		}
 
 		if (id) {
-			codec = purple_media_codec_new(atoi(id), encoding_name, PURPLE_MEDIA_AUDIO,
-					     clock_rate ? atoi(clock_rate) : 0);
-			codecs = g_list_append(codecs, codec);
+			codec = purple_media_codec_new(atoi(id), encoding_name,
+					video ?	PURPLE_MEDIA_VIDEO :
+					PURPLE_MEDIA_AUDIO,
+					clock_rate ? atoi(clock_rate) : 0);
+			if (video)
+				video_codecs = g_list_append(
+						video_codecs, codec);
+			else
+				codecs = g_list_append(codecs, codec);
 		}
 	}
 
-	purple_media_set_remote_codecs(session->media, "google-voice", session->remote_jid, codecs);
+	if (codecs)
+		purple_media_set_remote_codecs(session->media, "google-voice",
+				session->remote_jid, codecs);
+	if (video_codecs)
+		purple_media_set_remote_codecs(session->media, "google-video",
+				session->remote_jid, video_codecs);
+
+	purple_media_codec_list_free(codecs);
+	purple_media_codec_list_free(video_codecs);
 
 	g_signal_connect_swapped(G_OBJECT(session->media), "accepted",
 			G_CALLBACK(google_session_ready), session);
@@ -442,31 +547,32 @@
 	g_signal_connect(G_OBJECT(session->media), "stream-info",
 			G_CALLBACK(google_session_stream_info_cb), session);
 
-	purple_media_codec_list_free(codecs);
-
 	result = jabber_iq_new(js, JABBER_IQ_RESULT);
 	jabber_iq_set_id(result, iq_id);
 	xmlnode_set_attrib(result->node, "to", session->remote_jid);
 	jabber_iq_send(result);
 }
 
-static void 
+static void
 google_session_handle_candidates(JabberStream  *js, GoogleSession *session, xmlnode *sess, const char *iq_id)
 {
 	JabberIq *result;
-	GList *list = NULL;
+	GList *list = NULL, *video_list = NULL;
 	xmlnode *cand;
 	static int name = 0;
-	char n[4];	
-		
-	for (cand = xmlnode_get_child(sess, "candidate"); cand; cand = xmlnode_get_next_twin(cand)) {
+	char n[4];
+
+	for (cand = xmlnode_get_child(sess, "candidate"); cand;
+			cand = xmlnode_get_next_twin(cand)) {
 		PurpleMediaCandidate *info;
+		const gchar *cname = xmlnode_get_attrib(cand, "name");
 		const gchar *type = xmlnode_get_attrib(cand, "type");
 		const gchar *protocol = xmlnode_get_attrib(cand, "protocol");
 		const gchar *address = xmlnode_get_attrib(cand, "address");
 		const gchar *port = xmlnode_get_attrib(cand, "port");
+		guint component_id;
 
-		if (type && address && port) {
+		if (cname && type && address && port) {
 			PurpleMediaCandidateType candidate_type;
 
 			g_snprintf(n, sizeof(n), "S%d", name++);
@@ -480,7 +586,13 @@
 			else
 				candidate_type = PURPLE_MEDIA_CANDIDATE_TYPE_HOST;
 
-			info = purple_media_candidate_new(n, PURPLE_MEDIA_COMPONENT_RTP,
+			if (purple_strequal(cname, "rtcp") ||
+					purple_strequal(cname, "video_rtcp"))
+				component_id = PURPLE_MEDIA_COMPONENT_RTCP;
+			else
+				component_id = PURPLE_MEDIA_COMPONENT_RTP;
+
+			info = purple_media_candidate_new(n, component_id,
 					candidate_type,
 					purple_strequal(protocol, "udp") ?
 							PURPLE_MEDIA_NETWORK_PROTOCOL_UDP :
@@ -489,12 +601,23 @@
 					atoi(port));
 			g_object_set(info, "username", xmlnode_get_attrib(cand, "username"),
 					"password", xmlnode_get_attrib(cand, "password"), NULL);
-			list = g_list_append(list, info);
+			if (!strncmp(cname, "video_", 6))
+				video_list = g_list_append(video_list, info);
+			else
+				list = g_list_append(list, info);
 		}
 	}
 
-	purple_media_add_remote_candidates(session->media, "google-voice", session->remote_jid, list);
+	if (list)
+		purple_media_add_remote_candidates(
+				session->media, "google-voice",
+				session->remote_jid, list);
+	if (video_list)
+		purple_media_add_remote_candidates(
+				session->media, "google-video",
+				session->remote_jid, video_list);
 	purple_media_candidate_list_free(list);
+	purple_media_candidate_list_free(video_list);
 
 	result = jabber_iq_new(js, JABBER_IQ_RESULT);
 	jabber_iq_set_id(result, iq_id);
@@ -506,28 +629,57 @@
 google_session_handle_accept(JabberStream *js, GoogleSession *session, xmlnode *sess, const char *iq_id)
 {
 	xmlnode *desc_element = xmlnode_get_child(sess, "description");
-	xmlnode *codec_element = xmlnode_get_child(desc_element, "payload-type");
-	GList *codecs = NULL;
+	xmlnode *codec_element = xmlnode_get_child(
+			desc_element, "payload-type");
+	GList *codecs = NULL, *video_codecs = NULL;
 	JabberIq *result = NULL;
+	const gchar *xmlns = xmlnode_get_namespace(desc_element);
+	gboolean video = (xmlns && !strcmp(xmlns, NS_GOOGLE_VIDEO));
+
+	for (; codec_element; codec_element = codec_element->next) {
+		const gchar *xmlns, *encoding_name, *id,
+				*clock_rate, *width, *height, *framerate;
+		gboolean video_codec = FALSE;
+
+		if (!purple_strequal(codec_element->name, "payload-type"))
+			continue;
 
-	for (; codec_element; codec_element =
-			xmlnode_get_next_twin(codec_element)) {
-		const gchar *encoding_name =
-				xmlnode_get_attrib(codec_element, "name");
-		const gchar *id = xmlnode_get_attrib(codec_element, "id");
-		const gchar *clock_rate =
-				xmlnode_get_attrib(codec_element, "clockrate");
+		xmlns = xmlnode_get_namespace(codec_element);
+		encoding_name =	xmlnode_get_attrib(codec_element, "name");
+		id = xmlnode_get_attrib(codec_element, "id");
+
+		if (!video || purple_strequal(xmlns, NS_GOOGLE_PHONE))
+			clock_rate = xmlnode_get_attrib(
+					codec_element, "clockrate");
+		else {
+			clock_rate = "90000";
+			width = xmlnode_get_attrib(codec_element, "width");
+			height = xmlnode_get_attrib(codec_element, "height");
+			framerate = xmlnode_get_attrib(
+					codec_element, "framerate");
+			video_codec = TRUE;
+		}
 
 		if (id && encoding_name) {
-			PurpleMediaCodec *codec = purple_media_codec_new(atoi(id),
-					encoding_name, PURPLE_MEDIA_AUDIO,
+			PurpleMediaCodec *codec = purple_media_codec_new(
+					atoi(id), encoding_name,
+					video_codec ? PURPLE_MEDIA_VIDEO :
+					PURPLE_MEDIA_AUDIO,
 					clock_rate ? atoi(clock_rate) : 0);
-			codecs = g_list_append(codecs, codec);
+			if (video_codec)
+				video_codecs = g_list_append(
+						video_codecs, codec);
+			else
+				codecs = g_list_append(codecs, codec);
 		}
 	}
 
-	purple_media_set_remote_codecs(session->media, "google-voice",
-			session->remote_jid, codecs);
+	if (codecs)
+		purple_media_set_remote_codecs(session->media, "google-voice",
+				session->remote_jid, codecs);
+	if (video_codecs)
+		purple_media_set_remote_codecs(session->media, "google-video",
+				session->remote_jid, video_codecs);
 
 	purple_media_stream_info(session->media, PURPLE_MEDIA_INFO_ACCEPT,
 			NULL, NULL, FALSE);
@@ -638,7 +790,6 @@
 	const char *to, *url;
 	const char *in_str;
 	char *to_name;
-	char *default_tos[1];
 
 	int i, count = 1, returned_count;
 
@@ -658,14 +809,20 @@
 
 	/* If Gmail doesn't tell us who the mail is to, let's use our JID */
 	to = xmlnode_get_attrib(packet, "to");
-	default_tos[0] = jabber_get_bare_jid(to);
 
 	message = xmlnode_get_child(child, "mail-thread-info");
 
 	if (count == 0 || !message) {
-		if (count > 0)
-			purple_notify_emails(js->gc, count, FALSE, NULL, NULL, (const char**) default_tos, NULL, NULL, NULL);
-		g_free(default_tos[0]);
+		if (count > 0) {
+			char *bare_jid = jabber_get_bare_jid(to);
+			const char *default_tos[2] = { bare_jid };
+
+			purple_notify_emails(js->gc, count, FALSE, NULL, NULL, default_tos, NULL, NULL, NULL);
+			g_free(bare_jid);
+		} else {
+			purple_notify_emails(js->gc, count, FALSE, NULL, NULL, NULL, NULL, NULL, NULL);
+		}
+
 		return;
 	}
 
@@ -673,10 +830,10 @@
 	 * accordingly */
 	for (returned_count = 0; message; returned_count++, message=xmlnode_get_next_twin(message));
 
-	froms    = g_new0(const char* , returned_count);
-	tos      = g_new0(const char* , returned_count);
-	subjects = g_new0(char* , returned_count);
-	urls     = g_new0(const char* , returned_count);
+	froms    = g_new0(const char* , returned_count + 1);
+	tos      = g_new0(const char* , returned_count + 1);
+	subjects = g_new0(char* , returned_count + 1);
+	urls     = g_new0(const char* , returned_count + 1);
 
 	to = xmlnode_get_attrib(packet, "to");
 	to_name = jabber_get_bare_jid(to);
@@ -726,16 +883,12 @@
 	if (i>0)
 		purple_notify_emails(js->gc, count, count == i, (const char**) subjects, froms, tos,
 				urls, NULL, NULL);
-	else
-		purple_notify_emails(js->gc, count, FALSE, NULL, NULL, (const char**) default_tos, NULL, NULL, NULL);
-
 
 	g_free(to_name);
 	g_free(tos);
-	g_free(default_tos[0]);
 	g_free(froms);
-	for (; i > 0; i--)
-		g_free(subjects[i - 1]);
+	for (i = 0; i < returned_count; i++)
+		g_free(subjects[i]);
 	g_free(subjects);
 	g_free(urls);
 
@@ -763,7 +916,8 @@
 
 	/* Acknowledge the notification */
 	iq = jabber_iq_new(js, JABBER_IQ_RESULT);
-	xmlnode_set_attrib(iq->node, "to", from);
+	if (from)
+		xmlnode_set_attrib(iq->node, "to", from);
 	xmlnode_set_attrib(iq->node, "id", id);
 	jabber_iq_send(iq);
 
@@ -1137,7 +1291,7 @@
 }
 
 static void
-jabber_google_stun_lookup_cb(GSList *hosts, gpointer data, 
+jabber_google_stun_lookup_cb(GSList *hosts, gpointer data,
 	const char *error_message)
 {
 	JabberStream *js = (JabberStream *) data;
@@ -1150,16 +1304,16 @@
 	}
 
 	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];
 		int port;
 
 		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));
 			port = ntohs(((struct sockaddr_in6 *) addr)->sin6_port);
 		} 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));
 			port = ntohs(((struct sockaddr_in *) addr)->sin_port);
 		}
@@ -1224,12 +1378,12 @@
 
 			if (host && udp) {
 				int port = atoi(udp);
-				/* if there, would already be an ongoing query, 
+				/* if there, would already be an ongoing query,
 				 cancel it */
 				if (js->stun_query)
 					purple_dnsquery_destroy(js->stun_query);
 
-				js->stun_query = purple_dnsquery_a(host, port, 
+				js->stun_query = purple_dnsquery_a(host, port,
 					jabber_google_stun_lookup_cb, js);
 			}
 		}
@@ -1263,7 +1417,7 @@
 void
 jabber_google_send_jingle_info(JabberStream *js)
 {
-	JabberIq *jingle_info = 
+	JabberIq *jingle_info =
 		jabber_iq_new_query(js, JABBER_IQ_GET, GOOGLE_JINGLE_INFO_NAMESPACE);
 
 	jabber_iq_set_callback(jingle_info, jabber_google_jingle_info_cb,
--- a/libpurple/protocols/jabber/google.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/google.h	Sun Jun 28 04:41:07 2009 +0000
@@ -28,6 +28,7 @@
 #include "media.h"
 
 #define GOOGLE_VOICE_CAP "http://www.google.com/xmpp/protocol/voice/v1"
+#define GOOGLE_VIDEO_CAP "http://www.google.com/xmpp/protocol/video/v1"
 #define GOOGLE_JINGLE_INFO_NAMESPACE "google:jingleinfo"
 
 void jabber_gmail_init(JabberStream *js);
--- a/libpurple/protocols/jabber/iq.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/iq.c	Sun Jun 28 04:41:07 2009 +0000
@@ -42,7 +42,7 @@
 #endif
 
 GHashTable *iq_handlers = NULL;
-
+GHashTable *signal_iq_handlers = NULL;
 
 JabberIq *jabber_iq_new(JabberStream *js, JabberIqType type)
 {
@@ -289,6 +289,16 @@
 	const char *xmlns;
 	const char *iq_type, *id, *from;
 	JabberIqType type = JABBER_IQ_NONE;
+	gboolean signal_return;
+
+	from = xmlnode_get_attrib(packet, "from");
+	id = xmlnode_get_attrib(packet, "id");
+	iq_type = xmlnode_get_attrib(packet, "type");
+
+	signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin,
+			"jabber-receiving-iq", js->gc, iq_type, id, from, packet));
+	if (signal_return)
+		return;
 
 	/*
 	 * child will be either the first tag child or NULL if there is no child.
@@ -301,10 +311,6 @@
 			break;
 	}
 
-	iq_type = xmlnode_get_attrib(packet, "type");
-	from = xmlnode_get_attrib(packet, "from");
-	id = xmlnode_get_attrib(packet, "id");
-
 	if (iq_type) {
 		if (!strcmp(iq_type, "get"))
 			type = JABBER_IQ_GET;
@@ -361,12 +367,23 @@
 		}
 	}
 
-	/* Apparently not, so lets see if we have a pre-defined handler */
+	/*
+	 * Apparently not, so let's see if we have a pre-defined handler
+	 * or if an outside plugin is interested.
+	 */
 	if(child && (xmlns = xmlnode_get_namespace(child))) {
 		char *key = g_strdup_printf("%s %s", child->name, xmlns);
 		JabberIqHandler *jih = g_hash_table_lookup(iq_handlers, key);
+		int signal_ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key));
 		g_free(key);
 
+		if (signal_ref > 0) {
+			signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin, "jabber-watched-iq",
+					js->gc, iq_type, id, from, child));
+			if (signal_return)
+				return;
+		}
+
 		if(jih) {
 			jih(js, from, type, id, child);
 			return;
@@ -408,9 +425,48 @@
 	g_hash_table_replace(iq_handlers, key, handlerfunc);
 }
 
+void jabber_iq_signal_register(const gchar *node, const gchar *xmlns)
+{
+	gchar *key;
+	int ref;
+
+	g_return_if_fail(node != NULL && *node != '\0');
+	g_return_if_fail(xmlns != NULL && *xmlns != '\0');
+
+	key = g_strdup_printf("%s %s", node, xmlns);
+	ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key));
+	if (ref == 0) {
+		g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(1));
+	} else {
+		g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref + 1));
+		g_free(key);
+	}
+}
+
+void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns)
+{
+	gchar *key;
+	int ref;
+
+	g_return_if_fail(node != NULL && *node != '\0');
+	g_return_if_fail(xmlns != NULL && *xmlns != '\0');
+
+	key = g_strdup_printf("%s %s", node, xmlns);
+	ref = GPOINTER_TO_INT(g_hash_table_lookup(signal_iq_handlers, key));
+
+	if (ref == 1) {
+		g_hash_table_remove(signal_iq_handlers, key);
+	} else if (ref > 1) {
+		g_hash_table_insert(signal_iq_handlers, key, GINT_TO_POINTER(ref - 1));
+	}
+
+	g_free(key);
+}
+
 void jabber_iq_init(void)
 {
 	iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
+	signal_iq_handlers = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, NULL);
 
 	jabber_iq_register_handler("jingle", JINGLE, jingle_parse);
 	jabber_iq_register_handler("mailbox", "google:mail:notify",
@@ -439,6 +495,8 @@
 	jabber_iq_register_handler("session", "http://www.google.com/session",
 		jabber_google_session_parse);
 #endif
+	jabber_iq_register_handler("block", "urn:xmpp:blocking", jabber_blocklist_parse_push);
+	jabber_iq_register_handler("unblock", "urn:xmpp:blocking", jabber_blocklist_parse_push);
 	jabber_iq_register_handler("time", "urn:xmpp:time", jabber_iq_time_parse);
 
 }
@@ -446,5 +504,6 @@
 void jabber_iq_uninit(void)
 {
 	g_hash_table_destroy(iq_handlers);
-	iq_handlers = NULL;
+	g_hash_table_destroy(signal_iq_handlers);
+	iq_handlers = signal_iq_handlers = NULL;
 }
--- a/libpurple/protocols/jabber/iq.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/iq.h	Sun Jun 28 04:41:07 2009 +0000
@@ -31,6 +31,7 @@
 } JabberIqType;
 
 #include "jabber.h"
+#include "connection.h"
 
 typedef struct _JabberIq JabberIq;
 
@@ -106,4 +107,8 @@
 void jabber_iq_register_handler(const char *node, const char *xmlns,
                                 JabberIqHandler *func);
 
+/* Connected to namespace-handler registration signals */
+void jabber_iq_signal_register(const gchar *node, const gchar *xmlns);
+void jabber_iq_signal_unregister(const gchar *node, const gchar *xmlns);
+
 #endif /* PURPLE_JABBER_IQ_H_ */
--- a/libpurple/protocols/jabber/jabber.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.c	Sun Jun 28 04:41:07 2009 +0000
@@ -23,6 +23,7 @@
 #include "account.h"
 #include "accountopt.h"
 #include "blist.h"
+#include "core.h"
 #include "cmds.h"
 #include "connection.h"
 #include "conversation.h"
@@ -67,7 +68,7 @@
 
 #define JABBER_CONNECT_STEPS (js->gsc ? 9 : 5)
 
-static PurplePlugin *my_protocol = NULL;
+PurplePlugin *jabber_plugin = NULL;
 GList *jabber_features = NULL;
 GList *jabber_identities = NULL;
 GSList *jabber_cmds = NULL;
@@ -84,10 +85,6 @@
 						  "xmlns:stream='http://etherx.jabber.org/streams' "
 						  "version='1.0'>",
 						  js->user->domain);
-	if (js->reinit)
-		/* Close down the current stream to keep the XML parser happy */
-		jabber_parser_close_stream(js);
-
 	/* setup the parser fresh for each stream */
 	jabber_parser_setup(js);
 	jabber_send_raw(js, open_stream, -1);
@@ -252,7 +249,7 @@
 {
 	const char *xmlns;
 
-	purple_signal_emit(my_protocol, "jabber-receiving-xmlnode", js->gc, packet);
+	purple_signal_emit(jabber_plugin, "jabber-receiving-xmlnode", js->gc, packet);
 
 	/* if the signal leaves us with a null packet, we're done */
 	if(NULL == *packet)
@@ -406,7 +403,7 @@
 	/* If we've got a security layer, we need to encode the data,
 	 * splitting it on the maximum buffer length negotiated */
 
-	purple_signal_emit(my_protocol, "jabber-sending-text", js->gc, &data);
+	purple_signal_emit(jabber_plugin, "jabber-sending-text", js->gc, &data);
 	if (data == NULL)
 		return;
 
@@ -453,28 +450,31 @@
 	return len;
 }
 
-void jabber_send(JabberStream *js, xmlnode *packet)
+void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet,
+                           gpointer unused)
 {
 	char *txt;
 	int len;
 
-	purple_signal_emit(my_protocol, "jabber-sending-xmlnode", js->gc, &packet);
-
-	/* if we get NULL back, we're done processing */
-	if(NULL == packet)
+	if (NULL == packet)
 		return;
 
-	txt = xmlnode_to_str(packet, &len);
-	jabber_send_raw(js, txt, len);
+	txt = xmlnode_to_str(*packet, &len);
+	jabber_send_raw(purple_connection_get_protocol_data(pc), txt, len);
 	g_free(txt);
 }
 
+void jabber_send(JabberStream *js, xmlnode *packet)
+{
+	purple_signal_emit(jabber_plugin, "jabber-sending-xmlnode", js->gc, &packet);
+}
+
 static gboolean jabber_keepalive_timeout(PurpleConnection *gc)
 {
 	JabberStream *js = gc->proto_data;
 	purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
 					_("Ping timeout"));
-	js->keepalive_timeout = -1;
+	js->keepalive_timeout = 0;
 	return FALSE;
 }
 
@@ -482,8 +482,8 @@
 {
 	JabberStream *js = gc->proto_data;
 
-	if (js->keepalive_timeout == -1) {
-		jabber_ping_jid(js, js->user->domain);
+	if (js->keepalive_timeout == 0) {
+		jabber_keepalive_ping(js);
 		js->keepalive_timeout = purple_timeout_add_seconds(120,
 				(GSourceFunc)(jabber_keepalive_timeout), gc);
 	}
@@ -595,7 +595,7 @@
 	jabber_stream_set_state(js, JABBER_STREAM_INITIALIZING_ENCRYPTION);
 }
 
-static void 
+static void
 txt_resolved_cb(GSList *responses, gpointer data)
 {
 	JabberStream *js = data;
@@ -608,7 +608,7 @@
 		purple_connection_error_reason (js->gc,
 				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
 		g_free(tmp);
-		return;	
+		return;
 	}
 
 	while (responses) {
@@ -687,9 +687,6 @@
 
 static void tls_init(JabberStream *js)
 {
-	/* Close down the current stream to keep the XML parser happy */
-	jabber_parser_close_stream(js);
-
 	purple_input_remove(js->gc->inpa);
 	js->gc->inpa = 0;
 	js->gsc = purple_ssl_connect_with_host_fd(js->gc->account, js->fd,
@@ -761,6 +758,8 @@
 	PurpleConnection *gc = purple_account_get_connection(account);
 	const char *connect_server = purple_account_get_string(account,
 			"connect_server", "");
+	const char *bosh_url = purple_account_get_string(account,
+			"bosh_url", "");
 	JabberStream *js;
 	PurplePresence *presence;
 	PurpleStoredImage *image;
@@ -773,8 +772,6 @@
 	js->fd = -1;
 	js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,
 			g_free, g_free);
-	js->disco_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,
-			g_free, g_free);
 	js->buddies = g_hash_table_new_full(g_str_hash, g_str_equal,
 			g_free, (GDestroyNotify)jabber_buddy_free);
 	js->chats = g_hash_table_new_full(g_str_hash, g_str_equal,
@@ -783,7 +780,7 @@
 	js->next_id = g_random_int();
 	js->write_buffer = purple_circ_buffer_new(512);
 	js->old_length = 0;
-	js->keepalive_timeout = -1;
+	js->keepalive_timeout = 0;
 	/* Set the default protocol version to 1.0. Overridden in parser.c. */
 	js->protocol_version = JABBER_PROTO_1_0;
 	js->sessions = NULL;
@@ -829,21 +826,25 @@
 	jabber_stream_set_state(js, JABBER_STREAM_CONNECTING);
 
 	/* TODO: Just use purple_url_parse? */
-	if (!g_ascii_strncasecmp(connect_server, "http://", 7) || !g_ascii_strncasecmp(connect_server, "https://", 8)) {
+	/* If both BOSH and a Connect Server are specified, we prefer BOSH. I'm not
+	 * attached to that choice, though.
+	 */
+	if (*bosh_url) {
 		js->use_bosh = TRUE;
-		js->bosh = jabber_bosh_connection_init(js, connect_server);
-		if (!js->bosh) {
+		js->bosh = jabber_bosh_connection_init(js, bosh_url);
+		if (js->bosh)
+			jabber_bosh_connection_connect(js->bosh);
+		else {
 			purple_connection_error_reason (js->gc,
 				PURPLE_CONNECTION_ERROR_INVALID_SETTINGS,
-				_("Malformed BOSH Connect Server"));
-			return;
+				_("Malformed BOSH URL"));
 		}
-		jabber_bosh_connection_connect(js->bosh);
+
 		return;
-	} else {
-		js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain);
 	}
 
+	js->certificate_CN = g_strdup(connect_server[0] ? connect_server : js->user->domain);
+
 	/* if they've got old-ssl mode going, we probably want to ignore SRV lookups */
 	if(purple_account_get_bool(js->gc->account, "old_ssl", FALSE)) {
 		if(purple_ssl_is_supported()) {
@@ -1096,6 +1097,24 @@
 	jabber_iq_send(iq);
 }
 
+static const struct {
+	const char *name;
+	const char *label;
+} registration_fields[] = {
+	{ "email",   N_("Email") },
+	{ "nick",    N_("Nickname") },
+	{ "first",   N_("First name") },
+	{ "last",    N_("Last name") },
+	{ "address", N_("Address") },
+	{ "city",    N_("City") },
+	{ "state",   N_("State") },
+	{ "zip",     N_("Postal code") },
+	{ "phone",   N_("Phone") },
+	{ "url",     N_("URL") },
+	{ "date",    N_("Date") },
+	{ NULL, NULL }
+};
+
 void jabber_register_parse(JabberStream *js, const char *from, JabberIqType type,
                            const char *id, xmlnode *query)
 {
@@ -1103,18 +1122,15 @@
 	PurpleRequestFields *fields;
 	PurpleRequestFieldGroup *group;
 	PurpleRequestField *field;
-	xmlnode *x, *y;
+	xmlnode *x, *y, *node;
 	char *instructions;
 	JabberRegisterCBData *cbdata;
 	gboolean registered = FALSE;
+	int i;
 
 	if (type != JABBER_IQ_RESULT)
 		return;
 
-	if (!from)
-		from = js->serverFQDN;
-	g_return_if_fail(from != NULL);
-
 	if(js->registration) {
 		/* get rid of the login thingy */
 		purple_connection_set_state(js->gc, PURPLE_CONNECTED);
@@ -1163,74 +1179,53 @@
 	group = purple_request_field_group_new(NULL);
 	purple_request_fields_add_group(fields, group);
 
-	if(js->registration)
-		field = purple_request_field_string_new("username", _("Username"), js->user->node, FALSE);
-	else
-		field = purple_request_field_string_new("username", _("Username"), NULL, FALSE);
-
-	purple_request_field_group_add_field(group, field);
-
-	if(js->registration)
-		field = purple_request_field_string_new("password", _("Password"),
-									purple_connection_get_password(js->gc), FALSE);
-	else
-		field = purple_request_field_string_new("password", _("Password"), NULL, FALSE);
-
-	purple_request_field_string_set_masked(field, TRUE);
-	purple_request_field_group_add_field(group, field);
-
-	if(xmlnode_get_child(query, "name")) {
+	if((node = xmlnode_get_child(query, "username"))) {
+		char *data = xmlnode_get_data(node);
+		if(js->registration)
+			field = purple_request_field_string_new("username", _("Username"), data ? data : js->user->node, FALSE);
+		else
+			field = purple_request_field_string_new("username", _("Username"), data, FALSE);
+
+		purple_request_field_group_add_field(group, field);
+		g_free(data);
+	}
+	if((node = xmlnode_get_child(query, "password"))) {
+		if(js->registration)
+			field = purple_request_field_string_new("password", _("Password"),
+										purple_connection_get_password(js->gc), FALSE);
+		else {
+			char *data = xmlnode_get_data(node);
+			field = purple_request_field_string_new("password", _("Password"), data, FALSE);
+			g_free(data);
+		}
+
+		purple_request_field_string_set_masked(field, TRUE);
+		purple_request_field_group_add_field(group, field);
+	}
+
+	if((node = xmlnode_get_child(query, "name"))) {
 		if(js->registration)
 			field = purple_request_field_string_new("name", _("Name"),
 													purple_account_get_alias(js->gc->account), FALSE);
-		else
-			field = purple_request_field_string_new("name", _("Name"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "email")) {
-		field = purple_request_field_string_new("email", _("Email"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "nick")) {
-		field = purple_request_field_string_new("nick", _("Nickname"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "first")) {
-		field = purple_request_field_string_new("first", _("First name"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "last")) {
-		field = purple_request_field_string_new("last", _("Last name"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "address")) {
-		field = purple_request_field_string_new("address", _("Address"), NULL, FALSE);
+		else {
+			char *data = xmlnode_get_data(node);
+			field = purple_request_field_string_new("name", _("Name"), data, FALSE);
+			g_free(data);
+		}
 		purple_request_field_group_add_field(group, field);
 	}
-	if(xmlnode_get_child(query, "city")) {
-		field = purple_request_field_string_new("city", _("City"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "state")) {
-		field = purple_request_field_string_new("state", _("State"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "zip")) {
-		field = purple_request_field_string_new("zip", _("Postal code"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
+
+	for (i = 0; registration_fields[i].name != NULL; ++i) {
+		if ((node = xmlnode_get_child(query, registration_fields[i].name))) {
+			char *data = xmlnode_get_data(node);
+			field = purple_request_field_string_new(registration_fields[i].name,
+			                                        _(registration_fields[i].label),
+			                                        data, FALSE);
+			purple_request_field_group_add_field(group, field);
+			g_free(data);
+		}
 	}
-	if(xmlnode_get_child(query, "phone")) {
-		field = purple_request_field_string_new("phone", _("Phone"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "url")) {
-		field = purple_request_field_string_new("url", _("URL"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
-	if(xmlnode_get_child(query, "date")) {
-		field = purple_request_field_string_new("date", _("Date"), NULL, FALSE);
-		purple_request_field_group_add_field(group, field);
-	}
+
 	if(registered) {
 		field = purple_request_field_bool_new("unregister", _("Unregister"), FALSE);
 		purple_request_field_group_add_field(group, field);
@@ -1303,12 +1298,10 @@
 	js->registration = TRUE;
 	js->iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,
 			g_free, g_free);
-	js->disco_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal,
-			g_free, g_free);
 	js->user = jabber_id_new(purple_account_get_username(account));
 	js->next_id = g_random_int();
 	js->old_length = 0;
-	js->keepalive_timeout = -1;
+	js->keepalive_timeout = 0;
 
 	if(!js->user) {
 		purple_connection_error_reason (gc,
@@ -1493,8 +1486,6 @@
 
 	if(js->iq_callbacks)
 		g_hash_table_destroy(js->iq_callbacks);
-	if(js->disco_callbacks)
-		g_hash_table_destroy(js->disco_callbacks);
 	if(js->buddies)
 		g_hash_table_destroy(js->buddies);
 	if(js->chats)
@@ -1563,7 +1554,7 @@
 	g_free(js->old_track);
 	g_free(js->expected_rspauth);
 
-	if (js->keepalive_timeout != -1)
+	if (js->keepalive_timeout != 0)
 		purple_timeout_remove(js->keepalive_timeout);
 
 	g_free(js->srv_rec);
@@ -1577,7 +1568,7 @@
 		purple_dnsquery_destroy(js->stun_query);
 		js->stun_query = NULL;
 	}
-		
+
 	g_free(js);
 
 	gc->proto_data = NULL;
@@ -1652,6 +1643,73 @@
 	jabber_presence_send(js, FALSE);
 }
 
+void jabber_blocklist_parse_push(JabberStream *js, const char *from,
+                                 JabberIqType type, const char *id,
+                                 xmlnode *child)
+{
+	JabberIq *result;
+	xmlnode *item;
+	PurpleAccount *account;
+	gboolean is_block;
+
+	if (!jabber_is_own_account(js, from)) {
+		xmlnode *error, *x;
+		result = jabber_iq_new(js, JABBER_IQ_ERROR);
+		xmlnode_set_attrib(result->node, "id", id);
+		if (from)
+			xmlnode_set_attrib(result->node, "to", from);
+
+		error = xmlnode_new_child(result->node, "error");
+		xmlnode_set_attrib(error, "type", "cancel");
+		x = xmlnode_new_child(error, "not-allowed");
+		xmlnode_set_namespace(x, "urn:ietf:params:xml:ns:xmpp-stanzas");
+
+		jabber_iq_send(result);
+		return;
+	}
+
+	account = purple_connection_get_account(js->gc);
+	is_block = g_str_equal(child->name, "block");
+
+	item = xmlnode_get_child(child, "item");
+	if (!is_block && item == NULL) {
+		/* Unblock everyone */
+		purple_debug_info("jabber", "Received unblock push. Unblocking everyone.\n");
+
+		while (account->deny != NULL) {
+			purple_privacy_deny_remove(account, account->deny->data, TRUE);
+		}
+	} else if (item == NULL) {
+		/* An empty <block/> is bogus */
+		xmlnode *error, *x;
+		result = jabber_iq_new(js, JABBER_IQ_ERROR);
+		xmlnode_set_attrib(result->node, "id", id);
+
+		error = xmlnode_new_child(result->node, "error");
+		xmlnode_set_attrib(error, "type", "modify");
+		x = xmlnode_new_child(error, "bad-request");
+		xmlnode_set_namespace(x, "urn:ietf:params:xml:ns:xmpp-stanzas");
+
+		jabber_iq_send(result);
+		return;
+	} else {
+		for ( ; item; item = xmlnode_get_next_twin(item)) {
+			const char *jid = xmlnode_get_attrib(item, "jid");
+			if (jid == NULL || *jid == '\0')
+				continue;
+
+			if (is_block)
+				purple_privacy_deny_add(account, jid, TRUE);
+			else
+				purple_privacy_deny_remove(account, jid, TRUE);
+		}
+	}
+
+	result = jabber_iq_new(js, JABBER_IQ_RESULT);
+	xmlnode_set_attrib(result->node, "id", id);
+	jabber_iq_send(result);
+}
+
 static void jabber_blocklist_parse(JabberStream *js, const char *from,
                                    JabberIqType type, const char *id,
                                    xmlnode *packet, gpointer data)
@@ -1663,13 +1721,23 @@
 			"blocklist", "urn:xmpp:blocking");
 	account = purple_connection_get_account(js->gc);
 
-	if (blocklist == NULL)
+	if (type == JABBER_IQ_ERROR || blocklist == NULL)
 		return;
 
+	/* This is the only privacy method supported by XEP-0191 */
+	if (account->perm_deny != PURPLE_PRIVACY_DENY_USERS)
+		account->perm_deny = PURPLE_PRIVACY_DENY_USERS;
+
+	/*
+	 * TODO: When account->deny is something more than a hash table, this can
+	 * be re-written to find the set intersection and difference.
+	 */
+	while (account->deny)
+		purple_privacy_deny_remove(account, account->deny->data, TRUE);
+
 	item = xmlnode_get_child(blocklist, "item");
 	while (item != NULL) {
 		const char *jid = xmlnode_get_attrib(item, "jid");
-
 		purple_privacy_deny_add(account, jid, TRUE);
 		item = xmlnode_get_next_twin(item);
 	}
@@ -1798,14 +1866,14 @@
 	/* both required according to XEP-0030 */
 	g_return_if_fail(category != NULL);
 	g_return_if_fail(type != NULL);
-	
+
 	for(identity = jabber_identities; identity; identity = identity->next) {
 		JabberIdentity *ident = (JabberIdentity*)identity->data;
 		if (!strcmp(ident->category, category) &&
 		    !strcmp(ident->type, type) &&
 		    ((!ident->lang && !lang) || (ident->lang && lang && !strcmp(ident->lang, lang)))) {
 			return;
-		}	
+		}
 	}
 
 	ident = g_new0(JabberIdentity, 1);
@@ -1858,6 +1926,28 @@
 					!(jb->subscription & JABBER_SUB_TO)))
 			return "not-authorized";
 	}
+
+	if (jb) {
+		JabberBuddyResource *jbr = jabber_buddy_find_resource(jb, NULL);
+		if (jbr) {
+			const gchar *client_type = 
+				jabber_resource_get_identity_category_type(jbr, "client");
+		
+			if (client_type) {
+				if (strcmp(client_type, "phone") == 0) {
+					return "mobile";
+				} else if (strcmp(client_type, "web") == 0) {
+					return "external";
+				} else if (strcmp(client_type, "handheld") == 0) {
+					return "hiptop";
+				} else if (strcmp(client_type, "bot") == 0) {
+					return "bot";
+				}
+				/* the default value "pc" falls through and has no emblem */
+			}
+		}
+	}
+		
 	return NULL;
 }
 
@@ -1897,7 +1987,7 @@
 }
 
 static void
-jabber_tooltip_add_resource_text(JabberBuddyResource *jbr, 
+jabber_tooltip_add_resource_text(JabberBuddyResource *jbr,
 	PurpleNotifyUserInfo *user_info, gboolean multiple_resources)
 {
 	char *text = NULL;
@@ -1930,13 +2020,13 @@
 	g_free(label);
 	g_free(value);
 	g_free(text);
-	
+
 	/* if the resource is idle, show that */
 	/* only show it if there is more than one resource available for
 	the buddy, since the "general" idleness will be shown anyway,
 	this way we can see see the idleness of lower-priority resources */
 	if (jbr->idle && multiple_resources) {
-		gchar *idle_str = 
+		gchar *idle_str =
 			purple_str_seconds_to_string(time(NULL) - jbr->idle);
 		label = g_strdup_printf("%s%s", _("Idle"), (res ? res : ""));
 		purple_notify_user_info_add_pair(user_info, label, idle_str);
@@ -1969,13 +2059,13 @@
 		const char *sub;
 		GList *l;
 		const char *mood;
-		gboolean multiple_resources = 
+		gboolean multiple_resources =
 			jb->resources && g_list_next(jb->resources);
 		JabberBuddyResource *top_jbr = jabber_buddy_find_resource(jb, NULL);
 
 		/* resource-specific info for the top resource */
 		if (top_jbr) {
-			jabber_tooltip_add_resource_text(top_jbr, user_info, 
+			jabber_tooltip_add_resource_text(top_jbr, user_info,
 				multiple_resources);
 		}
 
@@ -1987,7 +2077,7 @@
 					multiple_resources);
 			}
 		}
-		
+
 		if (full) {
 			PurpleStatus *status;
 
@@ -2879,7 +2969,7 @@
 	return (caps & (PURPLE_MEDIA_CAPS_AUDIO | PURPLE_MEDIA_CAPS_AUDIO_SINGLE_DIRECTION));
 }
 
-static gboolean
+gboolean
 jabber_video_enabled(JabberStream *js, const char *namespace)
 {
 	PurpleMediaManager *manager = purple_media_manager_get();
@@ -2892,7 +2982,7 @@
 	PurpleAccount *account;
 	gchar *who;
 	PurpleMediaSessionType type;
-	
+
 } JabberMediaRequest;
 
 static void
@@ -2921,7 +3011,7 @@
 #endif
 
 gboolean
-jabber_initiate_media(PurpleAccount *account, const char *who, 
+jabber_initiate_media(PurpleAccount *account, const char *who,
 		      PurpleMediaSessionType type)
 {
 #ifdef USE_VV
@@ -3119,8 +3209,12 @@
 				caps |= PURPLE_MEDIA_CAPS_MODIFY_SESSION |
 						PURPLE_MEDIA_CAPS_CHANGE_DIRECTION;
 		}
-		if (jabber_resource_has_capability(jbr, GOOGLE_VOICE_CAP))
+		if (jabber_resource_has_capability(jbr, GOOGLE_VOICE_CAP)) {
 			caps |= PURPLE_MEDIA_CAPS_AUDIO;
+			if (jabber_resource_has_capability(jbr,
+					GOOGLE_VIDEO_CAP))
+				caps |= PURPLE_MEDIA_CAPS_AUDIO_VIDEO;
+		}
 		return caps;
 	}
 
@@ -3305,7 +3399,7 @@
 		return FALSE;
 	js = gc->proto_data;
 
-	if (!(resource = jabber_get_resource(jid)) || 
+	if (!(resource = jabber_get_resource(jid)) ||
 	    !(jb = jabber_buddy_find(js, jid, FALSE)) ||
 	    !(jbr = jabber_buddy_find_resource(jb, resource))) {
 		g_free(resource);
@@ -3331,9 +3425,26 @@
 void
 jabber_init_plugin(PurplePlugin *plugin)
 {
-	my_protocol = plugin;
-
-	jabber_add_identity("client", "pc", NULL, PACKAGE);
+	GHashTable *ui_info = purple_core_get_ui_info();
+	const gchar *ui_type;
+	const gchar *type = "pc"; /* default client type, if unknown or 
+								unspecified */
+
+	jabber_plugin = plugin;
+
+	ui_type = ui_info ? g_hash_table_lookup(ui_info, "client_type") : NULL;
+	if (ui_type) {
+		if (strcmp(ui_type, "pc") == 0 ||
+			strcmp(ui_type, "console") == 0 ||
+			strcmp(ui_type, "phone") == 0 ||
+			strcmp(ui_type, "handheld") == 0 ||
+			strcmp(ui_type, "web") == 0 ||
+			strcmp(ui_type, "bot") == 0) {
+			type = ui_type;
+		}
+	}
+
+	jabber_add_identity("client", type, NULL, PACKAGE);
 
 	/* initialize jabber_features list */
 	jabber_add_feature("jabber:iq:last", 0);
@@ -3359,7 +3470,7 @@
 	jabber_add_feature(XEP_0224_NAMESPACE, jabber_buzz_isenabled);
 
 	/* Bits Of Binary */
-	jabber_add_feature(XEP_0231_NAMESPACE, jabber_custom_smileys_isenabled);
+	jabber_add_feature(XEP_0231_NAMESPACE, 0);
 
 	/* Jingle features! */
 	jabber_add_feature(JINGLE, 0);
@@ -3380,15 +3491,33 @@
 							 purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_ACCOUNT),
 							 purple_value_new(PURPLE_TYPE_STRING),
 							 purple_value_new(PURPLE_TYPE_STRING));
+
 	purple_plugin_ipc_register(plugin, "add_feature", PURPLE_CALLBACK(jabber_ipc_add_feature),
 							 purple_marshal_VOID__POINTER,
 							 NULL, 1,
 							 purple_value_new(PURPLE_TYPE_STRING));
+
+	/* Modifying these? Look at libxmpp.c:load_plugin for the signal versions */
+	purple_plugin_ipc_register(plugin, "register_namespace_watcher",
+	                           PURPLE_CALLBACK(jabber_iq_signal_register),
+	                           purple_marshal_VOID__POINTER_POINTER,
+	                           NULL, 2,
+	                           purple_value_new(PURPLE_TYPE_STRING),  /* node */
+	                           purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+	purple_plugin_ipc_register(plugin, "unregister_namespace_watcher",
+	                           PURPLE_CALLBACK(jabber_iq_signal_unregister),
+	                           purple_marshal_VOID__POINTER_POINTER,
+	                           NULL, 2,
+	                           purple_value_new(PURPLE_TYPE_STRING),  /* node */
+	                           purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
 }
 
 void
 jabber_uninit_plugin(void)
 {
+	purple_plugin_ipc_unregister_all(jabber_plugin);
+
 	jabber_features_destroy();
 	jabber_identities_destroy();
 }
--- a/libpurple/protocols/jabber/jabber.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/jabber.h	Sun Jun 28 04:41:07 2009 +0000
@@ -44,6 +44,8 @@
 	JABBER_CAP_ADHOC		  = 1 << 12,
 	JABBER_CAP_BLOCKING       = 1 << 13,
 
+	JABBER_CAP_ITEMS          = 1 << 14,
+
 	JABBER_CAP_RETRIEVED      = 1 << 31
 } JabberCapabilities;
 
@@ -53,12 +55,12 @@
 #include <glib.h>
 #include "circbuffer.h"
 #include "connection.h"
+#include "dnsquery.h"
 #include "dnssrv.h"
 #include "media.h"
 #include "mediamanager.h"
 #include "roomlist.h"
 #include "sslconn.h"
-#include "dnsquery.h"
 
 #include "iq.h"
 #include "jutil.h"
@@ -75,6 +77,8 @@
 /* Index into attention_types list */
 #define JABBER_BUZZ 0
 
+extern PurplePlugin *jabber_plugin;
+
 typedef enum {
 	JABBER_STREAM_OFFLINE,
 	JABBER_STREAM_CONNECTING,
@@ -151,7 +155,6 @@
 	GList *user_directories;
 
 	GHashTable *iq_callbacks;
-	GHashTable *disco_callbacks;
 	int next_id;
 
 	GList *bs_proxies;
@@ -242,8 +245,8 @@
 	char *certificate_CN;
 
 	/* A purple timeout tag for the keepalive */
-	int keepalive_timeout;
-	
+	guint keepalive_timeout;
+
 	PurpleSrvResponse *srv_rec;
 	guint srv_rec_idx;
 	guint max_srv_rec_idx;
@@ -299,6 +302,8 @@
 void jabber_process_packet(JabberStream *js, xmlnode **packet);
 void jabber_send(JabberStream *js, xmlnode *data);
 void jabber_send_raw(JabberStream *js, const char *data, int len);
+void jabber_send_signal_cb(PurpleConnection *pc, xmlnode **packet,
+                           gpointer unused);
 
 void jabber_stream_set_state(JabberStream *js, JabberStreamState state);
 
@@ -320,8 +325,8 @@
 void jabber_add_feature(const gchar *namespace, JabberFeatureEnabled cb); /* cb may be NULL */
 void jabber_remove_feature(const gchar *namespace);
 
-/** Adds an identitiy to this jabber library instance. For list of valid values vistit the 
- *	webiste of the XMPP Registrar ( http://www.xmpp.org/registrar/disco-categories.html#client ).
+/** Adds an identity to this jabber library instance. For list of valid values visit the
+ *	website of the XMPP Registrar ( http://www.xmpp.org/registrar/disco-categories.html#client ).
  *  @param category the category of the identity.
  *  @param type the type of the identity.
  *  @param language the language localization of the name. Can be NULL.
@@ -345,6 +350,9 @@
 void jabber_login(PurpleAccount *account);
 void jabber_close(PurpleConnection *gc);
 void jabber_idle_set(PurpleConnection *gc, int idle);
+void jabber_blocklist_parse_push(JabberStream *js, const char *from,
+                                 JabberIqType type, const char *id,
+                                 xmlnode *child);
 void jabber_request_block_list(JabberStream *js);
 void jabber_add_deny(PurpleConnection *gc, const char *who);
 void jabber_rem_deny(PurpleConnection *gc, const char *who);
@@ -361,6 +369,7 @@
 GList *jabber_actions(PurplePlugin *plugin, gpointer context);
 
 gboolean jabber_audio_enabled(JabberStream *js, const char *unused);
+gboolean jabber_video_enabled(JabberStream *js, const char *unused);
 gboolean jabber_initiate_media(PurpleAccount *account, const char *who,
 		PurpleMediaSessionType type);
 PurpleMediaCaps jabber_get_media_caps(PurpleAccount *account, const char *who);
--- a/libpurple/protocols/jabber/jutil.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.c	Sun Jun 28 04:41:07 2009 +0000
@@ -105,6 +105,8 @@
 {
 	char *at;
 	char *slash;
+	char *node = NULL;
+	char *domain;
 	JabberID *jid;
 
 	if(!str || !g_utf8_validate(str, -1, NULL))
@@ -116,22 +118,31 @@
 	slash = g_utf8_strchr(str, -1, '/');
 
 	if(at) {
-		jid->node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC);
+		node = g_utf8_normalize(str, at-str, G_NORMALIZE_NFKC);
 		if(slash) {
-			jid->domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC);
+			domain = g_utf8_normalize(at+1, slash-(at+1), G_NORMALIZE_NFKC);
 			jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
 		} else {
-			jid->domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC);
+			domain = g_utf8_normalize(at+1, -1, G_NORMALIZE_NFKC);
 		}
 	} else {
 		if(slash) {
-			jid->domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC);
+			domain = g_utf8_normalize(str, slash-str, G_NORMALIZE_NFKC);
 			jid->resource = g_utf8_normalize(slash+1, -1, G_NORMALIZE_NFKC);
 		} else {
-			jid->domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC);
+			domain = g_utf8_normalize(str, -1, G_NORMALIZE_NFKC);
 		}
 	}
 
+	if (node) {
+		jid->node = g_utf8_strdown(node, -1);
+		g_free(node);
+	}
+
+	if (domain) {
+		jid->domain = g_utf8_strdown(domain, -1);
+		g_free(domain);
+	}
 
 	if(!jabber_nodeprep_validate(jid->node) ||
 			!jabber_nameprep_validate(jid->domain) ||
@@ -193,32 +204,70 @@
 	JabberStream *js = gc ? gc->proto_data : NULL;
 	static char buf[3072]; /* maximum legal length of a jabber jid */
 	JabberID *jid;
-	char *node, *domain;
 
 	jid = jabber_id_new(in);
 
 	if(!jid)
 		return NULL;
 
-	node = jid->node ? g_utf8_strdown(jid->node, -1) : NULL;
-	domain = g_utf8_strdown(jid->domain, -1);
-
-
-	if(js && node && jid->resource &&
-			jabber_chat_find(js, node, domain))
-		g_snprintf(buf, sizeof(buf), "%s@%s/%s", node, domain,
+	if(js && jid->node && jid->resource &&
+			jabber_chat_find(js, jid->node, jid->domain))
+		g_snprintf(buf, sizeof(buf), "%s@%s/%s", jid->node, jid->domain,
 				jid->resource);
 	else
-		g_snprintf(buf, sizeof(buf), "%s%s%s", node ? node : "",
-				node ? "@" : "", domain);
+		g_snprintf(buf, sizeof(buf), "%s%s%s", jid->node ? jid->node : "",
+				jid->node ? "@" : "", jid->domain);
 
 	jabber_id_free(jid);
-	g_free(node);
-	g_free(domain);
 
 	return buf;
 }
 
+gboolean
+jabber_is_own_server(JabberStream *js, const char *str)
+{
+	JabberID *jid;
+	gboolean equal;
+
+	if (str == NULL)
+		return FALSE;
+
+	g_return_val_if_fail(*str != '\0', FALSE);
+
+	jid = jabber_id_new(str);
+	if (!jid)
+		return FALSE;
+
+	equal = (jid->node == NULL &&
+	         g_str_equal(jid->domain, js->user->domain) &&
+	         jid->resource == NULL);
+	jabber_id_free(jid);
+	return equal;
+}
+
+gboolean
+jabber_is_own_account(JabberStream *js, const char *str)
+{
+	JabberID *jid;
+	gboolean equal;
+
+	if (str == NULL)
+		return TRUE;
+
+	g_return_val_if_fail(*str != '\0', FALSE);
+
+	jid = jabber_id_new(str);
+	if (!jid)
+		return FALSE;
+
+	equal = (purple_strequal(jid->node, js->user->node) &&
+	         g_str_equal(jid->domain, js->user->domain) &&
+	         (jid->resource == NULL ||
+	             g_str_equal(jid->resource, js->user->resource)));
+	jabber_id_free(jid);
+	return equal;
+}
+
 PurpleConversation *
 jabber_find_unnormalized_conv(const char *name, PurpleAccount *account)
 {
--- a/libpurple/protocols/jabber/jutil.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/jutil.h	Sun Jun 28 04:41:07 2009 +0000
@@ -36,6 +36,12 @@
 
 const char *jabber_normalize(const PurpleAccount *account, const char *in);
 
+/* Returns true if JID is the bare JID of our server. */
+gboolean jabber_is_own_server(JabberStream *js, const char *jid);
+
+/* Returns true if JID is the bare JID of our account. */
+gboolean jabber_is_own_account(JabberStream *js, const char *jid);
+
 gboolean jabber_nodeprep_validate(const char *);
 gboolean jabber_nameprep_validate(const char *);
 gboolean jabber_resourceprep_validate(const char *);
--- a/libpurple/protocols/jabber/libxmpp.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/libxmpp.c	Sun Jun 28 04:41:07 2009 +0000
@@ -34,6 +34,7 @@
 #include "iq.h"
 #include "jabber.h"
 #include "chat.h"
+#include "disco.h"
 #include "message.h"
 #include "roster.h"
 #include "si.h"
@@ -117,6 +118,7 @@
 	jabber_unregister_account,		/* unregister_user */
 	jabber_send_attention,			/* send_attention */
 	jabber_attention_types,			/* attention_types */
+
 	sizeof(PurplePluginProtocolInfo),       /* struct_size */
 	NULL, /* get_account_text_table */
 	jabber_initiate_media,          /* initiate_media */
@@ -135,21 +137,79 @@
 			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
 			purple_value_new_outgoing(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
 
+	/*
+	 * Do not remove this or the plugin will fail. Completely. You have been
+	 * warned!
+	 */
+	purple_signal_connect_priority(plugin, "jabber-sending-xmlnode",
+			plugin, PURPLE_CALLBACK(jabber_send_signal_cb),
+			NULL, PURPLE_SIGNAL_PRIORITY_HIGHEST);
+
 	purple_signal_register(plugin, "jabber-sending-text",
 			     purple_marshal_VOID__POINTER_POINTER, NULL, 2,
 			     purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
 			     purple_value_new_outgoing(PURPLE_TYPE_STRING));
 
+	purple_signal_register(plugin, "jabber-receiving-message",
+			purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER,
+			purple_value_new(PURPLE_TYPE_BOOLEAN), 6,
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+			purple_value_new(PURPLE_TYPE_STRING), /* type */
+			purple_value_new(PURPLE_TYPE_STRING), /* id */
+			purple_value_new(PURPLE_TYPE_STRING), /* from */
+			purple_value_new(PURPLE_TYPE_STRING), /* to */
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+	purple_signal_register(plugin, "jabber-receiving-iq",
+			purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
+			purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+			purple_value_new(PURPLE_TYPE_STRING), /* type */
+			purple_value_new(PURPLE_TYPE_STRING), /* id */
+			purple_value_new(PURPLE_TYPE_STRING), /* from */
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
+	purple_signal_register(plugin, "jabber-watched-iq",
+			purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER,
+			purple_value_new(PURPLE_TYPE_BOOLEAN), 5,
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+			purple_value_new(PURPLE_TYPE_STRING), /* type */
+			purple_value_new(PURPLE_TYPE_STRING), /* id */
+			purple_value_new(PURPLE_TYPE_STRING), /* from */
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE)); /* child */
+
+	/* Modifying these? Look at jabber_init_plugin for the ipc versions */
+	purple_signal_register(plugin, "jabber-register-namespace-watcher",
+			purple_marshal_VOID__POINTER_POINTER,
+			NULL, 2,
+			purple_value_new(PURPLE_TYPE_STRING),  /* node */
+			purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+	purple_signal_register(plugin, "jabber-unregister-namespace-watcher",
+			purple_marshal_VOID__POINTER_POINTER,
+			NULL, 2,
+			purple_value_new(PURPLE_TYPE_STRING),  /* node */
+			purple_value_new(PURPLE_TYPE_STRING)); /* namespace */
+
+	purple_signal_connect(plugin, "jabber-register-namespace-watcher",
+			plugin, PURPLE_CALLBACK(jabber_iq_signal_register), NULL);
+	purple_signal_connect(plugin, "jabber-unregister-namespace-watcher",
+			plugin, PURPLE_CALLBACK(jabber_iq_signal_unregister), NULL);
+
+	purple_signal_register(plugin, "jabber-receiving-presence",
+			purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER,
+			purple_value_new(PURPLE_TYPE_BOOLEAN), 4,
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_CONNECTION),
+			purple_value_new(PURPLE_TYPE_STRING), /* type */
+			purple_value_new(PURPLE_TYPE_STRING), /* from */
+			purple_value_new(PURPLE_TYPE_SUBTYPE, PURPLE_SUBTYPE_XMLNODE));
+
 	return TRUE;
 }
 
 static gboolean unload_plugin(PurplePlugin *plugin)
 {
-	purple_signal_unregister(plugin, "jabber-receiving-xmlnode");
-
-	purple_signal_unregister(plugin, "jabber-sending-xmlnode");
-
-	purple_signal_unregister(plugin, "jabber-sending-text");
+	purple_signals_unregister_by_instance(plugin);
 
 	/* reverse order of init_plugin */
 	jabber_bosh_uninit();
@@ -259,6 +319,11 @@
 	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
 						  option);
 
+	option = purple_account_option_string_new(_("BOSH URL"),
+						  "bosh_url", NULL);
+	prpl_info.protocol_options = g_list_append(prpl_info.protocol_options,
+						  option);
+
 	/* this should probably be part of global smiley theme settings later on,
 	  shared with MSN */
 	option = purple_account_option_bool_new(_("Show Custom Smileys"),
--- a/libpurple/protocols/jabber/message.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/message.c	Sun Jun 28 04:41:07 2009 +0000
@@ -532,16 +532,25 @@
 void jabber_message_parse(JabberStream *js, xmlnode *packet)
 {
 	JabberMessage *jm;
-	const char *type;
+	const char *id, *from, *to, *type;
 	xmlnode *child;
+	gboolean signal_return;
+
+	from = xmlnode_get_attrib(packet, "from");
+	id   = xmlnode_get_attrib(packet, "id");
+	to   = xmlnode_get_attrib(packet, "to");
+	type = xmlnode_get_attrib(packet, "type");
+
+	signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin,
+			"jabber-receiving-message", js->gc, type, id, from, to, packet));
+	if (signal_return)
+		return;
 
 	jm = g_new0(JabberMessage, 1);
 	jm->js = js;
 	jm->sent = time(NULL);
 	jm->delayed = FALSE;
 
-	type = xmlnode_get_attrib(packet, "type");
-
 	if(type) {
 		if(!strcmp(type, "normal"))
 			jm->type = JABBER_MESSAGE_NORMAL;
@@ -559,9 +568,9 @@
 		jm->type = JABBER_MESSAGE_NORMAL;
 	}
 
-	jm->from = g_strdup(xmlnode_get_attrib(packet, "from"));
-	jm->to = g_strdup(xmlnode_get_attrib(packet, "to"));
-	jm->id = g_strdup(xmlnode_get_attrib(packet, "id"));
+	jm->from = g_strdup(from);
+	jm->to   = g_strdup(to);
+	jm->id   = g_strdup(id);
 
 	for(child = packet->child; child; child = child->next) {
 		const char *xmlns = xmlnode_get_namespace(child);
@@ -630,7 +639,7 @@
 					purple_debug_info("jabber", "found %d smileys\n",
 						g_list_length(smiley_refs));
 
-					if (smiley_refs) {		
+					if (smiley_refs) {
 						if (jm->type == JABBER_MESSAGE_GROUPCHAT) {
 							JabberID *jid = jabber_id_new(jm->from);
 							JabberChat *chat = NULL;
@@ -648,7 +657,7 @@
 									who, account);
 							if (!conv) {
 								/* we need to create the conversation here */
-								conv = 
+								conv =
 									purple_conversation_new(PURPLE_CONV_TYPE_IM,
 									account, who);
 							}
@@ -912,11 +921,12 @@
 
 static gboolean
 jabber_conv_support_custom_smileys(const PurpleConnection *gc,
-								   const PurpleConversation *conv,
+								   PurpleConversation *conv,
 								   const gchar *who)
 {
 	JabberStream *js = (JabberStream *) gc->proto_data;
 	JabberBuddy *jb;
+	JabberChat *chat;
 
 	if (!js) {
 		purple_debug_error("jabber",
@@ -925,7 +935,6 @@
 	}
 
 	switch (purple_conversation_get_type(conv)) {
-		/* for the time being, we will not support custom smileys in MUCs */
 		case PURPLE_CONV_TYPE_IM:
 			jb = jabber_buddy_find(js, who, FALSE);
 			if (jb) {
@@ -934,6 +943,18 @@
 				return FALSE;
 			}
 			break;
+		case PURPLE_CONV_TYPE_CHAT:
+			chat = jabber_chat_find_by_conv(conv);
+			if (chat) {
+				/* do not attempt to send custom smileys in a MUC with more than
+				 10 people, to avoid getting too many BoB requests */
+				return jabber_chat_get_num_participants(chat) <= 10 &&
+					jabber_chat_all_participants_have_capability(chat,
+						XEP_0231_NAMESPACE);
+			} else {
+				return FALSE;
+			}
+			break;
 		default:
 			return FALSE;
 			break;
@@ -1154,7 +1175,6 @@
 	jm->chat_state = JM_STATE_ACTIVE;
 	jm->to = g_strdup(who);
 	jm->id = jabber_get_next_id(jm->js);
-	jm->chat_state = JM_STATE_ACTIVE;
 
 	if(jbr) {
 		if(jbr->thread_id)
@@ -1170,7 +1190,9 @@
 			jm->typing_style |= JM_TS_JEP_0022;
 	}
 
-	purple_markup_html_to_xhtml(msg, &xhtml, &jm->body);
+	tmp = purple_utf8_strip_unprintables(msg);
+	purple_markup_html_to_xhtml(tmp, &xhtml, &jm->body);
+	g_free(tmp);
 	tmp = jabber_message_smileyfy_xhtml(jm, xhtml);
 	if (tmp) {
 		g_free(xhtml);
@@ -1194,6 +1216,7 @@
 	JabberMessage *jm;
 	JabberStream *js;
 	char *xhtml;
+	char *tmp;
 
 	if(!msg || !gc)
 		return 0;
@@ -1210,7 +1233,14 @@
 	jm->to = g_strdup_printf("%s@%s", chat->room, chat->server);
 	jm->id = jabber_get_next_id(jm->js);
 
+	tmp = purple_utf8_strip_unprintables(msg);
 	purple_markup_html_to_xhtml(msg, &xhtml, &jm->body);
+	g_free(tmp);
+	tmp = jabber_message_smileyfy_xhtml(jm, xhtml);
+	if (tmp) {
+		g_free(xhtml);
+		xhtml = tmp;
+	}
 
 	if (chat->xhtml && !jabber_xhtml_plain_equal(xhtml, jm->body))
 		jm->xhtml = g_strdup_printf("<html xmlns='http://jabber.org/protocol/xhtml-im'><body xmlns='http://www.w3.org/1999/xhtml'>%s</body></html>", xhtml);
--- a/libpurple/protocols/jabber/oob.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/oob.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 /**
- * @file jutil.h utility functions
+ * @file oob.h out-of-band transfer functions
  *
  * purple
  *
--- a/libpurple/protocols/jabber/parser.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/parser.c	Sun Jun 28 04:41:07 2009 +0000
@@ -207,12 +207,6 @@
 	jabber_parser_free(js);
 }
 
-void
-jabber_parser_close_stream(JabberStream *js)
-{
-	xmlParseChunk(js->context, "</stream:stream>", 16 /* length */, 0);
-}
-
 void jabber_parser_free(JabberStream *js) {
 	if (js->context) {
 		xmlParseChunk(js->context, NULL,0,1);
--- a/libpurple/protocols/jabber/parser.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/parser.h	Sun Jun 28 04:41:07 2009 +0000
@@ -25,7 +25,6 @@
 #include "jabber.h"
 
 void jabber_parser_setup(JabberStream *js);
-void jabber_parser_close_stream(JabberStream *js);
 void jabber_parser_free(JabberStream *js);
 void jabber_parser_process(JabberStream *js, const char *buf, int len);
 
--- a/libpurple/protocols/jabber/ping.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/ping.c	Sun Jun 28 04:41:07 2009 +0000
@@ -28,11 +28,13 @@
 #include "ping.h"
 #include "iq.h"
 
-static void jabber_keepalive_pong_cb(JabberStream *js)
+static void jabber_keepalive_pong_cb(JabberStream *js, const char *from,
+                                     JabberIqType type, const char *id,
+                                     xmlnode *packet, gpointer data)
 {
-	if (js->keepalive_timeout >= 0) {
+	if (js->keepalive_timeout != 0) {
 		purple_timeout_remove(js->keepalive_timeout);
-		js->keepalive_timeout = -1;
+		js->keepalive_timeout = 0;
 	}
 }
 
@@ -57,16 +59,23 @@
                                   JabberIqType type, const char *id,
                                   xmlnode *packet, gpointer data)
 {
-	if (purple_strequal(from, js->user->domain))
-		/* If the pong is from the server, assume it's a result of the
-		 * keepalive functions */
-		jabber_keepalive_pong_cb(js);
-	else {
-		if (type == JABBER_IQ_RESULT)
-			purple_debug_info("jabber", "PONG!\n");
-		else
-			purple_debug_info("jabber", "ping not supported\n");
-	}
+	if (type == JABBER_IQ_RESULT)
+		purple_debug_info("jabber", "PONG!\n");
+	else
+		purple_debug_info("jabber", "ping not supported\n");
+}
+
+void jabber_keepalive_ping(JabberStream *js)
+{
+	JabberIq *iq;
+	xmlnode *ping;
+
+	iq = jabber_iq_new(js, JABBER_IQ_GET);
+	ping = xmlnode_new_child(iq->node, "ping");
+	xmlnode_set_namespace(ping, "urn:xmpp:ping");
+
+	jabber_iq_set_callback(iq, jabber_keepalive_pong_cb, NULL);
+	jabber_iq_send(iq);
 }
 
 gboolean jabber_ping_jid(JabberStream *js, const char *jid)
--- a/libpurple/protocols/jabber/ping.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/ping.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 /**
- * @file ping.h utility functions
+ * @file ping.h ping functions
  *
  * purple
  *
@@ -29,5 +29,6 @@
 void jabber_ping_parse(JabberStream *js, const char *from,
                        JabberIqType, const char *id, xmlnode *child);
 gboolean jabber_ping_jid(JabberStream *js, const char *jid);
+void jabber_keepalive_ping(JabberStream *js);
 
 #endif /* PURPLE_JABBER_PING_H_ */
--- a/libpurple/protocols/jabber/presence.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/presence.c	Sun Jun 28 04:41:07 2009 +0000
@@ -100,7 +100,7 @@
 
 	if (!purple_account_is_connected(account))
 		return;
-	
+
 	if (!purple_status_is_active(status))
 		return;
 
@@ -245,6 +245,9 @@
 {
 	xmlnode *show, *status, *presence, *pri, *c;
 	const char *show_string = NULL;
+#ifdef USE_VV
+	gboolean audio_enabled, video_enabled;
+#endif
 
 	presence = xmlnode_new("presence");
 
@@ -277,7 +280,7 @@
 		xmlnode *query = xmlnode_new_child(presence, "query");
 		gchar seconds[10];
 		g_snprintf(seconds, 10, "%d", (int) (time(NULL) - js->idle));
-		
+
 		xmlnode_set_namespace(query, "jabber:iq:last");
 		xmlnode_set_attrib(query, "seconds", seconds);
 	}
@@ -300,9 +303,18 @@
 	 * just assume that if we specify a 'voice-v1' ext (ignoring that
 	 * these are to be assigned no semantic value), we support receiving voice
 	 * calls.
+	 *
+	 * Ditto for 'video-v1'.
 	 */
-	if (jabber_audio_enabled(js, NULL /* unused */))
+	audio_enabled = jabber_audio_enabled(js, NULL /* unused */);
+	video_enabled = jabber_video_enabled(js, NULL /* unused */);
+
+	if (audio_enabled && video_enabled)
+		xmlnode_set_attrib(c, "ext", "voice-v1 video-v1");
+	else if (audio_enabled)
 		xmlnode_set_attrib(c, "ext", "voice-v1");
+	else if (video_enabled)
+		xmlnode_set_attrib(c, "ext", "video-v1");
 #endif
 
 	return presence;
@@ -361,10 +373,10 @@
 		if ((nick = xmlnode_get_child(vcard, "NICKNAME"))) {
 			char *tmp = xmlnode_get_data(nick);
 			char *bare_jid = jabber_get_bare_jid(from);
-			if (strstr(bare_jid, tmp) == NULL) {
+			if (tmp && strstr(bare_jid, tmp) == NULL) {
 				g_free(nickname);
 				nickname = tmp;
-			} else
+			} else if (tmp)
 				g_free(tmp);
 
 			g_free(bare_jid);
@@ -446,8 +458,8 @@
 
 void jabber_presence_parse(JabberStream *js, xmlnode *packet)
 {
-	const char *from = xmlnode_get_attrib(packet, "from");
-	const char *type = xmlnode_get_attrib(packet, "type");
+	const char *from;
+	const char *type;
 	const char *real_jid = NULL;
 	const char *affiliation = NULL;
 	const char *role = NULL;
@@ -469,10 +481,19 @@
 	xmlnode *caps = NULL;
 	int idle = 0;
 	gchar *nickname = NULL;
+	gboolean signal_return;
+
+	from = xmlnode_get_attrib(packet, "from");
+	type = xmlnode_get_attrib(packet, "type");
 
 	if(!(jb = jabber_buddy_find(js, from, TRUE)))
 		return;
 
+	signal_return = GPOINTER_TO_INT(purple_signal_emit_return_1(jabber_plugin,
+			"jabber-receiving-presence", js->gc, type, from, packet));
+	if (signal_return)
+		return;
+
 	if(!(jid = jabber_id_new(from)))
 		return;
 
@@ -617,7 +638,7 @@
 					avatar_hash = xmlnode_get_data(photo);
 				}
 			}
-		} else if (!strcmp(y->name, "query") && 
+		} else if (!strcmp(y->name, "query") &&
 			!strcmp(xmlnode_get_namespace(y), "jabber:iq:last")) {
 			/* resource has specified idle */
 			const gchar *seconds = xmlnode_get_attrib(y, "seconds");
@@ -635,7 +656,7 @@
 			NULL);
 		purple_debug_info("jabber", "got delay %s yielding %ld s offset\n",
 			stamp, offset);
-		idle += offset; 
+		idle += offset;
 	}
 
 	if(jid->node && (chat = jabber_chat_find(js, jid->node, jid->domain))) {
--- a/libpurple/protocols/jabber/roster.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/roster.c	Sun Jun 28 04:41:07 2009 +0000
@@ -282,9 +282,23 @@
 		return;
 
 	if(grps) {
+		GString *out = g_string_new(NULL);
 		groups = grps;
+
+		for (l = groups; l; l = l->next) {
+			out = g_string_append(out, (const char *)l->data);
+			if (l->next)
+				out = g_string_append(out, ", ");
+		}
+
+		purple_debug_info("jabber", "jabber_roster_update(%s): [Source: grps]: groups: %s\n",
+		                  name, out->str);
+		g_string_free(out, TRUE);
+
 	} else {
 		GSList *buddies = purple_find_buddies(js->gc->account, name);
+		GString *out = g_string_new(NULL);
+
 		if(!buddies)
 			return;
 		while(buddies) {
@@ -293,6 +307,15 @@
 			groups = g_slist_append(groups, (char *)purple_group_get_name(g));
 			buddies = g_slist_remove(buddies, b);
 		}
+		for (l = groups; l; l = l->next) {
+			out = g_string_append(out, (const char *)l->data);
+			if (l->next)
+				out = g_string_append(out, ", ");
+		}
+
+		purple_debug_info("jabber", "jabber_roster_update(%s): [Source: local blist]: groups: %s\n",
+		                  name, out->str);
+		g_string_free(out, TRUE);
 	}
 
 	iq = jabber_iq_new_query(js, JABBER_IQ_SET, "jabber:iq:roster");
@@ -340,6 +363,9 @@
 
 	jb = jabber_buddy_find(js, name, FALSE);
 
+	purple_debug_info("jabber", "jabber_roster_add_buddy(): Adding %s\n",
+	                  name);
+
 	jabber_roster_update(js, who, NULL);
 
 	my_bare_jid = g_strdup_printf("%s@%s", js->user->node, js->user->domain);
@@ -369,6 +395,9 @@
 	if(b != NULL) {
 		purple_blist_alias_buddy(b, alias);
 
+		purple_debug_info("jabber", "jabber_roster_alias_change(): Aliased %s to %s\n",
+				name, alias ? alias : "(null)");
+
 		jabber_roster_update(gc->proto_data, name, NULL);
 	}
 }
@@ -395,6 +424,10 @@
 			groups = g_slist_append(groups, (char*)gname);
 		buddies = g_slist_remove(buddies, b);
 	}
+
+	purple_debug_info("jabber", "jabber_roster_group_change(): Moving %s from %s to %s\n",
+	                  name, old_group, new_group);
+
 	jabber_roster_update(gc->proto_data, name, groups);
 	g_slist_free(groups);
 }
@@ -428,6 +461,9 @@
 			buddies = g_slist_remove(buddies, tmpbuddy);
 		}
 
+		purple_debug_info("jabber", "jabber_roster_remove_buddy(): Removing %s from %s\n",
+		                  purple_buddy_get_name(buddy), purple_group_get_name(group));
+
 		jabber_roster_update(gc->proto_data, name, groups);
 		g_slist_free(groups);
 	} else {
@@ -439,6 +475,9 @@
 		xmlnode_set_attrib(item, "jid", name);
 		xmlnode_set_attrib(item, "subscription", "remove");
 
+		purple_debug_info("jabber", "jabber_roster_remove_buddy(): Removing %s\n",
+		                  purple_buddy_get_name(buddy));
+
 		jabber_iq_send(iq);
 	}
 }
--- a/libpurple/protocols/jabber/si.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/si.c	Sun Jun 28 04:41:07 2009 +0000
@@ -407,7 +407,7 @@
 {
 	PurpleXfer *xfer = data;
 	JabberSIXfer *jsx = xfer->data;
-	char buffer[256];
+	char buffer[42]; /* 40 for DST.ADDR + 2 bytes for port number*/
 	int len;
 	char *dstaddr, *hash;
 	const char *host;
@@ -431,16 +431,21 @@
 		jsx->rxlen += len;
 		return;
 	} else if(jsx->rxqueue[0] != 0x05 || jsx->rxqueue[1] != 0x01 ||
-			jsx->rxqueue[3] != 0x03) {
-		purple_debug_info("jabber", "invalid socks5 stuff\n");
+			jsx->rxqueue[3] != 0x03 || jsx->rxqueue[4] != 40) {
+		purple_debug_info("jabber", "Invalid socks5 conn req. header[0x%x,0x%x,0x%x,0x%x,0x%x]\n",
+				  jsx->rxqueue[0], jsx->rxqueue[1], jsx->rxqueue[2],
+				  jsx->rxqueue[3], jsx->rxqueue[4]);
 		purple_input_remove(xfer->watcher);
 		xfer->watcher = 0;
 		close(source);
 		purple_xfer_cancel_remote(xfer);
 		return;
 	} else if(jsx->rxlen - 5 <  jsx->rxqueue[4] + 2) {
-		purple_debug_info("jabber", "reading umpteen more bytes\n");
-		len = read(source, buffer, jsx->rxqueue[4] + 5 + 2 - jsx->rxlen);
+		/* Upper-bound of 257 (jsx->rxlen = 5, jsx->rxqueue[4] = 0xFF) */
+		unsigned short to_read = jsx->rxqueue[4] + 2 - (jsx->rxlen - 5);
+		purple_debug_info("jabber", "reading %u bytes for DST.ADDR + port num (trying to read %hu now)\n",
+				  jsx->rxqueue[4] + 2, to_read);
+		len = read(source, buffer, to_read);
 		if(len < 0 && errno == EAGAIN)
 			return;
 		else if(len <= 0) {
@@ -455,6 +460,7 @@
 		jsx->rxlen += len;
 	}
 
+	/* Have we not read all of DST.ADDR and the following 2-byte port number? */
 	if(jsx->rxlen - 5 < jsx->rxqueue[4] + 2)
 		return;
 
@@ -468,9 +474,16 @@
 	/* Per XEP-0065, the 'host' must be SHA1(SID + from JID + to JID) */
 	hash = jabber_calculate_data_sha1sum(dstaddr, strlen(dstaddr));
 
-	if(jsx->rxqueue[4] != 40 || strncmp(hash, jsx->rxqueue+5, 40) ||
+	if(strncmp(hash, jsx->rxqueue + 5, 40) ||
 			jsx->rxqueue[45] != 0x00 || jsx->rxqueue[46] != 0x00) {
-		purple_debug_error("jabber", "someone connected with the wrong info!\n");
+		if (jsx->rxqueue[45] != 0x00 || jsx->rxqueue[46] != 0x00)
+			purple_debug_error("jabber", "Got SOCKS5 BS conn with the wrong DST.PORT"
+						     " (must be 0 - got[0x%x,0x%x]).\n",
+						     jsx->rxqueue[45], jsx->rxqueue[46]);
+		else
+			purple_debug_error("jabber", "Got SOCKS5 BS conn with the wrong DST.ADDR"
+						     " (expected '%s' - got '%.40s').\n",
+						     hash, jsx->rxqueue + 5);
 		close(source);
 		purple_xfer_cancel_remote(xfer);
 		g_free(hash);
@@ -531,11 +544,13 @@
 	purple_input_remove(xfer->watcher);
 	xfer->watcher = 0;
 
+	/* If we sent a "Success", wait for a response, otherwise give up and cancel */
 	if (jsx->rxqueue[1] == 0x00) {
 		xfer->watcher = purple_input_add(source, PURPLE_INPUT_READ,
 			jabber_si_xfer_bytestreams_send_read_again_cb, xfer);
 		g_free(jsx->rxqueue);
 		jsx->rxqueue = NULL;
+		jsx->rxlen = 0;
 	} else {
 		close(source);
 		purple_xfer_cancel_remote(xfer);
@@ -556,6 +571,7 @@
 
 	xfer->fd = source;
 
+	/** Try to read the SOCKS5 header */
 	if(jsx->rxlen < 2) {
 		purple_debug_info("jabber", "reading those first two bytes\n");
 		len = read(source, buffer, 2 - jsx->rxlen);
@@ -572,9 +588,12 @@
 		memcpy(jsx->rxqueue + jsx->rxlen, buffer, len);
 		jsx->rxlen += len;
 		return;
-	} else if(jsx->rxlen - 2 <  jsx->rxqueue[1]) {
-		purple_debug_info("jabber", "reading the next umpteen bytes\n");
-		len = read(source, buffer, jsx->rxqueue[1] + 2 - jsx->rxlen);
+	} else if(jsx->rxlen - 2 < jsx->rxqueue[1]) {
+		/* Has a maximum value of 255 (jsx->rxlen = 2, jsx->rxqueue[1] = 0xFF) */
+		unsigned short to_read = jsx->rxqueue[1] - (jsx->rxlen - 2);
+		purple_debug_info("jabber", "reading %u bytes for auth methods (trying to read %hu now)\n",
+				  jsx->rxqueue[1], to_read);
+		len = read(source, buffer, to_read);
 		if(len < 0 && errno == EAGAIN)
 			return;
 		else if(len <= 0) {
@@ -589,6 +608,7 @@
 		jsx->rxlen += len;
 	}
 
+	/* Have we not read all the auth. method bytes? */
 	if(jsx->rxlen -2 < jsx->rxqueue[1])
 		return;
 
@@ -1301,6 +1321,11 @@
 			jabber_iq_remove_callback_by_id(js, jsx->iq_id);
 		if (jsx->local_streamhost_fd >= 0)
 			close(jsx->local_streamhost_fd);
+		if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND &&
+			xfer->fd >= 0) {
+			purple_debug_info("jabber", "remove port mapping\n");
+			purple_network_remove_port_mapping(xfer->fd);
+		}
 		if (jsx->connect_timeout > 0)
 			purple_timeout_remove(jsx->connect_timeout);
 		if (jsx->ibb_timeout_handle > 0)
@@ -1677,8 +1702,8 @@
 void
 jabber_si_init(void)
 {
-	jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse);	
-	
+	jabber_iq_register_handler("si", "http://jabber.org/protocol/si", jabber_si_parse);
+
 	jabber_ibb_register_open_handler(jabber_si_xfer_ibb_open_cb);
 }
 
--- a/libpurple/protocols/jabber/si.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/si.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,5 +1,5 @@
 /**
- * @file jutil.h utility functions
+ * @file si.h SI transfer functions
  *
  * purple
  *
--- a/libpurple/protocols/jabber/useravatar.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/jabber/useravatar.c	Sun Jun 28 04:41:07 2009 +0000
@@ -257,6 +257,8 @@
                                gsize len, const gchar *error_message)
 {
 	JabberBuddyAvatarUpdateURLInfo *info = user_data;
+	gpointer icon_data;
+
 	if(!url_text) {
 		purple_debug(PURPLE_DEBUG_ERROR, "jabber",
 		             "do_buddy_avatar_update_fromurl got error \"%s\"",
@@ -264,7 +266,8 @@
 		goto out;
 	}
 
-	purple_buddy_icons_set_for_user(purple_connection_get_account(info->js->gc), info->from, (void*)url_text, len, info->id);
+	icon_data = g_memdup(url_text, len);
+	purple_buddy_icons_set_for_user(purple_connection_get_account(info->js->gc), info->from, icon_data, len, info->id);
 
 out:
 	g_free(info->from);
--- a/libpurple/protocols/msn/cmdproc.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/cmdproc.c	Sun Jun 28 04:41:07 2009 +0000
@@ -210,6 +210,7 @@
 
 	trans = g_new0(MsnTransaction, 1);
 
+	trans->cmdproc = cmdproc;
 	trans->command = g_strdup(command);
 
 	if (format != NULL)
--- a/libpurple/protocols/msn/contact.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/contact.c	Sun Jun 28 04:41:07 2009 +0000
@@ -357,29 +357,36 @@
 	MsnUser *user = msn_userlist_find_add_user(session->userlist, passport, NULL);
 	xmlnode *annotation;
 	guint nid = MSN_NETWORK_UNKNOWN;
+	char *invite = NULL;
 
-	/* For EmailMembers, the network must be found in the annotations. */
-	if (!strcmp(node, "PassportName")) {
+	for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
+	     annotation;
+	     annotation = xmlnode_get_next_twin(annotation)) {
+		char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
+		char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
+		if (name && value) {
+			if (!strcmp(name, "MSN.IM.BuddyType")) {
+				nid = strtoul(value, NULL, 10);
+			}
+			else if (!strcmp(name, "MSN.IM.InviteMessage")) {
+				invite = value;
+				value = NULL;
+			}
+		}
+		g_free(name);
+		g_free(value);
+	}
+
+	/* For EmailMembers, the network must be found in the annotations, above.
+	   Otherwise, PassportMembers are on the Passport network. */
+	if (!strcmp(node, "PassportName"))
 		nid = MSN_NETWORK_PASSPORT;
-	} else {
-		for (annotation = xmlnode_get_child(member, "Annotations/Annotation");
-		     annotation;
-		     annotation = xmlnode_get_next_twin(annotation)) {
-			char *name = xmlnode_get_data(xmlnode_get_child(annotation, "Name"));
-			if (name && !strcmp(name, "MSN.IM.BuddyType")) {
-				char *value = xmlnode_get_data(xmlnode_get_child(annotation, "Value"));
-				if (value != NULL)
-					nid = strtoul(value, NULL, 10);
-				g_free(value);
-			}
-			g_free(name);
-		}
-	}
 
 	purple_debug_info("msn", "CL: %s name: %s, Type: %s, MembershipID: %s, NetworkID: %u\n",
 		node, passport, type, member_id == NULL ? "(null)" : member_id, nid);
 
 	msn_user_set_network(user, nid);
+	msn_user_set_invite_message(user, invite);
 
 	if (member_id) {
 		user->membership_id[list] = atoi(member_id);
@@ -390,6 +397,7 @@
 	g_free(passport);
 	g_free(type);
 	g_free(member_id);
+	g_free(invite);
 }
 
 static void
@@ -717,8 +725,6 @@
 					g_free(msnEnabled);
 				}
 			}
-			if (passport == NULL) /* Couldn't find anything */
-				continue;
 		} else {
 			xmlnode *messenger_user;
 			/* ignore non-messenger contacts */
@@ -736,6 +742,7 @@
 			passport = xmlnode_get_data(passportName);
 		}
 
+		/* Couldn't find anything */
 		if (passport == NULL)
 			continue;
 
--- a/libpurple/protocols/msn/history.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/history.c	Sun Jun 28 04:41:07 2009 +0000
@@ -68,6 +68,7 @@
 msn_history_add(MsnHistory *history, MsnTransaction *trans)
 {
 	GQueue *queue;
+	int max_elems;
 
 	g_return_if_fail(history != NULL);
 	g_return_if_fail(trans   != NULL);
@@ -78,7 +79,12 @@
 
 	g_queue_push_tail(queue, trans);
 
-	if (queue->length > MSN_HIST_ELEMS)
+	if (trans->cmdproc->servconn->type == MSN_SERVCONN_NS)
+		max_elems = MSN_NS_HIST_ELEMS;
+	else
+		max_elems = MSN_SB_HIST_ELEMS;
+
+	if (queue->length > max_elems)
 	{
 		trans = g_queue_pop_head(queue);
 		msn_transaction_destroy(trans);
--- a/libpurple/protocols/msn/history.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/history.h	Sun Jun 28 04:41:07 2009 +0000
@@ -24,7 +24,8 @@
 #ifndef _MSN_HISTORY_H
 #define _MSN_HISTORY_H
 
-#define MSN_HIST_ELEMS 0x30
+#define MSN_NS_HIST_ELEMS 0x300
+#define MSN_SB_HIST_ELEMS 0x30
 
 typedef struct _MsnHistory MsnHistory;
 
--- a/libpurple/protocols/msn/httpconn.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/httpconn.c	Sun Jun 28 04:41:07 2009 +0000
@@ -219,7 +219,13 @@
 		g_free(tmp);
 
 		t = strchr(full_session_id, '.');
-		session_id = g_strndup(full_session_id, t - full_session_id);
+		if (t != NULL)
+			session_id = g_strndup(full_session_id, t - full_session_id);
+		else {
+			purple_debug_error("msn", "Malformed full_session_id[%s]\n",
+					   full_session_id ? full_session_id : NULL);
+			session_id = g_strdup(full_session_id);
+		}
 
 		if (session_action == NULL || strcmp(session_action, "close") != 0)
 		{
--- a/libpurple/protocols/msn/msn.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/msn.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1281,7 +1281,7 @@
 			imdata->gc = gc;
 			imdata->who = who;
 			imdata->msg = body_str;
-			imdata->flags = flags;
+			imdata->flags = flags & ~PURPLE_MESSAGE_SEND;
 			imdata->when = time(NULL);
 			purple_timeout_add(0, msn_send_me_im, imdata);
 		}
@@ -1380,56 +1380,36 @@
 	msn_change_status(session);
 }
 
-#if 0
+/*
+ * Actually adds a buddy once we have the response from FQY
+ */
 static void
-fake_userlist_add_buddy(MsnUserList *userlist,
-					   const char *who, int list_id,
-					   const char *group_name)
+add_pending_buddy(MsnSession *session,
+                  const char *who,
+                  MsnNetwork network,
+                  MsnUser *user)
 {
-	MsnUser *user;
-	static int group_id_c = 1;
-	int group_id;
-
-	group_id = -1;
-
-	if (group_name != NULL)
-	{
-		MsnGroup *group;
-		group = msn_group_new(userlist, group_id_c, group_name);
-		group_id = group_id_c++;
-	}
-
-	user = msn_userlist_find_user(userlist, who);
-
-	if (user == NULL)
-	{
-		user = msn_user_new(userlist, who, NULL);
+	MsnUserList *userlist = session->userlist;
+	MsnUser *user2;
+	char *group;
+
+	g_return_if_fail(user != NULL);
+
+	group = msn_user_remove_pending_group(user);
+
+	user2 = msn_userlist_find_user(userlist, who);
+	if (user2 != NULL) {
+		/* User already in userlist, so just update it. */
+		msn_user_destroy(user);
+		user = user2;
+	} else {
 		msn_userlist_add_user(userlist, user);
 	}
-	else
-		if (user->list_op & (1 << list_id))
-		{
-			if (list_id == MSN_LIST_FL)
-			{
-				if (group_id >= 0)
-					if (g_list_find(user->group_ids,
-									GINT_TO_POINTER(group_id)))
-						return;
-			}
-			else
-				return;
-		}
-
-	if (group_id >= 0)
-	{
-		/* This is wrong... user->group_ids contains g_strdup()'d data now */
-		user->group_ids = g_list_append(user->group_ids,
-										GINT_TO_POINTER(group_id));
-	}
-
-	user->list_op |= (1 << list_id);
+
+	msn_user_set_network(user, network);
+	msn_userlist_add_buddy(userlist, who, group);
+	g_free(group);
 }
-#endif
 
 static void
 msn_add_buddy(PurpleConnection *gc, PurpleBuddy *buddy, PurpleGroup *group)
@@ -1447,23 +1427,11 @@
 	purple_debug_info("msn", "Add user:%s to group:%s\n", who, gname ? gname : "(null)");
 	if (!session->logged_in)
 	{
-#if 0
-		fake_userlist_add_buddy(session->sync_userlist, who, MSN_LIST_FL,
-								group ? group->name : NULL);
-#else
 		purple_debug_error("msn", "msn_add_buddy called before connected\n");
-#endif
 
 		return;
 	}
 
-#if 0
-	if (group != NULL && group->name != NULL)
-		purple_debug_info("msn", "msn_add_buddy: %s, %s\n", who, group->name);
-	else
-		purple_debug_info("msn", "msn_add_buddy: %s\n", who);
-#endif
-
 	/* XXX - Would group ever be NULL here?  I don't think so...
 	 * shx: Yes it should; MSN handles non-grouped buddies, and this is only
 	 * internal. */
@@ -1476,13 +1444,15 @@
 		char **tokens;
 		char *fqy;
 		/* We need to check the network for this buddy first */
-		msn_userlist_save_pending_buddy(userlist, who, gname);
+		user = msn_user_new(userlist, who, NULL);
+		msn_user_set_pending_group(user, gname);
+		msn_user_set_network(user, MSN_NETWORK_UNKNOWN);
 		tokens = g_strsplit(who, "@", 2);
 		fqy = g_strdup_printf("<ml><d n=\"%s\"><c n=\"%s\"/></d></ml>",
 		                      tokens[1],
 		                      tokens[0]);
 		msn_notification_send_fqy(session, fqy, strlen(fqy),
-		                          (MsnFqyCb)msn_userlist_add_pending_buddy);
+		                          (MsnFqyCb)add_pending_buddy, user);
 		g_free(fqy);
 		g_strfreev(tokens);
 	}
--- a/libpurple/protocols/msn/notification.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/notification.c	Sun Jun 28 04:41:07 2009 +0000
@@ -149,48 +149,6 @@
 }
 
 /**************************************************************************
- * Util
- **************************************************************************/
-
-static void
-group_error_helper(MsnSession *session, const char *msg, const char *group_id, int error)
-{
-	PurpleAccount *account;
-	PurpleConnection *gc;
-	char *reason = NULL;
-	char *title = NULL;
-
-	account = session->account;
-	gc = purple_account_get_connection(account);
-
-	if (error == 224)
-	{
-		if (group_id == 0)
-		{
-			return;
-		}
-		else
-		{
-			const char *group_name;
-			group_name = msn_userlist_find_group_name(session->userlist,group_id);
-			reason = g_strdup_printf(_("%s is not a valid group."),
-									 group_name ? group_name : "");
-		}
-	}
-	else
-	{
-		reason = g_strdup(_("Unknown error."));
-	}
-
-	title = g_strdup_printf(_("%s on %s (%s)"), msg,
-						  purple_account_get_username(account),
-						  purple_account_get_protocol_name(account));
-	purple_notify_error(gc, NULL, title, reason);
-	g_free(title);
-	g_free(reason);
-}
-
-/**************************************************************************
  * Login
  **************************************************************************/
 
@@ -369,14 +327,13 @@
 	/* NOTE: cmd is not always cmdproc->last_cmd, sometimes cmd is a queued
 	 * command and we are processing it */
 	if (cmd->payload == NULL) {
-		cmdproc->last_cmd->payload_cb  = msg_cmd_post;
+		cmdproc->last_cmd->payload_cb = msg_cmd_post;
 		cmd->payload_len = atoi(cmd->params[2]);
-
 	} else {
 		g_return_if_fail(cmd->payload_cb != NULL);
 
 #if 0 /* glib on win32 doesn't correctly support precision modifiers for a string */
-		purple_debug_info("msn", "MSG payload:{%.*s}\n", cmd->payload_len, cmd->payload);
+		purple_debug_info("msn", "MSG payload:{%.*s}\n", (guint)cmd->payload_len, cmd->payload);
 #endif
 		cmd->payload_cb(cmdproc, cmd, cmd->payload, cmd->payload_len);
 	}
@@ -521,6 +478,12 @@
 /**************************************************************************
  * Buddy Lists
  **************************************************************************/
+
+typedef struct MsnFqyCbData {
+	MsnFqyCb cb;
+	gpointer data;
+} MsnFqyCbData;
+
 /* add contact to xmlnode */
 static void
 msn_add_contact_xml(MsnSession *session, xmlnode *mlNode,const char *passport, MsnListOp list_op, MsnNetwork networkId)
@@ -593,24 +556,40 @@
 	msn_cmdproc_send_trans(cmdproc, trans);
 }
 
+static void
+msn_notification_post_rml(MsnCmdProc *cmdproc, const char *payload, int payload_len)
+{
+	MsnTransaction *trans;
+	purple_debug_info("msn", "Sending RML with payload: %s\n", payload);
+	trans = msn_transaction_new(cmdproc, "RML", "%i", payload_len);
+	msn_transaction_set_payload(trans, payload, payload_len);
+	msn_cmdproc_send_trans(cmdproc, trans);
+}
+
 void
 msn_notification_send_fqy(MsnSession *session,
                           const char *payload, int payload_len,
-                          MsnFqyCb cb)
+                          MsnFqyCb cb,
+                          gpointer cb_data)
 {
 	MsnTransaction *trans;
 	MsnCmdProc *cmdproc;
+	MsnFqyCbData *data;
 
 	cmdproc = session->notification->cmdproc;
 
+	data = g_new(MsnFqyCbData, 1);
+	data->cb = cb;
+	data->data = cb_data;
+
 	trans = msn_transaction_new(cmdproc, "FQY", "%d", payload_len);
 	msn_transaction_set_payload(trans, payload, payload_len);
-	msn_transaction_set_data(trans, cb);
+	msn_transaction_set_data(trans, data);
 	msn_cmdproc_send_trans(cmdproc, trans);
 }
 
 static void
-update_contact_network(MsnSession *session, const char *passport, MsnNetwork network)
+update_contact_network(MsnSession *session, const char *passport, MsnNetwork network, gpointer unused)
 {
 	MsnUser *user;
 
@@ -726,7 +705,7 @@
 				payload = xmlnode_to_str(fqy_node, &payload_len);
 
 				msn_notification_send_fqy(session, payload, payload_len,
-				                          update_contact_network);
+				                          update_contact_network, NULL);
 
 				g_free(payload);
 				xmlnode_free(fqy_node);
@@ -751,7 +730,7 @@
 		payload = xmlnode_to_str(fqy_node, &payload_len);
 
 		msn_notification_send_fqy(session, payload, payload_len,
-		                          update_contact_network);
+		                          update_contact_network, NULL);
 
 		g_free(payload);
 	}
@@ -961,15 +940,20 @@
 
 			passport = g_strdup_printf("%s@%s", local, domain);
 
-			if (!g_ascii_isdigit(cmd->command[0]) && type != NULL)
+			if (g_ascii_isdigit(cmd->command[0]))
+				network = MSN_NETWORK_UNKNOWN;
+			else if (type != NULL)
 				network = (MsnNetwork)strtoul(type, NULL, 10);
-			else
-				network = MSN_NETWORK_UNKNOWN;
 
 			purple_debug_info("msn", "FQY response says %s is from network %d\n",
 			                  passport, network);
-			if (cmd->trans->data)
-				((MsnFqyCb)cmd->trans->data)(session, passport, network);
+			if (cmd->trans->data) {
+				MsnFqyCbData *fqy_data = cmd->trans->data;
+				fqy_data->cb(session, passport, network, fqy_data->data);
+				/* TODO: This leaks, but the server responds to FQY multiple times, so we
+				         can't free it yet. We need to figure out somewhere else to do so.
+				g_free(fqy_data); */
+			}
 
 			g_free(passport);
 		}
@@ -994,7 +978,7 @@
 	   FQY error, it's probably going to disconnect us. So it isn't necessary
 	   to tell the handler about it. */
 	else if (trans->data)
-		((MsnFqyCb)trans->data)(session, NULL, MSN_NETWORK_UNKNOWN); */
+		((MsnFqyCb)trans->data)(session, NULL, MSN_NETWORK_UNKNOWN, NULL);
 #endif
 }
 
@@ -1023,117 +1007,6 @@
 }
 
 static void
-add_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	MsnSession *session;
-	PurpleAccount *account;
-	PurpleConnection *gc;
-	const char *list, *passport;
-	char *reason = NULL;
-	char *msg = NULL;
-	char **params;
-
-	session = cmdproc->session;
-	account = session->account;
-	gc = purple_account_get_connection(account);
-	params = g_strsplit(trans->params, " ", 0);
-
-	list     = params[0];
-	passport = params[1];
-
-	if (!strcmp(list, "FL"))
-		msg = g_strdup_printf(_("Unable to add user on %s (%s)"),
-							  purple_account_get_username(account),
-							  purple_account_get_protocol_name(account));
-	else if (!strcmp(list, "BL"))
-		msg = g_strdup_printf(_("Unable to block user on %s (%s)"),
-							  purple_account_get_username(account),
-							  purple_account_get_protocol_name(account));
-	else if (!strcmp(list, "AL"))
-		msg = g_strdup_printf(_("Unable to permit user on %s (%s)"),
-							  purple_account_get_username(account),
-							  purple_account_get_protocol_name(account));
-
-	if (!strcmp(list, "FL"))
-	{
-		if (error == 210)
-		{
-			reason = g_strdup_printf(_("%s could not be added because "
-									   "your buddy list is full."), passport);
-		}
-	}
-
-	if (reason == NULL)
-	{
-		if (error == 208)
-		{
-			reason = g_strdup_printf(_("%s is not a valid passport account."),
-									 passport);
-		}
-		else if (error == 500)
-		{
-			reason = g_strdup(_("Service Temporarily Unavailable."));
-		}
-		else
-		{
-			reason = g_strdup(_("Unknown error."));
-		}
-	}
-
-	if (msg != NULL)
-	{
-		purple_notify_error(gc, NULL, msg, reason);
-		g_free(msg);
-	}
-
-	if (!strcmp(list, "FL"))
-	{
-		PurpleBuddy *buddy;
-
-		buddy = purple_find_buddy(account, passport);
-
-		if (buddy != NULL)
-			purple_blist_remove_buddy(buddy);
-	}
-
-	g_free(reason);
-
-	g_strfreev(params);
-}
-
-static void
-adg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	gint group_id;
-	const char *group_name;
-
-	session = cmdproc->session;
-
-	group_id = atoi(cmd->params[3]);
-
-	group_name = purple_url_decode(cmd->params[2]);
-
-	msn_group_new(session->userlist, cmd->params[3], group_name);
-
-	/* There is a user that must be moved to this group */
-	if (cmd->trans->data)
-	{
-		/* msn_userlist_move_buddy(); */
-		MsnUserList *userlist = cmdproc->session->userlist;
-		MsnCallbackState *data = cmd->trans->data;
-
-		if (data->old_group_name != NULL)
-		{
-			msn_userlist_move_buddy(userlist, data->who, data->old_group_name, group_name);
-			g_free(data->old_group_name);
-		} else {
-			/* msn_add_contact_to_group(userlist, data, data->who, group_name); */
-		}
-	}
-}
-
-static void
 qng_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
 {
 	/* TODO: Call PNG after the timeout specified. */
@@ -1468,61 +1341,6 @@
 	}
 }
 
-static void
-reg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	const char *group_id, *group_name;
-
-	session = cmdproc->session;
-	group_id = cmd->params[2];
-	group_name = purple_url_decode(cmd->params[3]);
-
-	msn_userlist_rename_group_id(session->userlist, group_id, group_name);
-}
-
-static void
-reg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	const char * group_id;
-	char **params;
-
-	params = g_strsplit(trans->params, " ", 0);
-
-	group_id = params[0];
-
-	group_error_helper(cmdproc->session, _("Unable to rename group"), group_id, error);
-
-	g_strfreev(params);
-}
-
-static void
-rmg_cmd(MsnCmdProc *cmdproc, MsnCommand *cmd)
-{
-	MsnSession *session;
-	const char *group_id;
-
-	session = cmdproc->session;
-	group_id = cmd->params[2];
-
-	msn_userlist_remove_group_id(session->userlist, group_id);
-}
-
-static void
-rmg_error(MsnCmdProc *cmdproc, MsnTransaction *trans, int error)
-{
-	const char *group_id;
-	char **params;
-
-	params = g_strsplit(trans->params, " ", 0);
-
-	group_id = params[0];
-
-	group_error_helper(cmdproc->session, _("Unable to delete group"), group_id, error);
-
-	g_strfreev(params);
-}
-
 /**************************************************************************
  * Misc commands
  **************************************************************************/
@@ -1891,14 +1709,11 @@
 
 		if (count > 0)
 		{
-			const char *passport;
-			const char *url;
-
-			passport = msn_user_get_passport(session->user);
-			url = session->passport_info.mail_url;
+			const char *passports[2] = { msn_user_get_passport(session->user) };
+			const char *urls[2] = { session->passport_info.mail_url };
 
 			purple_notify_emails(gc, count, FALSE, NULL, NULL,
-							   &passport, &url, NULL, NULL);
+							   passports, urls, NULL, NULL);
 		}
 	}
 
@@ -1960,14 +1775,11 @@
 
 		if (count > 0)
 		{
-			const char *passport;
-			const char *url;
-
-			passport = msn_user_get_passport(session->user);
-			url = session->passport_info.mail_url;
+			const char *passports[2] = { msn_user_get_passport(session->user) };
+			const char *urls[2] = { session->passport_info.mail_url };
 
 			purple_notify_emails(gc, count, FALSE, NULL, NULL,
-							   &passport, &url, NULL, NULL);
+							   passports, urls, NULL, NULL);
 		}
 	}
 
@@ -2081,10 +1893,54 @@
 	g_hash_table_destroy(table);
 }
 
+/**************************************************************************
+ * Dispatch server list management 
+ **************************************************************************/
+typedef struct MsnAddRemoveListData {
+	MsnCmdProc *cmdproc;
+	MsnUser *user;
+	MsnListOp list_op;
+	gboolean add;
+} MsnAddRemoveListData;
+
+static void
+modify_unknown_buddy_on_list(MsnSession *session, const char *passport,
+                             MsnNetwork network, gpointer data)
+{
+	MsnAddRemoveListData *addrem = data;
+	MsnCmdProc *cmdproc;
+	xmlnode *node;
+	char *payload;
+	int payload_len;
+
+	cmdproc = addrem->cmdproc;
+
+	/* Update user first */
+	msn_user_set_network(addrem->user, network);
+
+	node = xmlnode_new("ml");
+	node->child = NULL;
+
+	msn_add_contact_xml(session, node, passport,
+	                    addrem->list_op, network);
+
+	payload = xmlnode_to_str(node, &payload_len);
+	xmlnode_free(node);
+
+	if (addrem->add)
+		msn_notification_post_adl(cmdproc, payload, payload_len);
+	else
+		msn_notification_post_rml(cmdproc, payload, payload_len);
+
+	g_free(payload);
+	g_free(addrem);
+}
+
 void
 msn_notification_add_buddy_to_list(MsnNotification *notification, MsnListId list_id,
 							  MsnUser *user)
 {
+	MsnAddRemoveListData *addrem;
 	MsnCmdProc *cmdproc;
 	MsnListOp list_op = 1 << list_id;
 	xmlnode *adl_node;
@@ -2099,11 +1955,23 @@
 	msn_add_contact_xml(notification->session, adl_node, user->passport,
 	                    list_op, user->networkid);
 
-	payload = xmlnode_to_str(adl_node,&payload_len);
+	payload = xmlnode_to_str(adl_node, &payload_len);
 	xmlnode_free(adl_node);
 
-	msn_notification_post_adl(notification->servconn->cmdproc,
-						payload,payload_len);
+	if (user->networkid != MSN_NETWORK_UNKNOWN) {
+		msn_notification_post_adl(cmdproc, payload, payload_len);
+
+	} else {
+		addrem = g_new(MsnAddRemoveListData, 1);
+		addrem->cmdproc = cmdproc;
+		addrem->user = user;
+		addrem->list_op = list_op;
+		addrem->add = TRUE;
+
+		msn_notification_send_fqy(notification->session, payload, payload_len,
+		                          modify_unknown_buddy_on_list, addrem);
+	}
+
 	g_free(payload);
 }
 
@@ -2111,8 +1979,8 @@
 msn_notification_rem_buddy_from_list(MsnNotification *notification, MsnListId list_id,
 						   MsnUser *user)
 {
+	MsnAddRemoveListData *addrem;
 	MsnCmdProc *cmdproc;
-	MsnTransaction *trans;
 	MsnListOp list_op = 1 << list_id;
 	xmlnode *rml_node;
 	char *payload;
@@ -2129,10 +1997,20 @@
 	payload = xmlnode_to_str(rml_node, &payload_len);
 	xmlnode_free(rml_node);
 
-	purple_debug_info("msn", "Send RML with payload:\n%s\n", payload);
-	trans = msn_transaction_new(cmdproc, "RML","%" G_GSIZE_FORMAT, strlen(payload));
-	msn_transaction_set_payload(trans, payload, strlen(payload));
-	msn_cmdproc_send_trans(cmdproc, trans);
+	if (user->networkid != MSN_NETWORK_UNKNOWN) {
+		msn_notification_post_rml(cmdproc, payload, payload_len);
+
+	} else {
+		addrem = g_new(MsnAddRemoveListData, 1);
+		addrem->cmdproc = cmdproc;
+		addrem->user = user;
+		addrem->list_op = list_op;
+		addrem->add = FALSE;
+
+		msn_notification_send_fqy(notification->session, payload, payload_len,
+		                          modify_unknown_buddy_on_list, addrem);
+	}
+
 	g_free(payload);
 }
 
@@ -2155,9 +2033,6 @@
 	msn_table_add_cmd(cbs_table, "VER", "VER", ver_cmd);
 	msn_table_add_cmd(cbs_table, "PRP", "PRP", prp_cmd);
 	msn_table_add_cmd(cbs_table, "BLP", "BLP", blp_cmd);
-	msn_table_add_cmd(cbs_table, "REG", "REG", reg_cmd);
-	msn_table_add_cmd(cbs_table, "ADG", "ADG", adg_cmd);
-	msn_table_add_cmd(cbs_table, "RMG", "RMG", rmg_cmd);
 	msn_table_add_cmd(cbs_table, "XFR", "XFR", xfr_cmd);
 
 	/* Asynchronous */
@@ -2190,11 +2065,8 @@
 
 	msn_table_add_cmd(cbs_table, NULL, "241", adl_241_error_cmd);
 
-	msn_table_add_error(cbs_table, "ADD", add_error);
 	msn_table_add_error(cbs_table, "ADL", adl_error);
 	msn_table_add_error(cbs_table, "FQY", fqy_error);
-	msn_table_add_error(cbs_table, "REG", reg_error);
-	msn_table_add_error(cbs_table, "RMG", rmg_error);
 	msn_table_add_error(cbs_table, "USR", usr_error);
 
 	msn_table_add_msg_type(cbs_table,
--- a/libpurple/protocols/msn/notification.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/notification.h	Sun Jun 28 04:41:07 2009 +0000
@@ -58,7 +58,7 @@
 	gboolean in_use;
 };
 
-typedef void (*MsnFqyCb)(MsnSession *session, const char *passport, MsnNetwork network);
+typedef void (*MsnFqyCb)(MsnSession *session, const char *passport, MsnNetwork network, gpointer data);
 
 #include "state.h"
 void uum_send_msg(MsnSession *session,MsnMessage *msg);
@@ -73,7 +73,7 @@
 
 void msn_notification_send_fqy(MsnSession *session,
                                const char *payload, int payload_len,
-                               MsnFqyCb cb);
+                               MsnFqyCb cb, gpointer cb_data);
 
 MsnNotification *msn_notification_new(MsnSession *session);
 void msn_notification_destroy(MsnNotification *notification);
--- a/libpurple/protocols/msn/oim.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/oim.c	Sun Jun 28 04:41:07 2009 +0000
@@ -668,9 +668,15 @@
 		if (tokens[1] != NULL)
 			from = (const char *)tokens[1];
 
-		start = strchr(from, '<') + 1;
-		end = strchr(from, '>');
-		passport = g_strndup(start, end - start);
+		start = strchr(from, '<');
+		if (start != NULL) {
+			start++;
+			end = strchr(from, '>');
+			if (end != NULL)
+				passport = g_strndup(start, end - start);
+		}
+		if (passport == NULL)
+			passport = g_strdup(_("Unknown"));
 
 		g_strfreev(tokens);
 	}
@@ -764,14 +770,14 @@
 	if (iu_node != NULL && purple_account_get_check_mail(session->account))
 	{
 		char *unread = xmlnode_get_data(iu_node);
-		const char *passport = msn_user_get_passport(session->user);
-		const char *url = session->passport_info.mail_url;
+		const char *passports[2] = { msn_user_get_passport(session->user) };
+		const char *urls[2] = { session->passport_info.mail_url };
 		int count = atoi(unread);
 
 		/* XXX/khc: pretty sure this is wrong */
 		if (count > 0)
 			purple_notify_emails(session->account->gc, count, FALSE, NULL,
-				NULL, &passport, &url, NULL, NULL);
+				NULL, passports, urls, NULL, NULL);
 		g_free(unread);
 	}
 
--- a/libpurple/protocols/msn/session.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/session.c	Sun Jun 28 04:41:07 2009 +0000
@@ -261,9 +261,9 @@
 static void
 msn_session_sync_users(MsnSession *session)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
 	PurpleConnection *gc = purple_account_get_connection(session->account);
 	GList *to_remove = NULL;
+	GSList *buddies;
 
 	g_return_if_fail(gc != NULL);
 
@@ -271,60 +271,36 @@
 	 * being logged in. This no longer happens, so we manually iterate
 	 * over the whole buddy list to identify sync issues.
 	 */
-	for (gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		PurpleGroup *group = (PurpleGroup *)gnode;
-		const char *group_name;
-		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		group_name = purple_group_get_name(group);
-		for(cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for(bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				PurpleBuddy *b;
-				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				b = (PurpleBuddy *)bnode;
-				if(purple_buddy_get_account(b) == purple_connection_get_account(gc)) {
-					MsnUser *remote_user;
-					gboolean found = FALSE;
-
-					remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b));
+	for (buddies = purple_find_buddies(session->account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *buddy = buddies->data;
+		const gchar *buddy_name = purple_buddy_get_name(buddy);
+		const gchar *group_name = purple_group_get_name(purple_buddy_get_group(buddy));
+		MsnUser *remote_user;
+		gboolean found = FALSE;
 
-					if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP))
-					{
-						GList *l;
-
-						for (l = remote_user->group_ids; l != NULL; l = l->next)
-						{
-							const char *name = msn_userlist_find_group_name(remote_user->userlist, l->data);
-							if (name && !g_ascii_strcasecmp(group_name, name))
-							{
-								found = TRUE;
-								break;
-							}
-						}
-					}
+		remote_user = msn_userlist_find_user(session->userlist, buddy_name);
+		if (remote_user && remote_user->list_op & MSN_LIST_FL_OP) {
+			GList *l;
+			for (l = remote_user->group_ids; l; l = l->next) {
+				const char *name = msn_userlist_find_group_name(remote_user->userlist, l->data);
+				if (name && !g_ascii_strcasecmp(group_name, name)) {
+					found = TRUE;
+					break;
+				}
+			}
 
-					/* We don't care if they're in a different group, as long as they're on the
-					 * list somewhere. If we check for the group, we cause pain, agony and
-					 * suffering for people who decide to re-arrange their buddy list elsewhere.
-					 */
-					if (!found)
-					{
-						if ((remote_user == NULL) || !(remote_user->list_op & MSN_LIST_FL_OP)) {
-							/* The user is not on the server list */
-							msn_show_sync_issue(session, purple_buddy_get_name(b), group_name);
-						} else {
-							/* The user is not in that group on the server list */
-							to_remove = g_list_prepend(to_remove, b);
-						}
-					}
+			/* We don't care if they're in a different group, as long as they're on the
+			 * list somewhere. If we check for the group, we cause pain, agony and
+			 * suffering for people who decide to re-arrange their buddy list elsewhere.
+			 */
+			if (!found) {
+				if ((remote_user == NULL) || !(remote_user->list_op & MSN_LIST_FL_OP)) {
+					/* The user is not on the server list */
+					msn_show_sync_issue(session, buddy_name, group_name);
+				} else {
+					/* The user is not in that group on the server list */
+					to_remove = g_list_prepend(to_remove, buddy);
 				}
 			}
 		}
--- a/libpurple/protocols/msn/slplink.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/slplink.c	Sun Jun 28 04:41:07 2009 +0000
@@ -592,7 +592,7 @@
 		if (G_MAXSIZE - len < offset || (offset + len) > slpmsg->size)
 		{
 			purple_debug_error("msn",
-				"Oversized slpmsg - msgsize=%lld offset=%" G_GSIZE_FORMAT " len=%" G_GSIZE_FORMAT "\n",
+				"Oversized slpmsg - msgsize=%lld offset=%" G_GUINT64_FORMAT " len=%" G_GSIZE_FORMAT "\n",
 				slpmsg->size, offset, len);
 			g_return_if_reached();
 		}
@@ -683,9 +683,9 @@
 		size = st.st_size;
 
 	if(!file_name) {
-		base = g_path_get_basename(file_path);
-		u8 = purple_utf8_try_convert(base);
-		g_free(base);
+		gchar *basename = g_path_get_basename(file_path);
+		u8 = purple_utf8_try_convert(basename);
+		g_free(basename);
 		file_name = u8;
 	}
 
--- a/libpurple/protocols/msn/soap.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/soap.c	Sun Jun 28 04:41:07 2009 +0000
@@ -80,7 +80,7 @@
 	conn->session = session;
 	conn->host = g_strdup(host);
 	conn->queue = g_queue_new();
-	conn->unsafe_debug = g_getenv("PURPLE_MSN_UNSAFE_DEBUG") != NULL;
+	conn->unsafe_debug = g_getenv("PURPLE_UNSAFE_DEBUG") != NULL;
 	return conn;
 }
 
@@ -434,7 +434,7 @@
 					g_free(line);
 					return;
 				} else if (strcmp(key, "Content-Length") == 0) {
-					conn->body_len = atoi(value);
+					sscanf(value, "%" G_GSIZE_FORMAT, &(conn->body_len));
 				} else if (strcmp(key, "Connection") == 0) {
 					if (strcmp(value, "close") == 0) {
 						conn->close_when_done = TRUE;
@@ -667,7 +667,8 @@
 			conn->handled_len = 0;
 			conn->current_request = req;
 
-			purple_input_remove(conn->event_handle);
+			if (conn->event_handle)
+				purple_input_remove(conn->event_handle);
 			conn->event_handle = purple_input_add(conn->ssl->fd,
 				PURPLE_INPUT_WRITE, msn_soap_write_cb, conn);
 			if (!msn_soap_write_cb_internal(conn, conn->ssl->fd, PURPLE_INPUT_WRITE, TRUE)) {
--- a/libpurple/protocols/msn/state.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/state.c	Sun Jun 28 04:41:07 2009 +0000
@@ -21,6 +21,10 @@
  * along with this program; if not, write to the Free Software
  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
  */
+
+#include "internal.h"
+#include "core.h"
+
 #include "msn.h"
 #include "state.h"
 
@@ -288,10 +292,29 @@
 	MsnUser *user;
 	MsnObject *msnobj;
 	const char *state_text;
+	GHashTable *ui_info = purple_core_get_ui_info();
+	MsnClientCaps caps = MSN_CLIENT_ID;
 
 	g_return_if_fail(session != NULL);
 	g_return_if_fail(session->notification != NULL);
 
+	/* set client caps based on what the UI tells us it is... */
+	if (ui_info) {
+		const gchar *client_type = g_hash_table_lookup(ui_info, "client_type");
+		if (client_type) {
+			if (strcmp(client_type, "phone") == 0 ||
+				strcmp(client_type, "handheld") == 0) {
+				caps |= MSN_CLIENT_CAP_WIN_MOBILE;
+			} else if (strcmp(client_type, "web") == 0) {
+				caps |= MSN_CLIENT_CAP_WEBMSGR;
+			} else if (strcmp(client_type, "bot") == 0) {
+				caps |= MSN_CLIENT_CAP_BOT;
+			}
+			/* MSN doesn't a "console" type... 
+			 What, they have no ncurses UI? :-) */
+		}
+	}
+
 	account = session->account;
 	cmdproc = session->notification->cmdproc;
 	user = session->user;
@@ -307,8 +330,7 @@
 
 	if (msnobj == NULL)
 	{
-		msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text,
-						 MSN_CLIENT_ID);
+		msn_cmdproc_send(cmdproc, "CHG", "%s %d", state_text, caps);
 	}
 	else
 	{
@@ -317,7 +339,7 @@
 		msnobj_str = msn_object_to_string(msnobj);
 
 		msn_cmdproc_send(cmdproc, "CHG", "%s %d %s", state_text,
-						 MSN_CLIENT_ID, purple_url_encode(msnobj_str));
+						 caps, purple_url_encode(msnobj_str));
 
 		g_free(msnobj_str);
 	}
--- a/libpurple/protocols/msn/user.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/user.c	Sun Jun 28 04:41:07 2009 +0000
@@ -74,6 +74,7 @@
 	g_free(user->media.title);
 	g_free(user->media.album);
 	g_free(user->statusline);
+	g_free(user->invite_message);
 
 	g_free(user);
 }
@@ -426,6 +427,15 @@
 	user->clientcaps = info;
 }
 
+void
+msn_user_set_invite_message(MsnUser *user, const char *message)
+{
+	g_return_if_fail(user != NULL);
+
+	g_free(user->invite_message);
+	user->invite_message = g_strdup(message);
+}
+
 const char *
 msn_user_get_passport(const MsnUser *user)
 {
@@ -489,3 +499,12 @@
 
 	return user->clientcaps;
 }
+
+const char *
+msn_user_get_invite_message(const MsnUser *user)
+{
+	g_return_val_if_fail(user != NULL, NULL);
+
+	return user->invite_message;
+}
+
--- a/libpurple/protocols/msn/user.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/user.h	Sun Jun 28 04:41:07 2009 +0000
@@ -105,6 +105,8 @@
 
 	guint membership_id[5];	/**< The membershipId sent by the contacts server,
 				     indexed by the list it belongs to		*/
+
+	char *invite_message;   /**< Invite message of user request */
 };
 
 /**************************************************************************
@@ -290,6 +292,14 @@
  */
 void msn_user_set_client_caps(MsnUser *user, GHashTable *info);
 
+/**
+ * Sets the invite message for a user.
+ *
+ * @param user    The user.
+ * @param message The invite message for a user.
+ */
+void msn_user_set_invite_message(MsnUser *user, const char *message);
+
 
 /**
  * Returns the passport account for a user.
@@ -373,6 +383,15 @@
 GHashTable *msn_user_get_client_caps(const MsnUser *user);
 
 /**
+ * Returns the invite message for a user.
+ *
+ * @param user The user.
+ *
+ * @return The user's invite message.
+ */
+const char *msn_user_get_invite_message(const MsnUser *user);
+
+/**
  * check to see if user is online
  */
 gboolean
--- a/libpurple/protocols/msn/userlist.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/userlist.c	Sun Jun 28 04:41:07 2009 +0000
@@ -86,7 +86,7 @@
 }
 
 static void
-got_new_entry(PurpleConnection *gc, const char *passport, const char *friendly)
+got_new_entry(PurpleConnection *gc, const char *passport, const char *friendly, const char *message)
 {
 	PurpleAccount *acct;
 	MsnPermitAdd *pa;
@@ -97,7 +97,7 @@
 	pa->gc = gc;
 
 	acct = purple_connection_get_account(gc);
-	purple_account_request_authorization(acct, passport, NULL, friendly, NULL,
+	purple_account_request_authorization(acct, passport, NULL, friendly, message,
 										 purple_find_buddy(acct, passport) != NULL,
 										 msn_accept_add_cb, msn_cancel_add_cb, pa);
 
@@ -142,155 +142,6 @@
  * Server functions
  **************************************************************************/
 
-MsnListId
-msn_get_list_id(const char *list)
-{
-	if (list[0] == 'F')
-		return MSN_LIST_FL;
-	else if (list[0] == 'A')
-		return MSN_LIST_AL;
-	else if (list[0] == 'B')
-		return MSN_LIST_BL;
-	else if (list[0] == 'R')
-		return MSN_LIST_RL;
-
-	return -1;
-}
-
-/* this function msn_got_add_user isn't called anywhere */
-void
-msn_got_add_user(MsnSession *session, MsnUser *user,
-				 MsnListId list_id, const char * group_id)
-{
-	PurpleAccount *account;
-	const char *passport;
-	const char *friendly;
-
-	purple_debug_info("msn", "got add user...\n");
-	account = session->account;
-
-	passport = msn_user_get_passport(user);
-	friendly = msn_user_get_friendly_name(user);
-
-	if (list_id == MSN_LIST_FL)
-	{
-		PurpleConnection *gc;
-
-		gc = purple_account_get_connection(account);
-
-		serv_got_alias(gc, passport, friendly);
-
-		if (group_id != NULL)
-		{
-			msn_user_add_group_id(user, group_id);
-		}
-	}
-	else if (list_id == MSN_LIST_AL)
-	{
-		purple_privacy_permit_add(account, passport, TRUE);
-	}
-	else if (list_id == MSN_LIST_BL)
-	{
-		purple_privacy_deny_add(account, passport, TRUE);
-	}
-	else if (list_id == MSN_LIST_RL)
-	{
-		PurpleConversation *convo;
-
-		purple_debug_info("msn",
-						"%s has added you to his or her buddy list.\n",
-						passport);
-
- 		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account);
- 		if (convo) {
- 			PurpleBuddy *buddy;
- 			char *msg;
-
- 			buddy = purple_find_buddy(account, passport);
- 			msg = g_strdup_printf(
- 				_("%s has added you to his or her buddy list."),
- 				buddy ? purple_buddy_get_contact_alias(buddy) : passport);
- 			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg,
- 				PURPLE_MESSAGE_SYSTEM, time(NULL));
- 			g_free(msg);
- 		}
-
-		if (!(user->list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP)))
-		{
-			/*
-			 * TODO: The friendly name was NULL for me when I
-			 *       looked at this.  Maybe we should use the store
-			 *       name instead? --KingAnt
-			 */
-/*			got_new_entry(gc, passport, friendly); */
-		}
-	}
-
-	user->list_op |= (1 << list_id);
-	/* purple_user_add_list_id (user, list_id); */
-}
-
-void
-msn_got_rem_user(MsnSession *session, MsnUser *user,
-				 MsnListId list_id, const char * group_id)
-{
-	PurpleAccount *account;
-	const char *passport;
-
-	account = session->account;
-
-	passport = msn_user_get_passport(user);
-
-	if (list_id == MSN_LIST_FL)
-	{
-		/* TODO: When is the user totally removed? */
-		if (group_id != NULL)
-		{
-			msn_user_remove_group_id(user, group_id);
-			return;
-		}
-	}
-	else if (list_id == MSN_LIST_AL)
-	{
-		purple_privacy_permit_remove(account, passport, TRUE);
-	}
-	else if (list_id == MSN_LIST_BL)
-	{
-		purple_privacy_deny_remove(account, passport, TRUE);
-	}
-	else if (list_id == MSN_LIST_RL)
-	{
-		PurpleConversation *convo;
-
-		purple_debug_info("msn",
-						"%s has removed you from his or her buddy list.\n",
-						passport);
-
-		convo = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, passport, account);
-		if (convo) {
-			PurpleBuddy *buddy;
-			char *msg;
-
-			buddy = purple_find_buddy(account, passport);
-			msg = g_strdup_printf(
-				_("%s has removed you from his or her buddy list."),
-				buddy ? purple_buddy_get_contact_alias(buddy) : passport);
-			purple_conv_im_write(PURPLE_CONV_IM(convo), passport, msg,
-				PURPLE_MESSAGE_SYSTEM, time(NULL));
-			g_free(msg);
-		}
-	}
-
-	user->list_op &= ~(1 << list_id);
-	/* purple_user_remove_list_id (user, list_id); */
-
-	if (user->list_op == 0)
-	{
-		purple_debug_info("msn", "Buddy '%s' shall be deleted?.\n",
-						passport);
-	}
-}
-
 void
 msn_got_lst_user(MsnSession *session, MsnUser *user,
 				 int list_op, GSList *group_ids)
@@ -299,12 +150,14 @@
 	PurpleAccount *account;
 	const char *passport;
 	const char *store;
+	const char *message;
 
 	account = session->account;
 	gc = purple_account_get_connection(account);
 
 	passport = msn_user_get_passport(user);
 	store = msn_user_get_friendly_name(user);
+	message = msn_user_get_invite_message(user);
 
 	msn_user_set_op(user, list_op);
 
@@ -348,13 +201,13 @@
 
 		if (!(list_op & (MSN_LIST_AL_OP | MSN_LIST_BL_OP)))
 		{
-/*			got_new_entry(gc, passport, store); */
+/*			got_new_entry(gc, passport, store, NULL); */
 		}
 	}
 
 	if (list_op & MSN_LIST_PL_OP)
 	{
-		got_new_entry(gc, passport, store);
+		got_new_entry(gc, passport, store, message);
 	}
 }
 
@@ -748,69 +601,6 @@
 	msn_add_contact_to_group(userlist->session, state, who, group_id);
 }
 
-/*
- * Save a buddy address/group until we get back response from FQY
- */
-void
-msn_userlist_save_pending_buddy(MsnUserList *userlist,
-                               const char *who,
-                               const char *group_name)
-{
-	MsnUser *user;
-
-	g_return_if_fail(userlist != NULL);
-
-	user = msn_user_new(userlist, who, NULL);
-	msn_user_set_pending_group(user, group_name);
-	msn_user_set_network(user, MSN_NETWORK_UNKNOWN);
-	userlist->pending = g_list_prepend(userlist->pending, user);
-}
-
-/*
- * Actually adds a buddy once we have the response from FQY
- */
-void
-msn_userlist_add_pending_buddy(MsnSession *session,
-                               const char *who,
-                               /*MsnNetwork*/ int network)
-{
-	MsnUserList *userlist = session->userlist;
-	MsnUser *user = NULL;
-	MsnUser *user2;
-	GList *l;
-	char *group;
-
-	for (l = userlist->pending; l != NULL; l = l->next)
-	{
-		user = (MsnUser *)l->data;
-
-		if (!g_ascii_strcasecmp(who, user->passport)) {
-			userlist->pending = g_list_delete_link(userlist->pending, l);
-			break;
-		}
-	}
-
-	if (user == NULL) {
-		purple_debug_error("msn", "Attempting to add a pending user that does not exist.\n");
-		return;
-	}
-
-	group = msn_user_remove_pending_group(user);
-
-	user2 = msn_userlist_find_user(userlist, who);
-	if (user2 != NULL) {
-		/* User already in userlist, so just update it. */
-		msn_user_destroy(user);
-		user = user2;
-	} else {
-		msn_userlist_add_user(userlist, user);
-	}
-
-	msn_user_set_network(user, network);
-	msn_userlist_add_buddy(userlist, who, group);
-	g_free(group);
-}
-
 void
 msn_userlist_add_buddy_to_list(MsnUserList *userlist, const char *who,
 							MsnListId list_id)
@@ -930,7 +720,6 @@
 void
 msn_userlist_load(MsnSession *session)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
 	PurpleAccount *account = session->account;
 	PurpleConnection *gc = purple_account_get_connection(account);
 	GSList *l;
@@ -938,34 +727,14 @@
 
 	g_return_if_fail(gc != NULL);
 
-	for (gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode))
-	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				PurpleBuddy *b;
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				b = (PurpleBuddy *)bnode;
-				if (purple_buddy_get_account(b) == account)
-				{
-					user = msn_userlist_find_add_user(session->userlist,
-						purple_buddy_get_name(b), NULL);
-					purple_buddy_set_protocol_data(b, user);
-					msn_user_set_op(user, MSN_LIST_FL_OP);
-				}
-			}
-		}
+	for (l = purple_find_buddies(account, NULL); l != NULL;
+			l = g_slist_delete_link(l, l)) {
+		PurpleBuddy *buddy = l->data;
+
+		user = msn_userlist_find_add_user(session->userlist,
+			purple_buddy_get_name(buddy), NULL);
+		purple_buddy_set_protocol_data(buddy, user);
+		msn_user_set_op(user, MSN_LIST_FL_OP);
 	}
 	for (l = session->account->permit; l != NULL; l = l->next)
 	{
--- a/libpurple/protocols/msn/userlist.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msn/userlist.h	Sun Jun 28 04:41:07 2009 +0000
@@ -47,7 +47,6 @@
 
 	GList *users; /* Contains MsnUsers */
 	GList *groups; /* Contains MsnGroups */
-	GList *pending; /* MsnUsers pending addition (waiting for FQY response) */
 
 	GQueue *buddy_icon_requests;
 	int buddy_icon_window;
@@ -57,12 +56,7 @@
 
 gboolean msn_userlist_user_is_in_group(MsnUser *user, const char * group_id);
 gboolean msn_userlist_user_is_in_list(MsnUser *user, MsnListId list_id);
-MsnListId msn_get_list_id(const char *list);
 
-void msn_got_add_user(MsnSession *session, MsnUser *user,
-					  MsnListId list_id, const char *group_id);
-void msn_got_rem_user(MsnSession *session, MsnUser *user,
-					  MsnListId list_id, const char *group_id);
 void msn_got_lst_user(MsnSession *session, MsnUser *user,
 					  int list_op, GSList *group_ids);
 
@@ -92,12 +86,6 @@
 void msn_userlist_rem_buddy(MsnUserList *userlist, const char *who);
 void msn_userlist_add_buddy(MsnUserList *userlist,
 			    const char *who, const char *group_name);
-void msn_userlist_save_pending_buddy(MsnUserList *userlist,
-                                     const char *who,
-                                     const char *group_name);
-void msn_userlist_add_pending_buddy(MsnSession *session,
-                                    const char *who,
-                                    /*MsnNetwork*/ int network);
 void msn_userlist_move_buddy(MsnUserList *userlist, const char *who,
 						    const char *old_group_name,
 						    const char *new_group_name);
--- a/libpurple/protocols/msnp9/notification.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msnp9/notification.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1280,14 +1280,11 @@
 
 		if (count > 0)
 		{
-			const char *passport;
-			const char *url;
+			const char *passports[2] = { msn_user_get_passport(session->user) };
+			const char *urls[2] = { session->passport_info.file };
 
-			passport = msn_user_get_passport(session->user);
-			url = session->passport_info.file;
-
-			purple_notify_emails(gc, atoi(unread), FALSE, NULL, NULL,
-							   &passport, &url, NULL, NULL);
+			purple_notify_emails(gc, count, FALSE, NULL, NULL,
+							   passports, urls, NULL, NULL);
 		}
 	}
 
--- a/libpurple/protocols/msnp9/session.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/msnp9/session.c	Sun Jun 28 04:41:07 2009 +0000
@@ -221,68 +221,51 @@
 static void
 msn_session_sync_users(MsnSession *session)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
 	PurpleConnection *gc = purple_account_get_connection(session->account);
 	GList *to_remove = NULL;
+	GSList *buddies;
 
 	g_return_if_fail(gc != NULL);
 
 	/* The core used to use msn_add_buddy to add all buddies before
 	 * being logged in. This no longer happens, so we manually iterate
 	 * over the whole buddy list to identify sync issues. */
+	for (buddies = purple_find_buddies(session->account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *buddy = buddies->data;
+		const char *buddy_name = purple_buddy_get_name(buddy);
+		const char *group_name = purple_group_get_name(purple_buddy_get_group(buddy));
+		MsnUser *remote_user;
+		gboolean found = FALSE;
 
-	for (gnode = purple_blist_get_root(); gnode; gnode = gnode->next) {
-		PurpleGroup *group = (PurpleGroup *)gnode;
-		const char *group_name = group->name;
-		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for(cnode = gnode->child; cnode; cnode = cnode->next) {
-			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for(bnode = cnode->child; bnode; bnode = bnode->next) {
-				PurpleBuddy *b;
-				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				b = (PurpleBuddy *)bnode;
-				if(purple_buddy_get_account(b) == purple_connection_get_account(gc)) {
-					MsnUser *remote_user;
-					gboolean found = FALSE;
+		remote_user = msn_userlist_find_user(session->userlist, buddy_name);
 
-					remote_user = msn_userlist_find_user(session->userlist, purple_buddy_get_name(b));
+		if (remote_user && remote_user->list_op & MSN_LIST_FL_OP) {
+			int group_id;
+			GList *l;
 
-					if ((remote_user != NULL) && (remote_user->list_op & MSN_LIST_FL_OP))
-					{
-						int group_id;
-						GList *l;
+			group_id = msn_userlist_find_group_id(remote_user->userlist,
+					group_name);
 
-						group_id = msn_userlist_find_group_id(remote_user->userlist,
-								group_name);
-
-						for (l = remote_user->group_ids; l != NULL; l = l->next)
-						{
-							if (group_id == GPOINTER_TO_INT(l->data))
-							{
-								found = TRUE;
-								break;
-							}
-						}
-
-					}
+			for (l = remote_user->group_ids; l; l = l->next) {
+				if (group_id == GPOINTER_TO_INT(l->data)) {
+					found = TRUE;
+					break;
+				}
+			}
 
-					/* We don't care if they're in a different group, as long as they're on the
-					 * list somewhere. If we check for the group, we cause pain, agony and
-					 * suffering for people who decide to re-arrange their buddy list elsewhere.
-					 */
-					if (!found)
-					{
-						if ((remote_user == NULL) || !(remote_user->list_op & MSN_LIST_FL_OP)) {
-							/* The user is not on the server list */
-							msn_show_sync_issue(session, purple_buddy_get_name(b), group_name);
-						} else {
-							/* The user is not in that group on the server list */
-							to_remove = g_list_prepend(to_remove, b);
-						}
-					}
+			/* We don't care if they're in a different group, as long as they're on the
+			 * list somewhere. If we check for the group, we cause pain, agony and
+			 * suffering for people who decide to re-arrange their buddy list elsewhere.
+			 */
+			if (!found)
+			{
+				if ((remote_user == NULL) || !(remote_user->list_op & MSN_LIST_FL_OP)) {
+					/* The user is not on the server list */
+					msn_show_sync_issue(session, buddy_name, group_name);
+				} else {
+					/* The user is not in that group on the server list */
+					to_remove = g_list_prepend(to_remove, buddy);
 				}
 			}
 		}
--- a/libpurple/protocols/myspace/markup.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/myspace/markup.c	Sun Jun 28 04:41:07 2009 +0000
@@ -112,8 +112,10 @@
 	}
 }
 
-/** Convert typographical font point size to HTML font size.
- * Based on libpurple/gtkimhtml.c */
+/**
+ * Convert typographical font point size to HTML font size.
+ * Based on libpurple/gtkimhtml.c
+ */
 static guint
 msim_point_to_purple_size(MsimSession *session, guint point)
 {
@@ -135,7 +137,9 @@
 	return this_point;
 }
 
-/** Convert HTML font size to point size. */
+/**
+ * Convert HTML font size to point size.
+ */
 static guint
 msim_purple_size_to_point(MsimSession *session, guint size)
 {
@@ -155,7 +159,9 @@
 	return point;
 }
 
-/** Convert a msim markup font pixel height to the more usual point size, for incoming messages. */
+/**
+ * Convert a msim markup font pixel height to the more usual point size, for incoming messages.
+ */
 static guint
 msim_height_to_point(MsimSession *session, guint height)
 {
@@ -169,7 +175,9 @@
 	 * _font_size_ichat_to_purple */
 }
 
-/** Convert point size to msim pixel height font size specification, for outgoing messages. */
+/**
+ * Convert point size to msim pixel height font size specification, for outgoing messages.
+ */
 static guint
 msim_point_to_height(MsimSession *session, guint point)
 {
@@ -180,7 +188,9 @@
 	return (guint)msim_round((dpi * 1. / POINTS_PER_INCH) * point);
 }
 
-/** Convert the msim markup <f> (font) tag into HTML. */
+/**
+ * Convert the msim markup <f> (font) tag into HTML.
+ */
 static void
 msim_markup_f_to_html(MsimSession *session, xmlnode *root, gchar **begin, gchar **end)
 {
@@ -244,7 +254,8 @@
 	*end = g_string_free(gs_end, FALSE);
 }
 
-/** Convert a msim markup color to a color suitable for libpurple.
+/**
+ * Convert a msim markup color to a color suitable for libpurple.
  *
  * @param msim Either a color name, or an rgb(x,y,z) code.
  *
@@ -268,7 +279,9 @@
 	return g_strdup_printf("#%.2x%.2x%.2x", red, green, blue);
 }
 
-/** Convert the msim markup <a> (anchor) tag into HTML. */
+/**
+ * Convert the msim markup <a> (anchor) tag into HTML.
+ */
 static void
 msim_markup_a_to_html(MsimSession *session, xmlnode *root, gchar **begin, gchar **end)
 {
@@ -283,7 +296,9 @@
 	*end = g_strdup("</a>");
 }
 
-/** Convert the msim markup <p> (paragraph) tag into HTML. */
+/**
+ * Convert the msim markup <p> (paragraph) tag into HTML.
+ */
 static void
 msim_markup_p_to_html(MsimSession *session, xmlnode *root, gchar **begin, gchar **end)
 {
@@ -356,7 +371,9 @@
 	g_free(purple_color);
 }
 
-/** Convert the msim markup <i> tag (emoticon image) into HTML. */
+/**
+ * Convert the msim markup <i> tag (emoticon image) into HTML.
+ */
 static void
 msim_markup_i_to_html(MsimSession *session, xmlnode *root, gchar **begin, gchar **end)
 {
@@ -387,7 +404,9 @@
 	*end = g_strdup("");
 }
 
-/** Convert an individual msim markup tag to HTML. */
+/**
+ * Convert an individual msim markup tag to HTML.
+ */
 static int
 msim_markup_tag_to_html(MsimSession *session, xmlnode *root, gchar **begin,
 		gchar **end)
@@ -416,7 +435,9 @@
 	return 0;
 }
 
-/** Convert an individual HTML tag to msim markup. */
+/**
+ * Convert an individual HTML tag to msim markup.
+ */
 static int
 html_tag_to_msim_markup(MsimSession *session, xmlnode *root, gchar **begin,
 		gchar **end)
@@ -568,7 +589,8 @@
 	return ret;
 }
 
-/** Convert an xmlnode of msim markup or HTML to an HTML string or msim markup.
+/**
+ * Convert an xmlnode of msim markup or HTML to an HTML string or msim markup.
  *
  * @param f Function to convert tags.
  *
@@ -635,7 +657,9 @@
 	g_free(end);
 }
 
-/** Convert XML to something based on MSIM_XMLNODE_CONVERT. */
+/**
+ * Convert XML to something based on MSIM_XMLNODE_CONVERT.
+ */
 static gchar *
 msim_convert_xml(MsimSession *session, const gchar *raw, MSIM_XMLNODE_CONVERT f)
 {
@@ -669,7 +693,8 @@
 	return g_string_free(str, FALSE);
 }
 
-/** Convert plaintext smileys to <i> markup tags.
+/**
+ * Convert plaintext smileys to <i> markup tags.
  *
  * @param before Original text with ASCII smileys. Will be freed.
  * @return A new string with <i> tags, if applicable. Must be g_free()'d.
--- a/libpurple/protocols/myspace/myspace.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/myspace/myspace.c	Sun Jun 28 04:41:07 2009 +0000
@@ -519,6 +519,18 @@
 	return types;
 }
 
+/*
+ * TODO: This define is stolen from oscar.h.
+ *       It's also in yahoo.h.
+ *       It should be in libpurple/util.c
+ */
+#define msim_put32(buf, data) ( \
+		(*((buf)) = (unsigned char)((data)>>24)&0xff), \
+		(*((buf)+1) = (unsigned char)((data)>>16)&0xff), \
+		(*((buf)+2) = (unsigned char)((data)>>8)&0xff), \
+		(*((buf)+3) = (unsigned char)(data)&0xff), \
+		4)
+
 /**
  * Compute the base64'd login challenge response based on username, password, nonce, and IPs.
  *
@@ -619,15 +631,27 @@
 	purple_cipher_context_set_option(rc4, "key_len", (gpointer)0x10);
 	purple_cipher_context_set_key(rc4, key);
 
-	/* TODO: obtain IPs of network interfaces */
-
 	/* rc4 encrypt:
 	 * nonce1+email+IP list */
 
 	data = g_string_new(NULL);
 	g_string_append_len(data, nonce, NONCE_SIZE);
-	g_string_append(data, email);
+
+	/* Include the null terminator */
+	g_string_append_len(data, email, strlen(email) + 1);
+
+	while (data->len % 4 != 0)
+		g_string_append_c(data, 0xfb);
+
+#ifdef SEND_OUR_IP_ADDRESSES
+	/* TODO: Obtain IPs of network interfaces instead of using this hardcoded value */
+	g_string_set_size(data, data->len + 4);
+	msim_put32(data->str + data->len - 4, MSIM_LOGIN_IP_LIST_LEN);
 	g_string_append_len(data, MSIM_LOGIN_IP_LIST, MSIM_LOGIN_IP_LIST_LEN);
+#else
+	g_string_set_size(data, data->len + 4);
+	msim_put32(data->str + data->len - 4, 0);
+#endif /* !SEND_OUR_IP_ADDRESSES */
 
 	data_out = g_new0(guchar, data->len);
 
@@ -847,8 +871,6 @@
 	MsimMessage *body;
 	guint old_inbox_status;
 	guint i, n;
-	const gchar *froms[5], *tos[5], *urls[5], *subjects[5];
-
 	/* Information for each new inbox message type. */
 	static struct
 	{
@@ -863,16 +885,22 @@
 		{ "FriendRequest", MSIM_INBOX_FRIEND_REQUEST, "http://messaging.myspace.com/index.cfm?fuseaction=mail.friendRequests", NULL },
 		{ "PictureComment", MSIM_INBOX_PICTURE_COMMENT, "http://home.myspace.com/index.cfm?fuseaction=user", NULL }
 	};
+	const gchar *froms[G_N_ELEMENTS(message_types) + 1] = { "" },
+		*tos[G_N_ELEMENTS(message_types) + 1] = { "" },
+		*urls[G_N_ELEMENTS(message_types) + 1] = { "" },
+		*subjects[G_N_ELEMENTS(message_types) + 1] = { "" };
+
+	g_return_if_fail(reply != NULL);
 
 	/* Can't write _()'d strings in array initializers. Workaround. */
+	/* khc: then use N_() in the array initializer and use _() when they are
+	   used */
 	message_types[0].text = _("New mail messages");
 	message_types[1].text = _("New blog comments");
 	message_types[2].text = _("New profile comments");
 	message_types[3].text = _("New friend requests!");
 	message_types[4].text = _("New picture comments");
 
-	g_return_if_fail(reply != NULL);
-
 	body = msim_msg_get_dictionary(reply, "body");
 
 	if (body == NULL)
@@ -882,7 +910,7 @@
 
 	n = 0;
 
-	for (i = 0; i < sizeof(message_types) / sizeof(message_types[0]); ++i) {
+	for (i = 0; i < G_N_ELEMENTS(message_types); ++i) {
 		const gchar *key;
 		guint bit;
 
@@ -1114,10 +1142,6 @@
 	guint buddy_count;
 
 	body = msim_msg_get_dictionary(reply, "body");
-	if (!body) {
-		/* No friends. Not an error. */
-		return;
-	}
 
 	buddy_count = 0;
 
@@ -1473,28 +1497,22 @@
  * @return TRUE if successful.
  */
 static gboolean
-msim_incoming_im(MsimSession *session, MsimMessage *msg)
+msim_incoming_im(MsimSession *session, MsimMessage *msg, const gchar *username)
 {
-	gchar *username, *msg_msim_markup, *msg_purple_markup;
+	gchar *msg_msim_markup, *msg_purple_markup;
 	gchar *userid;
 	time_t time_received;
 	PurpleConversation *conv;
 
-	g_return_val_if_fail(MSIM_SESSION_VALID(session), FALSE);
-	g_return_val_if_fail(msg != NULL, FALSE);
-
-	username = msim_msg_get_string(msg, "_username");
 	/* I know this isn't really a string... but we need it to be one for
 	 * purple_find_conversation_with_account(). */
 	userid = msim_msg_get_string(msg, "f");
-	g_return_val_if_fail(username != NULL, FALSE);
 
 	purple_debug_info("msim_incoming_im", "UserID is %s", userid);
 
 	if (msim_is_userid(username)) {
 		purple_debug_info("msim", "Ignoring message from spambot (%s) on account %s\n",
 				username, purple_account_get_username(session->account));
-		g_free(username);
 		return FALSE;
 	}
 
@@ -1519,14 +1537,13 @@
 
 	serv_got_im(session->gc, username, msg_purple_markup, PURPLE_MESSAGE_RECV, time_received);
 
-	g_free(username);
 	g_free(msg_purple_markup);
 
 	return TRUE;
 }
 
 /**
- * Handle an incoming action message.
+ * Handle an incoming action message or an IM.
  *
  * @param session
  * @param msg
@@ -1534,7 +1551,7 @@
  * @return TRUE if successful.
  */
 static gboolean
-msim_incoming_action(MsimSession *session, MsimMessage *msg)
+msim_incoming_action_or_im(MsimSession *session, MsimMessage *msg)
 {
 	gchar *msg_text, *username;
 	gboolean rc;
@@ -1548,7 +1565,8 @@
 	username = msim_msg_get_string(msg, "_username");
 	g_return_val_if_fail(username != NULL, FALSE);
 
-	purple_debug_info("msim", "msim_incoming_action: action <%s> from <%s>\n",
+	purple_debug_info("msim",
+			"msim_incoming_action_or_im: action <%s> from <%s>\n",
 			msg_text, username);
 
 	if (g_str_equal(msg_text, "%typing%")) {
@@ -1562,13 +1580,16 @@
 	} else if (strstr(msg_text, "!!!GroupCount=")) {
 		/* TODO: support group chats. I think the number in msg_text has
 		 * something to do with the 'gid' field. */
-		purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text);
+		purple_debug_info("msim",
+				"msim_incoming_action_or_im: "
+				"TODO: implement #4691, group chats: %s\n", msg_text);
 
 		rc = TRUE;
 	} else if (strstr(msg_text, "!!!Offline=")) {
 		/* TODO: support group chats. This one might mean a user
 		 * went offline or exited the chat. */
-		purple_debug_info("msim", "msim_incoming_action: TODO: implement #4691, group chats: %s\n", msg_text);
+		purple_debug_info("msim", "msim_incoming_action_or_im: "
+				"TODO: implement #4691, group chats: %s\n", msg_text);
 
 		rc = TRUE;
 	} else if (msim_msg_get_integer(msg, "aid") != 0) {
@@ -1579,9 +1600,7 @@
 
 		rc = TRUE;
 	} else {
-		msim_unrecognized(session, msg,
-				"got to msim_incoming_action but unrecognized value for 'msg'");
-		rc = FALSE;
+		rc = msim_incoming_im(session, msg, username);
 	}
 
 	g_free(msg_text);
@@ -1666,10 +1685,9 @@
 	switch (bm) {
 		case MSIM_BM_STATUS:
 			return msim_incoming_status(session, msg);
-		case MSIM_BM_INSTANT:
-			return msim_incoming_im(session, msg);
-		case MSIM_BM_ACTION:
-			return msim_incoming_action(session, msg);
+		case MSIM_BM_ACTION_OR_IM_DELAYABLE:
+		case MSIM_BM_ACTION_OR_IM_INSTANT:
+			return msim_incoming_action_or_im(session, msg);
 		case MSIM_BM_MEDIA:
 			return msim_incoming_media(session, msg);
 		case MSIM_BM_UNOFFICIAL_CLIENT:
@@ -1677,7 +1695,8 @@
 		default:
 			/* Not really an IM, but show it for informational
 			 * purposes during development. */
-			return msim_incoming_im(session, msg);
+			/* TODO: This is probably wrong */
+			return msim_incoming_action_or_im(session, msg);
 	}
 }
 
@@ -1829,17 +1848,19 @@
 					gchar *suggestion;
 
 					suggestion = g_strdup_printf(_("%s Your password is "
-							"%d characters, greater than the "
-							"expected maximum length of %d for "
-							"MySpaceIM. Please shorten your "
+							"%zu characters, which is longer than the "
+							"maximum length of %d.  Please shorten your "
 							"password at http://profileedit.myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try again."),
-							full_errmsg, (int)
+							full_errmsg,
 							strlen(session->account->password),
 							MSIM_MAX_PASSWORD_LENGTH);
 
 					/* Replace full_errmsg. */
 					g_free(full_errmsg);
 					full_errmsg = suggestion;
+				} else {
+					g_free(full_errmsg);
+					full_errmsg = g_strdup(_("Incorrect username or password"));
 				}
 #endif
 				break;
@@ -2290,7 +2311,7 @@
 
 	message_msim = html_to_msim_markup(session, message);
 
-	if (msim_send_bm(session, who, message_msim, MSIM_BM_INSTANT)) {
+	if (msim_send_bm(session, who, message_msim, MSIM_BM_ACTION_OR_IM_DELAYABLE)) {
 		/* Return 1 to have Purple show this IM as being sent, 0 to not. I always
 		 * return 1 even if the message could not be sent, since I don't know if
 		 * it has failed yet--because the IM is only sent after the userid is
@@ -2343,7 +2364,7 @@
 	}
 
 	purple_debug_info("msim", "msim_send_typing(%s): %d (%s)\n", name, state, typing_str);
-	msim_send_bm(session, name, typing_str, MSIM_BM_ACTION);
+	msim_send_bm(session, name, typing_str, MSIM_BM_ACTION_OR_IM_INSTANT);
 	return 0;
 }
 
--- a/libpurple/protocols/myspace/myspace.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/myspace/myspace.h	Sun Jun 28 04:41:07 2009 +0000
@@ -127,12 +127,12 @@
 #define MSIM_FINAL_STRING           "\\final\\" /**< Message end marker */
 
 /* Messages */
-#define MSIM_BM_INSTANT             1
-#define MSIM_BM_STATUS              100
-#define MSIM_BM_ACTION              121
-#define MSIM_BM_MEDIA               122
-#define MSIM_BM_PROFILE             124
-#define MSIM_BM_UNOFFICIAL_CLIENT   200
+#define MSIM_BM_ACTION_OR_IM_DELAYABLE  1
+#define MSIM_BM_STATUS                  100
+#define MSIM_BM_ACTION_OR_IM_INSTANT    121
+#define MSIM_BM_MEDIA                   122
+#define MSIM_BM_PROFILE                 124
+#define MSIM_BM_UNOFFICIAL_CLIENT       200
 
 /* Authentication algorithm for login2 */
 #define MSIM_AUTH_ALGORITHM         196610
@@ -140,6 +140,7 @@
 /* Recognized challenge length */
 #define MSIM_AUTH_CHALLENGE_LENGTH  0x40
 
+#ifdef SEND_OUR_IP_ADDRESSES
 /* TODO: obtain IPs of network interfaces from user's machine, instead of
  * hardcoding these values below (used in msim_compute_login_response).
  * This is not immediately
@@ -152,6 +153,7 @@
 
 #define MSIM_LOGIN_IP_LIST  "\x00\x00\x00\x00\x05\x7f\x00\x00\x01\x00\x00\x00\x00\x0a\x00\x00\x40\xc0\xa8\x58\x01\xc0\xa8\x3c\x01"
 #define MSIM_LOGIN_IP_LIST_LEN         25
+#endif /* SEND_OUR_IP_ADDRESSES */
 
 /* Indexes into status string (0|1|2|3|..., but 0 always empty) */
 #define MSIM_STATUS_ORDINAL_EMPTY       0
--- a/libpurple/protocols/myspace/user.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/myspace/user.c	Sun Jun 28 04:41:07 2009 +0000
@@ -58,6 +58,7 @@
 
 		user = g_new0(MsimUser, 1);
 		user->buddy = buddy;
+		user->id = purple_blist_node_get_int(&buddy->node, "UserID");
 		purple_buddy_set_protocol_data(buddy, user);
 	}
 
@@ -109,7 +110,6 @@
 {
 	PurplePresence *presence;
 	gchar *str;
-	guint uid;
 	guint cv;
 
 	/* Useful to identify the account the tooltip refers to.
@@ -118,8 +118,6 @@
 		purple_notify_user_info_add_pair(user_info, _("User"), user->username);
 	}
 
-	uid = purple_blist_node_get_int((PurpleBlistNode *)user->buddy, "UserID");
-
 	/* a/s/l...the vitals */
 	if (user->age) {
 		char age[16];
--- a/libpurple/protocols/myspace/zap.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/myspace/zap.c	Sun Jun 28 04:41:07 2009 +0000
@@ -109,7 +109,7 @@
 	/* Construct and send the actual zap command. */
 	zap_string = g_strdup_printf("!!!ZAP_SEND!!!=RTE_BTN_ZAPS_%d", code);
 
-	if (!msim_send_bm(session, username, zap_string, MSIM_BM_ACTION)) {
+	if (!msim_send_bm(session, username, zap_string, MSIM_BM_ACTION_OR_IM_INSTANT)) {
 		purple_debug_info("msim_send_zap",
 				"msim_send_bm failed: zapping %s with %s\n",
 				username, zap_string);
--- a/libpurple/protocols/oscar/Makefile.am	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -7,6 +7,7 @@
 
 OSCARSOURCES = \
 	bstream.c           \
+	clientlogin.c       \
 	family_admin.c      \
 	family_advert.c     \
 	family_alert.c      \
--- a/libpurple/protocols/oscar/Makefile.mingw	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/Makefile.mingw	Sun Jun 28 04:41:07 2009 +0000
@@ -42,6 +42,7 @@
 ##
 C_SRC = \
 	bstream.c		\
+	clientlogin.c		\
 	family_admin.c		\
 	family_advert.c		\
 	family_alert.c		\
--- a/libpurple/protocols/oscar/bstream.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/bstream.c	Sun Jun 28 04:41:07 2009 +0000
@@ -161,15 +161,19 @@
 	return aimutil_getle32(bs->data + bs->offset - 4);
 }
 
+static void byte_stream_getrawbuf_nocheck(ByteStream *bs, guint8 *buf, int len)
+{
+	memcpy(buf, bs->data + bs->offset, len);
+	bs->offset += len;
+}
+
 int byte_stream_getrawbuf(ByteStream *bs, guint8 *buf, int len)
 {
 
 	if (byte_stream_empty(bs) < len)
 		return 0;
 
-	memcpy(buf, bs->data + bs->offset, len);
-	bs->offset += len;
-
+	byte_stream_getrawbuf_nocheck(bs, buf, len);
 	return len;
 }
 
@@ -177,12 +181,12 @@
 {
 	guint8 *ob;
 
+	if (byte_stream_empty(bs) < len)
+		return NULL;
+
 	ob = g_malloc(len);
 
-	if (byte_stream_getrawbuf(bs, ob, len) < len) {
-		g_free(ob);
-		return NULL;
-	}
+	byte_stream_getrawbuf_nocheck(bs, ob, len);
 
 	return ob;
 }
@@ -191,12 +195,12 @@
 {
 	char *ob;
 
+	if (byte_stream_empty(bs) < len)
+		return NULL;
+
 	ob = g_malloc(len + 1);
 
-	if (byte_stream_getrawbuf(bs, (guint8 *)ob, len) < len) {
-		g_free(ob);
-		return NULL;
-	}
+	byte_stream_getrawbuf_nocheck(bs, (guint8 *)ob, len);
 
 	ob[len] = '\0';
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/libpurple/protocols/oscar/clientlogin.c	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,530 @@
+/*
+ * Purple's oscar protocol plugin
+ * This file is the legal property of its developers.
+ * Please see the AUTHORS file distributed alongside this file.
+ *
+ * This library is free software; you can redistribute it and/or
+ * modify it under the terms of the GNU Lesser General Public
+ * License as published by the Free Software Foundation; either
+ * version 2 of the License, or (at your option) any later version.
+ *
+ * This library is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
+ * Lesser General Public License for more details.
+ *
+ * You should have received a copy of the GNU Lesser General Public
+ * License along with this library; if not, write to the Free Software
+ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02111-1301  USA
+*/
+
+/**
+ * This file implements AIM's clientLogin procedure for authenticating
+ * users.  This replaces the older MD5-based and XOR-based
+ * authentication methods that use SNAC family 0x0017.
+ *
+ * This doesn't use SNACs or FLAPs at all.  It makes http and https
+ * POSTs to AOL to validate the user based on the password they
+ * provided to us.  Upon successful authentication we request a
+ * connection to the BOS server by calling startOSCARsession.  The
+ * AOL server gives us the hostname and port number to use, as well
+ * as the cookie to use to authenticate to the BOS server.  And then
+ * everything else is the same as with BUCP.
+ *
+ * For details, see:
+ * http://dev.aol.com/aim/oscar/#AUTH
+ * http://dev.aol.com/authentication_for_clients
+ */
+
+#include "cipher.h"
+#include "core.h"
+
+#include "oscar.h"
+
+#define URL_CLIENT_LOGIN "https://api.screenname.aol.com/auth/clientLogin"
+#define URL_START_OSCAR_SESSION "http://api.oscar.aol.com/aim/startOSCARSession"
+
+/*
+ * Using clientLogin requires a developer ID.  This dev ID is owned by
+ * the AIM account "markdoliner"
+ */
+#define CLIENT_KEY "ma15d7JTxbmVG-RP"
+
+/**
+ * This is similar to purple_url_encode() except that it follows
+ * RFC3986 a little more closely by not encoding - . _ and ~
+ * It also uses capital letters as hex characters because capital
+ * letters are required by AOL.  The RFC says that capital letters
+ * are a SHOULD and that URLs that use capital letters are
+ * equivalent to URLs that use small letters.
+ *
+ * TODO: Check if purple_url_encode() can be replaced with this
+ *       version without breaking anything.
+ */
+static const char *oscar_auth_url_encode(const char *str)
+{
+	const char *iter;
+	static char buf[BUF_LEN];
+	char utf_char[6];
+	guint i, j = 0;
+
+	g_return_val_if_fail(str != NULL, NULL);
+	g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
+
+	iter = str;
+	for (; *iter && j < (BUF_LEN - 1) ; iter = g_utf8_next_char(iter)) {
+		gunichar c = g_utf8_get_char(iter);
+		/* If the character is an ASCII character and is alphanumeric
+		 * no need to escape */
+		if ((c < 128 && isalnum(c)) || c =='-' || c == '.' || c == '_' || c == '~') {
+			buf[j++] = c;
+		} else {
+			int bytes = g_unichar_to_utf8(c, utf_char);
+			for (i = 0; i < bytes; i++) {
+				if (j > (BUF_LEN - 4))
+					break;
+				sprintf(buf + j, "%%%02X", utf_char[i] & 0xff);
+				j += 3;
+			}
+		}
+	}
+
+	buf[j] = '\0';
+
+	return buf;
+}
+
+/**
+ * @return A null-terminated base64 encoded version of the HMAC
+ *         calculated using the given key and data.
+ */
+static gchar *hmac_sha256(const char *key, const char *message)
+{
+	PurpleCipherContext *context;
+	guchar digest[32];
+
+	context = purple_cipher_context_new_by_name("hmac", NULL);
+	purple_cipher_context_set_option(context, "hash", "sha256");
+	purple_cipher_context_set_key(context, (guchar *)key);
+	purple_cipher_context_append(context, (guchar *)message, strlen(message));
+	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
+	purple_cipher_context_destroy(context);
+
+	return purple_base64_encode(digest, sizeof(digest));
+}
+
+/**
+ * @return A base-64 encoded HMAC-SHA256 signature created using the
+ *         technique documented at
+ *         http://dev.aol.com/authentication_for_clients#signing
+ */
+static gchar *generate_signature(const char *method, const char *url, const char *parameters, const char *session_key)
+{
+	char *encoded_url, *signature_base_string, *signature;
+	const char *encoded_parameters;
+
+	encoded_url = g_strdup(oscar_auth_url_encode(url));
+	encoded_parameters = oscar_auth_url_encode(parameters);
+	signature_base_string = g_strdup_printf("%s&%s&%s",
+			method, encoded_url, encoded_parameters);
+	g_free(encoded_url);
+
+	signature = hmac_sha256(session_key, signature_base_string);
+	g_free(signature_base_string);
+
+	return signature;
+}
+
+static gboolean parse_start_oscar_session_response(PurpleConnection *gc, const gchar *response, gsize response_len, char **host, unsigned short *port, char **cookie)
+{
+	xmlnode *response_node, *tmp_node, *data_node;
+	xmlnode *host_node, *port_node, *cookie_node;
+	char *tmp;
+
+	/* Parse the response as XML */
+	response_node = xmlnode_from_str(response, response_len);
+	if (response_node == NULL)
+	{
+		purple_debug_error("oscar", "startOSCARSession could not parse "
+				"response as XML: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+		return FALSE;
+	}
+
+	/* Grab the necessary XML nodes */
+	tmp_node = xmlnode_get_child(response_node, "statusCode");
+	data_node = xmlnode_get_child(response_node, "data");
+	if (data_node != NULL) {
+		host_node = xmlnode_get_child(data_node, "host");
+		port_node = xmlnode_get_child(data_node, "port");
+		cookie_node = xmlnode_get_child(data_node, "cookie");
+	}
+
+	/* Make sure we have a status code */
+	if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
+		purple_debug_error("oscar", "startOSCARSession response was "
+				"missing statusCode: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	/* Make sure the status code was 200 */
+	if (strcmp(tmp, "200") != 0)
+	{
+		purple_debug_error("oscar", "startOSCARSession response statusCode "
+				"was %s: %s\n", tmp, response);
+
+		if (strcmp(tmp, "401") == 0)
+			purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+					_("You have been connecting and disconnecting too "
+					  "frequently. Wait ten minutes and try again. If "
+					  "you continue to try, you will need to wait even "
+					  "longer."));
+		else
+			purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+					_("Received unexpected response from " URL_START_OSCAR_SESSION));
+
+		g_free(tmp);
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+	g_free(tmp);
+
+	/* Make sure we have everything else */
+	if (data_node == NULL || host_node == NULL ||
+		port_node == NULL || cookie_node == NULL)
+	{
+		purple_debug_error("oscar", "startOSCARSession response was missing "
+				"something: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	/* Extract data from the XML */
+	*host = xmlnode_get_data_unescaped(host_node);
+	tmp = xmlnode_get_data_unescaped(port_node);
+	*cookie = xmlnode_get_data_unescaped(cookie_node);
+	if (*host == NULL || **host == '\0' || tmp == NULL || *tmp == '\0' || cookie == NULL || *cookie == '\0')
+	{
+		purple_debug_error("oscar", "startOSCARSession response was missing "
+				"something: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_START_OSCAR_SESSION));
+		g_free(*host);
+		g_free(tmp);
+		g_free(*cookie);
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	*port = atoi(tmp);
+	g_free(tmp);
+
+	return TRUE;
+}
+
+static void start_oscar_session_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
+{
+	OscarData *od;
+	PurpleConnection *gc;
+	char *host, *cookie;
+	unsigned short port;
+	guint8 *cookiedata;
+	gsize cookiedata_len;
+
+	od = user_data;
+	gc = od->gc;
+
+	od->url_data = NULL;
+
+	if (error_message != NULL || len == 0) {
+		gchar *tmp;
+		tmp = g_strdup_printf(_("Error requesting " URL_START_OSCAR_SESSION
+				": %s"), error_message);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
+		g_free(tmp);
+		return;
+	}
+
+	if (!parse_start_oscar_session_response(gc, url_text, len, &host, &port, &cookie))
+		return;
+
+	cookiedata = purple_base64_decode(cookie, &cookiedata_len);
+	oscar_connect_to_bos(gc, od, host, port, cookiedata, cookiedata_len);
+	g_free(cookiedata);
+
+	g_free(host);
+	g_free(cookie);
+}
+
+static void send_start_oscar_session(OscarData *od, const char *token, const char *session_key, time_t hosttime)
+{
+	char *query_string, *signature, *url;
+
+	/* Construct the GET parameters */
+	query_string = g_strdup_printf("a=%s"
+			"&f=xml"
+			"&k=" CLIENT_KEY
+			"&ts=%zu"
+			"&useTLS=0",
+			oscar_auth_url_encode(token), hosttime);
+	signature = generate_signature("GET", URL_START_OSCAR_SESSION,
+			query_string, session_key);
+	url = g_strdup_printf(URL_START_OSCAR_SESSION "?%s&sig_sha256=%s",
+			query_string, signature);
+	g_free(query_string);
+	g_free(signature);
+
+	/* Make the request */
+	od->url_data = purple_util_fetch_url(url, TRUE, NULL, FALSE,
+			start_oscar_session_cb, od);
+	g_free(url);
+}
+
+/**
+ * This function parses the given response from a clientLogin request
+ * and extracts the useful information.
+ *
+ * @param gc           The PurpleConnection.  If the response data does
+ *                     not indicate then purple_connection_error_reason()
+ *                     will be called to close this connection.
+ * @param response     The response data from the clientLogin request.
+ * @param response_len The length of the above response, or -1 if
+ *                     @response is NUL terminated.
+ * @param token        If parsing was successful then this will be set to
+ *                     a newly allocated string containing the token.  The
+ *                     caller should g_free this string when it is finished
+ *                     with it.  On failure this value will be untouched.
+ * @param secret       If parsing was successful then this will be set to
+ *                     a newly allocated string containing the secret.  The
+ *                     caller should g_free this string when it is finished
+ *                     with it.  On failure this value will be untouched.
+ * @param hosttime     If parsing was successful then this will be set to
+ *                     the time on the OpenAuth Server in seconds since the
+ *                     Unix epoch.  On failure this value will be untouched.
+ *
+ * @return TRUE if the request was successful and we were able to
+ *         extract all info we need.  Otherwise FALSE.
+ */
+static gboolean parse_client_login_response(PurpleConnection *gc, const gchar *response, gsize response_len, char **token, char **secret, time_t *hosttime)
+{
+	xmlnode *response_node, *tmp_node, *data_node;
+	xmlnode *secret_node, *hosttime_node, *token_node, *tokena_node;
+	char *tmp;
+
+	/* Parse the response as XML */
+	response_node = xmlnode_from_str(response, response_len);
+	if (response_node == NULL)
+	{
+		purple_debug_error("oscar", "clientLogin could not parse "
+				"response as XML: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_CLIENT_LOGIN));
+		return FALSE;
+	}
+
+	/* Grab the necessary XML nodes */
+	tmp_node = xmlnode_get_child(response_node, "statusCode");
+	data_node = xmlnode_get_child(response_node, "data");
+	if (data_node != NULL) {
+		secret_node = xmlnode_get_child(data_node, "sessionSecret");
+		hosttime_node = xmlnode_get_child(data_node, "hostTime");
+		token_node = xmlnode_get_child(data_node, "token");
+		if (token_node != NULL)
+			tokena_node = xmlnode_get_child(token_node, "a");
+	}
+
+	/* Make sure we have a status code */
+	if (tmp_node == NULL || (tmp = xmlnode_get_data_unescaped(tmp_node)) == NULL) {
+		purple_debug_error("oscar", "clientLogin response was "
+				"missing statusCode: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_CLIENT_LOGIN));
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	/* Make sure the status code was 200 */
+	if (strcmp(tmp, "200") != 0)
+	{
+		int status_code, status_detail_code = 0;
+
+		status_code = atoi(tmp);
+		g_free(tmp);
+		tmp_node = xmlnode_get_child(response_node, "statusDetailCode");
+		if (tmp_node != NULL && (tmp = xmlnode_get_data_unescaped(tmp_node)) != NULL) {
+			status_detail_code = atoi(tmp);
+			g_free(tmp);
+		}
+
+		purple_debug_error("oscar", "clientLogin response statusCode "
+				"was %d (%d): %s\n", status_code, status_detail_code, response);
+
+		if (status_code == 330 && status_detail_code == 3011) {
+			purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+					_("Incorrect password."));
+		} else if (status_code == 401 && status_detail_code == 3019) {
+			purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+					_("AOL does not allow your screen name to authenticate via this site."));
+		} else
+			purple_connection_error_reason(gc,
+					PURPLE_CONNECTION_ERROR_OTHER_ERROR,
+					_("Received unexpected response from " URL_CLIENT_LOGIN));
+
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+	g_free(tmp);
+
+	/* Make sure we have everything else */
+	if (data_node == NULL || secret_node == NULL ||
+		token_node == NULL || tokena_node == NULL)
+	{
+		purple_debug_error("oscar", "clientLogin response was missing "
+				"something: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_CLIENT_LOGIN));
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	/* Extract data from the XML */
+	*token = xmlnode_get_data_unescaped(tokena_node);
+	*secret = xmlnode_get_data_unescaped(secret_node);
+	tmp = xmlnode_get_data_unescaped(hosttime_node);
+	if (*token == NULL || **token == '\0' || *secret == NULL || **secret == '\0' || tmp == NULL || *tmp == '\0')
+	{
+		purple_debug_error("oscar", "clientLogin response was missing "
+				"something: %s\n", response);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+				_("Received unexpected response from " URL_CLIENT_LOGIN));
+		g_free(*token);
+		g_free(*secret);
+		g_free(tmp);
+		xmlnode_free(response_node);
+		return FALSE;
+	}
+
+	*hosttime = strtol(tmp, NULL, 10);
+	g_free(tmp);
+
+	xmlnode_free(response_node);
+
+	return TRUE;
+}
+
+static void client_login_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, gsize len, const gchar *error_message)
+{
+	OscarData *od;
+	PurpleConnection *gc;
+	char *token, *secret, *session_key;
+	time_t hosttime;
+	int password_len;
+	char *password;
+
+	od = user_data;
+	gc = od->gc;
+
+	od->url_data = NULL;
+
+	if (error_message != NULL || len == 0) {
+		gchar *tmp;
+		tmp = g_strdup_printf(_("Error requesting " URL_CLIENT_LOGIN
+				": %s"), error_message);
+		purple_connection_error_reason(gc,
+				PURPLE_CONNECTION_ERROR_NETWORK_ERROR, tmp);
+		g_free(tmp);
+		return;
+	}
+
+	if (!parse_client_login_response(gc, url_text, len, &token, &secret, &hosttime))
+		return;
+
+	password_len = strlen(purple_connection_get_password(gc));
+	password = g_strdup_printf("%.*s",
+			od->icq ? MIN(password_len, MAXICQPASSLEN) : password_len,
+			purple_connection_get_password(gc));
+	session_key = hmac_sha256(password, secret);
+	g_free(password);
+	g_free(secret);
+
+	send_start_oscar_session(od, token, session_key, hosttime);
+
+	g_free(token);
+	g_free(session_key);
+}
+
+/**
+ * This function sends a request to
+ * https://api.screenname.aol.com/auth/clientLogin with the user's
+ * username and password and receives the user's session key, which is
+ * used to request a connection to the BOSS server.
+ */
+void send_client_login(OscarData *od, const char *username)
+{
+	PurpleConnection *gc;
+	GString *request, *body;
+	const char *tmp;
+	char *password;
+	int password_len;
+
+	gc = od->gc;
+
+	/*
+	 * We truncate ICQ passwords to 8 characters.  There is probably a
+	 * limit for AIM passwords, too, but we really only need to do
+	 * this for ICQ because older ICQ clients let you enter a password
+	 * as long as you wanted and then they truncated it silently.
+	 *
+	 * And we can truncate based on the number of bytes and not the
+	 * number of characters because passwords for AIM and ICQ are
+	 * supposed to be plain ASCII (I don't know if this has always been
+	 * the case, though).
+	 */
+	tmp = purple_connection_get_password(gc);
+	password_len = strlen(tmp);
+	password = g_strndup(tmp, od->icq ? MIN(password_len, MAXICQPASSLEN) : password_len);
+
+	/* Construct the body of the HTTP POST request */
+	body = g_string_new("");
+	g_string_append_printf(body, "devId=" CLIENT_KEY);
+	g_string_append_printf(body, "&f=xml");
+	g_string_append_printf(body, "&pwd=%s", oscar_auth_url_encode(password));
+	g_string_append_printf(body, "&s=%s", oscar_auth_url_encode(username));
+	g_free(password);
+
+	/* Construct an HTTP POST request */
+	request = g_string_new("POST /auth/clientLogin HTTP/1.0\r\n"
+			"Connection: close\r\n"
+			"Accept: */*\r\n");
+
+	/* Tack on the body */
+	g_string_append_printf(request, "Content-Type: application/x-www-form-urlencoded; charset=UTF-8\r\n");
+	g_string_append_printf(request, "Content-Length: %" G_GSIZE_FORMAT "\r\n\r\n", body->len);
+	g_string_append_len(request, body->str, body->len);
+	g_string_free(body, TRUE);
+
+	/* Send the POST request  */
+	od->url_data = purple_util_fetch_url_request(URL_CLIENT_LOGIN,
+			TRUE, NULL, FALSE, request->str, FALSE,
+			client_login_cb, od);
+	g_string_free(request, TRUE);
+}
--- a/libpurple/protocols/oscar/family_auth.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/family_auth.c	Sun Jun 28 04:41:07 2009 +0000
@@ -26,11 +26,11 @@
  *
  */
 
-#include "oscar.h"
+#include <ctype.h>
 
 #include "cipher.h"
 
-#include <ctype.h>
+#include "oscar.h"
 
 /* #define USE_XOR_FOR_ICQ */
 
@@ -129,6 +129,8 @@
 	GSList *tlvlist = NULL;
 	int passwdlen;
 	guint8 *password_encoded;
+	const char *clientstring;
+	guint32 distrib;
 
 	passwdlen = strlen(password);
 	password_encoded = (guint8 *)g_malloc(passwdlen+1);
@@ -139,18 +141,25 @@
 
 	aim_encode_password(password, password_encoded);
 
+	clientstring = purple_prefs_get_string("/plugins/prpl/oscar/clientstring");
+	if (clientstring == NULL)
+		clientstring = ci->clientstring;
+	distrib = purple_prefs_get_int("/plugins/prpl/oscar/distid");
+	if ((gint32)distrib == -1)
+		distrib = ci->distrib;
+
 	byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
 	aim_tlvlist_add_str(&tlvlist, 0x0001, sn);
 	aim_tlvlist_add_raw(&tlvlist, 0x0002, passwdlen, password_encoded);
 
-	if (ci->clientstring)
-		aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
+	if (clientstring)
+		aim_tlvlist_add_str(&tlvlist, 0x0003, clientstring);
 	aim_tlvlist_add_16(&tlvlist, 0x0016, (guint16)ci->clientid);
 	aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
 	aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
 	aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
 	aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
-	aim_tlvlist_add_32(&tlvlist, 0x0014, (guint32)ci->distrib); /* distribution chan */
+	aim_tlvlist_add_32(&tlvlist, 0x0014, distrib); /* distribution chan */
 	aim_tlvlist_add_str(&tlvlist, 0x000f, ci->lang);
 	aim_tlvlist_add_str(&tlvlist, 0x000e, ci->country);
 
@@ -210,6 +219,8 @@
 	guint8 digest[16];
 	aim_snacid_t snacid;
 	size_t password_len;
+	const char *clientstring;
+	guint32 distrib;
 
 	if (!ci || !sn || !password)
 		return -EINVAL;
@@ -236,20 +247,27 @@
 
 	aim_encode_password_md5(password, password_len, key, digest);
 
+	clientstring = purple_prefs_get_string("/plugins/prpl/oscar/clientstring");
+	if (clientstring == NULL)
+		clientstring = ci->clientstring;
+	distrib = purple_prefs_get_int("/plugins/prpl/oscar/distid");
+	if ((gint32)distrib == -1)
+		distrib = ci->distrib;
+
 	aim_tlvlist_add_raw(&tlvlist, 0x0025, 16, digest);
 
 #ifndef USE_OLD_MD5
 	aim_tlvlist_add_noval(&tlvlist, 0x004c);
 #endif
 
-	if (ci->clientstring)
-		aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
+	if (clientstring)
+		aim_tlvlist_add_str(&tlvlist, 0x0003, clientstring);
 	aim_tlvlist_add_16(&tlvlist, 0x0016, (guint16)ci->clientid);
 	aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
 	aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
 	aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
 	aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
-	aim_tlvlist_add_32(&tlvlist, 0x0014, (guint32)ci->distrib);
+	aim_tlvlist_add_32(&tlvlist, 0x0014, distrib);
 	aim_tlvlist_add_str(&tlvlist, 0x000f, ci->lang);
 	aim_tlvlist_add_str(&tlvlist, 0x000e, ci->country);
 
--- a/libpurple/protocols/oscar/family_oservice.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/family_oservice.c	Sun Jun 28 04:41:07 2009 +0000
@@ -151,7 +151,7 @@
 
 	memset(&csi, 0, sizeof(csi));
 	csi.exchange = exchange;
-	strncpy(csi.name, roomname, sizeof(csi.name));
+	g_strlcpy(csi.name, roomname, sizeof(csi.name));
 	csi.instance = instance;
 
 	/*
--- a/libpurple/protocols/oscar/flap_connection.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/flap_connection.c	Sun Jun 28 04:41:07 2009 +0000
@@ -46,7 +46,7 @@
 	FlapFrame *frame;
 
 	frame = flap_frame_new(od, 0x01, 4);
-	byte_stream_put32(&frame->data, 0x00000001);
+	byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
 	flap_connection_send(conn, frame);
 }
 
@@ -64,7 +64,7 @@
 	GSList *tlvlist = NULL;
 
 	frame = flap_frame_new(od, 0x01, 4 + 2 + 2 + length);
-	byte_stream_put32(&frame->data, 0x00000001);
+	byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
 	aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy);
 	aim_tlvlist_write(&frame->data, &tlvlist);
 	aim_tlvlist_free(tlvlist);
@@ -72,6 +72,32 @@
 	flap_connection_send(conn, frame);
 }
 
+void
+flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci)
+{
+	FlapFrame *frame;
+	GSList *tlvlist = NULL;
+
+	frame = flap_frame_new(od, 0x01, 1152 + length);
+
+	byte_stream_put32(&frame->data, 0x00000001); /* FLAP Version */
+	aim_tlvlist_add_raw(&tlvlist, 0x0006, length, chipsahoy);
+
+	if (ci->clientstring)
+		aim_tlvlist_add_str(&tlvlist, 0x0003, ci->clientstring);
+	aim_tlvlist_add_16(&tlvlist, 0x0017, (guint16)ci->major);
+	aim_tlvlist_add_16(&tlvlist, 0x0018, (guint16)ci->minor);
+	aim_tlvlist_add_16(&tlvlist, 0x0019, (guint16)ci->point);
+	aim_tlvlist_add_16(&tlvlist, 0x001a, (guint16)ci->build);
+	aim_tlvlist_add_8(&tlvlist, 0x004a, 0x01);
+
+	aim_tlvlist_write(&frame->data, &tlvlist);
+
+	aim_tlvlist_free(tlvlist);
+
+	flap_connection_send(conn, frame);
+}
+
 static struct rateclass *
 flap_connection_get_rateclass(FlapConnection *conn, guint16 family, guint16 subtype)
 {
@@ -355,23 +381,9 @@
 		}
 	}
 
-	if (conn->fd >= 0)
-	{
-		if (conn->type == SNAC_FAMILY_LOCATE)
-			flap_connection_send_close(od, conn);
-
-		close(conn->fd);
-		conn->fd = -1;
-	}
-
-	if (conn->gsc != NULL)
-	{
-		if (conn->type == SNAC_FAMILY_LOCATE)
-			flap_connection_send_close(od, conn);
-
-		purple_ssl_close(conn->gsc);
-		conn->gsc = NULL;
-	}
+	if ((conn->fd >= 0 || conn->gsc != NULL)
+			&& conn->type == SNAC_FAMILY_LOCATE)
+		flap_connection_send_close(od, conn);
 
 	if (conn->watcher_incoming != 0)
 	{
@@ -385,6 +397,18 @@
 		conn->watcher_outgoing = 0;
 	}
 
+	if (conn->fd >= 0)
+	{
+		close(conn->fd);
+		conn->fd = -1;
+	}
+
+	if (conn->gsc != NULL)
+	{
+		purple_ssl_close(conn->gsc);
+		conn->gsc = NULL;
+	}
+
 	g_free(conn->buffer_incoming.data.data);
 	conn->buffer_incoming.data.data = NULL;
 
--- a/libpurple/protocols/oscar/oscar.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.c	Sun Jun 28 04:41:07 2009 +0000
@@ -145,9 +145,12 @@
 static const int msgerrreasonlen = G_N_ELEMENTS(msgerrreason);
 
 /* All the libfaim->purple callback functions */
+
+/* Only used when connecting with the old-style BUCP login */
 static int purple_parse_auth_resp  (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_login      (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_parse_auth_securid_request(OscarData *, FlapConnection *, FlapFrame *, ...);
+
 static int purple_handle_redirect  (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_info_change      (OscarData *, FlapConnection *, FlapFrame *, ...);
 static int purple_account_confirm  (OscarData *, FlapConnection *, FlapFrame *, ...);
@@ -204,7 +207,6 @@
 void oscar_set_info(PurpleConnection *gc, const char *info);
 static void oscar_set_info_and_status(PurpleAccount *account, gboolean setinfo, const char *rawinfo, gboolean setstatus, PurpleStatus *status);
 static void oscar_set_extendedstatus(PurpleConnection *gc);
-static void oscar_format_username(PurpleConnection *gc, const char *nick);
 static gboolean purple_ssi_rerequestdata(gpointer data);
 
 static void oscar_free_name_data(struct name_data *data) {
@@ -930,7 +932,7 @@
 	PurpleGroup *g = NULL;
 	struct buddyinfo *bi = NULL;
 	char *tmp;
-	const char *bname, *gname = NULL;
+	const char *bname = NULL, *gname = NULL;
 
 	od = purple_connection_get_protocol_data(gc);
 	account = purple_connection_get_account(gc);
@@ -938,14 +940,14 @@
 	if ((user_info == NULL) || ((b == NULL) && (userinfo == NULL)))
 		return;
 
-	bname = purple_buddy_get_name(b);
 	if (userinfo == NULL)
-		userinfo = aim_locate_finduserinfo(od, bname);
+		userinfo = aim_locate_finduserinfo(od, purple_buddy_get_name(b));
 
 	if (b == NULL)
 		b = purple_find_buddy(account, userinfo->bn);
 
 	if (b != NULL) {
+		bname = purple_buddy_get_name(b);
 		g = purple_buddy_get_group(b);
 		gname = purple_group_get_name(g);
 		presence = purple_buddy_get_presence(b);
@@ -1107,6 +1109,7 @@
 
 	if (conn->type == SNAC_FAMILY_AUTH)
 	{
+		/* This only happens when connecting with the old-style BUCP login */
 		gchar *msg;
 		msg = g_strdup_printf(_("Could not connect to authentication server:\n%s"),
 				error_message);
@@ -1152,14 +1155,26 @@
 		flap_connection_send_version(od, conn);
 	else
 	{
-		flap_connection_send_version_with_cookie(od, conn,
-				conn->cookielen, conn->cookie);
+		if (purple_account_get_bool(account, "use_clientlogin", OSCAR_DEFAULT_USE_CLIENTLOGIN))
+		{
+			ClientInfo aiminfo = CLIENTINFO_PURPLE_AIM;
+			ClientInfo icqinfo = CLIENTINFO_PURPLE_ICQ;
+			flap_connection_send_version_with_cookie_and_clientinfo(od,
+					conn, conn->cookielen, conn->cookie,
+					od->icq ? &icqinfo : &aiminfo);
+		} else {
+			flap_connection_send_version_with_cookie(od, conn,
+					conn->cookielen, conn->cookie);
+		}
+
+
 		g_free(conn->cookie);
 		conn->cookie = NULL;
 	}
 
 	if (conn->type == SNAC_FAMILY_AUTH)
 	{
+		/* This only happens when connecting with the old-style BUCP login */
 		aim_request_login(od, conn, purple_account_get_username(account));
 		purple_debug_info("oscar", "Username sent, waiting for response\n");
 		purple_connection_update_progress(gc, _("Username sent"), 1, OSCAR_CONNECT_STEPS);
@@ -1430,7 +1445,6 @@
 {
 	PurpleConnection *gc;
 	OscarData *od;
-	FlapConnection *newconn;
 
 	gc = purple_account_get_connection(account);
 	od = oscar_data_new();
@@ -1445,9 +1459,12 @@
 	oscar_data_addhandler(od, SNAC_FAMILY_ADMIN, 0x0007, purple_account_confirm, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_ALERT, 0x0001, purple_parse_genericerr, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_ALERT, SNAC_SUBTYPE_ALERT_MAILSTATUS, purple_email_parseupdate, 0);
+
+	/* These are only needed when connecting with the old-style BUCP login */
 	oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0003, purple_parse_auth_resp, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_AUTH, 0x0007, purple_parse_login, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_AUTH, SNAC_SUBTYPE_AUTH_SECURID_REQUEST, purple_parse_auth_securid_request, 0);
+
 	oscar_data_addhandler(od, SNAC_FAMILY_BART, SNAC_SUBTYPE_BART_RESPONSE, purple_icon_parseicon, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0001, purple_parse_genericerr, 0);
 	oscar_data_addhandler(od, SNAC_FAMILY_BOS, 0x0003, purple_bosrights, 0);
@@ -1523,10 +1540,34 @@
 	purple_prefs_connect_callback(gc, "/purple/away/idle_reporting", idle_reporting_pref_cb, gc);
 	purple_prefs_connect_callback(gc, "/plugins/prpl/oscar/recent_buddies", recent_buddies_pref_cb, gc);
 
-	newconn = flap_connection_new(od, SNAC_FAMILY_AUTH);
-	if (od->use_ssl) {
-		if (purple_ssl_is_supported()) {
-			const char *server = purple_account_get_string(account, "server", OSCAR_DEFAULT_SSL_LOGIN_SERVER);
+	/*
+	 * On 2008-03-05 AOL released some documentation on the OSCAR protocol
+	 * which includes a new login method called clientLogin.  It is similar
+	 * (though not the same?) as what the AIM 6.0 series uses to
+	 * authenticate.
+	 *
+	 * AIM 5.9 and lower use an MD5-based login procedure called "BUCP".
+	 * Note that some people were unable to log in to ICQ using the MD5
+	 * method, and so ICQ, when not using clientLogin, is still using a
+	 * very insecure XOR-based login scheme.
+	 */
+	if (purple_account_get_bool(account, "use_clientlogin", OSCAR_DEFAULT_USE_CLIENTLOGIN)) {
+		send_client_login(od, purple_account_get_username(account));
+	} else {
+		FlapConnection *newconn;
+		const char *server;
+
+		newconn = flap_connection_new(od, SNAC_FAMILY_AUTH);
+
+		if (od->use_ssl) {
+			if (!purple_ssl_is_supported()) {
+				purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
+						_("SSL support unavailable"));
+				return;
+			}
+
+			server = purple_account_get_string(account, "server", OSCAR_DEFAULT_SSL_LOGIN_SERVER);
+
 			/*
 			 * If the account's server is what the oscar prpl has offered as
 			 * the default login server through the vast eons (all two of
@@ -1544,32 +1585,29 @@
 					purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT),
 					ssl_connection_established_cb, ssl_connection_error_cb, newconn);
 		} else {
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT,
-					_("SSL support unavailable"));
+			server = purple_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER);
+
+			/*
+			 * See the comment above. We do the reverse here. If they don't want
+			 * SSL but their server is set to OSCAR_DEFAULT_SSL_LOGIN_SERVER,
+			 * set it back to the default.
+			 */
+			if (!strcmp(server, OSCAR_DEFAULT_SSL_LOGIN_SERVER)) {
+				purple_debug_info("oscar", "Account does not use SSL, so changing server back to non-SSL\n");
+				purple_account_set_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER);
+				server = OSCAR_DEFAULT_LOGIN_SERVER;
+			}
+
+			newconn->connect_data = purple_proxy_connect(NULL, account, server,
+					purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT),
+					connection_established_cb, newconn);
 		}
-	} else {
-		const char *server = purple_account_get_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER);
-
-		/*
-		 * See the comment above. We do the reverse here. If they don't want
-		 * SSL but their server is set to OSCAR_DEFAULT_SSL_LOGIN_SERVER,
-		 * set it back to the default.
-		 */
-		if (!strcmp(server, OSCAR_DEFAULT_SSL_LOGIN_SERVER)) {
-			purple_debug_info("oscar", "Account does not use SSL, so changing server back to non-SSL\n");
-			purple_account_set_string(account, "server", OSCAR_DEFAULT_LOGIN_SERVER);
-			server = OSCAR_DEFAULT_LOGIN_SERVER;
+
+		if (newconn->gsc == NULL && newconn->connect_data == NULL) {
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
+					_("Couldn't connect to host"));
+			return;
 		}
-
-		newconn->connect_data = purple_proxy_connect(NULL, account, server,
-				purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT),
-				connection_established_cb, newconn);
-	}
-
-	if (newconn->gsc == NULL && newconn->connect_data == NULL) {
-		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
-				_("Couldn't connect to host"));
-		return;
 	}
 
 	purple_connection_update_progress(gc, _("Connecting"), 0, OSCAR_CONNECT_STEPS);
@@ -1604,165 +1642,6 @@
 	purple_debug_info("oscar", "Signed off.\n");
 }
 
-static int
-purple_parse_auth_resp(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
-{
-	PurpleConnection *gc = od->gc;
-	PurpleAccount *account = purple_connection_get_account(gc);
-	char *host; int port;
-	int i;
-	FlapConnection *newconn;
-	va_list ap;
-	struct aim_authresp_info *info;
-
-	port = purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT);
-
-	va_start(ap, fr);
-	info = va_arg(ap, struct aim_authresp_info *);
-	va_end(ap);
-
-	purple_debug_info("oscar",
-			   "inside auth_resp (Username: %s)\n", info->bn);
-
-	if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) {
-		char buf[256];
-		switch (info->errorcode) {
-		case 0x01:
-			/* Unregistered username */
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_USERNAME, _("Invalid username."));
-			break;
-		case 0x05:
-			/* Incorrect password */
-			if (!purple_account_get_remember_password(account))
-				purple_account_set_password(account, NULL);
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
-			break;
-		case 0x11:
-			/* Suspended account */
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Your account is currently suspended."));
-			break;
-		case 0x02:
-		case 0x14:
-			/* service temporarily unavailable */
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("The AOL Instant Messenger service is temporarily unavailable."));
-			break;
-		case 0x18:
-			/* username connecting too frequently */
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
-			break;
-		case 0x1c:
-		{
-			/* client too old */
-			GHashTable *ui_info = purple_core_get_ui_info();
-			g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"),
-					   ((ui_info && g_hash_table_lookup(ui_info, "website")) ? (char *)g_hash_table_lookup(ui_info, "website") : PURPLE_WEBSITE));
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, buf);
-			break;
-		}
-		case 0x1d:
-			/* IP address connecting too frequently */
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
-			break;
-		default:
-			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Authentication failed"));
-			break;
-		}
-		purple_debug_info("oscar", "Login Error Code 0x%04hx\n", info->errorcode);
-		purple_debug_info("oscar", "Error URL: %s\n", info->errorurl ? info->errorurl : "");
-		return 1;
-	}
-
-	purple_debug_misc("oscar", "Reg status: %hu\n"
-							   "Email: %s\n"
-							   "BOSIP: %s\n",
-							   info->regstatus,
-							   info->email ? info->email : "null",
-							   info->bosip ? info->bosip : "null");
-	purple_debug_info("oscar", "Closing auth connection...\n");
-	flap_connection_schedule_destroy(conn, OSCAR_DISCONNECT_DONE, NULL);
-
-	for (i = 0; i < strlen(info->bosip); i++) {
-		if (info->bosip[i] == ':') {
-			port = atoi(&(info->bosip[i+1]));
-			break;
-		}
-	}
-	host = g_strndup(info->bosip, i);
-	newconn = flap_connection_new(od, SNAC_FAMILY_LOCATE);
-	newconn->cookielen = info->cookielen;
-	newconn->cookie = g_memdup(info->cookie, info->cookielen);
-
-	if (od->use_ssl)
-	{
-		/*
-		 * This shouldn't be hardcoded except that the server isn't sending
-		 * us a name to use for comparing the certificate common name.
-		 */
-		newconn->ssl_cert_cn = g_strdup("bos.oscar.aol.com");
-		newconn->connect_data = purple_proxy_connect(NULL, account, host, port,
-				ssl_proxy_conn_established_cb, newconn);
-	}
-	else
-	{
-		newconn->connect_data = purple_proxy_connect(NULL, account, host, port,
-				connection_established_cb, newconn);
-	}
-
-	g_free(host);
-	if (newconn->connect_data == NULL)
-	{
-		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Could Not Connect"));
-		return 0;
-	}
-
-	purple_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS);
-	ck[3] = 0x64;
-
-	return 1;
-}
-
-static void
-purple_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg)
-{
-	PurpleConnection *gc = user_data;
-	OscarData *od = purple_connection_get_protocol_data(gc);
-
-	aim_auth_securid_send(od, msg);
-}
-
-static void
-purple_parse_auth_securid_request_no_cb(gpointer user_data, const char *value)
-{
-	PurpleConnection *gc = user_data;
-
-	/* Disconnect */
-	purple_connection_error_reason(gc,
-		PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
-		_("The SecurID key entered is invalid."));
-}
-
-static int
-purple_parse_auth_securid_request(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
-{
-	PurpleConnection *gc = od->gc;
-	PurpleAccount *account = purple_connection_get_account(gc);
-	gchar *primary;
-
-	purple_debug_info("oscar", "Got SecurID request\n");
-
-	primary = g_strdup_printf("Enter the SecurID key for %s.", purple_account_get_username(account));
-	purple_request_input(gc, NULL, _("Enter SecurID"), primary,
-					   _("Enter the 6 digit number from the digital display."),
-					   FALSE, FALSE, NULL,
-					   _("_OK"), G_CALLBACK(purple_parse_auth_securid_request_yes_cb),
-					   _("_Cancel"), G_CALLBACK(purple_parse_auth_securid_request_no_cb),
-					   account, NULL, NULL,
-					   gc);
-	g_free(primary);
-
-	return 1;
-}
-
 /* XXX - Should use purple_util_fetch_url for the below stuff */
 struct pieceofcrap {
 	PurpleConnection *gc;
@@ -1833,13 +1712,6 @@
 	gchar *buf;
 	gssize result;
 
-	if (!PURPLE_CONNECTION_IS_VALID(pos->gc))
-	{
-		g_free(pos->modname);
-		g_free(pos);
-		return;
-	}
-
 	pos->fd = source;
 
 	if (source < 0) {
@@ -1879,7 +1751,8 @@
 /* size of icbmui.ocm, the largest module in AIM 3.5 */
 #define AIM_MAX_FILE_SIZE 98304
 
-int purple_memrequest(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...) {
+static int purple_memrequest(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
+{
 	va_list ap;
 	struct pieceofcrap *pos;
 	guint32 offset, len;
@@ -1937,8 +1810,7 @@
 	pos->len = len;
 	pos->modname = g_strdup(modname);
 
-	/* TODO: Keep track of this return value. */
-	if (purple_proxy_connect(NULL, pos->gc->account, "pidgin.im", 80,
+	if (purple_proxy_connect(pos->gc, pos->gc->account, "pidgin.im", 80,
 			straight_to_hell, pos) == NULL)
 	{
 		char buf[256];
@@ -1957,6 +1829,204 @@
 	return 1;
 }
 
+int oscar_connect_to_bos(PurpleConnection *gc, OscarData *od, const char *host, guint16 port, guint8 *cookie, guint16 cookielen)
+{
+	FlapConnection *conn;
+
+	conn = flap_connection_new(od, SNAC_FAMILY_LOCATE);
+	conn->cookielen = cookielen;
+	conn->cookie = g_memdup(cookie, cookielen);
+	conn->connect_data = purple_proxy_connect(NULL,
+			purple_connection_get_account(gc), host, port,
+			connection_established_cb, conn);
+	if (conn->connect_data == NULL)
+	{
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Could Not Connect"));
+		return 0;
+	}
+
+	od->default_port = port;
+
+	purple_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS);
+	ck[3] = 0x64;
+
+	return 1;
+}
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
+static int
+purple_parse_auth_resp(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
+{
+	PurpleConnection *gc = od->gc;
+	PurpleAccount *account = purple_connection_get_account(gc);
+	char *host; int port;
+	int i;
+	FlapConnection *newconn;
+	va_list ap;
+	struct aim_authresp_info *info;
+
+	port = purple_account_get_int(account, "port", od->default_port);
+
+	va_start(ap, fr);
+	info = va_arg(ap, struct aim_authresp_info *);
+	va_end(ap);
+
+	purple_debug_info("oscar",
+			   "inside auth_resp (Username: %s)\n", info->bn);
+
+	if (info->errorcode || !info->bosip || !info->cookielen || !info->cookie) {
+		char buf[256];
+		switch (info->errorcode) {
+		case 0x01:
+			/* Unregistered username */
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_INVALID_USERNAME, _("Invalid username."));
+			break;
+		case 0x05:
+			/* Incorrect password */
+			if (!purple_account_get_remember_password(account))
+				purple_account_set_password(account, NULL);
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Incorrect password."));
+			break;
+		case 0x11:
+			/* Suspended account */
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Your account is currently suspended."));
+			break;
+		case 0x02:
+		case 0x14:
+			/* service temporarily unavailable */
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("The AOL Instant Messenger service is temporarily unavailable."));
+			break;
+		case 0x18:
+			/* username connecting too frequently */
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait ten minutes and try again. If you continue to try, you will need to wait even longer."));
+			break;
+		case 0x1c:
+		{
+			/* client too old */
+			GHashTable *ui_info = purple_core_get_ui_info();
+			g_snprintf(buf, sizeof(buf), _("The client version you are using is too old. Please upgrade at %s"),
+					   ((ui_info && g_hash_table_lookup(ui_info, "website")) ? (char *)g_hash_table_lookup(ui_info, "website") : PURPLE_WEBSITE));
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, buf);
+			break;
+		}
+		case 0x1d:
+			/* IP address connecting too frequently */
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_OTHER_ERROR, _("You have been connecting and disconnecting too frequently. Wait a minute and try again. If you continue to try, you will need to wait even longer."));
+			break;
+		default:
+			purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED, _("Authentication failed"));
+			break;
+		}
+		purple_debug_info("oscar", "Login Error Code 0x%04hx\n", info->errorcode);
+		purple_debug_info("oscar", "Error URL: %s\n", info->errorurl ? info->errorurl : "");
+		return 1;
+	}
+
+	purple_debug_misc("oscar", "Reg status: %hu\n"
+							   "Email: %s\n"
+							   "BOSIP: %s\n",
+							   info->regstatus,
+							   info->email ? info->email : "null",
+							   info->bosip ? info->bosip : "null");
+	purple_debug_info("oscar", "Closing auth connection...\n");
+	flap_connection_schedule_destroy(conn, OSCAR_DISCONNECT_DONE, NULL);
+
+	for (i = 0; i < strlen(info->bosip); i++) {
+		if (info->bosip[i] == ':') {
+			port = atoi(&(info->bosip[i+1]));
+			break;
+		}
+	}
+	host = g_strndup(info->bosip, i);
+	newconn = flap_connection_new(od, SNAC_FAMILY_LOCATE);
+	newconn->cookielen = info->cookielen;
+	newconn->cookie = g_memdup(info->cookie, info->cookielen);
+
+	if (od->use_ssl)
+	{
+		/*
+		 * This shouldn't be hardcoded except that the server isn't sending
+		 * us a name to use for comparing the certificate common name.
+		 */
+		newconn->ssl_cert_cn = g_strdup("bos.oscar.aol.com");
+		newconn->connect_data = purple_proxy_connect(NULL, account, host, port,
+				ssl_proxy_conn_established_cb, newconn);
+	}
+	else
+	{
+		newconn->connect_data = purple_proxy_connect(NULL, account, host, port,
+				connection_established_cb, newconn);
+	}
+
+	g_free(host);
+	if (newconn->connect_data == NULL)
+	{
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, _("Could Not Connect"));
+		return 0;
+	}
+
+	purple_connection_update_progress(gc, _("Received authorization"), 3, OSCAR_CONNECT_STEPS);
+	ck[3] = 0x64;
+
+	return 1;
+}
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
+static void
+purple_parse_auth_securid_request_yes_cb(gpointer user_data, const char *msg)
+{
+	PurpleConnection *gc = user_data;
+	OscarData *od = purple_connection_get_protocol_data(gc);
+
+	aim_auth_securid_send(od, msg);
+}
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
+static void
+purple_parse_auth_securid_request_no_cb(gpointer user_data, const char *value)
+{
+	PurpleConnection *gc = user_data;
+
+	/* Disconnect */
+	purple_connection_error_reason(gc,
+		PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED,
+		_("The SecurID key entered is invalid."));
+}
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
+static int
+purple_parse_auth_securid_request(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
+{
+	PurpleConnection *gc = od->gc;
+	PurpleAccount *account = purple_connection_get_account(gc);
+	gchar *primary;
+
+	purple_debug_info("oscar", "Got SecurID request\n");
+
+	primary = g_strdup_printf("Enter the SecurID key for %s.", purple_account_get_username(account));
+	purple_request_input(gc, NULL, _("Enter SecurID"), primary,
+					   _("Enter the 6 digit number from the digital display."),
+					   FALSE, FALSE, NULL,
+					   _("_OK"), G_CALLBACK(purple_parse_auth_securid_request_yes_cb),
+					   _("_Cancel"), G_CALLBACK(purple_parse_auth_securid_request_no_cb),
+					   account, NULL, NULL,
+					   gc);
+	g_free(primary);
+
+	return 1;
+}
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 static int
 purple_parse_login(OscarData *od, FlapConnection *conn, FlapFrame *fr, ...)
 {
@@ -2002,7 +2072,7 @@
 	redir = va_arg(ap, struct aim_redirect_data *);
 	va_end(ap);
 
-	port = purple_account_get_int(account, "port", OSCAR_DEFAULT_LOGIN_PORT);
+	port = od->default_port;
 	separator = strchr(redir->ip, ':');
 	if (separator != NULL)
 	{
@@ -2835,9 +2905,15 @@
 			/* From libicq2000-0.3.2/src/ICQ.cpp */
 			byte_stream_init(&qbs, (guint8 *)args->msg, args->msglen);
 			byte_stream_advance(&qbs, 21);
+			/* expected:	01 00 00 20 00 0e 28 f6 00 11 e7 d3 11 bc f3 00 04 ac 96 9d c2 | 00 00 | 06 00 00 00 | 49 43 51 53 43 53 ...*/
+			/* unexpected:	00 00 26 00 81 1a 18 bc 0e 6c 18 47 a5 91 6f 18 dc c7 6f 1a | 00 00 | 0d 00 00 00 | 49 43 51 57 65 62 4d 65 73 73 61 67 65 ... */
 			smstype = byte_stream_getle16(&qbs);
+			if (smstype != 0)
+				break;
 			taglen = byte_stream_getle32(&qbs);
 			tagstr = byte_stream_getstr(&qbs, taglen);
+			if (tagstr == NULL)
+				break;
 			byte_stream_advance(&qbs, 3);
 			byte_stream_advance(&qbs, 4);
 			smslen = byte_stream_getle32(&qbs);
@@ -3566,13 +3642,16 @@
 	alerturl  = va_arg(ap, char *);
 	va_end(ap);
 
-	if (account != NULL && emailinfo != NULL && emailinfo->unread && havenewmail) {
+	if (account != NULL && emailinfo != NULL && purple_account_get_check_mail(account) &&
+			emailinfo->unread && havenewmail) {
 		gchar *to = g_strdup_printf("%s%s%s",
 				purple_account_get_username(account),
 				emailinfo->domain ? "@" : "",
 				emailinfo->domain ? emailinfo->domain : "");
+		const char *tos[2] = { to };
+		const char *urls[2] = { emailinfo->url };
 		purple_notify_emails(gc, emailinfo->nummsgs, FALSE, NULL, NULL,
-				(const char **)&to, (const char **)&emailinfo->url, NULL, NULL);
+				tos, urls, NULL, NULL);
 		g_free(to);
 	}
 
@@ -3917,20 +3996,9 @@
 			purple_account_get_bool(account, "web_aware", OSCAR_DEFAULT_WEB_AWARE));
 	}
 
+	aim_srv_requestnew(od, SNAC_FAMILY_ALERT);
 	aim_srv_requestnew(od, SNAC_FAMILY_CHATNAV);
 
-	/*
-	 * The "if" statement here is a pathetic attempt to not attempt to
-	 * connect to the alerts servce (aka email notification) if this
-	 * username does not support it.  I think mail notification
-	 * works for @mac.com accounts but does not work for the newer
-	 * @anythingelse.com accounts.  If that's true then this change
-	 * breaks mail notification for @mac.com accounts, but it gets rid
-	 * of an annoying error at signon for @anythingelse.com accounts.
-	 */
-	if (od->authinfo->email != NULL && strchr(username, '@') == NULL)
-		aim_srv_requestnew(od, SNAC_FAMILY_ALERT);
-
 	return 1;
 }
 
@@ -4433,7 +4501,8 @@
 	}
 	g_string_free(data, TRUE);
 
-	peer_odc_send_im(conn, msg->str, msg->len, charset, (imflags & PURPLE_MESSAGE_AUTO_RESP));
+	peer_odc_send_im(conn, msg->str, msg->len, charset,
+			imflags & PURPLE_MESSAGE_AUTO_RESP);
 	g_string_free(msg, TRUE);
 }
 
@@ -6381,6 +6450,10 @@
 
 	if (od->ssi.received_data && purple_buddy_get_group(buddy) != NULL)
 	{
+		/*
+		 * We only do this if the user is in our buddy list and we're
+		 * waiting for authorization.
+		 */
 		char *gname;
 		gname = aim_ssi_itemlist_findparentname(od->ssi.local, bname);
 		if (gname && aim_ssi_waitingforauth(od->ssi.local, gname, bname))
@@ -6460,7 +6533,7 @@
 						gc);
 }
 
-static void oscar_format_username(PurpleConnection *gc, const char *nick) {
+void oscar_format_username(PurpleConnection *gc, const char *nick) {
 	OscarData *od = purple_connection_get_protocol_data(gc);
 	if (!oscar_util_name_compare(purple_account_get_username(purple_connection_get_account(gc)), nick)) {
 		if (!flap_connection_getbytype(od, SNAC_FAMILY_ADMIN)) {
@@ -6538,47 +6611,35 @@
 {
 	PurpleConnection *gc = (PurpleConnection *) action->context;
 	OscarData *od = purple_connection_get_protocol_data(gc);
-	gchar *nombre, *text, *tmp;
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	gchar *text, *tmp;
+	GSList *buddies;
 	PurpleAccount *account;
 	int num=0;
 
 	text = g_strdup("");
 	account = purple_connection_get_account(gc);
 
-	for (gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		PurpleGroup *group = (PurpleGroup *)gnode;
-		const char *gname;
-		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		gname = purple_group_get_name(group);
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				PurpleBuddy *buddy = (PurpleBuddy *)bnode;
-				const char *bname;
-				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				bname = purple_buddy_get_name(buddy);
-				if (purple_buddy_get_account(buddy) == account && aim_ssi_waitingforauth(od->ssi.local, gname, bname)) {
-					if (purple_buddy_get_alias_only(buddy))
-						nombre = g_strdup_printf(" %s (%s)", bname, purple_buddy_get_alias_only(buddy));
-					else
-						nombre = g_strdup_printf(" %s", bname);
-					tmp = g_strdup_printf("%s%s<br>", text, nombre);
-					g_free(text);
-					text = tmp;
-					g_free(nombre);
-					num++;
-				}
-			}
+	buddies = purple_find_buddies(account, NULL);
+	while (buddies) {
+		PurpleBuddy *buddy;
+		const gchar *bname, *gname;
+
+		buddy = buddies->data;
+		bname = purple_buddy_get_name(buddy);
+		gname = purple_group_get_name(purple_buddy_get_group(buddy));
+		if (aim_ssi_waitingforauth(od->ssi.local, gname, bname)) {
+			const gchar *alias = purple_buddy_get_alias_only(buddy);
+			if (alias)
+				tmp = g_strdup_printf("%s %s (%s)<br>", text, bname, alias);
+			else
+				tmp = g_strdup_printf("%s %s<br>", text, bname);
+			g_free(text);
+			text = tmp;
+
+			num++;
 		}
+
+		buddies = g_slist_delete_link(buddies, buddies);
 	}
 
 	if (!num) {
@@ -6633,6 +6694,9 @@
 	purple_account_request_change_password(purple_connection_get_account(gc));
 }
 
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 static void oscar_show_chpassurl(PurplePluginAction *action)
 {
 	PurpleConnection *gc = (PurpleConnection *) action->context;
@@ -6773,12 +6837,16 @@
 			oscar_change_pass);
 	menu = g_list_prepend(menu, act);
 
-	if (od->authinfo->chpassurl != NULL)
+	if (od->authinfo != NULL && od->authinfo->chpassurl != NULL)
 	{
+		/* This only happens when connecting with the old-style BUCP login */
 		act = purple_plugin_action_new(_("Change Password (web)"),
 				oscar_show_chpassurl);
 		menu = g_list_prepend(menu, act);
-
+	}
+
+	if (!od->icq)
+	{
 		act = purple_plugin_action_new(_("Configure IM Forwarding (web)"),
 				oscar_show_imforwardingurl);
 		menu = g_list_prepend(menu, act);
@@ -7015,6 +7083,10 @@
 			OSCAR_DEFAULT_USE_SSL);
 	prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);
 
+	option = purple_account_option_bool_new(_("Use clientLogin"), "use_clientlogin",
+			OSCAR_DEFAULT_USE_CLIENTLOGIN);
+	prpl_info->protocol_options = g_list_append(prpl_info->protocol_options, option);
+
 	option = purple_account_option_bool_new(
 		_("Always use AIM/ICQ proxy server for\nfile transfers and direct IM (slower,\nbut does not reveal your IP address)"), "always_use_rv_proxy",
 		OSCAR_DEFAULT_ALWAYS_USE_RV_PROXY);
@@ -7031,6 +7103,16 @@
 	/* Preferences */
 	purple_prefs_add_none("/plugins/prpl/oscar");
 	purple_prefs_add_bool("/plugins/prpl/oscar/recent_buddies", FALSE);
+
+	/*
+	 * These two preferences will normally not be changed.  UIs can optionally
+	 * use them to override these two version fields which are sent to the
+	 * server when logging in.  AOL requested this change to allow clients to
+	 * use custom values.
+	 */
+	purple_prefs_add_string("/plugins/prpl/oscar/clientstring", NULL);
+	purple_prefs_add_int("/plugins/prpl/oscar/distid", -1);
+
 	purple_prefs_remove("/plugins/prpl/oscar/show_idle");
 	purple_prefs_remove("/plugins/prpl/oscar/always_use_rv_proxy");
 
--- a/libpurple/protocols/oscar/oscar.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/oscar.h	Sun Jun 28 04:41:07 2009 +0000
@@ -469,6 +469,9 @@
  */
 struct _OscarData
 {
+	/** Only used when connecting with clientLogin */
+	PurpleUtilFetchUrlData *url_data;
+
 	gboolean iconconnecting;
 	gboolean set_icon;
 
@@ -522,6 +525,8 @@
 
 	IcbmCookie *msgcookies;
 	struct aim_icq_info *icq_info;
+
+	/** Only used when connecting with the old-style BUCP login. */
 	struct aim_authresp_info *authinfo;
 	struct aim_emailinfo *emailinfo;
 
@@ -547,6 +552,7 @@
 
 	/** A linked list containing FlapConnections. */
 	GSList *oscar_connections;
+	guint16 default_port;
 
 	/** A linked list containing PeerConnections. */
 	GSList *peer_connections;
@@ -568,10 +574,9 @@
 #define AIM_ICQ_STATE_DIRECTREQUIREAUTH 0x10000000
 #define AIM_ICQ_STATE_DIRECTCONTACTLIST 0x20000000
 
-typedef int (*aim_rxcallback_t)(OscarData *od, FlapConnection *conn, FlapFrame *frame, ...);
-
-
-/* family_auth.c */
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 struct aim_clientrelease
 {
 	char *name;
@@ -580,6 +585,9 @@
 	char *info;
 };
 
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 struct aim_authresp_info
 {
 	char *bn;
@@ -611,12 +619,29 @@
 	} chat;
 };
 
+int oscar_connect_to_bos(PurpleConnection *gc, OscarData *od, const char *host, guint16 port, guint8 *cookie, guint16 cookielen);
+
+/* family_auth.c */
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 int aim_request_login(OscarData *od, FlapConnection *conn, const char *bn);
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 int aim_send_login(OscarData *od, FlapConnection *conn, const char *bn, const char *password, gboolean truncate_pass, ClientInfo *ci, const char *key, gboolean allow_multiple_logins);
+
+/**
+ * Only used when connecting with the old-style BUCP login.
+ */
 /* 0x000b */ int aim_auth_securid_send(OscarData *od, const char *securid);
 
-void oscar_data_addhandler(OscarData *od, guint16 family, guint16 subtype, aim_rxcallback_t newhandler, guint16 flags);
-aim_rxcallback_t aim_callhandler(OscarData *od, guint16 family, guint16 subtype);
+/**
+ * Only used when connecting with clientLogin.
+ */
+void send_client_login(OscarData *od, const char *username);
 
 /* flap_connection.c */
 FlapConnection *flap_connection_new(OscarData *, int type);
@@ -632,13 +657,19 @@
 void flap_connection_send(FlapConnection *conn, FlapFrame *frame);
 void flap_connection_send_version(OscarData *od, FlapConnection *conn);
 void flap_connection_send_version_with_cookie(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy);
+void flap_connection_send_version_with_cookie_and_clientinfo(OscarData *od, FlapConnection *conn, guint16 length, const guint8 *chipsahoy, ClientInfo *ci);
 void flap_connection_send_snac(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, guint16 flags, aim_snacid_t snacid, ByteStream *data);
 void flap_connection_send_snac_with_priority(OscarData *od, FlapConnection *conn, guint16 family, const guint16 subtype, guint16 flags, aim_snacid_t snacid, ByteStream *data, gboolean high_priority);
 void flap_connection_send_keepalive(OscarData *od, FlapConnection *conn);
 FlapFrame *flap_frame_new(OscarData *od, guint16 channel, int datalen);
 
+/* oscar_data.c */
+typedef int (*aim_rxcallback_t)(OscarData *od, FlapConnection *conn, FlapFrame *frame, ...);
+
 OscarData *oscar_data_new(void);
 void oscar_data_destroy(OscarData *);
+void oscar_data_addhandler(OscarData *od, guint16 family, guint16 subtype, aim_rxcallback_t newhandler, guint16 flags);
+aim_rxcallback_t aim_callhandler(OscarData *od, guint16 family, guint16 subtype);
 
 /* misc.c */
 #define AIM_VISIBILITYCHANGE_PERMITADD    0x05
--- a/libpurple/protocols/oscar/oscar_data.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/oscar_data.c	Sun Jun 28 04:41:07 2009 +0000
@@ -70,6 +70,7 @@
 	/* missing 0x14 */
 	aim__registermodule(od, icq_modfirst);
 	/* missing 0x16 */
+	/* auth_modfirst is only needed if we're connecting with the old-style BUCP login */
 	aim__registermodule(od, auth_modfirst);
 	aim__registermodule(od, email_modfirst);
 
@@ -86,6 +87,10 @@
 {
 	aim_cleansnacs(od, -1);
 
+	/* Only used when connecting with clientLogin */
+	if (od->url_data != NULL)
+		purple_util_fetch_url_cancel(od->url_data);
+
 	while (od->requesticon)
 	{
 		g_free(od->requesticon->data);
--- a/libpurple/protocols/oscar/oscarcommon.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/oscar/oscarcommon.h	Sun Jun 28 04:41:07 2009 +0000
@@ -45,6 +45,7 @@
 #define OSCAR_DEFAULT_ALWAYS_USE_RV_PROXY FALSE
 #define OSCAR_DEFAULT_ALLOW_MULTIPLE_LOGINS TRUE
 #define OSCAR_DEFAULT_USE_SSL FALSE
+#define OSCAR_DEFAULT_USE_CLIENTLOGIN FALSE
 
 #ifdef _WIN32
 const char *oscar_get_locale_charset(void);
@@ -91,5 +92,6 @@
 void oscar_send_file(PurpleConnection *gc, const char *who, const char *file);
 PurpleXfer *oscar_new_xfer(PurpleConnection *gc, const char *who);
 gboolean oscar_offline_message(const PurpleBuddy *buddy);
+void oscar_format_username(PurpleConnection *gc, const char *nick);
 GList *oscar_actions(PurplePlugin *plugin, gpointer context);
 void oscar_init(PurplePluginProtocolInfo *prpl_info);
--- a/libpurple/protocols/qq/qq_crypt.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/qq/qq_crypt.c	Sun Jun 28 04:41:07 2009 +0000
@@ -163,9 +163,11 @@
 		c32_prev[0] = crypted32[0]; c32_prev[1] = crypted32[1];
 		
 		/* set next 64 bits want to crypt*/
-		crypted_ptr += 8;
-		memcpy(crypted32, crypted_ptr, sizeof(crypted32));
-		plain32[0] = crypted32[0] ^ c32_prev[0]; plain32[1] = crypted32[1] ^ c32_prev[1];
+		if (count64 > 0) {
+			crypted_ptr += 8;
+			memcpy(crypted32, crypted_ptr, sizeof(crypted32));
+			plain32[0] = crypted32[0] ^ c32_prev[0]; plain32[1] = crypted32[1] ^ c32_prev[1];
+		}
 	}
 }
 
--- a/libpurple/protocols/qq/utils.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/qq/utils.c	Sun Jun 28 04:41:07 2009 +0000
@@ -222,7 +222,8 @@
  * The return should be freed later. */
 guint8 *hex_str_to_bytes(const gchar *const buffer, gint *out_len)
 {
-	gchar *hex_str, *hex_buffer, *cursor, tmp;
+	gchar *hex_str, *hex_buffer, *cursor;
+	gchar tmp[2];
 	guint8 *bytes, nibble1, nibble2;
 	gint index;
 
@@ -242,7 +243,9 @@
 	index = 0;
 	for (cursor = hex_str; cursor < hex_str + sizeof(gchar) * (strlen(hex_str)) - 1; cursor++) {
 		if (g_ascii_isdigit(*cursor)) {
-			tmp = *cursor; nibble1 = atoi(&tmp);
+			tmp[0] = *cursor;
+			tmp[1] = '\0';
+			nibble1 = atoi(tmp);
 		} else if (g_ascii_isalpha(*cursor) && (gint) *cursor - 87 < 16) {
 			nibble1 = (gint) *cursor - 87;
 		} else {
@@ -254,7 +257,9 @@
 		nibble1 = nibble1 << 4;
 		cursor++;
 		if (g_ascii_isdigit(*cursor)) {
-			tmp = *cursor; nibble2 = atoi(&tmp);
+			tmp[0] = *cursor;
+			tmp[1] = '\0';
+			nibble2 = atoi(tmp);
 		} else if (g_ascii_isalpha(*cursor) && (gint) (*cursor - 87) < 16) {
 			nibble2 = (gint) *cursor - 87;
 		} else {
--- a/libpurple/protocols/sametime/sametime.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/sametime/sametime.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1466,7 +1466,7 @@
 
   if(purple_account_get_bool(account, MW_KEY_FORCE, FALSE) ||
      !host || (! strcmp(current_host, host)) ||
-     (purple_proxy_connect(NULL, account, host, port, connect_cb, pd) == NULL)) {
+     (purple_proxy_connect(gc, account, host, port, connect_cb, pd) == NULL)) {
 
     /* if we're configured to force logins, or if we're being
        redirected to the already configured host, or if we couldn't
--- a/libpurple/protocols/silc/buddy.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/silc/buddy.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1407,35 +1407,16 @@
 
 void silcpurple_send_buddylist(PurpleConnection *gc)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleBuddy *buddy;
+	GSList *buddies;
 	PurpleAccount *account;
 
 	account = purple_connection_get_account(gc);
 
-	for (gnode = purple_blist_get_root();
-			gnode != NULL;
-			gnode = purple_blist_node_get_sibling_next(gnode))
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies))
 	{
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode != NULL;
-				cnode = purple_blist_node_get_sibling_next(cnode))
-		{
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode != NULL;
-					bnode = purple_blist_node_get_sibling_next(bnode))
-			{
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				buddy = (PurpleBuddy *)bnode;
-				if (purple_buddy_get_account(buddy) == account)
-					silcpurple_add_buddy_i(gc, buddy, TRUE);
-			}
-		}
+		PurpleBuddy *buddy = buddies->data;
+		silcpurple_add_buddy_i(gc, buddy, TRUE);
 	}
 }
 
--- a/libpurple/protocols/silc/ops.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/silc/ops.c	Sun Jun 28 04:41:07 2009 +0000
@@ -839,7 +839,7 @@
 
 			b = NULL;
 			if (public_key) {
-				PurpleBlistNode *gnode, *cnode, *bnode;
+				GSList *buddies;
 				const char *f;
 
 				pk = silc_pkcs_public_key_encode(public_key, &pk_len);
@@ -857,29 +857,13 @@
 				silc_free(pk);
 
 				/* Find buddy by associated public key */
-				for (gnode = purple_blist_get_root(); gnode;
-				     gnode = purple_blist_node_get_sibling_next(gnode)) {
-					if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-						continue;
-					for (cnode = purple_blist_node_get_first_child(gnode);
-							cnode;
-							cnode = purple_blist_node_get_sibling_next(cnode)) {
-						if( !PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-							continue;
-						for (bnode = purple_blist_node_get_first_child(cnode);
-								bnode;
-								bnode = purple_blist_node_get_sibling_next(bnode)) {
-							if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-								continue;
-							b = (PurpleBuddy *)bnode;
-							if (purple_buddy_get_account(b) != account)
-								continue;
-							f = purple_blist_node_get_string(bnode, "public-key");
-							if (f && !strcmp(f, buf))
-								goto cont;
-							b = NULL;
-						}
-					}
+				for (buddies = purple_find_buddies(account, NULL); buddies;
+						buddies = g_slist_delete_link(buddies, buddies)) {
+					b = buddies->data;
+					f = purple_blist_node_get_string(PURPLE_BLIST_NODE(b), "public-key");
+					if (purple_strequal(f, buf))
+						goto cont;
+					b = NULL;
 				}
 			}
 		cont:
--- a/libpurple/protocols/simple/simple.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/simple/simple.c	Sun Jun 28 04:41:07 2009 +0000
@@ -213,27 +213,18 @@
 }
 
 static void simple_get_buddies(PurpleConnection *gc) {
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	GSList *buddies;
 	PurpleAccount *account;
 
 	purple_debug_info("simple", "simple_get_buddies\n");
 
 	account = purple_connection_get_account(gc);
-	for(gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		if(!PURPLE_BLIST_NODE_IS_GROUP(gnode)) continue;
-		for(cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if(!PURPLE_BLIST_NODE_IS_CONTACT(cnode)) continue;
-			for(bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				if(!PURPLE_BLIST_NODE_IS_BUDDY(bnode)) continue;
-				if(purple_buddy_get_account((PurpleBuddy*)bnode) == account)
-					simple_add_buddy(gc, (PurpleBuddy*)bnode, (PurpleGroup *)gnode);
-			}
-		}
+	buddies = purple_find_buddies(account, NULL);
+	while (buddies) {
+		PurpleBuddy *buddy = buddies->data;
+		simple_add_buddy(gc, buddy, purple_buddy_get_group(buddy));
+
+		buddies = g_slist_delete_link(buddies, buddies);
 	}
 }
 
@@ -455,13 +446,6 @@
 	struct simple_account_data *sip;
 	struct sip_connection *conn;
 
-	if (!PURPLE_CONNECTION_IS_VALID(gc))
-	{
-		if (source >= 0)
-			close(source);
-		return;
-	}
-
 	if(source < 0) {
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
@@ -1744,13 +1728,6 @@
 	struct simple_account_data *sip;
 	struct sip_connection *conn;
 
-	if (!PURPLE_CONNECTION_IS_VALID(gc))
-	{
-		if (source >= 0)
-			close(source);
-		return;
-	}
-
 	if(source < 0) {
 		purple_connection_error_reason(gc,
 			PURPLE_CONNECTION_ERROR_NETWORK_ERROR,
--- a/libpurple/protocols/yahoo/Makefile.am	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -11,10 +11,6 @@
 	yahoochat.c \
 	yahoo_aliases.c \
 	yahoo_aliases.h \
-	yahoo_auth.c \
-	yahoo_auth.h \
-	yahoo_crypt.h \
-	yahoo_crypt.c \
 	yahoo_doodle.h \
 	yahoo_doodle.c \
 	yahoo_filexfer.h \
--- a/libpurple/protocols/yahoo/Makefile.mingw	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/Makefile.mingw	Sun Jun 28 04:41:07 2009 +0000
@@ -41,8 +41,6 @@
 			yahoo.c \
 			yahoochat.c \
 			yahoo_aliases.c \
-			yahoo_auth.c \
-			yahoo_crypt.c \
 			yahoo_doodle.c \
 			yahoo_filexfer.c \
 			yahoo_friend.c \
--- a/libpurple/protocols/yahoo/util.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/util.c	Sun Jun 28 04:41:07 2009 +0000
@@ -22,7 +22,7 @@
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
+#endif /* HAVE_CONFIG_H */
 
 #include "debug.h"
 #include "internal.h"
@@ -42,7 +42,7 @@
 /*
  * Returns cookies formatted as a null terminated string for the given connection.
  * Must g_free return value.
- * 
+ *
  * TODO:will work, but must test for strict correctness
  */
 gchar* yahoo_get_cookies(PurpleConnection *gc)
@@ -191,7 +191,7 @@
 /*
  * I found these on some website but i don't know that they actually
  * work (or are supposed to work). I didn't implement them yet.
- * 
+ *
      * [0;30m ---black
      * [1;37m ---white
      * [0;37m ---tan
--- a/libpurple/protocols/yahoo/yahoo.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo.c	Sun Jun 28 04:41:07 2009 +0000
@@ -44,8 +44,6 @@
 #include "yahoo.h"
 #include "yahoochat.h"
 #include "yahoo_aliases.h"
-#include "yahoo_auth.h"
-#include "yahoo_crypt.h"
 #include "yahoo_doodle.h"
 #include "yahoo_filexfer.h"
 #include "yahoo_friend.h"
@@ -66,7 +64,7 @@
 static void yahoo_add_buddy(PurpleConnection *gc, PurpleBuddy *, PurpleGroup *);
 #ifdef TRY_WEBMESSENGER_LOGIN
 static void yahoo_login_page_cb(PurpleUtilFetchUrlData *url_data, gpointer user_data, const gchar *url_text, size_t len, const gchar *error_message);
-#endif
+#endif /* TRY_WEBMESSENGER_LOGIN */
 static void yahoo_set_status(PurpleAccount *account, PurpleStatus *status);
 
 static void yahoo_update_status(PurpleConnection *gc, const char *name, YahooFriend *f)
@@ -76,12 +74,10 @@
 	if (!gc || !name || !f || !purple_find_buddy(purple_connection_get_account(gc), name))
 		return;
 
-	if (f->status == YAHOO_STATUS_OFFLINE)
-	{
-		return;
-	}
-
 	switch (f->status) {
+	case YAHOO_STATUS_OFFLINE:
+		status = YAHOO_STATUS_TYPE_OFFLINE;
+		break;
 	case YAHOO_STATUS_AVAILABLE:
 		status = YAHOO_STATUS_TYPE_AVAILABLE;
 		break;
@@ -149,7 +145,6 @@
 static void yahoo_process_status(PurpleConnection *gc, struct yahoo_packet *pkt)
 {
 	PurpleAccount *account = purple_connection_get_account(gc);
-	struct yahoo_data *yd = gc->proto_data;
 	GSList *l = pkt->hash;
 	YahooFriend *f = NULL;
 	char *name = NULL;
@@ -170,29 +165,7 @@
 
 		switch (pair->key) {
 		case 0: /* we won't actually do anything with this */
-			break;
-		case 1: /* we don't get the full buddy list here. */
-			if (!yd->logged_in) {
-				purple_connection_set_display_name(gc, pair->value);
-				purple_connection_set_state(gc, PURPLE_CONNECTED);
-				yd->logged_in = TRUE;
-				if (yd->picture_upload_todo) {
-					yahoo_buddy_icon_upload(gc, yd->picture_upload_todo);
-					yd->picture_upload_todo = NULL;
-				}
-				yahoo_set_status(account, purple_account_get_active_status(account));
-
-				/* this requests the list. i have a feeling that this is very evil
-				 *
-				 * scs.yahoo.com sends you the list before this packet without  it being
-				 * requested
-				 *
-				 * do_import(gc, NULL);
-				 * newpkt = yahoo_packet_new(YAHOO_SERVICE_LIST, YAHOO_STATUS_OFFLINE, 0);
-				 * yahoo_packet_send_and_free(newpkt, yd);
-				 */
-
-				}
+		case 1: /* we won't actually do anything with this */
 			break;
 		case 8: /* how many online buddies we have */
 			break;
@@ -207,8 +180,28 @@
 			name = message = NULL;
 			f = NULL;
 			if (pair->value && g_utf8_validate(pair->value, -1, NULL)) {
+				GSList *tmplist;
+				int protocol = 0;
+
 				name = pair->value;
+
+				/* Look ahead to see if we have the protocol info about the buddy */
+				for (tmplist = l->next; tmplist; tmplist = tmplist->next) {
+					struct yahoo_pair *p = tmplist->data;
+					if (p->key == 7)
+						break;
+					if (p->key == 241) {
+						if(strtol(p->value, NULL, 10) == 2) {
+							g_free(msn_name);
+							msn_name = g_strconcat("msn/", name, NULL);
+							name = msn_name;
+							protocol = 2;
+						}
+						break;
+					}
+				}
 				f = yahoo_friend_find_or_new(gc, name);
+				f->protocol = protocol;
 			}
 			break;
 		case 10: /* state */
@@ -281,7 +274,7 @@
 					f->status = YAHOO_STATUS_OFFLINE;
 				if (name) {
 					purple_prpl_got_user_status(account, name, "offline", NULL);
-			                purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE);
+					purple_prpl_got_user_status_deactive(account, name, YAHOO_STATUS_TYPE_MOBILE);
 				}
 				break;
 			}
@@ -356,11 +349,7 @@
 				f->version_id = strtol(pair->value, NULL, 10);
 			break;
 		case 241: /* protocol buddy belongs to */
-			if(strtol(pair->value, NULL, 10) == 2)	{
-				msn_name = g_strconcat("msn/", name, NULL);
-				name = msn_name;
-			}
-			break;
+			break;  /* We process this when get '7' */
 		default:
 			purple_debug_warning("yahoo",
 					   "Unknown status key %d\n", pair->key);
@@ -370,11 +359,16 @@
 		l = l->next;
 	}
 
-	if (message && f)
-		yahoo_friend_set_status_message(f, yahoo_string_decode(gc, message, unicode));
-
-	if (name && f) /* update the last buddy */
-		yahoo_update_status(gc, name, f);
+	if (f) {
+		if (pkt->service == YAHOO_SERVICE_LOGOFF)
+			f->status = YAHOO_STATUS_OFFLINE;
+		if (message)
+			yahoo_friend_set_status_message(f, yahoo_string_decode(gc, message, unicode));
+
+		if (name) /* update the last buddy */
+			yahoo_update_status(gc, name, f);
+	}
+	g_free(msn_name);
 }
 
 static void yahoo_do_group_check(PurpleAccount *account, GHashTable *ht, const char *name, const char *group)
@@ -512,7 +506,7 @@
 
 			break;
 		case 301: /* This is 319 before all s/n's in a group after the first. It is followed by an identical 300. */
-			if(temp != NULL)	{
+			if(temp != NULL) {
 				if(protocol == 2)
 					norm_bud = g_strconcat("msn/", temp, NULL);
 				else
@@ -525,30 +519,30 @@
 						if (!(g = purple_find_group(yd->current_list15_grp))) {
 							g = purple_group_new(yd->current_list15_grp);
 							purple_blist_add_group(g, NULL);
+						}
+						b = purple_buddy_new(account, norm_bud, NULL);
+						purple_blist_add_buddy(b, NULL, g, NULL);
 					}
-					b = purple_buddy_new(account, norm_bud, NULL);
-					purple_blist_add_buddy(b, NULL, g, NULL);
-				}
-				yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp);
-				if(protocol != 0)	{
-					f->protocol = protocol;
-					purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol);
-				}
-				if(stealth == 2)
-					f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
-
-				/* set p2p status not connected and no p2p packet sent */
-				if(protocol == 0)	{
-					yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
-					f->p2p_packet_sent = 0;
-				} else
-					yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT);
+					yahoo_do_group_check(account, ht, norm_bud, yd->current_list15_grp);
+					if(protocol != 0) {
+						f->protocol = protocol;
+						purple_debug_info("yahoo", "Setting protocol to %d\n", f->protocol);
+					}
+					if(stealth == 2)
+						f->presence = YAHOO_PRESENCE_PERM_OFFLINE;
+
+					/* set p2p status not connected and no p2p packet sent */
+					if(protocol == 0) {
+						yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
+						f->p2p_packet_sent = 0;
+					} else
+						yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT);
 				} else {
 					/* This buddy is on the ignore list (and therefore in no group) */
 					purple_debug_info("yahoo", "%s adding %s to the deny list because of the ignore list / no group was found\n",account->username, norm_bud);
 					purple_privacy_deny_add(account, norm_bud, 1);
 				}
-			
+
 				protocol = 0;
 				stealth = 0;
 				norm_bud = NULL;
@@ -579,6 +573,18 @@
 	}
 
 	g_hash_table_foreach(ht, yahoo_do_group_cleanup, NULL);
+
+	/* Now that we have processed the buddy list, we can say yahoo has connected */
+	purple_connection_set_display_name(gc, purple_normalize(account, purple_account_get_username(account)));
+	purple_connection_set_state(gc, PURPLE_CONNECTED);
+	yd->logged_in = TRUE;
+	if (yd->picture_upload_todo) {
+		yahoo_buddy_icon_upload(gc, yd->picture_upload_todo);
+		yd->picture_upload_todo = NULL;
+	}
+	yahoo_set_status(account, purple_account_get_active_status(account));
+	purple_debug_info("yahoo","Authentication: Connection established\n");
+
 	g_hash_table_destroy(ht);
 	g_free(norm_bud);
 	g_free(temp);
@@ -739,7 +745,6 @@
 	gint val_11 = 0;
 	struct yahoo_data *yd = gc->proto_data;
 	gboolean msn = FALSE;
-	char *msn_from = NULL;
 
 	account = purple_connection_get_account(gc);
 
@@ -772,17 +777,16 @@
 		return;
 	}
 
-	if(msn)
-		msn_from = g_strconcat("msn/", from, NULL);
-
 	if (!g_ascii_strncasecmp(msg, "TYPING", strlen("TYPING"))
 		&& (purple_privacy_check(account, from)))
 	{
-		if(msn)	{
+		if(msn) {
+			char *msn_from = g_strconcat("msn/", from, NULL);
 			if (*stat == '1')
 				serv_got_typing(gc, msn_from, 0, PURPLE_TYPING);
 			else
 				serv_got_typing_stopped(gc, msn_from);
+			g_free(msn_from);
 		}
 		else	{
 			if (*stat == '1')
@@ -816,8 +820,6 @@
 		purple_conversation_write(conv, NULL, buf, PURPLE_MESSAGE_SYSTEM|PURPLE_MESSAGE_NOTIFY, time(NULL));
 		g_free(buf);
 	}
-
-	g_free(msn_from);
 }
 
 
@@ -826,6 +828,7 @@
 	int time;
 	int utf8;
 	int buddy_icon;
+	char *id;
 	char *msg;
 };
 
@@ -837,13 +840,13 @@
 	struct yahoo_data *yd;
 	char *server_msg = NULL;
 	char *m;
-	
-	yd = gc->proto_data;	
+
+	yd = gc->proto_data;
 	account = purple_connection_get_account(gc);
 
 	while (l != NULL) {
 		struct yahoo_pair *pair = l->data;
-		if (pair->key == 4)	{
+		if (pair->key == 4) {
 			sms = g_new0(struct _yahoo_im, 1);
 			sms->from = g_strdup_printf("+%s", pair->value);
 			sms->time = time(NULL);
@@ -861,8 +864,8 @@
 		l = l->next;
 	}
 
-	if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) )	{
-		if (server_msg)	{
+	if( (pkt->status == -1) || (pkt->status == YAHOO_STATUS_DISCONNECTED) ) {
+		if (server_msg) {
 			PurpleConversation *c;
 			c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms->from, account);
 			if (c == NULL)
@@ -871,7 +874,7 @@
 		}
 		else
 			purple_notify_error(gc, NULL, _("Your SMS was not delivered"), NULL);
-		
+
 		g_free(sms->from);
 		g_free(sms);
 		return ;
@@ -884,7 +887,7 @@
 
 	m = yahoo_string_decode(gc, sms->msg, sms->utf8);
 	serv_got_im(gc, sms->from, m, 0, sms->time);
-		
+
 	g_free(m);
 	g_free(sms->from);
 	g_free(sms);
@@ -929,7 +932,7 @@
 				if (im)
 					im->msg = pair->value;
 			}
-			if (pair->key == 241)	{
+			if (pair->key == 241) {
 				if(strtol(pair->value, NULL, 10) == 2)
 					msn = TRUE;
 			}
@@ -943,6 +946,9 @@
 			{
 				imv = pair->value;
 			}
+			if (pair->key == 429)
+				if (im)
+					im->id = pair->value;
 			l = l->next;
 		}
 	} else if (pkt->status == 2) {
@@ -1010,6 +1016,28 @@
 			return;
 		}
 
+		/*
+		 * TODO: Is there anything else we should check when determining whether
+		 *       we should send an acknowledgement?
+		 */
+		if (im->id != NULL) {
+			/* Send acknowledgement.  If we don't do this then the official
+			 * Yahoo Messenger client for Windows will send us the same
+			 * message 7 seconds later as an offline message.  This is true
+			 * for at least version 9.0.0.2162 on Windows XP. */
+			struct yahoo_packet *pkt2;
+			pkt2 = yahoo_packet_new(YAHOO_SERVICE_MESSAGE_ACK,
+					YAHOO_STATUS_AVAILABLE, pkt->id);
+			yahoo_packet_hash(pkt2, "ssisii",
+					1, purple_connection_get_display_name(gc),
+					5, im->from,
+					302, 430,
+					430, im->id,
+					303, 430,
+					450, 0);
+			yahoo_packet_send_and_free(pkt2, yd);
+		}
+
 		m = yahoo_string_decode(gc, im->msg, im->utf8);
 		/* This may actually not be necessary, but it appears
 		 * that at least at one point some clients were sending
@@ -1027,7 +1055,7 @@
 		if (!strcmp(m, "<ding>")) {
 			char *username;
 
-			if(c == NULL)	{
+			if(c == NULL) {
 				if(msn)
 					c = purple_conversation_new(PURPLE_CONV_TYPE_IM, account, msn_from);
 				else
@@ -1037,7 +1065,7 @@
 				username = g_markup_escape_text(msn_from, -1);
 			else
 				username = g_markup_escape_text(im->from, -1);
-			
+
 			purple_prpl_got_attention(gc, username, YAHOO_BUZZ);
 			g_free(username);
 			g_free(m);
@@ -1056,8 +1084,8 @@
 
 		g_free(m2);
 
-		/* laters : implement buddy icon for msn friends */ 
-		if(!msn)	{
+		/* laters : implement buddy icon for msn friends */
+		if(!msn) {
 			if ((f = yahoo_friend_find(gc, im->from)) && im->buddy_icon == 2) {
 				if (yahoo_friend_get_buddy_icon_need_request(f)) {
 					yahoo_send_picture_request(gc, im->from);
@@ -1110,11 +1138,15 @@
 	struct yahoo_add_request *add_req = data;
 	struct yahoo_packet *pkt;
 	struct yahoo_data *yd = add_req->gc->proto_data;
+	const char *who = add_req->who;
+
+	if (add_req->protocol == 2)
+		who += 4;
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_AUTH_REQ_15, YAHOO_STATUS_AVAILABLE, 0);
 	yahoo_packet_hash(pkt, "ssiii",
 					  1, add_req->id,
-					  5, add_req->who,
+					  5, who,
 					  241, add_req->protocol,
 					  13, 1,
 					  334, 0);
@@ -1520,18 +1552,26 @@
 		g_free(dec_subj);
 		g_free(from);
 	} else if (count > 0) {
-		const char *to = purple_account_get_username(account);
-		const char *url = yahoo_mail_url;
-
-		purple_notify_emails(gc, count, FALSE, NULL, NULL, &to, &url,
+		const char *tos[2] = { purple_account_get_username(account) };
+		const char *urls[2] = { yahoo_mail_url };
+
+		purple_notify_emails(gc, count, FALSE, NULL, NULL, tos, urls,
 						   NULL, NULL);
 	}
 }
+
+/* We use this structure once while we authenticate */
+struct yahoo_auth_data
+{
+	PurpleConnection *gc;
+	char *seed;
+};
+
 /* This is the y64 alphabet... it's like base64, but has a . and a _ */
 static const char base64digits[] = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789._";
 
-/* This is taken from Sylpheed by Hiroyuki Yamamoto.  We have our own tobase64 function
- * in util.c, but it has a bug I don't feel like finding right now ;) */
+/* This is taken from Sylpheed by Hiroyuki Yamamoto. We have our own tobase64 function
+ * in util.c, but it is different from the one yahoo uses */
 static void to_y64(char *out, const unsigned char *in, gsize inlen)
      /* raw bytes in quasi-big-endian order to base 64 string (NUL-terminated) */
 {
@@ -1558,605 +1598,289 @@
 	*out = '\0';
 }
 
-static void yahoo_process_auth_old(PurpleConnection *gc, const char *seed)
+static void yahoo_auth16_stage3(PurpleConnection *gc, const char *crypt)
 {
-	struct yahoo_packet *pack;
+	struct yahoo_data *yd = gc->proto_data;
 	PurpleAccount *account = purple_connection_get_account(gc);
 	const char *name = purple_normalize(account, purple_account_get_username(account));
-	const char *pass = purple_connection_get_password(gc);
-	struct yahoo_data *yd = gc->proto_data;
-
-	/* So, Yahoo has stopped supporting its older clients in India, and undoubtedly
-	 * will soon do so in the rest of the world.
-	 *
-	 * The new clients use this authentication method.  I warn you in advance, it's
-	 * bizarre, convoluted, inordinately complicated.  It's also no more secure than
-	 * crypt() was.  The only purpose this scheme could serve is to prevent third
-	 * party clients from connecting to their servers.
-	 *
-	 * Sorry, Yahoo.
-	 */
-
-	PurpleCipher *cipher;
-	PurpleCipherContext *context;
-	guchar digest[16];
-
-	char *crypt_result;
-	char password_hash[25];
-	char crypt_hash[25];
-	char *hash_string_p = g_malloc(50 + strlen(name));
-	char *hash_string_c = g_malloc(50 + strlen(name));
-
-	char checksum;
-
-	int sv;
-
-	char result6[25];
-	char result96[25];
-
-	sv = seed[15];
-	sv = sv % 8;
-
-	cipher = purple_ciphers_find_cipher("md5");
-	context = purple_cipher_context_new(cipher, NULL);
-
-	purple_cipher_context_append(context, (const guchar *)pass, strlen(pass));
-	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
-
-	to_y64(password_hash, digest, 16);
-
-	crypt_result = yahoo_crypt(pass, "$1$_2S43d5f$");
-
-	purple_cipher_context_reset(context, NULL);
-	purple_cipher_context_append(context, (const guchar *)crypt_result, strlen(crypt_result));
-	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
-	to_y64(crypt_hash, digest, 16);
-
-	switch (sv) {
-	case 1:
-	case 6:
-		checksum = seed[seed[9] % 16];
-		g_snprintf(hash_string_p, strlen(name) + 50,
-			   "%c%s%s%s", checksum, name, seed, password_hash);
-		g_snprintf(hash_string_c, strlen(name) + 50,
-			   "%c%s%s%s", checksum, name, seed, crypt_hash);
-		break;
-	case 2:
-	case 7:
-		checksum = seed[seed[15] % 16];
-		g_snprintf(hash_string_p, strlen(name) + 50,
-			   "%c%s%s%s", checksum, seed, password_hash, name);
-		g_snprintf(hash_string_c, strlen(name) + 50,
-			   "%c%s%s%s", checksum, seed, crypt_hash, name);
-		break;
-	case 3:
-		checksum = seed[seed[1] % 16];
-		g_snprintf(hash_string_p, strlen(name) + 50,
-			   "%c%s%s%s", checksum, name, password_hash, seed);
-		g_snprintf(hash_string_c, strlen(name) + 50,
-			   "%c%s%s%s", checksum, name, crypt_hash, seed);
-		break;
-	case 4:
-		checksum = seed[seed[3] % 16];
-		g_snprintf(hash_string_p, strlen(name) + 50,
-			   "%c%s%s%s", checksum, password_hash, seed, name);
-		g_snprintf(hash_string_c, strlen(name) + 50,
-			   "%c%s%s%s", checksum, crypt_hash, seed, name);
-		break;
-	case 0:
-	case 5:
-		checksum = seed[seed[7] % 16];
-			g_snprintf(hash_string_p, strlen(name) + 50,
-                                   "%c%s%s%s", checksum, password_hash, name, seed);
-                        g_snprintf(hash_string_c, strlen(name) + 50,
-				   "%c%s%s%s", checksum, crypt_hash, name, seed);
-			break;
-	}
-
-	purple_cipher_context_reset(context, NULL);
-	purple_cipher_context_append(context, (const guchar *)hash_string_p, strlen(hash_string_p));
-	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
-	to_y64(result6, digest, 16);
-
-	purple_cipher_context_reset(context, NULL);
-	purple_cipher_context_append(context, (const guchar *)hash_string_c, strlen(hash_string_c));
-	purple_cipher_context_digest(context, sizeof(digest), digest, NULL);
-	purple_cipher_context_destroy(context);
-	to_y64(result96, digest, 16);
-
-	pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP,	YAHOO_STATUS_AVAILABLE, 0);
-
-	if(yd->jp) {
-		yahoo_packet_hash(pack, "sssss",
-						  0, name,
-						  6, result6,
-						  96, result96,
-						  1, name,
-						  135, YAHOOJP_CLIENT_VERSION);
-	} else {
-		yahoo_packet_hash(pack, "ssssss",
-						  0, name,
-						  6, result6,
-						  96, result96,
-						  1, name,
-						  244, YAHOO_CLIENT_VERSION_ID,
-						  135, YAHOO_CLIENT_VERSION);
-	}
-
-	yahoo_packet_send_and_free(pack, yd);
-
-	g_free(hash_string_p);
-	g_free(hash_string_c);
-}
-
-/* I'm dishing out some uber-mad props to Cerulean Studios for cracking this
- * and sending the fix!  Thanks guys. */
-
-static void yahoo_process_auth_new(PurpleConnection *gc, const char *seed)
-{
-	struct yahoo_packet *pack = NULL;
-	PurpleAccount *account = purple_connection_get_account(gc);
-	const char *name = purple_normalize(account, purple_account_get_username(account));
-	const char *pass = purple_connection_get_password(gc);
-	char *enc_pass;
-	struct yahoo_data *yd = gc->proto_data;
-
-	PurpleCipher		*md5_cipher;
-	PurpleCipherContext	*md5_ctx;
-	guchar				md5_digest[16];
-
-	PurpleCipher		*sha1_cipher;
-	PurpleCipherContext	*sha1_ctx1;
-	PurpleCipherContext	*sha1_ctx2;
-
-	char				*alphabet1			= "FBZDWAGHrJTLMNOPpRSKUVEXYChImkwQ";
-	char				*alphabet2			= "F0E1D2C3B4A59687abcdefghijklmnop";
-
-	char				*challenge_lookup	= "qzec2tb3um1olpar8whx4dfgijknsvy5";
-	char				*operand_lookup		= "+|&%/*^-";
-	char				*delimit_lookup		= ",;";
-
-	char				*password_hash		= (char *)g_malloc(25);
-	char				*crypt_hash			= (char *)g_malloc(25);
-	char				*crypt_result		= NULL;
-
-	unsigned char		pass_hash_xor1[64];
-	unsigned char		pass_hash_xor2[64];
-	unsigned char		crypt_hash_xor1[64];
-	unsigned char		crypt_hash_xor2[64];
-	char				resp_6[100];
-	char				resp_96[100];
-
-	unsigned char		digest1[20];
-	unsigned char		digest2[20];
-	unsigned char		comparison_src[20];
-	unsigned char		magic_key_char[4];
-	const char			*magic_ptr;
-
-	unsigned int		magic[64];
-	unsigned int		magic_work = 0;
-	unsigned int		magic_4 = 0;
-
-	int					x;
-	int					y;
-	int					cnt = 0;
-	int					magic_cnt = 0;
-	int					magic_len;
-
-	memset(password_hash, 0, 25);
-	memset(crypt_hash, 0, 25);
-	memset(&pass_hash_xor1, 0, 64);
-	memset(&pass_hash_xor2, 0, 64);
-	memset(&crypt_hash_xor1, 0, 64);
-	memset(&crypt_hash_xor2, 0, 64);
-	memset(&digest1, 0, 20);
-	memset(&digest2, 0, 20);
-	memset(&magic, 0, 64);
-	memset(&resp_6, 0, 100);
-	memset(&resp_96, 0, 100);
-	memset(&magic_key_char, 0, 4);
-	memset(&comparison_src, 0, 20);
+	PurpleCipher *md5_cipher;
+	PurpleCipherContext *md5_ctx;
+	guchar md5_digest[16];
+	gchar base64_string[25];
+	struct yahoo_packet *pkt;
+
+	purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage3\n");
 
 	md5_cipher = purple_ciphers_find_cipher("md5");
 	md5_ctx = purple_cipher_context_new(md5_cipher, NULL);
-
-	sha1_cipher = purple_ciphers_find_cipher("sha1");
-	sha1_ctx1 = purple_cipher_context_new(sha1_cipher, NULL);
-	sha1_ctx2 = purple_cipher_context_new(sha1_cipher, NULL);
-
-	/*
-	 * Magic: Phase 1.  Generate what seems to be a 30 byte value (could change if base64
-	 * ends up differently?  I don't remember and I'm tired, so use a 64 byte buffer.
-	 */
-
-	magic_ptr = seed;
-
-	while (*magic_ptr != '\0') {
-		char   *loc;
-
-		/* Ignore parentheses. */
-
-		if (*magic_ptr == '(' || *magic_ptr == ')') {
-			magic_ptr++;
-			continue;
+	purple_cipher_context_append(md5_ctx, (guchar *)crypt, strlen(crypt));
+	purple_cipher_context_digest(md5_ctx, sizeof(md5_digest), md5_digest, NULL);
+
+	to_y64(base64_string, md5_digest, 16);
+
+	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->jp) {
+		yahoo_packet_hash(pkt, "ssssssss",
+					1, name,
+					0, name,
+					277, yd->cookie_y,
+					278, yd->cookie_t,
+					307, base64_string,
+					2, name,
+					2, "1",
+					135, YAHOOJP_CLIENT_VERSION);
+	} else	{
+		yahoo_packet_hash(pkt, "sssssssss",
+					1, name,
+					0, name,
+					277, yd->cookie_y,
+					278, yd->cookie_t,
+					307, base64_string,
+					244, YAHOO_CLIENT_VERSION_ID,
+					2, name,
+					2, "1",
+					135, YAHOO_CLIENT_VERSION);
+	}
+	if (yd->picture_checksum)
+		yahoo_packet_hash_int(pkt, 192, yd->picture_checksum);
+	yahoo_packet_send_and_free(pkt, yd);
+
+	purple_cipher_context_destroy(md5_ctx);
+}
+
+static void yahoo_auth16_stage2(PurpleUtilFetchUrlData *unused, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message)
+{
+	struct yahoo_auth_data *auth_data = user_data;
+	PurpleConnection *gc = auth_data->gc;
+	struct yahoo_data *yd;
+	gboolean try_login_on_error = FALSE;
+
+	purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage2\n");
+
+	if (!PURPLE_CONNECTION_IS_VALID(gc)) {
+		g_free(auth_data->seed);
+		g_free(auth_data);
+		g_return_if_reached();
+	}
+
+	yd = (struct yahoo_data *)gc->proto_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);
+		g_free(auth_data->seed);
+		g_free(auth_data);
+		return;
+	}
+	else if (len > 0 && ret_data && *ret_data) {
+		gchar **split_data = g_strsplit(ret_data, "\r\n", -1);
+		int totalelements = 0;
+		int response_no = -1;
+		char *crumb = NULL;
+		char *crypt = NULL;
+
+#if GLIB_CHECK_VERSION(2,6,0)
+		totalelements = g_strv_length(split_data);
+#else
+		while (split_data[++totalelements] != NULL);	
+#endif
+		if (totalelements >= 5) {
+			response_no = strtol(split_data[1], NULL, 10);
+			crumb = g_strdup(split_data[2] + strlen("crumb="));
+			yd->cookie_y = g_strdup(split_data[3] + strlen("Y="));
+			yd->cookie_t = g_strdup(split_data[4] + strlen("T="));
 		}
 
-		/* Characters and digits verify against the challenge lookup. */
-
-		if (isalpha(*magic_ptr) || isdigit(*magic_ptr)) {
-			loc = strchr(challenge_lookup, *magic_ptr);
-			if (!loc) {
-			  /* SME XXX Error - disconnect here */
-			}
-
-			/* Get offset into lookup table and shl 3. */
-
-			magic_work = loc - challenge_lookup;
-			magic_work <<= 3;
-
-			magic_ptr++;
-			continue;
-		} else {
-			unsigned int	local_store;
-
-			loc = strchr(operand_lookup, *magic_ptr);
-			if (!loc) {
-				/* SME XXX Disconnect */
-			}
-
-			local_store = loc - operand_lookup;
-
-			/* Oops; how did this happen? */
-
-			if (magic_cnt >= 64)
-				break;
-
-			magic[magic_cnt++] = magic_work | local_store;
-			magic_ptr++;
-			continue;
-		}
+		g_strfreev(split_data);
+
+		if(response_no != 0) {
+			/* Some error in the login process */
+			PurpleConnectionError error;
+			char *error_reason = NULL;
+
+			switch(response_no) {
+				case -1:
+					/* Some error in the received stream */
+					error_reason = g_strdup(_("Received invalid data"));
+					error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+					break;
+				case 100:
+					/* Unknown error */
+					error_reason = g_strdup(_("Unknown error"));
+					error = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+					break;
+				default:
+					/* if we have everything we need, why not try to login irrespective of response */
+					if((crumb != NULL) && (yd->cookie_y != NULL) && (yd->cookie_t != NULL)) {
+						try_login_on_error = TRUE;
+						break;
+					}
+					error_reason = g_strdup(_("Unknown error"));
+					error = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+					break;
 			}
-
-	magic_len = magic_cnt;
-	magic_cnt = 0;
-
-	/* Magic: Phase 2.  Take generated magic value and sprinkle fairy
-	 * dust on the values.
-	 */
-
-	for (magic_cnt = magic_len - 2; magic_cnt >= 0; magic_cnt--) {
-		unsigned char	byte1;
-		unsigned char	byte2;
-
-		/* Bad.  Abort. */
-
-		if ((magic_cnt + 1 > magic_len) || (magic_cnt > magic_len))
-			break;
-
-		byte1 = magic[magic_cnt];
-		byte2 = magic[magic_cnt+1];
-
-		byte1 *= 0xcd;
-		byte1 ^= byte2;
-
-		magic[magic_cnt+1] = byte1;
-	}
-
-	/*
-	 * Magic: Phase 3.  This computes 20 bytes.  The first 4 bytes are used as our magic
-	 * key (and may be changed later); the next 16 bytes are an MD5 sum of the magic key
-	 * plus 3 bytes.  The 3 bytes are found by looping, and they represent the offsets
-	 * into particular functions we'll later call to potentially alter the magic key.
-	 *
-	 * %-)
-	 */
-
-	magic_cnt = 1;
-	x = 0;
-
-	do {
-		unsigned int bl = 0;
-		unsigned int cl = magic[magic_cnt++];
-
-		if (magic_cnt >= magic_len)
-			break;
-
-		if (cl > 0x7F) {
-			if (cl < 0xe0)
-				bl = cl = (cl & 0x1f) << 6;
-			else {
-				bl = magic[magic_cnt++];
-				cl = (cl & 0x0f) << 6;
-				bl = ((bl & 0x3f) + cl) << 6;
-			}
-
-			cl = magic[magic_cnt++];
-			bl = (cl & 0x3f) + bl;
-		} else
-			bl = cl;
-
-		comparison_src[x++] = (bl & 0xff00) >> 8;
-		comparison_src[x++] = bl & 0xff;
-	} while (x < 20);
-
-	/* First four bytes are magic key. */
-	memcpy(&magic_key_char[0], comparison_src, 4);
-	magic_4 = magic_key_char[0] | (magic_key_char[1] << 8) |
-			(magic_key_char[2] << 16) | (magic_key_char[3] << 24);
-
-	/*
-	 * Magic: Phase 4.  Determine what function to use later by getting outside/inside
-	 * loop values until we match our previous buffer.
-	 */
-	for (x = 0; x < 65535; x++) {
-		int leave = 0;
-
-		for (y = 0; y < 5; y++) {
-			unsigned char test[3];
-
-			/* Calculate buffer. */
-			test[0] = x;
-			test[1] = x >> 8;
-			test[2] = y;
-
-			purple_cipher_context_reset(md5_ctx, NULL);
-			purple_cipher_context_append(md5_ctx, magic_key_char, 4);
-			purple_cipher_context_append(md5_ctx, test, 3);
-			purple_cipher_context_digest(md5_ctx, sizeof(md5_digest),
-									   md5_digest, NULL);
-
-			if (!memcmp(md5_digest, comparison_src+4, 16)) {
-				leave = 1;
-				break;
+			if(error_reason) {
+				purple_debug_error("yahoo", "Authentication error: %s\n",
+				                   error_reason);
+				purple_connection_error_reason(gc, error, error_reason);
+				g_free(error_reason);
+				g_free(auth_data->seed);
+				g_free(auth_data);
+				return;
 			}
 		}
 
-		if (leave == 1)
-			break;
-	}
-
-	/* If y != 0, we need some help. */
-	if (y != 0) {
-		unsigned int	updated_key;
-
-		/* Update magic stuff.
-		 * Call it twice because Yahoo's encryption is super bad ass.
-		 */
-		updated_key = yahoo_auth_finalCountdown(magic_4, 0x60, y, x);
-		updated_key = yahoo_auth_finalCountdown(updated_key, 0x60, y, x);
-
-		magic_key_char[0] = updated_key & 0xff;
-		magic_key_char[1] = (updated_key >> 8) & 0xff;
-		magic_key_char[2] = (updated_key >> 16) & 0xff;
-		magic_key_char[3] = (updated_key >> 24) & 0xff;
+		crypt = g_strconcat(crumb, auth_data->seed, NULL);
+		yahoo_auth16_stage3(gc, crypt);
+		g_free(crypt);
+		g_free(crumb);
 	}
-
-	enc_pass = yahoo_string_encode(gc, pass, NULL);
-
-	/* Get password and crypt hashes as per usual. */
-	purple_cipher_context_reset(md5_ctx, NULL);
-	purple_cipher_context_append(md5_ctx, (const guchar *)enc_pass, strlen(enc_pass));
-	purple_cipher_context_digest(md5_ctx, sizeof(md5_digest),
-							   md5_digest, NULL);
-	to_y64(password_hash, md5_digest, 16);
-
-	crypt_result = yahoo_crypt(enc_pass, "$1$_2S43d5f$");
-
-	g_free(enc_pass);
-	enc_pass = NULL;
-
-	purple_cipher_context_reset(md5_ctx, NULL);
-	purple_cipher_context_append(md5_ctx, (const guchar *)crypt_result, strlen(crypt_result));
-	purple_cipher_context_digest(md5_ctx, sizeof(md5_digest),
-							   md5_digest, NULL);
-	to_y64(crypt_hash, md5_digest, 16);
-
-	/* Our first authentication response is based off of the password hash. */
-	for (x = 0; x < (int)strlen(password_hash); x++)
-		pass_hash_xor1[cnt++] = password_hash[x] ^ 0x36;
-
-	if (cnt < 64)
-		memset(&(pass_hash_xor1[cnt]), 0x36, 64-cnt);
-
-	cnt = 0;
-
-	for (x = 0; x < (int)strlen(password_hash); x++)
-		pass_hash_xor2[cnt++] = password_hash[x] ^ 0x5c;
-
-	if (cnt < 64)
-		memset(&(pass_hash_xor2[cnt]), 0x5c, 64-cnt);
-
-	/*
-	 * The first context gets the password hash XORed with 0x36 plus a magic value
-	 * which we previously extrapolated from our challenge.
-	 */
-
-	purple_cipher_context_append(sha1_ctx1, pass_hash_xor1, 64);
-	if (y >= 3)
-		purple_cipher_context_set_option(sha1_ctx1, "sizeLo", GINT_TO_POINTER(0x1ff));
-	purple_cipher_context_append(sha1_ctx1, magic_key_char, 4);
-	purple_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL);
-
-	/*
-	 * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest
-	 * of the first context.
-	 */
-
-	purple_cipher_context_append(sha1_ctx2, pass_hash_xor2, 64);
-	purple_cipher_context_append(sha1_ctx2, digest1, 20);
-	purple_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL);
-
-	/*
-	 * Now that we have digest2, use it to fetch characters from an alphabet to construct
-	 * our first authentication response.
-	 */
-
-	for (x = 0; x < 20; x += 2) {
-		unsigned int	val = 0;
-		unsigned int	lookup = 0;
-
-		char			byte[6];
-
-		memset(&byte, 0, 6);
-
-		/* First two bytes of digest stuffed together. */
-
-		val = digest2[x];
-		val <<= 8;
-		val += digest2[x+1];
-
-		lookup = (val >> 0x0b);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet1))
-			break;
-		sprintf(byte, "%c", alphabet1[lookup]);
-		strcat(resp_6, byte);
-		strcat(resp_6, "=");
-
-		lookup = (val >> 0x06);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet2))
-			break;
-		sprintf(byte, "%c", alphabet2[lookup]);
-		strcat(resp_6, byte);
-
-		lookup = (val >> 0x01);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet2))
-			break;
-		sprintf(byte, "%c", alphabet2[lookup]);
-		strcat(resp_6, byte);
-
-		lookup = (val & 0x01);
-		if (lookup >= strlen(delimit_lookup))
-			break;
-		sprintf(byte, "%c", delimit_lookup[lookup]);
-		strcat(resp_6, byte);
+	g_free(auth_data->seed);
+	g_free(auth_data);
+}
+
+static void yahoo_auth16_stage1_cb(PurpleUtilFetchUrlData *unused, gpointer user_data, const gchar *ret_data, size_t len, const gchar *error_message)
+{
+	struct yahoo_auth_data *auth_data = user_data;
+	PurpleConnection *gc = auth_data->gc;
+
+	purple_debug_info("yahoo","Authentication: In yahoo_auth16_stage1_cb\n");
+
+	if (!PURPLE_CONNECTION_IS_VALID(gc)) {
+		g_free(auth_data->seed);
+		g_free(auth_data);
+		g_return_if_reached();
+	}
+
+	if (error_message != NULL) {
+		purple_debug_error("yahoo", "Login Failed, unable to retrieve login url: %s\n", error_message);
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NETWORK_ERROR, error_message);
+		g_free(auth_data->seed);
+		g_free(auth_data);
+		return;
 	}
-
-	/* Our second authentication response is based off of the crypto hash. */
-
-	cnt = 0;
-	memset(&digest1, 0, 20);
-	memset(&digest2, 0, 20);
-
-	for (x = 0; x < (int)strlen(crypt_hash); x++)
-		crypt_hash_xor1[cnt++] = crypt_hash[x] ^ 0x36;
-
-	if (cnt < 64)
-		memset(&(crypt_hash_xor1[cnt]), 0x36, 64-cnt);
-
-	cnt = 0;
-
-	for (x = 0; x < (int)strlen(crypt_hash); x++)
-		crypt_hash_xor2[cnt++] = crypt_hash[x] ^ 0x5c;
-
-	if (cnt < 64)
-		memset(&(crypt_hash_xor2[cnt]), 0x5c, 64-cnt);
-
-	purple_cipher_context_reset(sha1_ctx1, NULL);
-	purple_cipher_context_reset(sha1_ctx2, NULL);
-
-	/*
-	 * The first context gets the password hash XORed with 0x36 plus a magic value
-	 * which we previously extrapolated from our challenge.
-	 */
-
-	purple_cipher_context_append(sha1_ctx1, crypt_hash_xor1, 64);
-	if (y >= 3) {
-		purple_cipher_context_set_option(sha1_ctx1, "sizeLo",
-									   GINT_TO_POINTER(0x1ff));
+	else if (len > 0 && ret_data && *ret_data) {
+		gchar **split_data = g_strsplit(ret_data, "\r\n", -1);
+		int totalelements = 0;
+		int response_no = -1;
+		char *token = NULL;
+
+#if GLIB_CHECK_VERSION(2,6,0)
+		totalelements = g_strv_length(split_data);
+#else
+		while (split_data[++totalelements] != NULL);	
+#endif
+		if(totalelements >= 5) {
+			response_no = strtol(split_data[1], NULL, 10);
+			token = g_strdup(split_data[2] + strlen("ymsgr="));
+		}
+
+		g_strfreev(split_data);
+
+		if(response_no != 0) {
+			/* Some error in the login process */
+			PurpleConnectionError error;
+			char *error_reason;
+
+			switch(response_no) {
+				case -1:
+					/* Some error in the received stream */
+					error_reason = g_strdup(_("Received invalid data"));
+					error = PURPLE_CONNECTION_ERROR_NETWORK_ERROR;
+					break;
+				case 1212:
+					/* Password incorrect */
+					error_reason = g_strdup(_("Incorrect Password"));
+					error = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+					break;
+				case 1213:
+					/* security lock from too many failed login attempts */
+					error_reason = g_strdup(_("Account locked: Too many failed login attempts.\nLogging into the Yahoo! website may fix this."));
+					error = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+					break;
+				case 1235:
+					/* the username does not exist */
+					error_reason = g_strdup(_("Username does not exist"));
+					error = PURPLE_CONNECTION_ERROR_INVALID_USERNAME;
+					break;
+				case 1214:
+				case 1236:
+					/* indicates a lock of some description */
+					error_reason = g_strdup(_("Account locked: Unknown reason.\nLogging into the Yahoo! website may fix this."));
+					error = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+					break;
+				case 100:
+					/* username or password missing */
+					error_reason = g_strdup(_("Username or password missing"));
+					error = PURPLE_CONNECTION_ERROR_AUTHENTICATION_FAILED;
+					break;
+				default:
+					/* Unknown error! */
+					error_reason = g_strdup(_("Unknown error"));
+					error = PURPLE_CONNECTION_ERROR_OTHER_ERROR;
+					break;
+			}
+			purple_debug_error("yahoo", "Authentication error: %s\n",
+			                   error_reason);
+			purple_connection_error_reason(gc, error, error_reason);
+			g_free(error_reason);
+			g_free(auth_data->seed);
+			g_free(auth_data);
+		}
+		else {
+			/* OK to login, correct information provided */
+			PurpleUtilFetchUrlData *url_data = NULL;
+			char *url = NULL;
+			gboolean yahoojp = purple_account_get_bool(purple_connection_get_account(gc),
+				"yahoojp", 0);
+
+			url = g_strdup_printf(yahoojp ? YAHOOJP_LOGIN_URL : YAHOO_LOGIN_URL, token);
+			url_data = purple_util_fetch_url_request_len_with_account(
+					purple_connection_get_account(gc), url, TRUE,
+					YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, -1,
+					yahoo_auth16_stage2, auth_data);
+			g_free(url);
+			g_free(token);
+		}
 	}
-	purple_cipher_context_append(sha1_ctx1, magic_key_char, 4);
-	purple_cipher_context_digest(sha1_ctx1, sizeof(digest1), digest1, NULL);
-
-	/*
-	 * The second context gets the password hash XORed with 0x5c plus the SHA-1 digest
-	 * of the first context.
-	 */
-
-	purple_cipher_context_append(sha1_ctx2, crypt_hash_xor2, 64);
-	purple_cipher_context_append(sha1_ctx2, digest1, 20);
-	purple_cipher_context_digest(sha1_ctx2, sizeof(digest2), digest2, NULL);
-
-	/*
-	 * Now that we have digest2, use it to fetch characters from an alphabet to construct
-	 * our first authentication response.
-	 */
-
-	for (x = 0; x < 20; x += 2) {
-		unsigned int	val = 0;
-		unsigned int	lookup = 0;
-
-		char			byte[6];
-
-		memset(&byte, 0, 6);
-
-		/* First two bytes of digest stuffed together. */
-
-		val = digest2[x];
-		val <<= 8;
-		val += digest2[x+1];
-
-		lookup = (val >> 0x0b);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet1))
-			break;
-		sprintf(byte, "%c", alphabet1[lookup]);
-		strcat(resp_96, byte);
-		strcat(resp_96, "=");
-
-		lookup = (val >> 0x06);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet2))
-			break;
-		sprintf(byte, "%c", alphabet2[lookup]);
-		strcat(resp_96, byte);
-
-		lookup = (val >> 0x01);
-		lookup &= 0x1f;
-		if (lookup >= strlen(alphabet2))
-			break;
-		sprintf(byte, "%c", alphabet2[lookup]);
-		strcat(resp_96, byte);
-
-		lookup = (val & 0x01);
-		if (lookup >= strlen(delimit_lookup))
-			break;
-		sprintf(byte, "%c", delimit_lookup[lookup]);
-		strcat(resp_96, byte);
+}
+
+static void yahoo_auth16_stage1(PurpleConnection *gc, const char *seed)
+{
+	PurpleUtilFetchUrlData *url_data = NULL;
+	struct yahoo_auth_data *auth_data = NULL;
+	char *url = NULL;
+	char *encoded_username;
+	char *encoded_password;
+	gboolean yahoojp;
+
+	purple_debug_info("yahoo", "Authentication: In yahoo_auth16_stage1\n");
+
+	if(!purple_ssl_is_supported()) {
+		purple_connection_error_reason(gc, PURPLE_CONNECTION_ERROR_NO_SSL_SUPPORT, _("SSL support unavailable"));
+		return;
 	}
-	purple_debug_info("yahoo", "yahoo status: %d\n", yd->current_status);
-	pack = yahoo_packet_new(YAHOO_SERVICE_AUTHRESP,	yd->current_status, 0);
-
-	if(yd->jp) {
-		yahoo_packet_hash(pack, "sssss",
-						  0, name,
-						  6, resp_6,
-						  96, resp_96,
-						  1, name,
-						  135, YAHOOJP_CLIENT_VERSION);
-	} else {
-		yahoo_packet_hash(pack, "ssssss",
-						  0, name,
-						  6, resp_6,
-						  96, resp_96,
-						  1, name,
-						  244, YAHOO_CLIENT_VERSION_ID,
-						  135, YAHOO_CLIENT_VERSION);
-	}
-
-	if (yd->picture_checksum)
-		yahoo_packet_hash_int(pack, 192, yd->picture_checksum);
-
-	yahoo_packet_send_and_free(pack, yd);
-
-	purple_cipher_context_destroy(md5_ctx);
-	purple_cipher_context_destroy(sha1_ctx1);
-	purple_cipher_context_destroy(sha1_ctx2);
-
-	g_free(password_hash);
-	g_free(crypt_hash);
+
+	yahoojp =  purple_account_get_bool(purple_connection_get_account(gc),
+			"yahoojp", 0);
+	auth_data = g_new0(struct yahoo_auth_data, 1);
+	auth_data->gc = gc;
+	auth_data->seed = g_strdup(seed);
+
+	encoded_username = g_strdup(purple_url_encode(purple_account_get_username(purple_connection_get_account(gc))));
+	encoded_password = g_strdup(purple_url_encode(purple_connection_get_password(gc)));
+	url = g_strdup_printf(yahoojp ? YAHOOJP_TOKEN_URL : YAHOO_TOKEN_URL,
+			encoded_username, encoded_password, purple_url_encode(seed));
+	g_free(encoded_password);
+	g_free(encoded_username);
+
+	url_data = purple_util_fetch_url_request_len_with_account(
+			purple_connection_get_account(gc), url, TRUE,
+			YAHOO_CLIENT_USERAGENT, TRUE, NULL, FALSE, -1,
+			yahoo_auth16_stage1_cb, auth_data);
+
+	g_free(url);
 }
 
 static void yahoo_process_auth(PurpleConnection *gc, struct yahoo_packet *pkt)
@@ -2181,11 +1905,10 @@
 	if (seed) {
 		switch (m) {
 		case 0:
-			yahoo_process_auth_old(gc, seed);
-			break;
+			/* used to be for really old auth routine, dont support now */
 		case 1:
-		case 2: /* This case seems to work, could probably use testing */
-			yahoo_process_auth_new(gc, seed);
+		case 2: /* Yahoo ver 16 authentication */
+			yahoo_auth16_stage1(gc, seed);
 			break;
 		default:
 			{
@@ -2198,7 +1921,7 @@
 				purple_notify_error(gc, "", _("Failed Yahoo! Authentication"),
 							buf);
 				g_free(buf);
-				yahoo_process_auth_new(gc, seed); /* Can't hurt to try it anyway. */
+				yahoo_auth16_stage1(gc, seed); /* Can't hurt to try it anyway. */
 				break;
 			}
 		}
@@ -2304,7 +2027,7 @@
 {
 #ifdef TRY_WEBMESSENGER_LOGIN
 	struct yahoo_data *yd = gc->proto_data;
-#endif
+#endif /* TRY_WEBMESSENGER_LOGIN */
 	GSList *l = pkt->hash;
 	int err = 0;
 	char *msg;
@@ -2348,7 +2071,7 @@
 				yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
 			return;
 		}
-#endif
+#endif /* TRY_WEBMESSENGER_LOGIN */
 		if (!purple_account_get_remember_password(account))
 			purple_account_set_password(account, NULL);
 
@@ -2414,7 +2137,7 @@
 		return;
 	if (!group)
 		group = "";
-	
+
 	if(msn)
 		who = g_strconcat("msn/", temp, NULL);
 	else
@@ -2426,10 +2149,10 @@
 		if(protocol)
 			f->protocol = protocol;
 
-		if( !g_hash_table_lookup(yd->peers, who) )	{
+		if( !g_hash_table_lookup(yd->peers, who) ) {
 			/* we are not connected as client, so set friend to not connected */
 			if(msn)
-				yahoo_friend_set_p2p_status(f,YAHOO_P2PSTATUS_DO_NOT_CONNECT);
+				yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_DO_NOT_CONNECT);
 			else	{
 				yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_NOT_CONNECTED);
 				f->p2p_packet_sent = 0;
@@ -2455,7 +2178,7 @@
 {
 	size_t pkt_len;
 	guchar *raw_packet;
-	
+
 	/*build the raw packet and send it to the host*/
 	pkt_len = yahoo_packet_build(pkt, 0, 0, 0, &raw_packet);
 	if(write(source, raw_packet, pkt_len) != pkt_len)
@@ -2565,7 +2288,7 @@
 	 * WHEN WE ARE SERVER: we send val_13 = 0 to yahoo server, peer sends us val_13 = 1, we send val_13 = 5,
 	 * receive val_13 = 6, send val_13 = 7, receive val_13 = 7. HALT. Keep sending val_13 = 7 as keep alive. */
 
-	switch(p2p_data->val_13)	{
+	switch(p2p_data->val_13) {
 		case 1 : val_13_to_send = 5; break;
 		case 5 : val_13_to_send = 6; break;
 		case 6 : val_13_to_send = 7; break;
@@ -2590,12 +2313,12 @@
 	yahoo_packet_free(pkt_to_send);
 
 	if( val_13_to_send == 7 )
-		if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) )	{
+		if( !g_hash_table_lookup(yd->peers, p2p_data->host_username) ) {
 			g_hash_table_insert(yd->peers, g_strdup(p2p_data->host_username), p2p_data);
 			/* If the peer is a friend, set him connected */
 			f = yahoo_friend_find(p2p_data->gc, p2p_data->host_username);
-			if (f)	{
-				if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER)	{
+			if (f) {
+				if(p2p_data->connection_type == YAHOO_P2P_WE_ARE_SERVER) {
 					p2p_data->session_id = f->session_id;
 					yahoo_friend_set_p2p_status(f, YAHOO_P2PSTATUS_WE_ARE_SERVER);
 				}
@@ -2634,7 +2357,7 @@
 			yahoo_p2p_disconnect_destroy_data(data);
 		return;
 	}
-	
+
 	if(len < YAHOO_PACKET_HDRLEN)
 		return;
 
@@ -2643,13 +2366,11 @@
 		purple_debug_warning("yahoo","p2p: Got something other than YMSG packet\n");
 
 		start = memchr(buf + 1, 'Y', len - 1);
-		if(start) {
-			g_memmove(buf, start, len - (start - buf));
-			len -= start - buf;
-		} else {
-			g_free(buf);
+		if (start == NULL)
 			return;
-		}
+
+		g_memmove(buf, start, len - (start - buf));
+		len -= start - buf;
 	}
 
 	pos += 4;	/* YMSG */
@@ -2668,7 +2389,7 @@
 	yahoo_packet_read(pkt, buf + pos, pktlen);
 
 	/* packet processing */
-	switch(pkt->service)	{
+	switch(pkt->service) {
 		case YAHOO_SERVICE_P2PFILEXFER:
 			yahoo_p2p_process_p2pfilexfer(data, source, pkt);
 			break;
@@ -2754,7 +2475,7 @@
 	if(!(p2p_data = data))
 		return ;
 
-	if(listenfd == -1)	{
+	if(listenfd == -1) {
 		purple_debug_warning("yahoo","p2p: error starting p2p server\n");
 		yahoo_p2p_disconnect_destroy_data(data);
 		return;
@@ -2774,7 +2495,7 @@
 void yahoo_send_p2p_pkt(PurpleConnection *gc, const char *who, int val_13)
 {
 	const char *public_ip;
-	guint32 temp[4];	
+	guint32 temp[4];
 	guint32 ip;
 	char temp_str[100];
 	gchar *base64_ip = NULL;
@@ -2795,7 +2516,7 @@
 	if( strcmp(purple_normalize(account, purple_account_get_username(account)), who) == 0)
 		return;
 
-	/* send packet to only those friends who arent p2p connected and to whom we havent already sent. Do not send if this condition doesn't hold good */ 
+	/* send packet to only those friends who arent p2p connected and to whom we havent already sent. Do not send if this condition doesn't hold good */
 	if( !( f && (yahoo_friend_get_p2p_status(f) == YAHOO_P2PSTATUS_NOT_CONNECTED) && (f->p2p_packet_sent == 0)) )
 		return;
 
@@ -2855,10 +2576,10 @@
 		return ;
 	yd = p2p_data->gc->proto_data;
 
-	if(error_message != NULL)	{
+	if(error_message != NULL) {
 		purple_debug_warning("yahoo","p2p: %s\n",error_message);
 		yahoo_send_p2p_pkt(p2p_data->gc, p2p_data->host_username, 2);/* send p2p init packet with val_13=2 */
-		
+
 		yahoo_p2p_disconnect_destroy_data(p2p_data);
 		return;
 	}
@@ -2962,7 +2683,7 @@
 
 		account = purple_connection_get_account(gc);
 
-		if(val_11==0)	{
+		if(val_11==0) {
 			if(!f)
 				return;
 			else
@@ -2979,7 +2700,7 @@
 		p2p_data->source = -1;
 
 		/* connect to host */
-		if((purple_proxy_connect(NULL, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL)	{
+		if((purple_proxy_connect(gc, account, host_ip, YAHOO_PAGER_PORT_P2P, yahoo_p2p_init_cb, p2p_data))==NULL) {
 			purple_debug_info("yahoo","p2p: Connection to %s failed\n", host_ip);
 			g_free(p2p_data->host_ip);
 			g_free(p2p_data->host_username);
@@ -3297,11 +3018,6 @@
 	struct yahoo_data *yd;
 	struct yahoo_packet *pkt;
 
-	if (!PURPLE_CONNECTION_IS_VALID(gc)) {
-		close(source);
-		return;
-	}
-
 	if (source < 0) {
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
@@ -3329,11 +3045,6 @@
 	struct yahoo_data *yd;
 	struct yahoo_packet *pkt;
 
-	if (!PURPLE_CONNECTION_IS_VALID(gc)) {
-		close(source);
-		return;
-	}
-
 	if (source < 0) {
 		gchar *tmp;
 		tmp = g_strdup_printf(_("Could not establish a connection with the server:\n%s"),
@@ -3411,7 +3122,7 @@
 		i += strlen("Set-Cookie: ");
 		for (;*i != ';' && *i != '\0'; i++)
 			g_string_append_c(s, *i);
-        
+
 		g_string_append(s, "; ");
 		/* Should these cookies be included too when trying for xfer?
 		 * It seems to work without these
@@ -3623,7 +3334,7 @@
 
 	purple_cipher_context_destroy(context);
 }
-#endif
+#endif /* TRY_WEBMESSENGER_LOGIN */
 
 static void yahoo_server_check(PurpleAccount *account)
 {
@@ -3631,7 +3342,8 @@
 
 	server = purple_account_get_string(account, "server", YAHOO_PAGER_HOST);
 
-	if (strcmp(server, "scs.yahoo.com") == 0)
+	if (*server == '\0' || g_str_equal(server, "scs.yahoo.com") ||
+			g_str_equal(server, "scs.msg.yahoo.com"))
 		purple_account_set_string(account, "server", YAHOO_PAGER_HOST);
 }
 
@@ -4230,7 +3942,7 @@
 	struct yahoo_data *yd = gc->proto_data;
 
 	g_return_if_fail(PURPLE_CONNECTION_IS_VALID(gc));
-	
+
 	yd->url_datas = g_slist_remove(yd->url_datas, url_data);
 
 	if (error_message != NULL)
@@ -4272,14 +3984,15 @@
 	gchar *request = g_strdup_printf(
 		"POST %s/config/cookie_token HTTP/1.0\r\n"
 		"Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s;\r\n"
-		"User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+		"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
 		"Host: login.yahoo.com\r\n"
 		"Content-Length: 0\r\n\r\n",
 		use_whole_url ? base_url : "",
 		yd->cookie_t, yd->cookie_y);
 
-	url_data = purple_util_fetch_url_request(base_url, use_whole_url,
-			"Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, request, FALSE,
+	url_data = purple_util_fetch_url_request_len_with_account(
+			purple_connection_get_account(gc), base_url, use_whole_url,
+			YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1,
 			yahoo_get_inbox_token_cb, gc);
 
 	g_free(request);
@@ -4358,7 +4071,7 @@
 	PurpleAccount *account = purple_connection_get_account(gc);
 	PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account);
 
-	if (error_message != NULL)	{
+	if (error_message != NULL) {
 		purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL));
 
 		g_free(sms_cb_data->who);
@@ -4370,7 +4083,7 @@
 		xmlnode *validate_data_root = xmlnode_from_str(webdata, -1);
 		xmlnode *validate_data_child = xmlnode_get_child(validate_data_root, "mobile_no");
 		mobile_no = (char *)xmlnode_get_attrib(validate_data_child, "msisdn");
-		
+
 		validate_data_root = xmlnode_copy(validate_data_child);
 		validate_data_child = xmlnode_get_child(validate_data_root, "status");
 		status = xmlnode_get_data(validate_data_child);
@@ -4380,7 +4093,7 @@
 
 		purple_debug_info("yahoo","SMS validate data: Mobile:%s, Status:%s, Carrier:%s\n", mobile_no, status, carrier);
 
-		if( strcmp(status, "Valid") == 0)	{
+		if( strcmp(status, "Valid") == 0) {
 			g_hash_table_insert(yd->sms_carrier, g_strdup_printf("+%s", mobile_no), g_strdup(carrier));
 			yahoo_send_im(sms_cb_data->gc, sms_cb_data->who, sms_cb_data->what, PURPLE_MESSAGE_SEND);
 		}
@@ -4430,7 +4143,7 @@
 	request = g_strdup_printf(
 		"POST /mobileno?intl=us&version=%s HTTP/1.1\r\n"
 		"Cookie: T=%s; path=/; domain=.yahoo.com; Y=%s; path=/; domain=.yahoo.com;\r\n"
-		"User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+		"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
 		"Host: validate.msg.yahoo.com\r\n"
 		"Content-Length: %" G_GSIZE_FORMAT "\r\n"
 		"Cache-Control: no-cache\r\n\r\n%s",
@@ -4440,14 +4153,15 @@
 	if ((gc->account->proxy_info) && (gc->account->proxy_info->type == PURPLE_PROXY_HTTP))
 	    use_whole_url = TRUE;
 
-	url_data = purple_util_fetch_url_request(YAHOO_SMS_CARRIER_URL, use_whole_url,
-			"Mozilla/4.0 (compatible; MSIE 5.5)", TRUE, request, FALSE,
+	url_data = purple_util_fetch_url_request_len_with_account(
+			purple_connection_get_account(gc), YAHOO_SMS_CARRIER_URL, use_whole_url,
+			YAHOO_CLIENT_USERAGENT, TRUE, request, FALSE, -1,
 			yahoo_get_sms_carrier_cb, data);
 
 	g_free(request);
 	g_free(validate_request_str);
 
-	if (!url_data)	{
+	if (!url_data) {
 		PurpleAccount *account = purple_connection_get_account(gc);
 		PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, sms_cb_data->who, account);
 		purple_conversation_write(conv, NULL, "Cant send SMS, Unable to obtain mobile carrier", PURPLE_MESSAGE_SYSTEM, time(NULL));
@@ -4472,7 +4186,7 @@
 	struct yahoo_p2p_data *p2p_data;
 	gboolean msn = FALSE;
 	msg2 = yahoo_string_encode(gc, msg, &utf8);
-	
+
 	if(msg2) {
 		lenb = strlen(msg2);
 		lenc = g_utf8_strlen(msg2, -1);
@@ -4490,7 +4204,7 @@
 
 	msn = g_str_has_prefix(who, "msn/") || g_str_has_prefix(who, "MSN/");
 
-	if( strncmp(who, "+", 1) == 0 )	{
+	if( strncmp(who, "+", 1) == 0 ) {
 		/* we have an sms to be sent */
 		gchar *carrier = NULL;
 		const char *alias = NULL;
@@ -4498,17 +4212,15 @@
 		PurpleConversation *conv = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, account);
 
 		carrier = g_hash_table_lookup(yd->sms_carrier, who);
-		if (!carrier)	{
+		if (!carrier) {
 			struct yahoo_sms_carrier_cb_data *sms_cb_data;
 			sms_cb_data = g_malloc(sizeof(struct yahoo_sms_carrier_cb_data));
 			sms_cb_data->gc = gc;
-			sms_cb_data->who = g_malloc(strlen(who));
-			sms_cb_data->what = g_malloc(strlen(what));
-			strcpy(sms_cb_data->who, who);
-			strcpy(sms_cb_data->what, what);
+			sms_cb_data->who = g_strdup(who);
+			sms_cb_data->what = g_strdup(what);
 
 			purple_conversation_write(conv, NULL, "Getting mobile carrier to send the sms", PURPLE_MESSAGE_SYSTEM, time(NULL));
-			
+
 			yahoo_get_sms_carrier(gc, sms_cb_data);
 
 			g_free(msg);
@@ -4540,7 +4252,7 @@
 	}
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_MESSAGE, YAHOO_STATUS_OFFLINE, 0);
-	if(msn)	{
+	if(msn) {
 		yahoo_packet_hash(pkt, "ss", 1, purple_connection_get_display_name(gc), 5, who+4);
 		yahoo_packet_hash_int(pkt, 241, 2);
 	}
@@ -4587,9 +4299,9 @@
 		yahoo_packet_hash_str(pkt, 206, "2");
 
 	/* We may need to not send any packets over 2000 bytes, but I'm not sure yet. */
-	if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000)	{
+	if ((YAHOO_PACKET_HDRLEN + yahoo_packet_length(pkt)) <= 2000) {
 		/* if p2p link exists, send through it. To-do: key 15, time value to be sent in case of p2p */
-		if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn )	{
+		if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) {
 			yahoo_packet_hash_int(pkt, 11, p2p_data->session_id);
 			yahoo_p2p_write_pkt(p2p_data->source, pkt);
 		}
@@ -4624,10 +4336,10 @@
 	pkt = yahoo_packet_new(YAHOO_SERVICE_NOTIFY, YAHOO_STATUS_TYPING, 0);
 
 	/* check to see if p2p link exists, send through it */
-	if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn )	{
+	if( (p2p_data = g_hash_table_lookup(yd->peers, who)) && !msn ) {
 		yahoo_packet_hash(pkt, "sssssis", 49, "TYPING", 1, purple_connection_get_display_name(gc),
 	                  14, " ", 13, state == PURPLE_TYPING ? "1" : "0",
-	                  5, who, 11, p2p_data->session_id, 1002, "1");	/* To-do: key 15 to be sent in case of p2p */	
+	                  5, who, 11, p2p_data->session_id, 1002, "1");	/* To-do: key 15 to be sent in case of p2p */
 		yahoo_p2p_write_pkt(p2p_data->source, pkt);
 		yahoo_packet_free(pkt);
 	}
@@ -4753,8 +4465,10 @@
 			status = purple_presence_get_active_status(purple_account_get_presence(purple_connection_get_account(gc)));
 		tmp = purple_status_get_attr_string(status, "message");
 		if (tmp != NULL) {
-			msg = yahoo_string_encode(gc, tmp, NULL);
+			gboolean utf8 = TRUE;
+			msg = yahoo_string_encode(gc, tmp, &utf8);
 			msg2 = purple_markup_strip_html(msg);
+			yahoo_packet_hash_str(pkt, 97, utf8 ? "1" : 0);
 			yahoo_packet_hash_str(pkt, 19, msg2);
 		} else {
 			/* get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
@@ -4895,7 +4609,7 @@
 
 	group2 = yahoo_string_encode(gc, group, NULL);
 	pkt = yahoo_packet_new(YAHOO_SERVICE_ADDBUDDY, YAHOO_STATUS_AVAILABLE, 0);
-	if(msn)	{
+	if(msn) {
 		yahoo_packet_hash(pkt, "sssssssssss",
 			14, "",
 			65, group2,
@@ -5058,7 +4772,7 @@
 	if (!f)
 		return;
 
-	if(f->protocol == 2)	{
+	if(f->protocol == 2) {
 		msn = TRUE;
 		temp = who+4;
 	} else
--- a/libpurple/protocols/yahoo/yahoo.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo.h	Sun Jun 28 04:41:07 2009 +0000
@@ -28,13 +28,15 @@
 #include "circbuffer.h"
 #include "prpl.h"
 
-#define YAHOO_PAGER_HOST "scs.msg.yahoo.com"
+#define YAHOO_PAGER_HOST "scsa.msg.yahoo.com"
 #define YAHOO_PAGER_PORT 5050
 #define YAHOO_PAGER_PORT_P2P 5101
+#define YAHOO_LOGIN_URL "https://login.yahoo.com/config/pwtoken_login?src=ymsgr&ts=&token=%s"
+#define YAHOO_TOKEN_URL "https://login.yahoo.com/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s"
 #define YAHOO_P2P_KEEPALIVE_SECS 300
 #define YAHOO_P2P_SERVER_TIMEOUT 10
 #define YAHOO_PROFILE_URL "http://profiles.yahoo.com/"
-#define YAHOO_MAIL_URL "https://login.yahoo.com/config/login?.src=ym"
+#define YAHOO_MAIL_URL "http://rd.yahoo.com/messenger/client/?http://mail.yahoo.com/"
 #define YAHOO_XFER_HOST "filetransfer.msg.yahoo.com"
 #define YAHOO_XFER_PORT 80
 #define YAHOO_XFER_RELAY_HOST "relay.msg.yahoo.com"
@@ -44,12 +46,14 @@
 /* really we should get the list of servers from
  http://update.messenger.yahoo.co.jp/servers.html */
 #define YAHOOJP_PAGER_HOST "cs.yahoo.co.jp"
+#define YAHOOJP_TOKEN_URL "https://login.yahoo.co.jp/config/pwtoken_get?src=ymsgr&ts=&login=%s&passwd=%s&chal=%s"
+#define YAHOOJP_LOGIN_URL "https://login.yahoo.co.jp/config/pwtoken_login?src=ymsgr&ts=&token=%s"
 #define YAHOOJP_PROFILE_URL "http://profiles.yahoo.co.jp/"
 #define YAHOOJP_MAIL_URL "http://mail.yahoo.co.jp/"
 #define YAHOOJP_XFER_HOST "filetransfer.msg.yahoo.co.jp"
 #define YAHOOJP_WEBCAM_HOST "wc.yahoo.co.jp"
 /* not sure, must test: */
-#define YAHOOJP_XFER_RELAY_HOST "relay.msg.yahoo.co.jp" 
+#define YAHOOJP_XFER_RELAY_HOST "relay.msg.yahoo.co.jp"
 #define YAHOOJP_XFER_RELAY_PORT 80
 #define YAHOOJP_ROOMLIST_URL "http://insider.msg.yahoo.co.jp/ycontent/"
 #define YAHOOJP_ROOMLIST_LOCALE "ja"
@@ -79,11 +83,13 @@
 #define YAHOO_STATUS_TYPE_INVISIBLE "invisible"
 #define YAHOO_STATUS_TYPE_MOBILE "mobile"
 
-#define YAHOO_CLIENT_VERSION_ID "2097087"
-#define YAHOO_CLIENT_VERSION "8.1.0.421"
+#define YAHOO_CLIENT_VERSION_ID "4194239"
+#define YAHOO_CLIENT_VERSION "9.0.0.2152"
 
-#define YAHOOJP_CLIENT_VERSION_ID "524223"
-#define YAHOOJP_CLIENT_VERSION "7,0,1,1"
+#define YAHOOJP_CLIENT_VERSION_ID "4194239"
+#define YAHOOJP_CLIENT_VERSION "9.0.0.2152"
+
+#define YAHOO_CLIENT_USERAGENT "Mozilla/5.0"
 
 /* Index into attention types list. */
 #define YAHOO_BUZZ 0
@@ -195,7 +201,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 */
-	
+
 	/**
 	 * We may receive a list15 in multiple packets with no prior warning as to how many we'll be getting;
 	 * the server expects us to keep track of the group for which it is sending us contact names.
--- a/libpurple/protocols/yahoo/yahoo_aliases.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_aliases.c	Sun Jun 28 04:41:07 2009 +0000
@@ -166,7 +166,7 @@
 	url = yd->jp ? YAHOOJP_ALIAS_FETCH_URL : YAHOO_ALIAS_FETCH_URL;
 	purple_url_parse(url, &webaddress, NULL, &webpage, NULL, NULL);
 	request = g_strdup_printf("GET %s%s/%s HTTP/1.1\r\n"
-				 "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+				 "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
 				 "Cookie: T=%s; Y=%s\r\n"
 				 "Host: %s\r\n"
 				 "Cache-Control: no-cache\r\n\r\n",
@@ -175,9 +175,9 @@
 				  webaddress);
 
 	/* We have a URL and some header information, let's connect and get some aliases  */
-	url_data = purple_util_fetch_url_request(url, use_whole_url, NULL, TRUE,
-						 request, FALSE,
-						 yahoo_fetch_aliases_cb, cb);
+	url_data = purple_util_fetch_url_request_len_with_account(purple_connection_get_account(gc),
+				url, use_whole_url, NULL, TRUE, request, FALSE, -1,
+				yahoo_fetch_aliases_cb, cb);
 	if (url_data != NULL)
 		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
 
@@ -334,7 +334,7 @@
 	}
 
 	request = g_strdup_printf("POST %s%s/%s HTTP/1.1\r\n"
-				  "User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+				  "User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
 				  "Cookie: T=%s; Y=%s\r\n"
 				  "Host: %s\r\n"
 				  "Content-Length: %" G_GSIZE_FORMAT "\r\n"
@@ -347,7 +347,9 @@
 				  content);
 
 	/* We have a URL and some header information, let's connect and update the alias  */
-	url_data = purple_util_fetch_url_request(url, use_whole_url, NULL, TRUE, request, FALSE, yahoo_update_alias_cb, cb);
+	url_data = purple_util_fetch_url_request_len_with_account(
+			purple_connection_get_account(gc), url, use_whole_url, NULL, TRUE,
+			request, FALSE, -1, yahoo_update_alias_cb, cb);
 	if (url_data != NULL)
 		yd->url_datas = g_slist_prepend(yd->url_datas, url_data);
 
--- a/libpurple/protocols/yahoo/yahoo_aliases.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_aliases.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,38 +1,38 @@
-/*
- * 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
- *
- */
-
-
-#include "internal.h"
-
-#include "account.h"
-#include "accountopt.h"
-#include "blist.h"
-#include "debug.h"
-#include "util.h"
-#include "version.h"
-#include "yahoo.h"
-#include "yahoo_packet.h"
-
-void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias);
-void yahoo_fetch_aliases(PurpleConnection *gc);
-
+/*
+ * 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
+ *
+ */
+
+
+#include "internal.h"
+
+#include "account.h"
+#include "accountopt.h"
+#include "blist.h"
+#include "debug.h"
+#include "util.h"
+#include "version.h"
+#include "yahoo.h"
+#include "yahoo_packet.h"
+
+void yahoo_update_alias(PurpleConnection *gc, const char *who, const char *alias);
+void yahoo_fetch_aliases(PurpleConnection *gc);
+
--- a/libpurple/protocols/yahoo/yahoo_auth.c	Sun May 10 06:24:26 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,925 +0,0 @@
-/*
- * yahoo_auth.c: Authentication routines.
- *
- * Written by Kevin Kurtz and Scott Werndorfer
- * Copyright(c) 2003 Cerulean Studios
- *
- * 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
- *
- */
-
-#include "internal.h"
-
-#include "yahoo.h"
-#include "yahoo_auth.h"
-
-/*************
- * Ugliness  *
- *************/
-static const auth_function_t main_function_list[5][96] = {
-	{
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 },
-		{ 0, 0x0, 0x0 }
-	},
-	{
-		{ 2, 0x36056cd7, 0x4387 },
-		{ 3, 0x538920, 0x0 },
-		{ 3, 0x538a20, 0x0 },
-		{ 4, 0x55f320, 0x0 },
-		{ 3, 0x539320, 0x0 },
-		{ 4, 0x55f340, 0x0 },
-		{ 2, 0x4abb534d, 0x3769 },
-		{ 1, 0x1d242da5, 0x0 },
-		{ 2, 0x3c23132d, 0x339b },
-		{ 1, 0x191265c, 0x0 },
-		{ 1, 0x3db979db, 0x0 },
-		{ 3, 0x539868, 0x0 },
-		{ 1, 0x1a550e1e, 0x0 },
-		{ 1, 0x2f140a2d, 0x0 },
-		{ 2, 0x7c466a4b, 0x29bf },
-		{ 1, 0x2d3f30d3, 0x0 },
-		{ 2, 0x7e823b21, 0x6bb3 },
-		{ 4, 0x55f360, 0x0 },
-		{ 3, 0x5395a8, 0x0 },
-		{ 4, 0x55f604, 0x0 },
-		{ 3, 0x539ba8, 0x0 },
-		{ 4, 0x5628c4, 0x0 },
-		{ 3, 0x547818, 0x0 },
-		{ 4, 0x5628e4, 0x0 },
-		{ 3, 0x547978, 0x0 },
-		{ 4, 0x5628a4, 0x0 },
-		{ 2, 0x5b756ab9, 0x7e9b },
-		{ 3, 0x539d48, 0x0 },
-		{ 1, 0x1d1c4911, 0x0 },
-		{ 3, 0x539f60, 0x0 },
-		{ 3, 0x53a060, 0x0 },
-		{ 1, 0x46bd7771, 0x0 },
-		{ 1, 0x51ae2b42, 0x0 },
-		{ 2, 0x2417591b, 0x177b },
-		{ 2, 0x57f27c5f, 0x2433 },
-		{ 3, 0x53a588, 0x0 },
-		{ 3, 0x53a688, 0x0 },
-		{ 1, 0x71422261, 0x0 },
-		{ 4, 0x55f6a4, 0x0 },
-		{ 2, 0x58e937f9, 0x1075 },
-		{ 3, 0x53a7c8, 0x0 },
-		{ 4, 0x55f6c4, 0x0 },
-		{ 3, 0x53a8c8, 0x0 },
-		{ 3, 0x53aa20, 0x0 },
-		{ 2, 0xb4c3d13, 0x1597 },
-		{ 4, 0x55f6e4, 0x0 },
-		{ 1, 0xfe07d38, 0x0 },
-		{ 2, 0x689b4017, 0x3cfb },
-		{ 4, 0x562928, 0x0 },
-		{ 3, 0x547b00, 0x0 },
-		{ 1, 0x35413df3, 0x0 },
-		{ 2, 0x5b611ab, 0x570b },
-		{ 2, 0xda5334f, 0x3ac7 },
-		{ 1, 0x47706008, 0x0 },
-		{ 4, 0x55f744, 0x0 },
-		{ 3, 0x547548, 0x0 },
-		{ 4, 0x562884, 0x0 },
-		{ 1, 0x57611b36, 0x0 },
-		{ 2, 0x314c2cd1, 0x2b5b },
-		{ 1, 0x1ef33946, 0x0 },
-		{ 2, 0x28ea041f, 0x638f },
-		{ 3, 0x53b1d0, 0x0 },
-		{ 3, 0x53b2d0, 0x0 },
-		{ 3, 0x53b418, 0x0 },
-		{ 2, 0x511537cb, 0x7135 },
-		{ 2, 0x1cf71007, 0x5e17 },
-		{ 1, 0x583d4bcf, 0x0 },
-		{ 3, 0x53b550, 0x0 },
-		{ 1, 0x373e6856, 0x0 },
-		{ 2, 0x4d595519, 0x1a7d },
-		{ 3, 0x53b718, 0x0 },
-		{ 3, 0x53b838, 0x0 },
-		{ 1, 0xe2a36a7, 0x0 },
-		{ 3, 0x53bc10, 0x0 },
-		{ 3, 0x53bd10, 0x0 },
-		{ 4, 0x55f784, 0x0 },
-		{ 4, 0x55f7a4, 0x0 },
-		{ 1, 0x53f3604f, 0x0 },
-		{ 4, 0x55f7c4, 0x0 },
-		{ 4, 0x55f7e4, 0x0 },
-		{ 2, 0x1edc0ba3, 0x7531 },
-		{ 3, 0x53be50, 0x0 },
-		{ 1, 0x10df1038, 0x0 },
-		{ 4, 0x55f804, 0x0 },
-		{ 3, 0x53bf68, 0x0 },
-		{ 1, 0x4ede0cac, 0x0 },
-		{ 2, 0x2f076eeb, 0x5bcf },
-		{ 1, 0x6d86030f, 0x0 },
-		{ 1, 0x3f331713, 0x0 },
-		{ 3, 0x53c0e8, 0x0 },
-		{ 2, 0x41cd726f, 0x3f79 },
-		{ 4, 0x55f824, 0x0 },
-		{ 1, 0xece0054, 0x0 },
-		{ 2, 0x19b32b03, 0x4ad1 },
-		{ 4, 0x55f844, 0x0 },
-		{ 4, 0x55f864, 0x0 }
-	},
-	{
-		{ 2, 0x39731111, 0x419b },
-		{ 1, 0x54f7757a, 0x0 },
-		{ 4, 0x55f884, 0x0 },
-		{ 4, 0x55f8a4, 0x0 },
-		{ 3, 0x53c240, 0x0 },
-		{ 3, 0x53c368, 0x0 },
-		{ 2, 0x3cc0256b, 0x7ce7 },
-		{ 1, 0x79991847, 0x0 },
-		{ 2, 0x228f7fb5, 0x472d },
-		{ 2, 0x32da290b, 0x7745 },
-		{ 1, 0x7a28180d, 0x0 },
-		{ 4, 0x55f91c, 0x0 },
-		{ 4, 0x55f93c, 0x0 },
-		{ 2, 0x5c814f8b, 0x227f },
-		{ 3, 0x53c7b0, 0x0 },
-		{ 2, 0xb496f6d, 0x412d },
-		{ 1, 0x6f4b62da, 0x0 },
-		{ 3, 0x53c8b8, 0x0 },
-		{ 1, 0x64973977, 0x0 },
-		{ 3, 0x53c9e8, 0x0 },
-		{ 3, 0x53cae8, 0x0 },
-		{ 4, 0x55f9d0, 0x0 },
-		{ 3, 0x53cd28, 0x0 },
-		{ 3, 0x547230, 0x0 },
-		{ 1, 0x6dd14c92, 0x0 },
-		{ 3, 0x53ceb0, 0x0 },
-		{ 4, 0x560280, 0x0 },
-		{ 4, 0x56034c, 0x0 },
-		{ 4, 0x56036c, 0x0 },
-		{ 3, 0x53d168, 0x0 },
-		{ 1, 0x5e6324d8, 0x0 },
-		{ 3, 0x53d2d0, 0x0 },
-		{ 3, 0x53d3d0, 0x0 },
-		{ 3, 0x53d798, 0x0 },
-		{ 4, 0x5605b0, 0x0 },
-		{ 1, 0x62745ed0, 0x0 },
-		{ 2, 0x102c215b, 0x581 },
-		{ 3, 0x53d970, 0x0 },
-		{ 3, 0x53da70, 0x0 },
-		{ 3, 0x53dbd0, 0x0 },
-		{ 2, 0x19511111, 0x12c1 },
-		{ 3, 0x53dd70, 0x0 },
-		{ 2, 0x2a6e2953, 0x6977 },
-		{ 3, 0x53e0d0, 0x0 },
-		{ 1, 0x55cd5445, 0x0 },
-		{ 4, 0x560bcc, 0x0 },
-		{ 4, 0x560bec, 0x0 },
-		{ 2, 0x646c21eb, 0x43e5 },
-		{ 1, 0x71dc4898, 0x0 },
-		{ 1, 0x167519cb, 0x0 },
-		{ 1, 0x6d3158f8, 0x0 },
-		{ 1, 0x7ea95bea, 0x0 },
-		{ 4, 0x560c10, 0x0 },
-		{ 1, 0x47377587, 0x0 },
-		{ 1, 0x2d8b6e8f, 0x0 },
-		{ 2, 0x5e6105db, 0x1605 },
-		{ 1, 0x65b543c8, 0x0 },
-		{ 3, 0x540278, 0x0 },
-		{ 4, 0x560d34, 0x0 },
-		{ 2, 0x48af73cb, 0xa67 },
-		{ 1, 0x4fb96154, 0x0 },
-		{ 3, 0x5406e8, 0x0 },
-		{ 4, 0x560e38, 0x0 },
-		{ 1, 0x622c4954, 0x0 },
-		{ 4, 0x561014, 0x0 },
-		{ 1, 0x20d220f3, 0x0 },
-		{ 1, 0x361d4f0d, 0x0 },
-		{ 1, 0x2b2000d1, 0x0 },
-		{ 1, 0x6fb8593e, 0x0 },
-		{ 3, 0x5409e8, 0x0 },
-		{ 4, 0x561074, 0x0 },
-		{ 1, 0x2b7f7dfc, 0x0 },
-		{ 2, 0x5fc41a57, 0x693 },
-		{ 2, 0x17154387, 0x2489 },
-		{ 4, 0x561094, 0x0 },
-		{ 4, 0x5610b4, 0x0 },
-		{ 4, 0x5610d4, 0x0 },
-		{ 3, 0x540d18, 0x0 },
-		{ 1, 0x7e221470, 0x0 },
-		{ 1, 0x7a600061, 0x0 },
-		{ 4, 0x561190, 0x0 },
-		{ 4, 0x5611b0, 0x0 },
-		{ 3, 0x541218, 0x0 },
-		{ 4, 0x5611d0, 0x0 },
-		{ 2, 0xe813a5, 0x2ce5 },
-		{ 2, 0x3d707e25, 0x3827 },
-		{ 2, 0x77a53e07, 0x6a5f },
-		{ 4, 0x562968, 0x0 },
-		{ 3, 0x547d98, 0x0 },
-		{ 3, 0x547f10, 0x0 },
-		{ 1, 0x43a73788, 0x0 },
-		{ 3, 0x5387b0, 0x0 },
-		{ 4, 0x55f214, 0x0 },
-		{ 3, 0x539420, 0x0 },
-		{ 1, 0x55f4606b, 0x0 },
-		{ 4, 0x55f380, 0x0 }
-	},
-	{
-		{ 5, 0x55f3f8, 0x0 },
-		{ 2, 0x32ca58e3, 0x4f9 },
-		{ 1, 0x11756b30, 0x0 },
-		{ 2, 0x218b2569, 0x5db1 },
-		{ 1, 0x77d64b90, 0x0 },
-		{ 5, 0x562948, 0x0 },
-		{ 3, 0x547c10, 0x0 },
-		{ 2, 0x7d1428cb, 0x3d },
-		{ 1, 0x6f872c49, 0x0 },
-		{ 1, 0x2e484655, 0x0 },
-		{ 2, 0x1e3349f7, 0x41f5 },
-		{ 3, 0x541400, 0x0 },
-		{ 5, 0x561258, 0x0 },
-		{ 1, 0x61640311, 0x0 },
-		{ 5, 0x561278, 0x0 },
-		{ 3, 0x541588, 0x0 },
-		{ 3, 0x541688, 0x0 },
-		{ 3, 0x541988, 0x0 },
-		{ 1, 0x7044d3, 0x0 },
-		{ 5, 0x561298, 0x0 },
-		{ 2, 0x5c221625, 0x576f },
-		{ 3, 0x541b30, 0x0 },
-		{ 3, 0x541c30, 0x0 },
-		{ 1, 0x2d406bb1, 0x0 },
-		{ 2, 0x680b1f17, 0x12cd },
-		{ 5, 0x5613a0, 0x0 },
-		{ 2, 0x12564d55, 0x32b9 },
-		{ 2, 0x21a67897, 0x6bab },
-		{ 3, 0x541db8, 0x0 },
-		{ 2, 0x6405119, 0x7143 },
-		{ 1, 0x351d01ed, 0x0 },
-		{ 2, 0x46356f6b, 0xa49 },
-		{ 2, 0x32c77969, 0x72f3 },
-		{ 5, 0x5613c0, 0x0 },
-		{ 3, 0x541fe0, 0x0 },
-		{ 3, 0x5420e0, 0x0 },
-		{ 5, 0x5613e4, 0x0 },
-		{ 3, 0x542220, 0x0 },
-		{ 5, 0x561404, 0x0 },
-		{ 2, 0x74d52c55, 0x5f43 },
-		{ 1, 0x26201ca8, 0x0 },
-		{ 1, 0x7aeb3255, 0x0 },
-		{ 3, 0x53ab20, 0x0 },
-		{ 2, 0x578f1047, 0x640b },
-		{ 3, 0x542738, 0x0 },
-		{ 3, 0x542df8, 0x0 },
-		{ 5, 0x5615a0, 0x0 },
-		{ 5, 0x561628, 0x0 },
-		{ 1, 0x4a1352cf, 0x0 },
-		{ 2, 0x4bfb6ef3, 0x704f },
-		{ 2, 0x1b4c7fe7, 0x5637 },
-		{ 2, 0x4091a3b, 0x4917 },
-		{ 1, 0x270c2f52, 0x0 },
-		{ 3, 0x5430b8, 0x0 },
-		{ 5, 0x561748, 0x0 },
-		{ 3, 0x543220, 0x0 },
-		{ 5, 0x561768, 0x0 },
-		{ 2, 0x127549d5, 0x579b },
-		{ 2, 0xab54121, 0x7a47 },
-		{ 5, 0x5617f0, 0x0 },
-		{ 1, 0x751e6e49, 0x0 },
-		{ 3, 0x543580, 0x0 },
-		{ 3, 0x543680, 0x0 },
-		{ 1, 0x670c3f74, 0x0 },
-		{ 2, 0x6b080851, 0x7e8b },
-		{ 1, 0x71cd789e, 0x0 },
-		{ 1, 0x3eb20b7b, 0x0 },
-		{ 5, 0x561ea0, 0x0 },
-		{ 3, 0x543848, 0x0 },
-		{ 2, 0x58a67753, 0x272b },
-		{ 2, 0x1ab54ad7, 0x4d33 },
-		{ 2, 0x7d30a45, 0x569 },
-		{ 2, 0x737616bf, 0x70c7 },
-		{ 3, 0x543990, 0x0 },
-		{ 2, 0x45c4485d, 0x2063 },
-		{ 5, 0x561f38, 0x0 },
-		{ 1, 0x2598043d, 0x0 },
-		{ 2, 0x223a4fe3, 0x49a7 },
-		{ 1, 0x1eed619f, 0x0 },
-		{ 5, 0x561f58, 0x0 },
-		{ 1, 0x6f477561, 0x0 },
-		{ 5, 0x561f7c, 0x0 },
-		{ 5, 0x561f9c, 0x0 },
-		{ 3, 0x543bf8, 0x0 },
-		{ 2, 0x4bc13c4f, 0x45c1 },
-		{ 1, 0x3b547bfb, 0x0 },
-		{ 3, 0x543d08, 0x0 },
-		{ 2, 0x71406ab3, 0x7a5f },
-		{ 1, 0x2f1467e9, 0x0 },
-		{ 2, 0x9366d1, 0x22d1 },
-		{ 2, 0x587d1b75, 0x2ca5 },
-		{ 2, 0x213a4be7, 0x4499 },
-		{ 2, 0x62653e89, 0x2d5d },
-		{ 5, 0x562198, 0x0 },
-		{ 2, 0x4f5f3257, 0x444f },
-		{ 2, 0x4c0e2b2b, 0x19d3 }
-	},
-	{
-		{ 2, 0x3f867b35, 0x7b3b },
-		{ 2, 0x32d25cb1, 0x3d6d },
-		{ 5, 0x5622f0, 0x0 },
-		{ 2, 0x50fa1c51, 0x5f4f },
-		{ 3, 0x544130, 0x0 },
-		{ 1, 0x5fe7af1, 0x0 },
-		{ 2, 0x14067c29, 0x10c5 },
-		{ 3, 0x544298, 0x0 },
-		{ 2, 0x4a5558c5, 0x271f },
-		{ 1, 0x3c0861b1, 0x0 },
-		{ 5, 0x562864, 0x0 },
-		{ 3, 0x546d50, 0x0 },
-		{ 2, 0x18837c9d, 0x6335 },
-		{ 5, 0x56238c, 0x0 },
-		{ 1, 0x7dab5033, 0x0 },
-		{ 3, 0x544548, 0x0 },
-		{ 2, 0x3b87321, 0x7225 },
-		{ 1, 0x7f906745, 0x0 },
-		{ 3, 0x544700, 0x0 },
-		{ 5, 0x5623ac, 0x0 },
-		{ 1, 0x21c46c2c, 0x0 },
-		{ 2, 0x2b36757d, 0x28d },
-		{ 5, 0x5623cc, 0x0 },
-		{ 3, 0x5448a8, 0x0 },
-		{ 1, 0x106b4a85, 0x0 },
-		{ 1, 0x17640f11, 0x0 },
-		{ 3, 0x544a28, 0x0 },
-		{ 1, 0x69e60486, 0x0 },
-		{ 3, 0x547670, 0x0 },
-		{ 2, 0x3782017d, 0x5bf },
-		{ 5, 0x5623ec, 0x0 },
-		{ 3, 0x5480c8, 0x0 },
-		{ 1, 0x6bca53b0, 0x0 },
-		{ 3, 0x546af0, 0x0 },
-		{ 3, 0x546bf0, 0x0 },
-		{ 3, 0x544d20, 0x0 },
-		{ 3, 0x544e20, 0x0 },
-		{ 1, 0xb8236e3, 0x0 },
-		{ 5, 0x562908, 0x0 },
-		{ 2, 0x5ee51c43, 0x4553 },
-		{ 5, 0x56249c, 0x0 },
-		{ 3, 0x546fd8, 0x0 },
-		{ 3, 0x5470d8, 0x0 },
-		{ 3, 0x546970, 0x0 },
-		{ 2, 0x42b14c6f, 0x5531 },
-		{ 1, 0x4a2548e8, 0x0 },
-		{ 2, 0x5c071d85, 0x2437 },
-		{ 3, 0x5467d8, 0x0 },
-		{ 2, 0x29195861, 0x108b },
-		{ 1, 0x24012258, 0x0 },
-		{ 3, 0x546690, 0x0 },
-		{ 1, 0x63cc2377, 0x0 },
-		{ 1, 0x8d04b59, 0x0 },
-		{ 2, 0x3fd30cf5, 0x7027 },
-		{ 1, 0x7c3e0478, 0x0 },
-		{ 2, 0x457776b7, 0x24b3 },
-		{ 1, 0x86652bc, 0x0 },
-		{ 2, 0x302f5b13, 0x371d },
-		{ 3, 0x546548, 0x0 },
-		{ 2, 0x58692d47, 0x671 },
-		{ 1, 0x6601178e, 0x0 },
-		{ 2, 0xf195b9b, 0x1369 },
-		{ 1, 0x7ba21d8, 0x0 },
-		{ 5, 0x562544, 0x0 },
-		{ 5, 0x562564, 0x0 },
-		{ 1, 0x13ac3d21, 0x0 },
-		{ 2, 0x5bcf3275, 0x6e1b },
-		{ 2, 0x62725c5b, 0x16b9 },
-		{ 2, 0x5b950fdf, 0x2d35 },
-		{ 5, 0x5625a0, 0x0 },
-		{ 5, 0x5625c0, 0x0 },
-		{ 2, 0x73ba5335, 0x1c13 },
-		{ 5, 0x5625e0, 0x0 },
-		{ 5, 0x562600, 0x0 },
-		{ 1, 0x3e144154, 0x0 },
-		{ 2, 0x4eed7b27, 0x38ab },
-		{ 3, 0x545c58, 0x0 },
-		{ 2, 0x627c7e0f, 0x7f01 },
-		{ 2, 0x5d7e1f73, 0x2c0f },
-		{ 3, 0x545aa0, 0x0 },
-		{ 2, 0x55c9525f, 0x4659 },
-		{ 1, 0x3765334c, 0x0 },
-		{ 2, 0x5df66ddf, 0x7c25 },
-		{ 3, 0x545d78, 0x0 },
-		{ 3, 0x545e78, 0x0 },
-		{ 1, 0x16ae5776, 0x0 },
-		{ 3, 0x545ff8, 0x0 },
-		{ 3, 0x546190, 0x0 },
-		{ 5, 0x562620, 0x0 },
-		{ 5, 0x562640, 0x0 },
-		{ 3, 0x546290, 0x0 },
-		{ 2, 0x4392327b, 0x7e0d },
-		{ 3, 0x546398, 0x0 },
-		{ 2, 0x3d8b0cb5, 0x640d },
-		{ 2, 0x32865601, 0x4d43 },
-		{ 5, 0x562660, 0x0 }
-	}
-};
-
-static const struct buffer_t type_three_list[NUM_TYPE_THREES]={
-	{ 0x538920, "\x7a\x61\x31\x57\x9\xbc\x11\x8d\x6a\x12\x3a\x4d\x76\xbf\x19\x86\x2c\xc8\x69\x60\x84\x1\xc9\x21\xb1\xa6\xf\x99\xcd\xa0\x71\x8b\x5f\xb2\xd2\x53\xed\xf9\x55\xa\x50\x14\x15\xad\x88\x52\x5d\xbb\xe\xe5\xd\x56\x3e\x9b\xc7\x17\x9a\x97\x92\x23\x0\x37\xaa\x27\xf6\xb6\x33\xb5\xc5\xd1\x38\x1b\x85\x42\x13\xe1\x64\x1d\x4c\x87\x9f\x3c\x40\xdf\x7b\xd5\xae\xc6\x7c\xec\xd7\x49\x35\x2f\x2b\x9d\x32\xbd\x93\x45\x73\x91\x34\xd4\x39\x1e\x96\x65\xeb\x82\x5a\xf3\xd8\xf1\x41\xce\x9c\xe6\x90\x7d\x6b\x29\x6\xc1\x3d\x4e\xe3\xdb\x48\x6c\x62\x72\x7f\xfe\xdd\xcf\xa1\x24\x4f\xc0\xd0\x3f\x2d\x5c\x78\x6f\x3b\x10\xef\xba\xb\x25\xd6\x1f\x58\x8c\xf8\xcc\xc2\x5\xb3\xfa\xa4\xac\x6e\xf5\x18\x2a\x26\x5e\xf4\x79\xb8\xc3\x16\xe2\xf2\x83\x30\x59\xda\xe9\x36\x7\x46\xa9\xde\x77\xd3\xa3\x98\x8\x1c\xe7\xee\x51\xe8\xfb\x2\xc4\xfd\xff\x22\xaf\x7e\xcb\x68\xc\x28\xe4\x63\xca\x70\x75\xb0\x74\xa7\xea\x20\x4\x4b\xa5\xb7\xf7\xfc\x4a\x47\xf0\xa8\x81\xbe\xe0\x66\x8e\x44\x54\x6d\x80\xb9\x95\x2e\xab\x8a\x1a\x94\xdc\x89\xb4\x5b\x9e\xd9\x8f\xa2\x43\x67\x3" },
-	{ 0x538a20, "\x28\xeb\x74\xef\xb7\x73\x79\xd1\x46\xcc\xfb\x3b\x91\xc2\x16\xcb\x93\xaf\x51\x88\xb0\x5d\xfa\xfc\xc\xf\xc8\x4a\x53\x17\x8e\xec\x81\x36\xc6\xdc\xbc\x89\xa\x1f\x78\xdd\x76\x6c\x85\xd2\x13\xb9\x3a\x97\xde\x86\x3e\x12\xbe\x68\x23\x6a\x58\xce\xea\xe3\xa8\x5a\x8c\x3\x8a\x9d\xfe\xf3\x47\x63\xdf\x44\xaa\xd9\x24\xf0\x5b\xe2\x9c\xd3\xa9\x2e\xfd\x8b\xbd\xa4\x7a\x42\x5f\x4d\xa2\x48\x83\xcd\xe\x27\x61\xcf\xd\x50\x6f\x49\xae\xc7\x2f\x31\x39\x8f\x11\xdb\xad\x6b\x7f\xb6\x55\x62\x4c\x66\xc4\x75\xf6\x1b\xc1\xf1\x90\x95\x65\x9\xe0\xb4\xbf\xf4\x35\x37\x1c\x67\xe8\xf9\xe6\x56\x99\x22\xc0\xe9\x92\x21\xe1\x7d\x6e\x34\xd4\x8d\x96\x20\x52\xd0\x69\x2d\xf8\x7e\x4f\xb\xac\x71\xa3\xe5\x2a\xa5\xc5\x18\x5e\x6\xca\x2\x4b\x26\xf5\xab\x9f\xe7\x15\x3d\xd6\x4\x8\xee\xbb\x57\x0\x40\xd5\xa7\x1d\x45\xa6\x2c\xff\x9a\x32\x84\x1a\x14\xf7\x80\xd8\x43\x72\x7\x98\x38\x87\x33\xb1\x29\xb3\x7c\x30\xba\x94\xc9\x64\xe4\x1\x77\x3c\x2b\x82\x54\x6d\x9e\xf2\x3f\xed\xc3\x4e\x5c\x60\x70\x19\xa0\xb8\xda\x5\xb2\x10\x7b\x25\xb5\x9b\x59\x41\x1e\xa1\xd7" },
-	{ 0x539320, "\x9c\x3b\xec\x3e\x7b\x79\x6f\x88\x42\xe6\xe1\x9b\xa3\xd\x83\x86\x7a\xfc\xc5\xb3\xdb\x7c\xf6\xa\xb7\xe7\x3c\x53\x28\x65\xf2\xa9\x6a\xf4\xef\x2c\x3d\xf8\xed\x6\xaf\x31\x75\xab\xf3\x73\xee\x20\x95\x1b\xe\x19\xa8\x5b\xa5\x66\x74\x85\x11\x60\x1e\x2a\x6c\x48\x50\x2f\x9a\x2e\x55\xaa\xcb\x64\x40\x4c\x25\xe9\xd0\xfd\x2d\x46\x8b\x81\x8d\xd2\x32\x4a\xc6\x7\xd6\xbf\xfb\x98\xd4\x76\x7e\xc\xfa\xde\x14\xa6\xd5\xe2\x90\xd1\xeb\xd3\x58\xbb\x5f\x94\xf7\x78\x54\x27\x52\xb6\x22\xea\x8c\xc8\x7d\x87\x12\x9d\xa1\x63\x38\xd8\x35\x2b\xc9\x56\x10\x9f\x1a\x2\xbe\xf1\x59\x17\x9e\xac\x5a\xb8\x1\xb5\x30\xad\xff\xe0\x49\xe8\x23\x4e\x6b\x16\xdc\x4f\x89\x68\x43\xc1\x99\x4\xa7\x33\x92\x84\xa4\x26\x34\x41\x1d\xb2\x91\x61\xc2\x51\x8f\x36\xfe\x5\xa2\xf9\xb\x13\x71\x82\x6e\x5d\xb4\xdf\xdd\x7f\xa0\xcd\x44\xc7\x70\x4d\xf0\x1c\x4b\x45\x57\x37\x3a\xcc\xf5\x8a\xd9\xe4\xbc\x15\xc3\x62\xc4\x39\x72\x47\x97\xbd\x8\xe5\x67\x18\xb1\x77\x8e\x1f\x9\xba\xf\xd7\xb0\x24\xce\xda\x0\x96\xca\x69\x3\x6d\x93\xae\xe3\x3f\x5c\xcf\xc0\xb9\x29\x80\x21\x5e" },
-	{ 0x539868, "\xf2\xc3\x9\x40\x62\x4b\x94\xd2\xf8\x4a\xdf\xa\xb1\x61\xf9\x9c\x13\x35\x3\xe8\xc4\xf6\x49\x1a\xc\x45\x97\xe\x83\x33\x6d\xa0\x73\xb9\x3d\x9d\xff\x60\xc6\xaf\x68\xb6\x89\x10\xb0\xde\x98\x7f\x8c\x5a\xa5\x1e\x6f\x7c\x17\x12\xd7\xdc\x75\xfc\x20\x1d\x92\xcf\xf1\x16\xd\x50\x41\x39\xab\xeb\x14\x65\xc8\xa4\x99\xb5\x8a\x21\x90\xba\x4d\x3c\xf3\x66\xd1\x96\xf\xac\xa6\x7b\xbc\x8f\xd0\x29\x1f\xb3\xce\xd8\x79\x2\x36\x0\xe5\x91\x5e\xbb\xaa\x52\xc2\x31\x6b\x88\x8b\x9b\x2a\x44\x6c\x2f\x8e\xfb\xa3\x6\x48\xa2\x69\xc9\x28\x43\x47\x37\xef\xb8\x84\xe0\x4f\x30\xae\x56\xb7\x4e\x34\x81\x77\x67\xfd\x74\x93\xcd\x7a\x51\x76\x54\x5b\x2b\x3e\x80\xea\x9f\x15\xe1\x9a\xbf\x38\xfa\x8\x24\x42\xee\x7e\x4\x5f\xa8\xc5\xdb\x4c\x2d\xd9\xca\x19\xcc\xcb\x85\xa1\x32\x25\xec\x64\x57\xad\xf5\xb\x71\x11\x3f\xfe\x58\x1c\xd3\xb2\x72\xf7\x2c\xa9\xf0\x8d\xe9\xbe\x70\xe7\x95\xe6\x6e\x7\x9e\x46\x53\xdd\xed\xe2\xf4\x3b\x22\xc1\x3a\x55\x26\xd6\xc7\xd4\xc0\x27\x5\x7d\x5d\xe4\xd5\x5c\xe3\xb4\x63\xa7\x59\x82\xda\x18\x23\x2e\x1b\x1\xbd\x78\x86\x6a\x87" },
-	{ 0x5395a8, "\xfa\xb9\xda\x78\xde\x7f\x6\xab\xd7\xb1\x5c\x10\x1b\xf5\x62\x85\xf4\x98\xfb\xb2\xff\x5e\x5\x2b\x81\xd1\x7d\x58\xa7\x6b\x23\x7b\x26\x9f\xa9\xe\x59\xb8\xac\xd9\x64\x6e\x4f\x6a\x2d\x3c\x15\xc7\x63\x42\x54\x9\x90\xf6\xa0\x86\x9d\xea\xcf\x7c\xfe\xc5\xd4\x4d\xa6\xd5\xba\xcd\x5d\x9b\x2a\x6c\xb5\x7a\xbe\xf0\x44\x65\x0\x17\x3\xaf\xed\xfd\x1f\xc2\xd8\x5a\x16\xad\xc3\x35\x43\xbb\xa5\x37\x40\xf\x60\x99\x94\x1e\x89\x68\x88\xc8\xc4\x4a\x66\x24\x55\x3d\x4b\xe2\x1d\x1a\xe8\x19\x5b\xbf\x51\x8c\xae\x8a\x87\x8d\x3b\x22\x82\xd6\x80\x95\xef\x50\x21\xd\xd3\x33\x6d\x2c\xf1\xee\x38\xdc\xc1\x6f\x2\x46\xc6\x7e\x18\xb0\xce\x8\xd2\xb6\x53\x73\xe6\xf9\x3a\x4c\x48\x96\x1c\x70\x8b\x93\x69\xf7\x56\x30\x31\xdb\xa1\x1\xb\x77\xbc\xf2\x8e\x27\xa3\x7\xe4\x3f\xfc\x49\xcb\xe0\x45\x12\x67\x13\xb7\x74\xc\x52\xcc\xdd\x76\x29\x32\x57\xe1\xe9\x8f\xca\xaa\xbd\x71\x2e\x4\x97\xa4\xc9\x79\xdf\x83\xb3\x3e\x72\xc0\xb4\xec\x9a\x14\xa\x2f\x5f\x39\x25\x28\x75\xa2\xf8\x9c\xe3\xa8\x11\x9e\x4e\xd0\xe7\x61\x41\x84\xeb\x20\x36\x34\xf3\xe5\x92\x91\x47" },
-	{ 0x539ba8, "\x88\x82\x72\x56\xde\xa5\x45\x91\xf9\xe4\xee\x32\x59\x18\xb8\x6f\x79\xc7\xb0\x8c\x11\xd2\xe7\xef\x48\xe6\x20\xa1\x22\x12\xc8\x15\x6a\x8f\x3b\xd5\x3c\xe8\x63\x28\x10\xe9\x2c\xf5\x69\xa7\xf6\xd0\x83\xe0\x80\x81\x46\x29\x38\x2e\xf8\x34\x5b\x1a\x9d\xfa\xa4\x35\x54\xc1\x7e\xe\xae\x7f\x6e\x57\xb4\xbc\xff\x9b\x4a\xb7\x2b\x0\x5f\x31\x6d\x74\xd8\x36\x5c\xc3\xa2\xdf\x3d\xe2\x86\xfb\x5a\xca\x30\x50\x3e\x73\x4e\x9a\x94\xf0\x7d\xc5\x4f\xe3\x66\x39\xeb\x70\x52\x4b\xe5\x71\xc0\x76\x44\xa9\xa0\x7b\x27\xb1\x6c\xf\xc6\x96\xcb\xba\xda\xea\x37\x1c\xac\xb3\xd6\xb9\xbf\xdb\x1d\x8a\xfe\x9\x21\x75\x5d\x97\xe1\x8e\x25\xbd\x2d\xdd\xf7\xcd\x2a\x1e\x5e\x7a\xc\xfd\x9f\x60\x8\x64\xce\xf4\x61\x8d\x9e\xcf\xd4\x49\xb\x67\x1\xf1\x87\x53\x13\xaf\x2f\xa\xec\x3a\xbb\xa8\xbe\xc9\x90\x43\x6\x7c\xb6\xcc\xc2\x4c\x62\xb5\xc4\x77\x3\xf3\xab\xd3\x33\x24\xf2\x55\x6b\x1b\xa3\x2\x4\x23\x16\x14\x95\x3f\x65\xad\x89\x26\x5\x42\xfc\x98\x7\xaa\x19\x9c\xa6\xd\x93\xed\xb2\x8b\x40\xd7\x47\x1f\x99\x78\x17\x92\xd1\x4d\x51\x58\x84\xdc\x41\xd9\x68\x85" },
-	{ 0x547818, "\x73\x5\xde\x12\xaf\xb4\xaa\x9\x31\xcb\xba\x55\xd3\x1b\xf7\xbe\xd9\x45\x6d\x50\x2d\x74\xfa\x9c\xb3\xb2\xc0\x34\x16\x8d\x3d\x3f\x65\x13\xc8\xe3\xc\xfd\xea\x56\x67\x32\x7b\x24\xd1\xee\xc4\x1f\x3e\x4d\xd7\x33\xd5\xbf\xf\xca\x82\x63\x8b\x60\x86\xfe\x37\x51\x6\xe5\xe8\xe6\x64\x2b\x8a\xbb\xd0\xb8\xb1\xdc\xb9\x8c\x75\x5c\x14\x88\x22\x94\x96\x9d\xb7\x58\x2e\xbc\xc9\xa1\x1\x77\xec\xa2\x2\x6b\xc1\xad\xac\x62\xe1\x9b\x40\xb5\xd6\x78\x80\xc3\x4\x3\x4a\xa0\xeb\x8e\xf5\xc6\xab\xf6\x57\xa5\x8\xcc\x5b\xf2\xff\x2f\xa\x25\xb0\x3a\x7d\xf4\x43\x10\x85\x15\x44\xae\x92\x61\x27\x1c\xce\x19\xf9\xa6\xc5\x48\xe2\x59\xb\x89\xef\xc2\x0\xa8\x5d\x99\x54\xed\x2a\x3b\x4e\x42\xf3\x8f\x2c\x18\x6f\x69\x53\x68\xcd\x29\x6a\x1d\xc7\xf0\xd\x23\x4c\xe\x91\xfc\xe9\xcf\x98\x9a\x52\xfb\x21\x1e\x5f\x30\xda\x9e\x9f\xa9\x7a\x6c\x4b\x39\x7f\x20\x5a\xd2\x83\xdb\x49\x81\x93\x7\x3c\x95\xe0\x70\x26\x41\xa3\x79\x47\xa4\x11\x76\x97\x17\x35\xd8\xf8\x5e\x7e\x71\xbd\xf1\x28\x84\x46\xb6\xa7\xdf\x38\x66\x72\xdd\x90\xe4\x7c\x6e\xe7\x87\x36\x1a\xd4\x4f" },
-	{ 0x547978, "\x4f\xf2\x63\xe9\xdd\x53\x55\xf0\xf6\x86\x76\xab\x8b\x91\x5\xa9\x5c\x92\xc9\xf3\x24\xdc\x3c\x6\xf4\x54\xb\xad\x28\x46\xaf\x60\xc1\xae\xc2\xec\x74\x84\xb3\xcc\x75\x1b\x34\xa6\xf\x6e\x85\xf9\x44\x69\x3d\x4e\x8e\x1f\xed\x15\x12\x62\xdb\xbd\xea\x68\x50\xfc\x30\xde\x5b\x9b\x33\x99\x8d\x61\x98\x56\x78\x19\xc\xb4\x8f\xc8\x10\xb0\x38\x17\x21\x2a\x5e\xe1\xb1\x81\xbc\x2b\xe3\x94\x7b\x6f\x9a\x7e\x48\x3\xc6\xb5\x65\x43\xaa\x23\x1d\x59\x31\xcf\x1\xb7\xfa\xfe\xbf\x1a\x96\xf5\x87\xac\xbb\xfd\xdf\x82\xd1\x13\x8a\x11\xe4\x40\x0\xc5\x7\xa5\xb6\xd9\x4b\xba\x3b\x93\xa0\x9e\x52\x9c\xe\x14\xd2\x3e\x7d\x9f\xd8\x72\x9\xe0\x39\x27\x77\x97\x29\xd5\x88\x95\xee\x22\x3a\x47\xc7\x16\xc4\x25\xb9\x6d\x8\x2c\x35\x6c\xcd\xb2\x5f\xf8\xff\x41\x18\x3f\xe5\x57\x2e\x67\xc3\x49\x89\x90\xcb\xe6\x26\x4\xa8\xbe\xca\x2f\xfb\xd4\x71\xf7\xda\xe8\x6b\x5d\x79\x70\x1c\xce\x7a\xa3\x2d\x4a\xd7\xe2\xb8\x64\x6a\x51\x73\xa\x37\xa2\xd3\x4d\x80\x5a\xa1\x36\x45\x66\xa4\x20\x58\x4c\xd6\x1e\xd\xeb\xe7\x42\x7f\x9d\xf1\xa7\xef\x32\xc0\x2\x8c\x83\x7c\xd0" },
-	{ 0x539d48, "\x29\x0\x10\x9\x37\xc0\xb\xa\x91\xc8\xc9\xb6\x8e\x1\x9f\x64\xae\x13\xa6\xb7\x62\x27\xf7\xd0\x9e\x68\xf1\xf9\x15\xdd\x3a\x56\xca\xde\x96\x89\x8\x90\x38\xeb\x99\x57\xb8\xd7\x65\x94\x77\xb1\x16\x45\x5d\x67\x2f\x79\xd5\xcc\xdf\x44\xbe\x31\x8a\xef\x88\x7a\xfb\xa3\xa5\x39\x78\x84\x3\xe8\xbd\x8c\x85\x6f\xb2\x59\x6d\x93\x7\xaa\x36\xee\xe7\x7c\x21\x2b\xc7\x40\x54\xcd\xb9\x1f\x30\x80\xea\xcb\xfd\x20\xbf\x2c\xd\x6e\x73\x4b\xe5\x74\x18\x9d\x3f\xb4\xb3\x50\x81\x9a\xd4\xf3\xf2\x3e\x6b\x1d\x9b\x12\x49\xa1\xcf\x4f\x51\x41\x71\xc2\xd9\xdb\x5a\x97\x6a\xe0\x87\x6\x5\x2d\xf8\x47\x5b\x1b\x69\xc4\xad\xff\x43\x46\x24\xc\x82\x33\x8d\x26\x86\xab\x5c\x61\xe4\x66\xaf\x11\xa0\x42\xa2\x2e\x34\xdc\x25\x4d\xd6\xd2\x63\x70\x22\x83\x19\xa7\x4e\x92\xb5\xf\xda\x55\xed\x7f\x7b\xa4\xfc\x1a\x1e\x8b\xbc\xb0\xc3\x98\xec\x17\x60\xc1\x3d\x8f\x4c\x48\xac\xce\x7e\x72\xd1\x5e\x35\xa8\x32\x4\x1c\xe\x3b\xfa\xbb\xa9\x2a\xf6\xd8\x2\x6c\x23\x76\xe2\x53\xba\x28\x9c\xe1\xd3\x52\xf0\xe9\x7d\xe6\xfe\x58\x14\x5f\xf4\xe3\xc5\x4a\x3c\xf5\x75\xc6\x95" },
-	{ 0x539f60, "\x5f\xfc\x77\xa1\x39\xa6\x43\xf3\x2b\xbf\xab\x35\x4b\xbe\xad\xcd\xd3\x87\x22\x4f\x62\x3a\x1b\x3c\xef\xb1\x71\xae\x8c\x96\xc4\x86\x38\xf8\xa\xf9\x9b\xfb\x33\x41\xea\x69\x4e\x5c\x42\x58\xcc\x67\xf1\x26\xc9\xf5\xa3\x74\xe4\xbb\x56\x8\x7d\xbd\x99\x72\x80\x5d\xed\x2d\x65\xe6\x9\xa0\xb3\xb5\xc5\xa9\x85\x7\xd\x82\x1f\x9e\xd2\x6f\x2\xaf\x57\x55\x93\x48\x76\xc6\x30\x16\xe0\x60\x51\xf7\x59\x1c\x45\x6c\x4\x92\x32\x7a\xf2\x2f\x4a\x36\x63\x2c\xdd\x70\xd7\x4c\xec\xce\x13\xd9\x89\x97\xc7\x81\x15\xdc\xa5\x7c\x5a\x3\x1a\x2a\x49\xb2\x11\x88\x68\xc1\xb4\x9d\x73\x9a\xc0\x47\x21\x12\xe2\x78\x31\x0\x3e\x6\x6d\xca\xb8\x7f\xcf\x25\xb0\x91\xff\xb\x84\x24\xe9\x8e\xa4\x6b\xc\xac\xe3\x17\xc2\xe7\x6a\xc8\x8d\xf0\x14\xe\x95\xcb\xc3\xd6\x3f\x6e\x64\xfa\xd4\xee\x90\x9f\xe8\xd5\x98\xdf\xeb\xf\x2e\x19\x20\xaa\x44\x46\xbc\x53\x8b\x4d\x3b\x7b\xfd\xa7\x29\x28\x34\xe5\x8f\xb7\xa2\xd8\xa8\x3d\xb9\x5b\x75\xdb\x5\x83\xb6\x50\x5e\x7e\x52\xfe\x37\xe1\x54\x66\x9c\xda\x1d\x40\x10\xba\x1e\x27\xf4\x1\xd0\x18\x94\xde\x8a\x79\x23\x61\xd1\xf6" },
-	{ 0x53a060, "\x1e\x91\xb3\x15\xe7\xc6\x8d\xfe\xc9\xb5\xa6\xdf\x86\xa\x8e\x2b\x54\xbf\x2c\x1d\xbd\x9e\x5f\xcf\x6\x4d\x14\xf\x9c\x2f\x3f\xe8\x49\x1b\xa7\x4a\x10\x88\x7d\xbe\xb0\x35\x11\xe1\xa4\x6d\x30\x2e\x38\x60\xf6\xf7\xdb\xb7\x33\x75\xc\x20\x77\xa9\x9f\xef\xf4\x9b\x79\xfa\x5e\xd5\x3a\x3e\xe6\x44\xd8\x17\xda\xe5\x31\x78\xde\x39\x19\x93\xb4\xa3\xcb\x48\x9d\x45\x21\xf1\x67\xed\xce\x29\x95\xe0\x55\xc1\xfc\x5c\x82\x5\xd3\x80\x76\xab\x72\xb\x97\xd1\xf3\xea\xae\x34\x2d\x98\x73\xc2\xf5\x26\x8a\x1\x37\xfd\x47\xeb\x5d\x0\x56\x8\x66\x36\xd6\x7b\xb2\xe9\x70\xc7\xa5\x7a\x6b\x4c\xdd\x74\x6a\xbc\x43\xc8\x81\x64\x62\xa0\xd2\xfb\x83\x4e\x53\x1c\x52\xcc\x1a\x59\xd0\x99\xf8\x3b\x5a\x28\x41\xf0\xd9\x40\x90\xc0\x69\x7f\x4f\x8f\x8b\x42\x18\xe2\x57\xb6\xb1\xe4\x16\x61\xbb\x23\xa2\xd7\x1f\xc4\x85\xa1\x7c\x9\x65\x8c\xb8\x58\x7\x22\x12\xdc\x13\xcd\xc3\x89\x2a\xee\x27\x7e\xa8\xe\xba\x3d\x4b\x96\x50\x3\xac\x94\xad\xec\x6f\x5b\x87\xb9\xaf\xd4\x63\xf2\x6e\x51\x84\x68\x92\x25\xaa\xe3\x46\x3c\xc5\x24\x4\xd\xff\xf9\x2\xca\x9a\x71\x6c\x32" },
-	{ 0x53a588, "\x87\xca\xb5\xe\xb6\xee\x76\xd4\xda\x6a\x2b\x3b\x46\x9e\x44\x1d\x38\x3\xa\xb3\x1b\xf5\xea\x80\x94\xe6\x33\x43\x95\x0\xe1\x5c\x41\xc8\x97\x36\xaf\x34\x53\xb0\x6d\x29\xf9\x32\x2\xd6\x75\xbe\x7\xae\xe3\x6c\xa8\xe5\x4d\x56\x68\xb\xf4\x5d\x51\xc5\x54\x6b\x85\xba\x65\x86\xa7\xa9\x2f\xf1\x28\x5b\x4\x9c\xe7\x3f\x70\xd\xd5\xbf\xac\x5e\xad\x5a\x6\x2d\x30\x45\xd2\x17\x8d\x25\xed\x16\xc7\xd3\xde\x78\x22\x4a\xa0\x20\xe2\x89\x11\xa6\x2e\xff\xfc\xec\xfe\x9d\x18\xfd\x27\x60\xb1\xc0\x81\x99\x69\xa5\x64\x3d\xf2\x39\x1c\x9b\xc9\xc4\x8a\x21\x1f\x57\x4b\x5\x62\xb2\x14\x59\x2a\x12\x5f\xd1\x50\x90\x52\xcf\x1\x9\x4f\x7d\x74\x10\x42\x19\x8e\xe0\x40\x8f\xc2\xc\x82\x6f\xbb\xa4\x63\x55\xd7\x24\xab\x92\xbd\xf8\xcb\x8\xe9\x26\x49\x58\xf3\x1a\xc1\xd9\xdb\x4c\xbc\xb8\x84\xc3\x88\x8c\x98\x77\xeb\xcc\x3c\x83\xdf\xfa\x79\x15\x91\x7e\x3a\xf\x93\x66\xce\xa2\x7b\x37\x9a\x1e\xd0\xa3\x71\x3e\x47\xaa\xb4\x23\x96\xe4\xb9\x4e\x7f\xf0\xcd\x9f\x61\xf6\xfb\x7a\xdd\x73\xb7\x13\x7c\x35\x2c\xa1\xe8\x8b\x31\xd8\x72\xc6\x67\xdc\x6e\xf7\x48\xef" },
-	{ 0x53a688, "\x62\x6f\x9b\x9c\x31\x48\x4c\xca\xc1\xe6\xa2\x2e\xed\xb4\xe2\xc8\x8f\x45\xc7\x76\x7a\xa5\x40\xb8\x15\x36\x93\x13\xc2\xf6\x17\x2f\xf0\x23\xc5\x95\x79\x1e\xba\xc\x73\x8\x0\x60\xc9\x1f\x54\x58\xc6\xbb\x2c\xb3\x68\x55\xbe\x41\xfa\xc0\x2\xa7\xbd\x78\x57\xa9\x69\x6d\xe4\x12\xe8\x7\x3f\xac\x6c\x16\x4\x87\xb5\xa0\x33\x5e\xe1\x28\xee\x4f\x6b\x50\x99\xaf\x51\xbf\x7c\x7d\x6\x5c\xfe\x6a\x53\x9d\x2a\xd4\x14\x66\xcc\x65\xa3\x3b\xfd\xfc\xf9\x3\xb2\x19\x8e\x91\x49\xdf\x1\x44\xa\x98\x9f\x3a\x80\xf8\xb1\x42\x32\x3d\x22\x37\x8a\x35\xae\xd0\x8c\xdc\xab\xc3\x18\xd9\xe5\x10\x5d\x38\x27\xaa\x52\x3c\xf\x74\xf5\x90\xe7\xec\xd1\x81\x84\x2d\xd5\x8b\x82\x5b\x46\x11\x5\x4a\x4b\xea\x5a\xb\x92\x24\xf4\x1b\x5f\x21\x9e\x7f\xff\x6e\xb6\x8d\xfb\xdd\xcb\x1d\xf2\xe3\xb0\xef\xb7\x4e\x25\x86\xa1\xce\xcd\x72\x34\x64\xd3\xf7\x83\x94\x89\x9a\xd\xd8\x71\x67\xad\xbc\xf1\xa6\x63\x88\xd7\xe\x70\xc4\x20\xde\x3e\xd2\x7b\xb9\x1c\x1a\x39\x30\xda\x59\x47\x43\x29\x9\xe0\xcf\x77\x4d\x75\x97\x56\xdb\x2b\xa4\xa8\x7e\x96\x85\x26\xf3\xd6\xe9\x61\xeb" },
-	{ 0x53a7c8, "\x84\x5c\x65\xae\x56\xa1\xcc\x60\xa9\x28\x29\xf5\x35\x54\x33\xd1\xd6\x48\x44\x68\x34\xef\xee\xf3\x80\xa5\xcf\x2c\x22\xdf\xac\x53\x18\x2a\x19\xdb\xf1\x3d\xbb\x1b\xc4\xf2\xa6\xbf\x32\x2b\xe7\x8c\xb6\xba\xf8\x8b\x1c\xb7\xfe\x11\x75\xf6\xf7\x59\x76\x9c\xb1\x6e\xb4\xc6\xd\xb2\xb8\xc\x1f\x6\x12\x62\xa0\x47\x74\x5e\xd3\xde\x6a\xe\xaf\xc1\x8d\x57\x7\x89\x0\xa8\xbc\x51\x95\x4d\x97\x98\xfb\x9a\xea\x61\x7d\xe5\x50\x4f\xdd\x52\x64\xe4\x16\x8\x70\xff\x40\xd7\x9\x87\xad\xc7\xf4\x4c\x83\xd2\x63\x6c\xeb\x3\x79\xf\x13\x27\x88\xc5\x8e\x20\x3c\xb9\xf0\xc9\x94\xc3\x96\x1\x67\xb\x3e\x7e\xd8\xd5\x2d\x42\x58\x6f\x6b\xcd\x86\xdc\xab\xed\xfc\x24\xa3\x5d\xe9\x9d\x3a\x38\x8f\x55\x30\x46\xca\xc2\x25\x5f\x66\xc8\xe2\x23\x7a\x6d\xfa\xce\xe6\x36\x45\xb3\xb5\xfd\x92\x1a\x39\x21\x31\xaa\x7f\x71\x9b\xbd\x93\x43\x4\xa4\xd0\x81\x41\xf9\x78\x5a\xa7\x17\xcb\x9f\x3b\x90\x2\xe3\x5b\x69\x1e\xec\xe1\x5\x91\xd4\x4b\x7b\x8a\x77\x4a\x7c\xd9\x82\xc0\x26\xbe\x85\xda\x14\x2e\xa\x9e\x72\x4e\xe0\xa2\xe8\x99\x3f\x37\x10\x2f\x15\x73\xb0\x1d\x49" },
-	{ 0x53a8c8, "\xfe\x9b\xe5\x18\xb2\x38\x1d\xd4\x98\xa9\x52\x58\xc3\xe1\xe8\xbf\x39\x4a\x36\x9\x6f\x7e\xb0\x4f\xca\xcd\x3\xe0\x66\x1e\xdf\xd2\x59\x95\x71\x2a\x16\xa2\x86\xcf\x64\xf0\xdb\xf3\x8e\x35\x7f\x19\xb1\x33\x90\xbe\xc0\x8f\x5d\x6e\x51\x56\xda\xaf\xa\x25\x54\xd3\x41\xb9\x7d\x82\x62\x97\xfc\x4d\x88\xe3\x57\xff\xb4\xc7\x1c\xbd\x80\xef\xe6\x1\x23\xce\x17\x44\xdc\x67\x26\x6a\xbc\x8d\x45\xb8\xa3\x1f\x9e\x7\x74\xb3\xc9\x0\x9c\x78\xf4\xf1\x32\x49\x14\x73\xc5\x7a\x65\x5b\xf\x42\xbb\xa4\xb\xcc\xe7\x27\x9a\xfb\x55\xd6\xd\xad\xeb\x10\x79\x1a\x2d\xed\xe4\x2e\x5a\x7c\x3f\x3c\x47\xa6\x20\x92\x46\xb5\x84\x7b\x37\x89\xee\x2b\xf8\xa1\x30\x48\x9f\x87\x68\xb7\xae\xa0\x29\xb6\xc6\xf9\x2f\x22\xf6\x43\x83\x5c\x21\x5\xd1\xfd\x6b\x50\x11\x93\x8c\xe2\x28\xa5\x3b\x2c\xba\xd0\xcb\x91\x4c\xc1\x69\x53\x75\x12\x85\xab\x4\xf2\xd8\x34\xf7\xc2\x40\xec\x3d\xe9\xc\xa7\xd7\x8a\xaa\xac\x99\x15\x2\x31\xea\x6\x60\x4e\x72\x70\x94\x63\xfa\xc8\xc4\x3a\x4b\x13\x3e\xa8\xf5\xde\x24\xd9\x6c\x76\x5e\x96\x5f\x1b\x6d\x9d\xd5\xdd\xe\x77\x61\x8b\x8\x81" },
-	{ 0x53aa20, "\xfc\x7a\xc6\x79\x44\xfa\x78\x60\xb5\xd8\xa\xc0\x19\x5e\x12\xa9\x29\xb3\xcd\x75\xe3\x7b\x3a\xf1\x85\xab\x2f\x33\xe9\xc1\x14\xf0\x96\x82\xf9\x72\x77\xa3\xdd\xc9\x8c\x53\x4e\x1\xd1\x2e\x5\xec\x16\xdb\xd7\xb2\x35\x10\x74\xb1\xf6\xbe\x8a\x15\x50\x92\xe0\x7\xde\x24\x9c\xe7\x22\xda\x5d\xc3\x9e\x42\x59\xb\x11\x4a\xaf\x5f\x76\xd0\x94\x2c\x3f\x48\x97\x99\x2b\x34\x1e\x89\x6b\x23\x30\xce\xc\x8b\xaa\x57\x91\xc7\xea\xf4\xb8\x21\x8d\x3e\x70\x6\xa2\x64\xd3\x9f\xf3\x4b\x13\x2a\x1c\x7d\xee\xa1\xe5\x58\xbf\x98\x3\xfb\x6e\x81\x61\x56\x8e\x71\xa6\x26\x5a\x46\x80\x7e\x9\x37\xa4\x6a\x90\x1b\x1d\x51\x27\x5b\x2d\xba\x4f\xbb\x7c\xa8\x93\xf7\x4\xf5\x68\xd5\xc8\xc4\xef\x36\x84\xe8\xcf\x62\x2\xcc\x67\x49\xb0\x43\xc2\x3b\xa7\xa5\x1f\xfe\xac\x40\xb9\xc5\xae\x6f\xd4\x9a\x95\xbc\x17\x47\x9d\x86\xb7\xfd\xeb\x63\x65\x39\x69\x3c\x55\xe1\x9b\xd2\x66\xdc\x73\xbd\xf8\x83\xff\xf\xcb\x52\xb4\x88\x4d\xe6\x8\x6c\x20\x18\xe2\x45\x25\xe\xf2\x32\xdf\x38\x41\x4c\x5c\x31\x8f\xb6\xed\x0\x54\x28\x3d\xe4\xd9\x6d\xca\xad\xd\x7f\xd6\x87\xa0\x1a" },
-	{ 0x547b00, "\x72\xf0\x14\xcb\x61\xa5\xb2\x2\x75\x22\xc3\x9d\x5a\x63\xfa\x5f\xd9\x55\x58\x43\x24\x7d\x77\x93\xba\x50\x1d\xf7\x49\x18\xb0\x42\xbb\xec\x52\x38\xdc\xc8\x16\x54\x17\x19\x89\x67\x33\x3c\xa\xad\xc9\xde\x81\xed\xbd\xe\xb\x6d\x46\x30\x35\x2b\x8c\xa0\x1c\xd\xfd\xa1\x70\xc6\xd8\x41\xb3\xc0\x44\xeb\x92\xbe\x6b\x98\x1a\x76\x71\xc5\x51\x56\x80\xfc\x1\x53\x4b\xd0\x8b\xd2\x7b\xe7\x15\x5d\xe5\xa6\x8a\xd3\x9b\xf4\x69\x23\xe8\xb6\xc7\xe2\x73\x9f\x88\xdf\xb4\x28\xee\xc2\x94\xb8\xf9\x7f\x4a\x57\x6\xf6\xbf\xc1\xab\xfb\xa4\x8e\xd1\xd7\xf5\x7c\xa3\x1e\x3b\x32\x3\xaa\x90\x5c\x48\xe0\xe3\xcf\xd4\xef\x59\xd5\x1b\x34\x1f\x95\xce\x7a\x20\x26\x87\xb7\x78\x9c\x4f\xa2\x12\x97\x27\x3f\xff\x7\x84\x96\x4\xaf\xa8\xea\x2c\x6c\xae\x37\x91\xa9\x10\xdb\xcd\xda\x8\x99\xf1\x4d\xcc\x68\x79\x2e\xb1\x39\x9e\xe9\x2f\x6a\x3d\xf\x85\x8d\xca\x29\x86\xd6\xdd\x5\x25\x3a\x40\x21\x45\xac\x11\xf3\xa7\x9\x2a\x31\xe4\xc\xf8\x6e\x3e\xb5\x82\xfe\x74\x13\x65\xe1\x2d\x8f\xe6\xc4\x0\x5b\x4e\xb9\x66\xf2\x62\x36\x4c\x83\x5e\x6f\x47\x64\xbc\x9a\x60\x7e" },
-	{ 0x547548, "\x7c\x11\x4d\x5b\x41\x55\x97\x3f\x59\xed\xda\x6f\x85\x33\x16\xc8\xb1\x18\x50\x6c\x9c\x38\x2\x71\x2e\xec\x93\xa1\xa5\x0\x91\xaf\x7a\x92\x1b\xc7\x3a\xa9\xbe\xb6\x9b\xe5\xee\x57\xf1\x99\x47\x4\x6b\xd8\x20\xf4\x3\xd3\x75\xe3\xb8\xdc\x7\x54\x4f\x2d\x37\x49\x14\x9f\x69\xc4\xf7\xc6\xf0\xce\x24\x7b\x7e\x89\x4e\x3c\x7f\xcc\x9\xe6\x2f\x61\xfc\xcd\x86\x62\x83\x56\x29\xd6\x32\xc\x76\xc1\x5c\x68\x51\xf3\xa8\xe2\x87\xcb\xe0\xdb\xb\xba\xe4\x46\x9a\x84\x95\xf\x10\x81\x82\x53\x1c\x26\xc2\x31\xb0\x8c\xb3\x9d\xd9\x96\x5a\x79\xd1\xb2\x25\x80\x1f\xa4\xff\x60\x44\x1a\xb9\x45\xf9\xd2\x6e\xd0\x5e\x35\x98\x66\xc3\x90\xae\xa0\x78\xb5\x34\x2c\x12\xf5\xcf\xaa\xe9\x77\x8b\x70\xde\xeb\x65\xbb\x72\xa6\x88\x58\xa2\x27\xc5\x4b\xbc\x19\xdf\x36\x1e\xa\x74\x15\x17\xbd\x22\xe7\xac\xf6\xf2\x30\xe8\x13\x1\xef\x8f\xd4\x2b\x23\x48\x5f\x21\x3d\x73\x8\xa7\xd\xfd\x63\x67\x4a\x8e\x6a\xd7\xb4\x3b\x40\xc9\xfa\x64\x39\x7d\xea\xab\xfb\xd5\x8d\x42\x8a\x6d\xca\x94\xc0\xe1\xad\xbf\xa3\x9e\x28\x3e\x1d\x43\x6\xb7\x52\xe\x2a\xfe\xf8\x5d\x4c\xdd\x5" },
-	{ 0x53b1d0, "\xf\x8\xef\x6c\x8f\x19\x5e\x9c\xdb\xec\x35\x6f\xe9\x5\xe0\xd\xf3\x17\xa2\xb3\xcf\x28\x46\xe1\xa0\x6\x4e\x38\x4d\x25\x3f\xb5\x12\x80\xb2\xa7\x3\xbc\xca\x41\x6b\x2f\x1d\x4b\x66\x6a\x68\xaa\xc4\x77\xa4\x59\x4\xbe\xc9\xb9\x7b\xd1\xc5\xde\x57\x85\xa9\xcc\xc8\x6e\x78\xb\x82\x2\x5f\xae\x51\x7f\x2d\x8c\xee\xcb\x69\x62\x67\x81\x87\x5c\x1f\x8b\x74\xa5\xe\xf2\x5b\xc0\xc2\x18\xe5\xfd\x95\x65\x20\x97\x58\xc6\x3b\xb7\x9\xdc\x21\x11\xe4\xe3\x16\xa8\x63\xf6\x33\x6d\x8d\x9e\xb6\x34\x7\x14\x36\x71\x60\x45\xfb\x4a\x9a\xea\x1b\x90\x31\xb0\x99\x1c\xd3\x7c\x24\x47\xe2\xdf\xe8\xc7\x29\x30\x1\x2b\xd4\x8e\xb8\xd6\x7e\x2a\x7a\x3d\xf4\xdd\xd0\xb1\xf0\x73\xab\xbb\xa6\xf7\x3a\x1e\xba\x52\x4f\xbd\x4c\xb4\x72\xc1\xe7\xfa\x1a\x54\xf5\xac\xff\x5d\x40\x37\xd9\x43\x23\x93\xa1\x3c\x79\xad\x44\x76\xed\xaf\x84\x94\x49\x50\x91\x10\x70\x5a\xce\xc\xd8\x0\xfe\x92\xd5\x55\x56\x2e\xeb\x89\x13\x88\xc3\x64\xe6\x75\xa3\xf8\xf9\xa\x9f\xcd\x61\x83\x96\xfc\x22\x9d\x7d\x2c\x53\xd2\xbf\xd7\x39\x3e\xf1\x48\x8a\x15\x42\x98\x27\xda\x26\x32\x9b\x86" },
-	{ 0x53b2d0, "\xab\xdf\x86\xff\xce\xfa\xaa\x1\xd2\x41\x9e\xe7\xbc\xc0\x77\x22\xe8\x7c\x4e\xfb\x8e\xf3\x33\xc9\x4b\x26\x60\x89\xc4\x69\x79\x96\x54\xcd\x10\x48\x23\x31\x38\x44\x82\xe5\x6a\x8\xd7\x3f\xe1\x28\xd3\xa6\x4c\x7\x34\x5b\x7f\xb0\xd\x81\xd0\xf\xc1\xaf\xcc\x3d\x99\x19\x24\x57\xb4\x2c\x8d\x7d\x58\x55\x27\x8a\x42\xb\xa2\xca\x53\xc5\xe0\xf4\x4f\x2f\x8b\x21\x2\x2d\x12\x65\xf5\xf2\xc8\xed\x1d\x47\x5c\x1c\xa8\x40\x7a\x8f\xda\x87\xd5\xb1\x4\x70\xea\xe\xeb\x29\xb5\xb8\x9f\xf8\x2a\x3b\xb3\xfd\x5d\x0\x71\x2e\xc2\x46\xec\x92\xf9\x6\x74\xe4\x6d\xa0\x59\x6e\x25\xa9\x7b\x5f\xe2\x64\x3e\x37\xfc\xd4\x9b\x5\x61\x84\x20\xa\xc6\xa7\x76\x83\x62\x32\xa3\x6f\xc7\x78\xa5\xf6\x30\x6c\xdc\xa1\x2b\xbd\xae\x15\x3a\xf1\x4d\x45\x5e\x75\x98\x68\xad\x1b\xd1\x49\x35\x6b\x52\x14\x1a\x11\x88\xbe\x8c\xac\xc\xe3\x66\x13\xd9\x17\xcf\xdd\x93\xbf\x39\x56\xf7\x18\x94\x63\x3\x1f\xd8\xb6\xcb\xf0\x9d\x9\x16\xe6\x90\xa4\xb2\xba\x85\x3c\xd6\xfe\x36\x50\xc3\x43\x80\x1e\xb9\xee\xb7\x9a\x51\x9c\xdb\xef\x67\xde\xe9\x7e\x97\xbb\x5a\x72\x4a\x73\x95\x91" },
-	{ 0x53b418, "\xc6\xcb\x61\x7f\xb\x44\x1c\xea\xc1\x87\x7d\x4e\xd4\x23\xbc\x82\x10\xa7\x3e\xaa\xbf\x46\xb2\xd2\xa3\x33\x20\x27\xc0\x9f\xe2\x45\x6b\x96\x6\x8b\x1d\xb7\x26\x56\x88\xc3\x13\x2b\x15\x37\x9e\x57\xe5\xc8\x21\xa9\x92\x2\x38\xfe\xd7\xba\x9a\xc7\x5a\x84\x28\x58\xfb\xa8\x90\x42\xf4\x3d\xfa\xdc\xa\x4c\x48\x8f\x8e\x39\x3b\x63\x5\x79\x4a\x2c\x65\x71\xe\xdb\x29\xe0\x50\x1\x8d\x19\x31\x94\xd\xb4\x9c\x6c\xb3\x68\xc2\x2e\xce\x97\xe6\x2d\xcf\x36\x91\x1f\x7a\xf\xc4\x8a\x5d\x9b\xad\xfd\x93\xd8\x3f\x9d\x64\x85\x4d\x99\x69\xd5\xd1\x18\x1a\xd9\x12\x2f\xf5\xf2\xda\x80\x51\x1e\x4\x60\x7c\xd6\x86\x54\x62\xac\x5b\x17\xf8\x66\xa4\x43\x49\xff\x0\xe1\x9\xb9\xed\xdf\xd3\x55\x72\x16\x4f\xe9\xe3\xab\x81\xe8\x2a\xcd\xb1\x53\x77\x75\xb0\xdd\xc5\x67\xf3\xa6\xe4\x34\x3a\x40\x1b\x83\x6f\xef\xa5\xa2\xca\x73\xb5\x47\x8\x76\x11\xc9\x3\x3c\xf7\x6a\x25\x41\x30\xf9\xaf\x5c\x95\xa0\xb6\x35\x78\xbe\xd0\x14\xec\x59\xbb\x70\x5e\x74\x6e\xb8\xae\x7e\xfc\x7\x6d\x52\xe7\x32\x8c\xcc\xeb\xf1\x89\x7b\xbd\xa1\xf0\xc\x98\x24\xf6\x5f\xde\x22\x4b\xee" },
-	{ 0x53b550, "\xa0\xb9\x6e\x86\xd9\x98\x97\x73\x25\x76\xf\xcc\x7\xe8\x7a\x79\xb5\xe5\x38\xf4\xc2\x16\x10\x2f\xa2\xec\x3a\xb0\xdf\x5f\xb4\x6a\xb1\x60\xd4\x3e\xd2\xde\x6\x95\x62\xd5\xab\x9\x13\x11\x92\xa6\x37\xa\x2c\x64\xf1\x80\x1b\xfc\x31\x22\x3b\xff\x94\x70\xca\x84\x24\xdd\xd7\xd3\xb2\x32\x3d\xb6\xb7\xa9\x26\x9b\x48\xc0\x1f\xaf\x83\x6c\x58\x29\xc3\x7d\xc5\xf3\x8d\xb\x8a\x2a\x69\x1d\x91\x7e\x9c\x3\xb8\xf2\x9f\x45\x28\x4c\xbb\xcb\x2b\xfd\x61\x7f\xb3\x99\x6b\xbc\x7c\x19\x52\x2\x78\xea\x5c\x49\x74\xa7\xc7\x59\xf6\xf0\x8f\x81\x82\x8c\x1\xf5\xc4\xad\x21\xa5\x0\x5a\x39\x75\xd8\xc\xc1\x85\x17\x5b\x77\x43\xc6\x89\xa1\xf9\x20\x93\xee\x12\x1e\x1a\xe1\x57\xf7\x4\xae\x18\xcf\x33\x47\xfe\xe9\x8\x71\x65\xbd\xd\xcd\x6d\xe4\xac\xba\xdc\xd0\xf8\x4e\xe0\x8e\x5d\x41\x3f\x54\x42\xa4\x40\x34\x5e\x87\x7b\xe3\xdb\xe7\x51\xd6\x9a\xaa\xce\xbe\x36\x67\x35\xd1\x68\x4f\xfa\x23\xfb\xed\x8b\x44\x9d\x50\xeb\xc8\x14\x15\xe6\xc9\xe\x88\x4d\x66\xa8\x5\x3c\x46\x2e\x27\x6f\x72\xbf\xa3\x2d\x96\x9e\xda\xe2\x63\x1c\x53\x55\xef\x56\x4b\x90\x4a\x30" },
-	{ 0x53b718, "\xd4\x58\xf7\x7\xc3\xfd\x69\x49\x23\x17\x65\x84\x9b\xf\x77\x97\xb\xc4\x67\xb1\xbd\xba\x85\xc7\xff\x8f\x32\x28\xea\x6b\xd7\x9f\x31\xab\x9e\x5b\x11\xa8\x36\x8\x96\xa4\x4f\xa2\x70\xed\xd3\x91\x2a\xd9\x73\x6\xb4\xaa\x35\x72\x48\xf3\x0\x1e\xc0\xdf\x2e\x29\xdd\xb7\xa\xd\xaf\x2f\x56\x19\xc\x39\x5c\x46\xec\xac\xfc\x7d\xe6\x92\xf2\x15\xa3\x5d\x93\x3d\x98\x2d\x79\xb0\x52\x5f\xb3\x89\x3\x4\x1d\x55\x42\xcc\xe9\x83\x16\x80\xd2\x8e\x5a\x66\x1b\x47\xfa\x88\xa7\x9a\xd1\x25\xf8\x44\xe2\x26\x59\x9\x61\x40\x3c\x34\xd8\x30\x45\xbb\xc6\x7f\xe7\xbc\x7b\xa9\x3a\x1c\xe5\x68\x21\x5e\xb2\x12\x2c\x74\xcf\x8a\xb9\x24\x1\xcd\xe4\xb5\x9d\x1f\x18\x3b\xe0\x71\x4e\x4b\x4d\x62\xa0\xd0\xc2\xd6\xeb\x43\x51\xf9\xa6\xf4\x2\x90\x1a\xa5\xef\x5\x7c\xb8\x57\xc1\xfb\x8d\xde\x50\x33\xf5\x82\x86\x3e\x76\xc9\x8c\xa1\x8b\xc5\xee\xbe\xe3\xda\xae\x14\xf1\x6f\xe1\xd5\x10\xf6\x27\xfe\x6d\xce\x9c\x6e\x94\xe8\xb6\xca\x60\x37\x53\xe\x54\x3f\x99\x75\x81\x20\xcb\x4c\x7a\x6c\x38\x78\xdb\x64\x95\x6a\x13\x4a\xf0\xbf\x22\x41\xdc\x87\xc8\x7e\x63\x2b\xad" },
-	{ 0x53b838, "\xe3\x57\xc6\x8b\x64\x27\x80\x87\x9b\x49\x29\x6e\xa8\xda\x5b\x20\xbb\x69\x19\xd3\x5e\x30\x9e\x9d\x24\xcd\x2c\x1c\x79\xb\x9f\x8d\xff\x41\x6f\x68\xbd\xd9\x55\xcf\x36\xe6\x5f\x93\x99\x33\xe1\x72\xf2\xe\xd2\xe2\x2e\xd7\xa7\x32\x31\xa2\x25\xfd\xef\x67\x21\xe4\x2d\x3e\xd0\xac\x34\x35\xf1\x44\xee\x5a\x83\x71\xc1\x59\x3f\xa3\x10\xfb\xa6\xcc\x0\x40\x18\x3b\x9a\x47\xfa\xa5\x66\x5d\x6a\x2f\x16\x23\x88\x7a\x84\xc5\xc9\xea\xce\x58\xeb\x11\xaf\x5\x37\x89\x17\x1a\xe5\xb8\xa\xc0\x95\x48\x81\xb7\xf\xf6\x7e\x60\x8f\x8\xd5\x42\xd1\xf8\x45\x2b\x5c\x1b\x76\xf0\xc8\xf4\x3\x7d\x50\xb5\x86\xb3\xe0\x7b\x3a\x1f\xdc\x92\x28\xca\x61\x4a\x78\x1e\x51\xdd\x3d\xbc\x77\xd8\x53\xf9\x94\x74\xc3\x9\x4f\xb6\xec\x2a\x91\x8c\xd4\x38\x4e\x26\x1d\x96\xdf\x4\xd\xab\xa4\xfc\xc4\x15\xa9\x3c\x97\x6b\x7\xde\x9c\xe8\x22\xe7\x2\x6d\xa1\x39\xf3\x54\xba\x6\x65\x90\xb0\x6c\x63\xad\xf5\xb4\xb9\xc\xe9\x1\xc7\xd6\xc2\xb2\x56\xbe\xaa\xb1\xcb\x52\x82\x14\xed\x7c\xfe\xae\x85\x8a\x13\xbf\x4c\x98\x4b\x62\x12\xa0\x4d\x7f\x73\x8e\x43\x75\xf7\x46\x70\xdb" },
-	{ 0x53bc10, "\xf\xc6\xa1\xa3\x50\xbd\xce\xa7\x9\xa4\xf7\x1b\x8c\x3d\xf0\xe5\xdf\x3c\x20\x75\x3f\xdd\x12\x81\xde\x3b\xaf\x68\xf6\xea\x41\x58\xeb\x5d\xae\x61\xa\x46\xed\x91\x23\x65\x99\x86\x27\x92\x8e\x83\x51\x8\x4b\x3e\x32\x1f\xbf\x5b\xa9\xc5\xfe\x7c\xf4\x15\xdc\x89\xf5\x2b\x72\xad\x6b\xba\x5a\xf2\x24\x53\xe7\x29\xee\x4\xd\xf3\xe0\xb7\x67\xcf\xb0\xc3\xbc\xc9\xfa\x66\xcd\xb4\xd5\xd9\x71\xe3\xb8\xa0\x25\xf8\x78\xc4\x5\xe9\x87\xfd\x35\x1a\x98\x9f\x16\xb3\x6\x26\x22\xb2\xd6\x74\xc7\x84\xc2\x7d\x64\xec\x54\x37\x4c\xef\x70\xe\x48\x9b\x4e\xd7\x80\x7\x73\xbe\xd3\x2\x3\x94\xfc\x59\xb5\x8b\x21\x9d\xf1\x69\xe1\x10\x38\x2d\xd2\x45\x30\x42\x85\x6e\x52\xc\x76\x82\x6d\xa6\xd4\xe4\x90\xa2\x62\x7e\x1\xe6\x1d\x4a\xff\x8d\x79\x8a\x55\x77\x2f\xca\x9e\x47\x19\x6c\x28\xb6\x93\x97\x6a\x18\x5c\x4f\x95\x6f\xc0\x14\x40\xdb\xa8\x17\x34\x36\x39\x56\x11\x13\xd1\xc8\xcc\x1e\x2c\x5f\x43\x5e\xa5\xe8\xd0\x9a\xe2\xab\xf9\x4d\x3a\xaa\x1c\xb\x2a\xb9\x31\x7a\x60\xac\xfb\xb1\x44\x0\x88\x8f\x33\xc1\x7b\x49\x2e\xda\x63\xd8\x96\x57\xcb\xbb\x7f\x9c" },
-	{ 0x53bd10, "\xba\x9d\x27\x84\x89\xcd\x60\x67\x68\xd9\x1f\xea\xf2\x15\xd2\x6\x12\x5d\x54\x75\xbc\xa0\x29\xe8\x16\x70\xc8\xf1\x9\xa4\x26\x30\x49\xd\xbd\xf4\xf8\xef\x8d\x1d\x41\x38\xf7\x9c\x1e\x87\xf3\xbe\x7a\x37\x88\xcb\x36\xe6\xfc\xd6\xd0\xad\x78\x71\x93\x96\xf0\x3c\xfe\x57\xe9\x4f\x7d\xaa\xf9\x62\x9a\xab\x18\x39\xbf\xc\xc3\x4d\xe7\x97\x7f\x8a\x3f\x1\xc9\x80\x76\x9e\xfb\xa1\x3e\xfa\xb3\x45\x3b\xdc\x5c\x5b\x58\x61\x2b\xec\xb4\x55\x1a\x9f\x6a\x3\x11\x32\xd1\xe1\xb2\xa8\x6c\xe4\xa3\xa7\x4b\xf5\x17\x40\x6e\x8\xff\x81\x4c\x5\x79\xae\x1c\x83\x46\x25\x6b\xdf\x24\x64\x2e\x4e\x21\x31\x2\x73\x6f\x3a\x8b\xc4\x7b\xac\x23\x72\x20\x65\x7\x33\xa2\xe0\x47\x77\x85\x2d\xdd\x0\xf6\xd8\x9b\xb9\x63\xd4\x53\xaf\xb7\xda\xa5\xc5\xc6\x2f\xa\x6d\x92\xb8\x50\x74\xbb\x14\xd3\xf\xb0\x4a\x95\xe3\xce\xee\xca\xe\x91\x82\x8c\x3d\x8f\x22\xa9\xb1\x86\xc0\x5f\x28\x90\xdb\x7c\x4\x94\xb\xc7\xd5\xfd\xc2\x2a\x1b\x98\xed\xcc\x59\x8e\xe5\xe2\x42\xb6\x34\xd7\xa6\x13\x2c\xc1\x44\x51\xcf\x99\x48\x69\xeb\x7e\xb5\x52\x35\x19\x66\x10\x56\x5e\x43\xde\x5a" },
-	{ 0x53be50, "\x64\xe7\x66\xd5\xf\xc3\xc8\x20\x4e\x9\xd3\x30\x3f\xef\xa9\x80\xe3\x72\x42\x68\xa5\x51\x99\xb\xbf\x4d\xd1\x34\xaa\xdf\x2f\xec\x55\x58\xb0\xdb\xb8\xd6\xc5\x9b\x9a\xa\xbb\x40\xc2\xb2\x2e\x78\x89\x97\x5d\x74\xf7\x52\x5b\xa1\x2b\x83\xae\x7b\xd9\x5e\xfe\xfd\x98\xd2\x29\x13\xc6\x8e\x5c\xca\x7\xd4\xe4\x49\xa8\xa0\xff\xee\xc9\xcf\x16\xb4\x61\x8f\x60\x1\x84\xb5\xac\x62\x54\x6\x2d\x63\xa7\x48\x73\x1e\x92\x2c\x3c\x82\xe1\xcb\x10\xf2\xd8\x50\xf1\xfb\x96\xc\xd7\x6b\x87\x77\x7e\x15\x8a\xde\x31\xe\xab\x59\xd\x3b\xf3\x79\x1f\xfc\x81\x27\x1a\xf9\x94\x2a\x45\x88\xfa\x47\xe9\x7d\xb7\xed\x7c\x32\x7f\xe2\xbd\x6f\x18\x76\x4b\x65\x70\x22\x1d\xaf\xeb\x28\x4f\x9c\xbc\xf8\xcd\xc0\x1b\x43\xb1\xea\xa3\x6c\x12\x35\x44\x8d\x25\xb3\x1c\x24\xc4\x9d\xa2\x36\x56\xb9\x19\xe8\x21\x11\xf0\x75\x5\x17\xc7\xce\x41\x4\x4a\xe0\x6e\x67\x69\x4c\xdd\x53\x3e\xa6\xd0\x3d\xdc\xcc\xe6\x9f\x93\xc1\x33\x90\x57\x37\xb6\xa4\x9e\x6d\x8b\x46\xad\xba\x86\x38\x85\xf6\x5f\x8\x14\x2\xe5\x8c\x5a\x39\x95\xf5\x91\xda\x7a\xbe\x23\x26\x6a\x71\x3\xf4\x0\x3a" },
-	{ 0x53bf68, "\x36\xbe\x8a\x3c\x5d\xaa\xc4\xf5\xfa\xc\x3f\xd\xa0\xc6\x49\xc1\xe1\x20\x7a\x31\x84\x87\xf7\x9f\x71\x6b\xeb\xa8\x11\x35\x22\x78\xe4\x83\x97\xdd\x53\x39\x45\xb9\x3\xad\x4c\x34\x8e\x79\xfc\x57\xb8\x47\x66\xfd\x54\x96\x33\x48\x4b\x88\xf9\x7\xa2\x3e\x64\x1b\xb2\xf\x5f\xcb\xcd\x18\xfb\x74\x70\xb1\x2a\x37\x2c\x98\x9a\x7c\x30\xe2\x75\x28\x26\x63\x1c\xec\x3a\xa3\x8\x85\xc5\xe\x2b\x4\xe9\xc9\x4f\xd1\xd2\x25\x9d\x6c\xd0\xfe\xce\xca\x15\xbc\x82\x2d\x27\x3d\xbb\x56\xe6\x24\xd7\xe3\xf2\x6e\x12\x9c\x6a\xe0\xe8\x4a\x9b\xd5\x10\x86\xc7\x90\x7d\x61\x67\xd8\xb5\xf1\x1a\x8f\xf8\x89\x4d\xa\xe5\xf4\x7b\x60\xa1\x40\x42\x2f\x1\xb6\x1f\xef\xd3\x81\xc2\x5b\x6d\x41\x5c\xff\x95\xc8\x76\x94\xd6\xd9\x19\xf3\x38\xb4\xdf\x59\xb\x52\xb7\xab\x73\x14\x62\xbf\x9e\xb3\x21\x3b\x17\xba\x58\xcc\xdb\x6\xda\x5\xa5\x16\x4e\x80\x1e\xa7\x8d\xa6\x7e\x99\xae\x0\x5e\x2e\x77\x50\x65\x29\x7f\xd4\xee\xf6\x2\x13\xdc\x69\xa4\x44\x8b\x32\xde\x92\x68\x1d\x51\xcf\xa9\xbd\xf0\xc3\x72\xed\xb0\x8c\xac\xc0\x23\x9\x46\x55\x91\x43\x5a\xe7\x93\xaf\x6f\xea" },
-	{ 0x53c0e8, "\x6d\x90\x16\x84\x89\x48\x99\x24\xad\xbc\x92\xe\x6a\xf5\x4e\xea\xaf\x38\xcb\xbd\x8a\x12\x9e\xd6\xb\x8e\x9c\xf8\xb5\xa1\x81\xe3\x9d\xfa\x65\x77\x6\x7b\xb8\x98\xda\x54\xf6\x3b\x7\x93\x5c\x7a\x15\xfe\x2a\x30\x36\x80\x39\x8c\x2b\x4b\x5b\x21\xe0\x13\x6c\x29\xc0\xbb\x27\x3a\xdd\x3f\xa2\xe9\xac\x4c\xef\x44\x70\x19\x5a\x72\x7c\xc5\x3c\xdc\xcf\x88\xf2\x51\x47\x61\x3\x67\x82\xfb\xed\x18\x9f\xb7\xa7\xb0\xc4\xf\x26\x5\x28\xe5\xd2\x4f\xa\xd0\xb3\x1\xd5\x1a\x37\x6e\x8\x9a\x1f\x60\x45\x5f\xf9\x33\x9b\x6f\x2d\xca\x9\xb4\x3e\xbf\x96\x95\x4a\x11\x1d\x74\xcd\x87\xce\xb9\x20\x68\xc3\x40\xf1\x31\x8d\x25\x7f\x2\x17\xb6\xcc\xd3\xa5\x59\xf4\x91\xd1\x83\x4d\xc2\xe1\x22\xec\x4\x52\xf0\xd9\xae\xc8\x56\xf7\xd4\x85\x42\x1e\x35\x1c\x7e\xeb\xe2\x76\x6b\x49\x75\x3d\x58\xff\x57\xbe\x43\x46\xf3\xba\x2e\x69\xa3\x34\x78\xb2\x73\x5e\xe7\x1b\x8f\xd8\x8b\x94\xa8\xe6\x97\x7d\xde\x2c\xa6\xab\x23\xfd\x50\xe8\x79\x62\xa4\x66\xfc\xee\x86\x41\xc6\xd7\xa0\xc7\xe4\x5d\xc9\x53\x32\x63\xaa\xc1\x64\xdb\xb1\x0\x10\x2f\xc\xdf\xd\x14\x55\x71\xa9" },
-	{ 0x53c240, "\x74\x4b\x7\xe3\x16\x70\x33\x94\xb\xb6\xe6\xc0\x62\xd5\xe5\xfb\xbe\x8d\x67\xc8\xc7\x58\xc6\x2e\xf9\x47\x77\x12\x4a\x68\x6c\x84\x35\xe1\x69\x14\xc4\x48\x32\x11\x9d\xb1\xe\x5a\xd0\x17\x60\xed\x28\x21\xef\x10\x2b\x5b\x31\xab\x23\x89\xf0\x18\x66\x0\x87\x99\x30\xe2\xda\x49\x7f\xd2\x4d\xcc\x81\xd6\xdf\x37\xd\x1a\xaa\x51\x97\xb3\x73\xd3\x50\xb2\xdd\xc3\xbf\x3e\x92\x1\x64\xf4\xcd\x1c\x8f\xaf\xa9\x24\x36\x91\x9e\xa4\xd1\x75\xc9\x59\x42\x4e\xb4\x6a\x4f\xa1\xe8\x6d\x61\x63\xea\x3c\x38\x5\xe9\x9c\x46\xb9\x9f\xb7\x43\xeb\xf5\x5c\x76\x3b\xd7\xba\xa5\x7b\x6f\x5f\xde\xad\xe7\x15\x2\x2f\x5e\xf7\xa6\xbb\x52\x95\xd9\x86\x26\xa\xa8\x8\x20\xf1\x45\x13\xca\xf6\x65\xcf\xe4\x98\xdc\x80\x19\x7a\xfd\x9b\x4\x1e\xa3\x9a\x5d\x72\xb5\xfa\x3\x53\xc2\xc\xa7\x57\x55\x7e\x29\x6e\x83\xb0\x1f\xbd\x8e\x93\x8a\x79\x96\x39\x7d\x88\x27\xcb\x71\xf\xf3\xfc\x25\x40\x3a\xd8\x85\x2c\x6b\xd4\x2d\x34\x54\xec\x8c\xe0\x1b\xb8\x8b\x3f\xf2\xac\xff\x7c\xa0\xee\xbc\x22\x44\xce\xc5\x9\xdb\x82\x78\x90\xae\xc1\x6\xa2\x41\x4c\x1d\x3d\xf8\xfe\x2a\x56" },
-	{ 0x53c368, "\x8b\x9c\xe5\x1a\x2d\x5a\xf5\xa6\x77\x3\xd4\xb4\x99\x84\x32\x53\xcd\xca\x43\xb5\xe2\xcb\x1e\x8c\xc7\x81\x89\x49\xb3\xf7\x71\xbb\x4e\xe8\x7d\xaa\x2e\xd0\x7f\x3e\xf1\xe9\x60\xbf\x87\xe6\x6c\x6d\xff\x47\x10\xc5\xc9\x3a\x5e\x30\x3b\x0\x4a\x18\x63\x11\x8e\x92\xab\xf9\x8a\x9f\x9e\x1d\x45\x62\xf8\x83\xce\x5d\xcf\x78\xdd\x93\x8f\xc2\x76\x2b\xd3\x54\xd\x4d\x44\x31\xa\x42\x91\x23\xfd\x36\x48\x79\x2a\x4f\x2c\x80\x7c\x7\xb9\xb0\x68\x52\x33\x70\xe1\x6a\x9\xbe\xad\xf0\xb8\x37\x5c\x41\x95\x59\x72\xa5\x67\xf6\xa2\x13\x82\xfb\x19\x34\x66\x3f\x5b\xac\x5f\x9d\xeb\xd8\xb7\x21\x1c\x3c\x75\x4c\xd1\x7e\x74\x40\xb6\x22\x98\x69\xee\xea\xa4\x7a\xe4\x6e\x58\xc0\x12\x1b\xe\x14\xae\xde\x9a\x7b\xd7\x28\xed\x1f\x61\x55\xf\xb\x57\x17\x9b\xef\xe7\x97\xfa\xaf\x24\x4b\xd2\xa3\xd9\x85\x64\x8\x2f\x96\x50\x35\xa7\xe3\x25\xc1\x46\x8d\xcc\x73\xe0\x56\x15\x90\xa8\xbd\x5\x4\x20\xc4\xf3\x39\x16\x6\x38\x65\xf2\xdb\x86\x6f\x27\x1\xf4\x6b\xb1\xbc\xdc\xba\xc6\x26\x3d\xdf\xa1\x29\x51\x2\xa0\xc8\xda\xa9\xec\x94\xc3\xc\x88\xd6\xb2\xd5\xfe\xfc" },
-	{ 0x53c7b0, "\x5f\xb6\xef\xa1\xfb\xd0\xa3\xb\xc9\x67\x54\xdd\x92\x4\xa5\xe0\x99\xa7\x62\x53\x87\x3c\xf6\xcc\x12\x45\xd5\xa6\x7b\xb4\x8e\x6f\x3e\x6e\xe3\x41\x44\x61\x8b\x5e\x2a\xb9\x2b\xdc\x46\x7c\x4b\xf0\x50\x4d\x9b\xad\xc3\xa8\x7d\x81\x8f\x2e\x1d\x79\xf3\xfe\x29\x8a\x3f\x22\x35\x4c\xa2\xf1\x90\x58\x9a\x70\xac\x88\xc4\xbb\x43\xb5\xbd\xaf\x24\x2c\x1c\xb0\xe9\xbc\x3\x3d\x18\xc5\x7\xd8\x9f\x97\xdf\xd9\xc6\x68\x5c\x15\x2\xda\xa9\xc2\xaa\x6\x55\xc7\x76\xf4\x2d\x7a\x32\x85\x86\xee\x19\x95\x4a\xec\x94\x80\x89\xbe\x9c\xcd\x56\x38\x10\xd3\x8\xdb\xb1\x6d\x6a\x2f\xf5\x33\x52\xcf\xab\xe6\x1f\xa4\x73\xf9\xf\xc8\xc0\xe8\x93\x13\xd\x84\xf7\x9d\xba\x64\x83\xb3\xae\x71\x37\x1e\x8c\x25\x0\xf2\x21\x9\xea\xd1\x1a\x7f\x42\xe1\x16\x48\x6c\xc1\x1b\xf8\xd6\x20\x27\x74\xb8\x49\x60\xcb\x6b\xa\x3b\x72\x75\x9e\x47\xeb\x4f\x91\x31\xe4\x63\xd2\xe7\xfc\xde\xb2\x28\x4e\xce\x57\xc\xb7\x98\xed\x36\x7e\x5a\x34\x40\x51\x23\x30\x59\x77\xfa\x5d\x1\x96\x39\x8d\xff\x17\x11\x66\x5\xfd\xd7\x14\xe5\xa0\xbf\x69\xe2\x82\x26\x65\x5b\xd4\x3a\x78\xca\xe" },
-	{ 0x53c8b8, "\x69\x23\xad\xbe\xc\x4e\x2f\x48\x7e\xe3\x30\xaa\x9d\x42\xc3\xc1\x6e\x13\x64\xff\x3d\xd9\xdf\xb3\x4b\x98\xfc\xeb\x92\x83\x95\x50\xaf\xc9\x7b\xf\xc7\x8d\x53\xa8\xbb\xb5\xd8\x2e\x9f\x3\x81\xe8\x2d\xed\x74\x6c\x97\xe9\xb\xbd\x1d\x15\x4\xa0\x5a\x16\xbf\x3f\x7c\x35\x6\xcf\x7a\xae\x44\x8b\xf4\xf7\x5e\x1e\xef\x27\x8f\x29\x55\xf2\x4f\xd\xea\xc4\x5\x88\x18\x94\x34\x8\xb4\x62\xd7\x26\x56\xfb\xf8\x37\x33\xce\x1c\xd0\x47\xd5\xe0\x71\x41\xd6\x87\xee\x72\xf1\x70\xe5\x75\x7f\x21\x54\xca\x80\xb2\x11\x7d\xbc\xdc\x7\xe\x91\x38\x96\xa1\xb6\x3a\xfd\x2\x6f\xa6\x3e\x10\x60\x9c\x63\x77\x59\xec\xa\x86\xf5\x28\xfa\xe7\xe1\xb7\x76\x36\x1a\x1f\xa5\x9a\x45\x39\xdb\x5d\xd2\x5f\x2b\xf9\xfe\xde\x31\xab\x52\xd1\xa4\x3b\x4a\xb0\x0\xb9\x9b\x9e\x43\xc0\x12\x89\xa9\xa3\x20\x65\x14\x1\x46\x2c\xcc\x17\x8a\x68\xe2\x19\x4c\xd3\x32\x5b\xdd\x66\x73\xcb\x85\x1b\xc6\x67\x6a\xd4\xc2\x8e\x61\xda\xf3\x57\x79\xa7\xb8\x8c\x9\x40\x5c\x6d\xb1\xa2\x22\xc8\xf0\x25\x49\x58\x24\x6b\xe4\xcd\xba\x93\x2a\x99\xc5\x4d\xe6\xf6\x84\x3c\xac\x90\x82\x51\x78" },
-	{ 0x53c9e8, "\x1\x69\x88\x4f\xf0\x48\xe7\xbd\xc3\xba\x8\x63\x75\x6d\x3a\x4b\xd7\x86\x59\x47\xb\xde\xa\xf1\xbe\x58\xe1\x5d\x91\xab\x9\xee\xad\x5e\x28\xca\x6\xa9\x4\xe9\x8e\xc5\x6f\xd0\xfe\xdf\x12\xc1\x7e\x4c\x2b\xcb\xb1\x96\x7a\x90\xf8\xc2\xa4\xe6\x73\xa2\xdd\x1c\xaa\xe4\x30\x3f\xcc\xc4\x35\x66\xb3\x1d\xdb\xa0\x7\x36\xa3\x54\xb9\x43\x94\xc\x8b\x98\x72\x44\xbc\xf5\xcd\x2d\x2\x5b\xed\x1f\x29\xf7\x0\x7f\x53\xda\x85\x2f\xc0\x89\x33\xa5\x9f\x9a\x8d\x64\x68\xd2\x9e\xaf\x40\xeb\xec\xfa\x26\x41\x9d\xd4\xa1\x10\x8c\x37\xbf\x4a\x81\xac\x45\xd6\xa7\xe3\x9c\x8f\x21\xf2\xff\x42\xea\x87\x32\x1a\x2e\xcf\xbb\x3e\x15\x22\x65\x7b\x61\x3d\x83\xa6\x78\x6a\xd8\xf\x2c\x31\x62\x97\x5c\x14\x27\x49\x46\xf4\xd1\xf3\x93\xb6\x60\x95\x3b\x99\xc6\x70\xfb\x67\x24\x6c\x9b\x25\xc9\xe5\xb4\x4d\xd5\x76\x71\x2a\x1b\xdc\xfc\x8a\xae\xe2\xef\xe0\x17\x13\x5f\x57\xb5\x79\x50\x6b\x56\x7c\x52\x11\x3\xd\x23\x7d\xa8\xd9\xe\x6e\x3c\x16\x38\x92\xce\x51\x34\xc7\x55\x18\xb7\xe8\x74\x82\xb2\xd3\x19\x20\x77\x5\xb8\xc8\xfd\xf9\x80\xf6\x1e\x4e\x84\x5a\x39\xb0" },
-	{ 0x53cae8, "\xa4\x6d\xc3\xfc\x24\xa5\xb7\x3f\x26\xc0\x2d\xe3\x49\x71\xe0\x36\xaa\x39\x6a\xb4\x21\x67\x9a\xfa\x23\xe5\xec\x12\x25\xd\x72\x87\x27\x7a\x5d\x60\x6f\x57\x78\x94\x44\x56\xde\xc9\x95\x97\x2f\x77\x9d\x53\x89\xfe\xff\x8b\x46\x2c\xcb\x61\x8\xdf\x79\xb6\x20\xc\x15\x3d\x4a\x2e\xb2\x7\x73\x3e\xcf\x6\x88\xf4\x37\x32\x19\x3a\xf6\xe9\x75\xac\xeb\x30\xf9\xbb\xa7\x84\x63\x5f\xa8\x1a\x91\xc8\x9c\x7f\xd6\xd5\xed\x3c\x98\xd8\xbc\xb1\xf\xfd\x9\x3\x99\x6b\x16\x8e\x59\x4e\x1f\x66\x82\x2\x8d\x96\x4b\x22\xc5\xa3\x50\x74\xdd\x2b\x5e\xa1\xda\xcd\x5b\x58\x9e\x28\x1d\xe8\x62\x47\xf1\x33\x35\xaf\x34\xef\x5a\xa2\xbd\xe\x81\x4\x5\xee\x7c\x51\x4f\xbe\xc4\x42\xb\xca\xd3\x70\x9f\xba\xd4\x8c\x10\xfb\x90\x14\x13\x1b\x3b\x11\xc1\xad\xb9\x64\x48\xd0\x31\x4d\x8a\xd2\x86\x38\x0\x92\xdb\xf5\x5c\x9b\xea\x17\xf8\x68\x83\x18\x4c\x52\x1e\x2a\xe6\xa\x69\xab\x6c\x6e\xf7\xd9\xc7\x41\xf3\xc2\xa6\x1c\x7d\xb3\xd7\xdc\xd1\x93\xe2\xce\x85\xbf\xb8\xe1\x76\x40\x54\xcc\x7b\x8f\xa9\x7e\xe4\xae\x55\x1\x80\xf0\x43\xc6\xb5\xf2\x65\x29\xb0\xa0\x45\xe7" },
-	{ 0x53cd28, "\xed\x8e\xda\x43\x63\x70\xc8\x69\xee\x7\x3b\xd6\xe9\x1c\x17\xc\x38\x97\xa3\xe1\xe\x6\x40\x96\x0\x7c\xbb\x39\x9\x2b\xd7\x78\x19\x59\x4\x44\xb9\xa7\x13\x68\x16\xcd\x8d\xa8\xc2\x54\xb5\x30\xac\x72\x5b\x12\x1b\x6b\x89\x6f\x99\xc6\xd3\x51\x76\x87\x91\x60\x27\xa0\x4d\x4f\x47\xf3\xd\xcc\x98\xaf\xf8\x6e\x9d\x9f\x7b\xfc\x36\x5e\x9c\xb8\xf5\x8b\xdf\x7f\xfa\xe4\x75\xcb\x9b\xf0\x77\x3\x41\x62\xb3\x11\x32\xa5\x2d\xa2\x6c\x3d\x86\xdb\x80\xba\x2a\x83\x90\xf2\x22\x24\xc5\xff\x5f\xb0\x15\x31\xbd\x1e\xcf\x57\x4e\xc7\xae\xf4\xe3\xb4\x4b\xce\x35\x3c\xb2\xa\x95\xfe\xa1\x5\xf9\xd1\x8a\xf6\xdd\x74\xa6\x2\x1\xe2\x52\xa4\x10\xb7\x93\xf7\xc4\x18\x28\xd4\x84\xa9\x9a\xc0\xe8\x8f\x53\x2f\x7a\x5c\x58\x26\x79\x42\x4a\x25\xad\x33\x67\xbe\x7d\x34\x1a\x46\x29\xde\x20\xd5\x3f\x1d\xd8\x3e\xe0\xb\xc1\x71\x14\x1f\x73\x6a\xfb\x61\x55\xab\x50\x85\xbc\xb6\x7e\x9e\xd9\xeb\x5d\xd0\xd2\x21\x64\xf1\xbf\xdc\x56\x45\x94\x65\x4c\xe5\x3a\xb1\x6d\xe6\x49\x8\x23\x88\xaa\xfd\xc9\x5a\x81\x37\x2e\xf\xef\x2c\xca\x92\xe7\x48\x82\x8c\xc3\xec\x66\xea" },
-	{ 0x547230, "\x31\x69\xdc\xcc\x61\xe2\xd4\xad\x9a\x51\xe5\xfa\x53\x6d\xfe\x6\x89\x79\x46\x99\x24\x7c\xa0\x18\x56\x27\x7f\x2e\x2a\x77\x0\xd8\xcd\xb6\x1e\x4b\x4e\xfc\x4\x23\xa4\x75\x8\x44\x19\x80\x7\xf3\x16\x5c\x9\x93\xb9\xdb\x92\x10\x30\xd0\x43\xd7\x85\xfb\xdd\xe\x49\x39\xca\x2\x64\x8a\x35\xa6\xee\x13\xe0\x91\x9b\xce\xc2\x12\x82\xab\x4d\x74\x22\xd\x70\xb2\x90\x98\x3\xec\xc7\xcb\x9c\x71\xba\xac\x50\x21\xf8\xc0\xda\x67\xa\x72\xfd\x2d\xc\xf6\xa7\x52\x65\xaf\xc3\xa3\xa1\xea\x5a\xd5\x17\xbe\x7e\xcf\x94\xb0\x34\xd1\x1b\x6e\xf0\x54\xf2\xe8\x76\xbc\xe4\x3f\xf4\x73\xe9\xae\x7b\x6c\x3a\xbb\x8f\xe7\x4a\xb1\xb\x7a\x68\x86\x11\x2f\xf1\x8d\x81\x47\x42\x2c\x7d\x8c\x95\x55\xf7\xc5\x84\x1d\x59\x41\xd6\xbf\x8b\x33\x9f\xe6\x38\x45\x87\x1\xc4\x1a\x78\x40\x3c\xbd\xe1\xb7\x1f\x26\x6a\x6b\xa8\x96\xf5\xa9\x60\x37\xed\xa2\x15\x58\x3d\x8e\x48\x3b\x9d\xb4\x5b\x29\x62\x4c\xc6\x83\x66\xb3\xb8\xde\x1c\x2b\x5e\x63\x57\xd2\x5f\x25\x36\x20\x28\xb5\xc1\x5d\xc9\xf9\x9e\xf\x88\xa5\x5\xef\xdf\x97\x4f\x14\xc8\xd3\xff\xd9\xeb\xe3\x32\xaa\x3e\x6f" },
-	{ 0x53ceb0, "\xbc\xb2\x5e\x24\x9d\xc6\x26\xc5\x91\x6c\x87\xb3\x70\x47\x6f\x5f\x1\xad\x7f\xa5\xea\x4\x7c\x31\x39\xdb\x15\x9e\xdd\x64\xb8\xf4\x9a\xd0\xe0\xf\xf0\xcd\xef\xd4\x23\xc0\x14\xcf\x79\x5b\xba\x48\x2f\x18\xc\x95\x55\x43\xab\x67\x99\xa3\xbd\xd9\x90\xec\xbf\x21\xff\xd2\xb6\x96\xf1\x5d\x6a\xe3\xd5\x4f\x7d\x8f\x46\xb1\x7e\x12\xb4\x6e\x97\x37\xa\x36\x94\xc8\x1f\x51\x8d\x60\x78\xaf\xfa\x9c\x2a\x40\x7b\x1d\xbb\xe9\x75\xe8\x5a\x3a\x11\xf5\x7\xed\x5\xc7\x9b\xf7\xb5\xb0\x1c\xd1\x4a\x83\xc4\x81\x7a\x92\xf2\x3b\x4e\xb9\x2\xde\xaa\xe\x1a\xcb\x5c\x44\xe1\xd6\x98\xa2\x4c\xee\xd7\x45\x9\x32\x20\x3e\x3d\xa7\x57\x58\x0\x73\xa6\x10\xfb\x6\x4b\xce\x74\x35\xfc\xae\x77\x89\xfe\x19\x53\xfd\x82\xc2\x85\x30\x50\x84\x8\xc3\x28\xf9\x22\x80\x65\x62\x13\xe4\xca\x34\x3f\xdc\x4d\xf3\x8a\x86\x8b\x69\xf8\xda\xa4\xc9\x61\xe7\x38\x6b\x54\x2b\x49\x29\xa0\xc1\x71\xd8\x2e\xa1\x1b\xd\xcc\x8e\x8c\xa8\x2d\x27\x42\x56\x16\x41\xf6\x72\xa9\xb\xe2\x68\x25\x63\x93\x1e\xb7\x9f\x59\xd3\xac\xe5\xdf\x2c\xe6\x88\x76\xeb\x3c\x52\x33\x17\x66\xbe\x3\x6d" },
-	{ 0x53d168, "\x3\x21\xa0\xee\x97\xa8\x35\x87\x9f\x6e\x88\xf0\xc1\x1a\x19\xbd\xd2\x17\x78\xb9\xd6\x29\xf4\x28\x40\xe6\x8d\x1c\x2f\xf6\x56\x14\xdd\xa5\x57\x48\x9a\xce\xb4\xff\x5a\x5\x3a\x9d\x7e\x6d\x96\x6c\x55\x3b\x38\x4b\x51\x1f\x60\x8\x1d\x70\x22\xae\xd3\x8f\x99\xc3\x83\xe0\xde\xea\x6\xf9\x9b\x5c\x52\x2a\x72\xb7\xc9\xdb\xfa\xd7\xdf\x68\xbc\xb6\x59\x98\x74\xb2\x27\x9\xf\x44\x6f\x91\x7d\xcc\x12\x4e\x2d\x42\x7a\xf7\x9c\x7c\xe4\xf8\x94\xad\x23\xef\x8a\xaf\xb8\xe2\x80\xb5\x86\x54\x47\x4a\x2\x3c\x5f\xf3\xec\x4d\xe7\x8b\xbf\xb0\x26\xc5\x67\x24\x3e\xca\xbb\xd8\x1b\x63\xc6\x82\x75\x69\x5e\xdc\x45\xac\x71\x30\x76\xa\x81\xda\x33\x32\xd5\xbe\xd\xfc\xf2\x3d\xa4\xf1\x73\xed\x43\xd4\xe5\x2e\xe9\xd0\xcb\x41\x37\x5d\x34\xd9\x77\x7b\x7f\xa3\x39\x6a\x61\x16\xcf\x1\x7\xfd\x58\x13\xa2\x20\xc7\xc2\x66\x2c\x50\xd1\x65\x79\xc8\xb1\x64\xb3\x90\x0\x5b\x11\x31\xe\x25\x6b\x89\xe1\x8c\x53\x10\xaa\xc\x4\x4f\xa1\xa7\xc4\x85\x92\x36\x46\x1e\x3f\xfb\x84\xe8\xc0\x8e\xa6\xa9\xcd\xf5\xba\xab\x62\x15\x18\x9e\xb\x4c\x2b\x49\xeb\x93\x95\xe3\xfe" },
-	{ 0x53d2d0, "\x43\x2f\x53\xa0\xc2\xfd\xcc\x6\x29\x3e\x1f\x44\xab\x65\x74\x54\x49\x27\xb7\xe2\x2c\x5a\x33\x34\x1e\x16\xa7\xae\xa\x92\x55\x20\xad\x98\xf8\xa9\xe\x8b\x32\xdf\xa5\x15\xfc\x9f\x23\x3c\xc4\xc0\x4c\xbe\x89\x9a\xf0\xe4\x73\x59\x30\x9e\x82\x58\x51\x8f\xbf\xa1\xc7\xeb\xf1\x64\x1b\x4b\xc8\xc3\x38\x31\xd2\xfe\x3d\xd0\x77\xcb\xd6\x24\xf7\xc\xe5\xff\xd8\x4d\xac\x10\xe6\x76\xbb\xf\x9c\x6c\x2e\xb\x75\x78\x5d\xa3\xaf\x17\x5e\xb0\xe1\xb1\x9b\xf9\x7\x39\x6d\x7b\x1c\x2a\x9\x3f\x12\x4\xc9\xc1\xc5\x19\x61\x5\xb4\x47\x37\x5f\xd5\x94\x28\x21\x88\x97\xfa\xd3\xcf\x7f\xdd\xd4\xf3\x68\xf4\x81\x62\x84\x91\x83\x8c\x7e\x67\x63\x66\xed\xe7\xe9\x85\x6f\xdb\xaa\x87\xec\xde\x90\xba\x25\xa2\xd\x6b\x5b\x7a\x96\x70\xe0\x86\xa8\xe8\x6a\x4e\x42\x57\x2b\xb6\x40\xce\x69\x46\xb5\x72\x80\xcd\x13\xf6\xf2\x0\xda\x93\x22\x60\x3b\x7c\xb2\x48\xef\x3\xb9\x71\x4f\xc6\x45\x36\x26\xfb\xf5\xca\x2\x6e\xd9\x8d\x95\x14\x2d\x8a\xd7\xdc\x52\xee\x99\xa4\xbc\xb8\x8e\x1a\x3a\x1d\x4a\x7d\x1\xe3\x56\xa6\x50\x35\x18\x8\x79\x5c\xbd\x41\xb3\xea\x9d\x11\xd1" },
-	{ 0x53d3d0, "\xf1\xbb\x4b\x7e\xc1\x8a\x41\x12\x97\x5e\x57\x56\x9f\x2c\x5f\xb6\x47\xff\xb1\x4c\x8b\x9c\x63\xc4\xa7\x98\xb2\x31\x84\xb4\xd\x1d\xe0\x67\xfd\x2\x13\x10\xdb\x8\x83\x48\xc6\x86\xaa\xe5\x80\x9\x38\xfc\xe2\x85\xc7\x8d\xa9\x3b\x18\xa5\xb7\x32\x9b\x6a\x2e\x87\xc0\x24\xa0\xfa\x6b\x76\xa2\xe6\x7f\x5d\x7b\x40\x33\xfb\x62\xf6\x43\xd1\x6d\xa1\x29\xd5\x17\x50\xf9\x1c\xeb\xf2\x22\xc2\x51\xe4\x26\xca\x5b\xf\xf8\x96\x4e\xba\xf3\x55\xa4\x37\x36\x82\x70\x99\x20\xc9\xf5\x7c\xa8\x92\x6\x72\xe7\xb5\x9d\x44\xd2\xbf\x64\x16\x49\x3\x4a\xe3\x68\xd0\x1a\x34\x95\x7d\xcb\xbc\xd3\x78\xd7\x5a\xb0\xb9\x2f\x27\x77\xf7\x45\x25\x52\x1b\x3c\x3d\x9e\x2b\x74\x89\xa\x1f\xfe\xf0\x2a\xe1\x1\x3a\x9a\x39\x8e\x79\x71\xd8\xcc\x46\xe8\x69\x3e\xaf\x7a\x21\xad\xea\x75\x93\x15\x30\xf4\xe9\xdd\xe\x60\x28\x6e\x88\xae\x81\x4\x59\xc5\x90\xee\x61\xcf\x8f\xb8\xb3\x54\xed\x58\x6c\x91\x3f\x65\x6f\xd6\xbe\x4d\xef\xde\xa6\x8c\xc\xc3\x23\x35\x5c\xac\xd4\xda\x5\xc8\x14\x94\xd9\x19\xcd\x4f\x2d\x0\xdf\xbd\x7\x42\xab\xdc\x73\xa3\xb\x66\x53\x1e\xce\x11\xec" },
-	{ 0x53d798, "\xcc\xbb\x69\x91\x5\x73\xbe\x41\xf4\x59\x24\xa5\xf6\x28\xc7\x7a\xc1\xd5\xd\x62\x40\xb1\x32\x16\x6d\x77\xdb\xee\x65\x95\xd7\x35\x2f\x64\x30\x7\xfa\x5a\xe3\x88\x93\x6a\xeb\x31\xde\xd4\xcb\x4f\x92\xc8\x11\xfb\xd0\x4e\x3a\xdc\x7e\x15\xf1\xb4\x61\x58\xad\x9e\xfe\xb9\x6\x4a\x0\x6f\x3\x7f\x8a\x20\x3d\x22\x78\xe1\xe9\xe6\x14\xbc\x75\xe4\xf8\x19\x5b\xc4\xb3\x7d\x76\x2d\x3c\x9d\x9b\xac\x8e\xb2\x3b\xb5\xa7\x47\x9f\xc3\x36\xdf\xf9\x90\x80\x43\xf5\xa4\xe\x4d\x33\xe0\xc\xdd\xb8\x2\x7c\x8b\xf0\x45\x46\xa9\x8c\xcf\x9a\xca\xce\x84\x83\x71\x48\x39\xba\xfc\x2a\xe2\x57\xc5\x98\x97\x60\xc6\xae\xc0\xd8\x37\x81\xaa\xb6\x2b\xea\x26\x21\x4b\x55\xe5\xd2\x85\xab\xb7\x34\xbf\xd9\x70\xcd\x53\x96\xc2\xef\x63\x13\x1e\xed\x12\xc9\x74\x42\x5e\x3e\x54\x9\xd3\x89\x6e\x72\x49\x2e\xd6\x1a\x9c\xa\xa8\x6c\xbd\x10\x86\x4\x38\x50\xf2\xb\x1f\x87\x2c\x29\x17\xfd\x52\x66\x67\xf\x8d\x1\xb0\x18\xda\xe8\x1d\x94\xa3\x25\x79\x3f\x8f\x51\xa2\x23\xf3\xaf\x68\x5d\xa1\xf7\x99\x1b\xff\xec\x56\x44\x8\xa6\x6b\xe7\x5c\xd1\x1c\xa0\x5f\x7b\x4c\x82\x27" },
-	{ 0x53d970, "\xb9\xd7\x6b\x9c\x5b\xfb\xc0\x9b\xf\x49\x55\xa9\x6d\xa5\x17\xd0\xc3\xdc\x4b\xb8\xf2\xb0\x93\xee\x3c\xeb\xdf\x8d\xe1\xf6\x2f\xe2\xc4\x32\x4c\x35\x62\xb4\x92\x91\x1c\x6f\xb6\x30\xe3\x5a\xb2\x2\x5e\x64\x21\xd5\x0\xcd\xd2\xb7\xd\x81\xef\x14\xb1\x87\xf0\x8f\x20\x39\xfc\x16\x63\x38\x1a\x7a\x56\xe4\xf3\x6e\xf4\xcb\x27\x57\x34\x2b\x12\x86\x79\x3f\x7\x6\x5d\xe\xbd\x7b\x54\x8e\xf1\xc8\x51\xf5\xbf\xd8\x5\x26\x47\x67\xda\x53\x95\x98\xea\xed\x5f\x74\x41\x3a\xc\x8c\xa6\x94\x59\xb3\x8b\x46\x6c\x7c\xbe\x9e\x7d\x83\x36\x88\x31\x7e\x18\xdb\x5c\x19\xe6\xe0\x58\x9d\x72\x13\x77\xdd\xc2\xac\x75\x96\x8\x73\xd4\xa\x2c\x22\xe5\x2d\xf8\x71\xaf\x45\x2e\xc6\x76\x3d\x65\xf9\x29\x4f\x80\xd1\xd3\xe9\x69\x9a\xab\x90\x1b\x1\x1e\xc7\x15\x24\xec\xcc\xe8\xad\x3b\x10\x4d\xcf\x85\xa1\xa7\x89\x25\x11\xd9\xc1\x1d\xae\x9\xde\x6a\x44\x4a\x3e\xbb\x48\xca\xe7\x70\x4\x9f\xa8\x68\x43\xb\x8a\x52\x42\x50\xba\xfa\xce\xd6\x33\x61\x60\xa0\xa3\xf7\x3\x1f\x84\xfd\xbc\x40\x7f\x66\xaa\xc5\xb5\xa4\x37\xfe\x97\x28\xff\x78\x23\x82\xc9\x2a\x4e\x99\xa2" },
-	{ 0x53da70, "\x46\x47\x9d\xa8\xcf\xa7\x62\xc7\x30\x42\x69\x3a\x34\x5a\xbe\xd5\x59\x63\x33\x21\x2c\xa0\x6\x1e\x31\xa6\x92\x3f\xc8\x57\x5e\xbf\xa9\x90\x19\xb0\x29\x7\x12\x1f\x23\x97\xe3\xa4\xdd\xb8\x3c\xb2\x5c\xce\xda\xd0\x52\x8\x64\xc3\xc0\x9a\xca\xea\x43\x6b\x41\x1c\x8c\x7a\x7b\xd1\x94\x5\xc\x93\x15\x51\xd9\xd4\x3e\x4c\x2f\x49\x4\xd2\xee\x73\x0\xa2\x8d\x6d\x55\x2\x3\xfe\xb\xc2\x1a\xe2\xf1\x83\x80\x36\x78\xf5\x96\x40\x75\xe\x9c\x7d\xad\x32\x5f\x2b\xc9\xbb\xf4\x7c\x66\xb7\x54\x8a\x89\xff\x50\xdc\x60\x25\xb3\x6a\xfb\xe4\x4d\xab\xb9\x74\xc5\xbc\xb6\xe8\xc6\xfd\x7f\x4a\x76\x3b\x9f\x45\x18\x4f\x9e\x95\x13\xb5\x10\xf8\x22\x5d\x1d\xdb\xbd\xb4\x6f\x84\xba\x17\xd\x6c\xaa\x44\xae\xf6\xde\x81\x11\x79\x85\x86\x39\x99\x82\x38\x6e\xa3\x26\x68\xeb\xc1\x27\xed\xcb\x2e\xdf\xf7\xef\xfa\xb1\x9\xd7\xd8\x8b\xac\x37\x4e\xe7\xf0\xe1\xd6\xa\xd3\xec\x61\x72\x5b\x28\xa1\x87\x70\xf3\x71\x98\x8e\x20\x53\x16\x3d\xa5\xf2\xf9\x4b\x9b\x91\x88\x2a\x65\xf\xfc\x67\xe6\x58\x2d\x14\x56\x48\x1\x7e\x35\xaf\xc4\xe9\x8f\xe0\x1b\xcc\x24\xe5\xcd\x77" },
-	{ 0x53dbd0, "\x77\x1f\x49\xca\xc3\x17\x39\x14\x66\xde\xc5\xd9\x2f\xf\x6e\xd3\x7d\x21\x60\xec\x9a\x4b\x25\xc2\x71\xfc\xb\x81\x8e\xbf\x36\x99\xf7\x6b\x7e\x86\x10\xdc\xa7\xb0\x8b\xb9\x72\x20\xf4\x5e\x31\x74\x6c\x4f\x80\x4\xb1\xc9\xb7\xd0\xab\x7b\xd\xf6\x1d\xbc\x38\x78\xaa\x43\x3f\xf0\x82\xcf\xcb\x96\xf5\xeb\xce\xb5\x12\x29\xc0\x62\x63\x9\xf1\x2\xc1\x44\x32\x2c\xe8\x4e\xe6\x57\x7a\x83\x95\xb8\xfb\x37\xd7\x2a\x3\x5d\xef\xc7\x11\xd6\xa2\xb2\x5c\x85\xa3\x5a\x19\xfe\x8a\xad\xd2\xbd\x28\x9b\x34\x6f\x3c\x67\xe1\xc\x24\x68\x97\xb4\xda\xe3\x98\x7c\x2b\xd5\xee\xe4\xcc\x47\xcd\xb3\xe7\xfd\x61\x42\x3d\x4d\x9c\x5\x9e\x4a\xdd\xa9\xdf\x6d\x45\x6a\xd8\xfa\x16\xae\x58\x1b\x76\xf9\xa0\xe5\xb6\x1a\x59\xa5\xba\x9f\x65\xbb\xa4\xe\xd1\xd4\x51\x41\x40\xc8\xe2\xdb\xaf\x94\x64\x7f\x22\x3b\xf2\x2d\xc4\x70\x2e\x5b\x69\xc6\x56\x33\x7\xa\x15\xea\x91\x53\x1\xf8\x84\xe0\x30\x90\x75\x87\x5f\x54\x6\x46\xe9\x35\x92\x50\x79\x88\x1e\x8d\x3e\x8f\x73\x0\x18\x89\x93\x9d\x8c\x27\x1c\xa6\xbe\x23\xf3\xed\x55\x52\xa8\x26\xff\x8\x13\xac\x4c\x48\x3a\xa1" },
-	{ 0x53dd70, "\x97\xd5\x40\x91\xed\xf1\xce\xf3\xc2\x6e\x94\x19\x5f\x5b\x7d\x9b\xc\x29\x5d\xda\x71\x7c\xab\x9d\xb4\x9e\x2d\x48\x2\xa8\x0\xbe\x7b\x86\xf\x38\x56\xee\xd3\x34\xa6\xbf\x7f\x1b\x8d\x53\xe8\xdb\x61\xa4\xe2\xe1\x2e\x78\x3d\xb6\x80\xd8\xe\xfa\x6d\xd1\xe7\x6\x4e\x14\x77\x54\xae\x5\xd4\xbc\x6a\x74\x3b\x1c\x8a\xc0\xb7\x45\x92\x26\x11\xd0\x99\x57\xaf\xb3\x95\x84\xfd\xc4\xa3\x22\xa7\x39\xbd\x41\x1e\x4f\x3e\x1a\x2b\x15\xba\x64\x1\x23\xa9\x37\x58\xd\x67\x76\x2c\x8e\xca\xc8\xdc\x65\x98\x90\xea\xad\x6f\xcc\xe5\x32\xbb\x28\x70\xf5\xa5\x12\xb9\xc6\x75\xf0\x3c\x4c\x6c\x85\x73\x88\xe6\x7\x72\x69\x82\x8b\x2f\xb2\xde\x10\x6b\xdd\xff\xb1\x43\xd6\x50\xcf\xd7\xb8\x4\x68\xe0\x93\x18\x79\xa\x9\xc5\xaa\x83\x7e\x16\xf4\xc3\xcb\x96\x87\xc7\xb\x49\x3a\x62\x3f\xb5\x31\x24\xa0\x8f\xf7\x13\x30\xe9\x51\x59\xa2\x4d\x47\x4a\xe3\x8c\x55\x81\xa1\x5c\x1d\xfc\x2a\xfe\xeb\xcd\xdf\x60\x25\x89\xef\x33\x7a\x20\x66\x27\xc1\xb0\x3\xf2\x9f\xf8\x1f\x9a\x5a\x9c\x5e\xf6\x35\x21\x52\xd9\x44\xe4\x4b\xc9\xec\xd2\x63\xf9\x36\x8\xac\x42\xfb\x17\x46" },
-	{ 0x53e0d0, "\xed\xb6\x90\x15\xcd\x25\x37\x67\xfc\xf3\xd9\x12\xb8\x36\x3\x5d\xe5\x44\x43\x20\x93\x47\xfb\x9b\xca\x3b\xd0\x9c\xbf\x34\x42\x3a\x68\x73\x76\x3c\xc1\x8e\xb1\x51\x31\x98\x19\x1b\xb\xfe\xeb\x3d\xe6\x82\xea\x2\x9f\x9e\xf2\x46\x87\xfd\xb2\x83\x1f\x9\x8b\x4f\x5e\xa8\x16\xd7\xad\x71\xd2\x64\x24\x66\xe4\x48\xa\x79\x4\x84\x49\x52\xda\x8\x58\x8d\xec\x0\x7b\xe1\x2b\xd3\xc7\x96\x38\x32\x74\x2f\x60\x7a\x7d\xac\x85\x99\xa5\xbb\xc0\xf4\x10\xd4\x61\x6f\xba\x26\xc5\x3f\x8c\xb0\xf7\xee\xe8\xb3\x11\xa6\x2d\x54\x30\x1d\x2e\xe0\x1e\x6b\xc\xce\xcb\x6c\x65\x39\x4e\x5f\xdd\xef\x41\xc9\xf8\xe7\xf6\x92\xd8\x4a\xdc\x53\x40\xbd\xa4\xb5\x22\x9a\xe\x5b\xb7\xde\x5c\x8f\x29\xaf\x8a\x56\xb9\x95\x94\x5\x27\x35\x5a\x78\x18\xae\xd5\xb4\x3e\xa9\x6e\xaa\xc4\x6\x80\xc8\xf5\x6d\x55\x33\x72\xa0\x1c\x89\xa1\xa7\x2a\x97\x4b\xcf\x4d\x6a\xf9\x9d\x28\xf\x14\xa2\xff\x7e\xd6\x81\x91\x7f\x23\xd\x57\x62\x4c\x17\xc2\xc6\xf0\x77\xf1\xa3\x21\x88\x7\xab\x69\x63\xe2\xd1\x50\xcc\xe9\xdb\xc3\x86\xbc\x59\xe3\xbe\xfa\x75\x1\x45\x13\x70\xdf\x1a\x7c\x2c" },
-	{ 0x540278, "\x6c\x9f\x49\x77\xa9\x27\x95\x66\xde\xf\x58\x2f\x4c\x1c\x4b\x73\x22\xcc\xfb\x1a\x85\xf6\x9c\x8b\xc5\xdd\xb0\x15\x46\x37\x79\x2\xab\x3d\x44\x8a\x10\x87\x9e\xfc\xba\xb9\x2b\xa\xf4\xd9\xbf\x78\xf1\xef\x11\xdc\x80\xd2\xd5\xf7\x5c\xbe\xe2\xd4\x9d\xd3\x13\x1\xe1\x18\x50\x53\x43\xd7\x64\xf8\xdb\xf2\x62\xcd\x99\xe7\xa2\x0\xaf\xbc\xff\x25\x91\x5f\x83\x60\xec\x42\xb6\x47\x8e\x6a\xd\x4f\x16\xe6\x51\x14\x8f\x5\xea\x70\x3a\xca\xc7\x74\xce\x5d\x98\x31\x3b\xe9\xe0\xc3\xa4\x1b\x92\xd0\xc\x40\x4d\xb5\x7f\x8\xf9\x39\xb1\x29\xc4\xd1\x21\xac\xc0\x54\x4\x55\xcb\x17\x69\xfe\xe5\x3e\x88\x1d\xe\x7c\x76\xb2\xc6\x24\x81\x9\xe4\x59\x34\x7a\x86\xf5\xad\x5e\x38\xbb\x4a\xe3\xc8\x26\x30\xbd\xfd\x33\x72\xb4\x20\x2a\x19\x6b\x97\x32\x96\x7b\xa1\xa6\xdf\x61\x71\x7\x23\xee\xc2\x75\xb7\xaa\x7e\x67\xa0\xa3\x94\xd8\xa5\x1e\x68\xda\xa7\x48\x8c\xf0\xb3\x4e\xfa\x9b\xb\x6f\x2d\x6d\x8d\xcf\x5b\xc9\xae\x9a\x3f\x6\x1f\x90\x65\x6e\xf3\x93\xa8\x45\x12\x2c\x52\x36\xeb\x82\x3c\x7d\x57\x28\x56\xed\xd6\x63\x2e\x3\x41\xc1\xb8\x5a\x89\x35\xe8\x84" },
-	{ 0x5406e8, "\xbb\x3b\x8c\x61\x95\x4d\x8e\x4c\xe1\xae\xff\xc4\x47\x64\xc9\xb7\xd3\xca\xb\xed\xef\xc0\xc7\x43\x1c\x66\xb9\xd9\xea\x2f\xa0\xfb\xcc\xfa\x50\xd\x55\x46\x96\x24\x21\x70\xe0\x6\x33\xf3\x0\xd5\x67\x1a\x13\xde\xa5\x7c\x74\xfe\x1f\xaa\x73\xc3\x15\x93\x9f\xd7\x2b\x14\xcb\x7b\xb8\xe4\x91\xf0\xaf\x9\x23\x4f\x5e\x6d\xe\x89\xc5\x30\x77\x68\x1\xfc\xe3\xf4\xa8\x9e\xc2\xcd\xe6\x71\x44\x2c\x3\xc1\xa9\x62\x9b\xee\xbf\x2e\x65\x12\xb2\x25\x8f\x5a\x31\xe2\xf6\x7\xd6\x48\xad\xeb\xcf\x19\xd0\xbc\x29\x92\x16\xba\x9d\x3c\x9c\x94\x3a\x80\x2\xa4\x7f\x11\x1d\x63\xe7\x6c\x40\x86\x76\xf9\x83\x54\xa3\x84\x72\x18\x4b\xf7\x7a\xf1\x4a\xd2\xfd\xec\x2d\x8a\x3d\x7e\x78\xda\x42\x3e\x27\xdd\x5c\x69\xc6\xe9\xf8\xa1\x98\x36\x35\x60\x51\x85\x88\x53\xac\x10\xd4\x4\xdc\x6a\x7d\x9a\xb0\xa6\xc\xe5\x56\x32\x6b\xa2\xe8\x57\x38\x20\xce\x5b\x8d\xf2\x81\x22\x1b\x3f\x87\xbd\xa\x17\xb5\x34\xc8\x1e\x8b\x5\x8\xb1\x75\x59\xf5\x45\x79\x49\x5f\x41\x37\x28\xd1\x39\xab\x26\xa7\xb4\xf\xdf\xb6\xdb\xb3\x4e\x2a\x58\x52\xd8\x82\x90\x5d\x99\xbe\x6f\x97\x6e" },
-	{ 0x5409e8, "\x2e\x94\x26\x55\x6c\xd6\xe3\x30\x16\x24\xae\xb8\x39\x13\x48\x85\x2\xa\xa8\xb9\xfb\x58\x3e\x59\x40\x37\x89\x4c\x68\xc9\x5b\xdb\xee\x83\xb\x64\x49\xf0\x52\xeb\x3f\x65\xbc\xfa\xa4\x6\x76\x27\xec\xc2\xe0\x53\x2a\x3c\x2b\xa2\x3d\x12\xde\xc7\xfc\xd7\x5\xed\xff\xc0\x9d\x14\x4a\xf7\xa3\x87\x79\x96\xa6\x7e\xd3\x1b\xf5\x90\x3\x80\x19\x4f\x77\x2f\xb1\x84\x7a\xe\x8e\xef\x62\xcd\xce\x9a\xd8\xb2\x69\xc4\xb0\xda\x23\x8\x11\xa0\x6b\x73\x4d\x9\x4e\x8c\x17\x21\x67\xbb\xd5\xcc\x20\x36\xea\x95\xe1\x5c\xe2\x7d\xe7\xc\x33\x5f\x99\xa5\xf4\x44\xdd\x25\xc1\x35\x29\x1a\x1c\x28\xb4\x9c\x34\x6f\x15\xa7\xf9\xe6\xb5\xd4\xe9\x9b\x1\x31\xf8\x72\xb3\x2d\x70\xdc\xfd\x46\x1f\x42\x8f\xcb\x54\x63\x93\x8d\x41\x5e\x9f\xe8\xf1\xe4\xb6\x71\x18\xbd\x6e\x7f\x81\x32\xd0\x74\xfe\x0\xcf\x47\xc6\xaf\x82\x38\x91\xac\xad\xc3\xb7\x6d\x1d\x8a\x98\xca\x97\x1e\x60\x7b\x88\xaa\xd2\xd1\xa1\x86\x61\xba\xc8\x10\x22\x3a\x9e\x51\x43\x92\x75\x3b\x56\xf2\x45\xa9\xbe\xd9\x78\x5d\x5a\x4\x4b\xd\x66\xf3\x7\x57\x7c\x2c\xe5\x50\xc5\xbf\xf\x6a\xf6\xdf\x8b\xab" },
-	{ 0x540d18, "\x7a\x2e\x7c\x16\x54\x74\xa6\xd7\x3d\x42\x25\xa\x4c\x87\xff\xbd\xc6\xcf\xaa\x78\x0\x95\x91\x68\x50\x7e\x4\xbe\xf\x83\xc7\x82\x9a\xa1\x36\xe2\x9b\x43\x62\x79\xe4\x73\x93\x56\x17\xb5\x60\xf9\xf0\xd\x2\xef\xbb\x22\x1c\xfb\x28\x94\x1e\xdc\x1d\x2a\x7\x72\xa0\x2f\x40\xed\x6c\x7b\xcc\xb4\xbc\xeb\xf4\xa3\x96\x7d\xb8\xf6\x75\x9\xc5\xf2\x70\x33\xc2\x13\xf7\xdb\x97\x1b\x6f\x3\xe3\x6\x44\xc1\xd3\x2b\x4d\xe9\xb9\xe1\x64\x20\x8d\x18\x76\x9d\xda\x67\xa7\x9c\x32\xb\x6a\x99\xf1\x41\x59\x71\x23\x14\x88\xac\x49\x37\xba\xe6\xe0\x51\x4f\xfd\x8e\xe7\xd5\xcd\xd6\xb2\x58\xa8\x55\xa2\xc3\xdf\x5e\x9e\xc9\xd2\xd8\x7f\x84\x39\xb6\xab\x63\x9f\xfa\x69\xfe\x21\xb0\x3a\x1f\x34\x5c\x4a\xbf\xe8\x52\x8a\x4e\x30\x5b\x92\x46\x4b\x8b\x5f\x8f\x90\x6e\x61\x89\x3e\xd9\x27\xaf\xee\x26\x98\xb1\xde\x19\xca\xf3\x86\x53\xa4\xd0\xad\x1a\x47\x80\x85\x45\x2d\xc8\xe\xa9\x3b\x65\xb7\x8\x24\xb3\xc\x11\x35\x15\xdd\x5\xce\x5a\xea\x2c\x6b\xec\xe5\xf8\x3c\x77\xcb\x6d\xc0\xd4\xae\x81\x57\x31\x12\x10\xfc\x3f\x1\x29\xd1\x38\x8c\x5d\xf5\xc4\xa5\x66\x48" },
-	{ 0x541218, "\x6e\x60\xba\x8c\x16\x67\xc7\xd9\xa1\xf9\x25\x41\x77\x6\x4b\x81\x98\xfb\x39\xe0\x7d\xa0\x10\xa4\x31\xf\xe5\x2b\x2d\xea\x68\xdf\x3d\xc8\xd5\x62\xaf\x83\xbd\xdb\x18\x88\xc4\xa9\x14\x38\x7f\x95\x5b\x51\xeb\x8e\xc\x2\xd0\x1\x6a\xcf\x92\x20\x7e\xc2\xc5\x36\xa6\xcd\x89\x64\x22\x8a\x96\xff\x49\xad\xb0\xc1\x13\x32\xa2\x99\x59\x17\xa5\x56\x29\x3b\x84\x93\x33\x5\x1c\x26\x94\xe8\x5d\xb8\x4\x5c\x4d\x46\xe9\x80\x4c\x45\x85\x9c\xb6\x11\xb1\xdd\x9b\x78\x9e\x8d\xac\xe2\x73\xbf\x82\xd2\x97\x57\x12\x63\xa8\x1a\xf2\xbc\x0\xc3\xcb\x7c\xf3\xe4\xdc\xd1\xed\xce\xd4\x6d\x15\x44\x8b\x52\x75\xd8\x7\x48\xfe\xe\xf6\x1f\xe3\x6c\x4e\x40\x4a\x91\x61\x70\xae\xe6\x19\xcc\x66\x1e\xa7\xd3\x43\xda\xde\x2a\xb4\x3e\x3a\xca\x9a\x5e\x71\xd\x34\xef\xb5\xb\x55\xbb\xee\x35\x50\x69\x4f\x9\x7b\x1d\x47\x86\x53\xb3\xbe\x79\xa3\xb9\x24\x8f\xe1\x1b\x58\xa\xd7\x2f\xfc\x8\x72\xf5\xe7\x7a\x5a\x54\xb7\x87\xfd\xf0\xc0\xc9\x30\x27\x3\xf1\xd6\x74\x3f\x90\xf7\x37\xf8\x28\x9f\x42\x6b\xab\x76\x23\x65\x6f\x2e\xb2\x21\xc6\x3c\x2c\xfa\xf4\x9d\x5f\xec\xaa" },
-	{ 0x547d98, "\x84\xf6\x55\x2c\x2b\xb\x30\xb6\xd7\x91\x7b\xea\xfc\x8b\xb9\x6d\x11\x2a\x4a\xba\xc5\xfb\x8\x5c\xda\x3\x9f\x52\x8e\x81\xc4\xb3\xa5\x38\xf1\xc7\xca\xd9\xfe\x58\xcd\x42\x1a\xd8\xbd\x9a\xa4\x45\x36\x4f\x4e\x43\x9c\xe0\x9d\xd2\xd4\x19\x98\x26\xdd\x5d\xa8\x28\xfd\xc2\x31\xa0\xed\xbe\x1d\xd6\x68\x3a\x9\x12\xcc\x48\xa6\x95\x66\x6a\x92\xbb\xbc\xaf\xaa\x93\x53\x2d\xb0\xf2\xd\xd1\xcb\x2\x76\xb4\x5\x4c\x85\xde\x51\xe1\x54\x47\x8f\x70\xf5\xb1\x96\x18\x78\xfa\x39\x62\x88\x6e\x9b\x59\x8d\x8c\x87\x1\xf\x4d\x6\xa7\xe3\xb7\x77\xb2\xf0\x1b\x7a\x83\x50\x1f\x8a\xe8\x5f\xae\x4b\xeb\x13\xe5\xdf\x7\x41\x63\xf4\xc3\x64\x32\x21\x29\x94\xa9\x16\x6b\xa\x3b\xd3\x69\x5a\xa2\xff\x72\xef\x89\x2e\x7c\x82\xab\x49\x22\x61\x34\xdb\x7d\x5b\x5e\x65\x6c\xdc\xf7\x2f\x10\x3f\x60\xac\xc\xf3\xbf\x46\x86\x44\x99\xf9\xc8\x35\xec\xd5\x1e\x6f\x15\x4\x97\xc6\x25\x90\x1c\x80\x75\x3d\xa1\x33\x0\xd0\x7e\xb5\xe\x57\xe7\x67\x23\x17\x74\x27\x7f\xce\x3c\xad\xee\x3e\x37\x24\xe9\x71\x20\xe6\xe4\x9e\xa3\x73\xf8\xe2\x14\xc1\x56\x79\xcf\xb8\xc0\xc9\x40" },
-	{ 0x547f10, "\x5\x3d\xbf\x26\xdf\xc3\xc0\xfd\xa2\xb\xee\x82\xad\xbd\x48\x1f\x66\x2c\x57\x13\x3e\x5c\x50\xe7\x29\xb7\x62\x32\x85\xe3\x9c\xf0\x69\xa6\x65\x92\x84\x9f\x54\xec\xa0\x15\xf9\x0\x78\xf7\xe1\xb5\xb8\xf2\x7f\xae\xf5\x44\xb2\xd6\xcb\xc\x8e\x7d\x4\xb1\x36\x24\xe\xa\x16\x43\xfe\x77\xb9\x63\xc5\x49\x3f\x71\xf6\x64\xc6\x87\xd0\x1c\xa1\x7e\x7c\x23\xd8\x67\x9b\x59\x53\xf3\xa5\xce\x7a\xb0\x68\x3a\xd9\xe9\x8a\xcc\x80\x45\xe4\x6\x4e\x2f\xd5\x6c\xea\x19\x9e\x97\xe2\x8d\x60\x37\x8b\xd4\xdd\x81\x5b\xa4\x8\xf1\x2d\x4d\x6a\xfa\xe0\x75\xa9\xe6\xd3\x76\x31\x86\xc1\xa8\x46\x72\x58\x38\x2a\x96\x73\xc4\xc7\x51\x9d\x30\xd2\x88\x27\xc8\x95\x52\x1d\x21\x94\x5e\x1\x56\x3b\x9\xdc\xa7\x79\x3\x7b\x39\x28\x6e\x1e\xc2\x2b\x70\x99\x6f\xff\x17\x18\xda\xaf\x2e\xb3\xba\x42\x5a\x55\x10\xd7\xe8\x47\xfb\x83\x8c\x5d\x6b\x3c\xab\xeb\xef\x25\x5f\x22\xb6\x33\x9a\xcd\x2\xb4\x91\x7\xd\xf\xdb\x1a\x61\x12\xbc\xcf\x34\xbb\x6d\x20\x4c\x11\x4a\xaa\xfc\x41\xe5\x1b\x74\xde\xbe\x4b\x40\x90\x98\xf8\x4f\x14\xca\xf4\xac\x93\x35\x8f\xc9\x89\xd1\xed\xa3" },
-	{ 0x5387b0, "\x78\x56\x88\x23\x55\xb3\xa8\xaf\x59\xea\x6\x1f\x73\x25\xb0\xe1\x70\x4d\x82\x58\x26\xe7\x40\x1a\x6c\xc1\x48\xb1\xf0\xba\xff\x0\xab\x2d\xa6\x22\x43\xee\x19\x8c\xe\xda\x17\x53\x85\xbd\x1d\x6b\xf8\x50\xce\x76\x4\xdd\xa7\xf1\x8e\x52\x37\xa2\x51\xe3\x69\x3a\x1c\x16\x68\x4a\x86\xbb\xb6\x6f\xdc\xfe\x14\xc\x79\x5e\xf4\x96\x42\x54\x2e\x84\x5f\xb5\xbf\xcf\x61\x7d\xd7\x98\x71\x3e\xcd\x20\x3f\xd0\xae\xa9\xd\xc7\x8\x65\x8d\x3c\x81\x29\xb8\x6d\xb4\x80\xd1\x4b\x5b\x28\xa5\x4c\xa0\x6e\x90\xa\x11\x3\x64\x21\xdf\x2f\x24\xeb\xf2\x7b\xc5\xac\xb\xec\xed\x66\xd6\xe0\x9\x41\x32\xcb\x83\x93\xfa\x15\xe5\x27\x5a\x87\x44\xd4\xde\xf\x3b\x1\xb7\x2a\xf3\xa1\xd5\x72\xb2\x6a\x2b\x95\x7a\x8b\xca\x7e\x18\x7f\x47\xe6\xdb\x49\xf7\x9a\x9e\xad\x9d\x57\xf6\x60\xd2\xfc\x30\xfb\x9b\x45\xd9\x2c\xf5\x5d\x33\x1b\xc4\x89\x13\x35\x67\xef\x2\x36\x92\x99\x39\xf9\xaa\x74\xe2\x5c\x3d\xc3\x63\xcc\xc9\x62\xa4\xfd\x34\x12\xbe\xc0\xc8\xc2\x7\x10\x75\x31\xe8\xbc\xd8\x97\x4f\x46\x1e\x7c\x38\x4e\x94\x9f\xc6\x8f\xe9\x91\xe4\x8a\xa3\xb9\x9c\x5\x77\xd3" },
-	{ 0x539420, "\xbb\x1a\x8e\x40\x7\x47\x3e\x6e\xb1\xfa\xa5\x63\x7c\xec\xa9\x75\x55\x76\xd2\xa6\xcb\xe4\x2d\xc6\x43\xa8\x18\x79\x48\xf0\x38\xd0\x9a\x8\xd5\xa0\x22\x7b\xc1\x84\x5a\x6b\xae\xd7\xbe\xb9\x50\xcf\x46\x70\x91\xed\xba\x8f\x7f\x1\xc5\x7d\x34\xf4\x14\x2\xe3\x2f\x64\x96\xb2\xee\x94\x4e\x90\x20\xd9\x95\x30\xca\x65\xf\xb\xd4\xd6\xde\xeb\x2a\x62\xd8\xc7\xdd\xe8\xe2\x4c\xbc\x77\x81\x66\x24\xc9\xb7\x60\x12\x39\xda\x71\xf1\x4d\x6c\xa\xf9\xb5\x6\x52\x3b\xa3\xb3\x7a\x35\x13\xe5\x57\x33\xc0\x16\x17\xfb\x87\xe7\xa1\x42\xe1\x67\x44\x54\x3d\xa4\x9\x19\x61\x15\x29\xb0\x0\xbf\xac\x5d\x1e\x27\x99\x56\x26\x83\x11\x5f\x69\x4f\x1d\xf5\x5\x8c\xff\x2b\x1c\x59\x21\xaf\xa2\xe\xdc\xb8\x85\x78\x80\x6a\x5c\x4\xfd\x25\x6d\x32\x9c\x8a\xc2\x8b\xf3\x9f\xb4\xd\x74\x9b\x8d\x97\x4a\xc3\x9d\x7e\xad\x28\x1b\x98\x53\xaa\x36\xf2\x49\xc8\xce\x73\xf8\xfc\x68\xef\xe6\x89\x3a\xea\x37\x31\xcd\xe0\x86\x3f\xb6\xab\xdf\x58\x23\x41\x3c\x88\x1f\xbd\x2e\xe9\xc4\x82\x72\xcc\x6f\xf6\xd3\x4b\xa7\x93\x5e\xfe\xf7\x51\x45\xd1\x10\x2c\x92\x5b\x9e\xdb\x3\xc" },
-	{ 0x547c10, "\xb4\x8f\x68\x29\x2d\x91\x41\x34\x56\x3a\x46\xf8\xcf\x63\xb8\xb2\x1d\xcc\xb5\x5f\xe0\x83\xd0\x66\x28\x60\xa0\x20\x88\x3\x9b\x4\x36\x55\x1f\x6d\x24\x62\x7b\x99\x53\xf2\x86\x4b\xff\x3b\xe9\xce\x92\xa5\x71\x5a\x7\xd2\x4a\xdb\xa2\x9d\xf4\xfc\xc9\x90\xac\x72\x77\x1\xb9\x2a\xf1\xd4\xfa\xc2\x61\xc0\xcb\xf5\x6b\x18\x67\xc6\x0\x9\x58\xfb\xba\x3c\x1c\x49\xae\xe6\x38\x40\x80\x97\xdd\x14\xf\x69\x89\x4c\x59\x16\x9a\x2e\x4f\x4e\x5\x33\x3d\xa6\xb6\x6a\x13\x30\xca\xeb\x25\x65\xd7\x57\xa9\x6c\xb1\xde\xd5\xcd\xed\x7c\x15\xbc\x19\xa4\x85\xc1\xa1\x73\xef\xbe\xc5\x35\xe\x7e\x47\x8\x64\xf6\x3f\x8a\xf7\x52\x75\xe5\x48\x37\x23\x8c\xdf\xa7\xd3\xe1\x2\xd\xa8\xe4\x74\x5d\xc4\xad\xf3\xbb\x54\x70\xbf\xdc\x1a\xec\xc3\x31\x1b\xa\x7d\x93\xb7\x9e\x2c\xd1\xfd\xe3\x3e\x96\xd9\x51\x12\xe7\xd8\x50\xb\xe8\xe2\x17\x4d\x5e\xd6\x39\xc7\x5b\x6e\x21\x84\x22\x11\x82\xf9\x26\x1e\x6f\x95\x6\xea\x10\x98\x2f\x78\x5c\x32\x45\xaf\x8d\xf0\x7a\xbd\xaa\x81\xda\xb3\xc\xfe\xc8\x2b\x76\x79\x8b\x94\xb0\xa3\x7f\xee\x42\x87\xab\x27\x9c\x44\x43\x8e\x9f" },
-	{ 0x541400, "\x7b\x35\x11\x79\x7\x2f\xf6\x82\x8e\xb4\x6e\xd2\x6d\xc5\x8c\x1c\xe0\xd6\x34\xf0\x4f\x25\x59\xe8\xdf\x1d\xeb\x32\x86\x51\xa4\xf2\x5c\xd1\xc8\x41\xec\x9d\x62\xac\xdd\x3e\xb8\x65\x75\x89\x12\x6c\x40\x4e\xc7\x27\xe1\x37\xcf\x9\x16\x78\xaa\x58\xd\xe6\x54\xfe\x8f\xfd\xf9\x61\x26\x3f\x2e\xcd\x2c\x4\xb2\x80\xf\x14\x6f\xc6\xab\xfb\x13\xdb\x9a\x21\xb3\xc0\xa9\x19\x70\xf3\x2b\xae\x9b\x49\xb7\xa8\x24\x1b\x48\xea\xed\xd9\x47\x9e\x9c\x69\x3c\x66\xbb\x6\x46\x38\x17\xb5\xcb\x5\x4a\x5e\x15\x20\xb9\xb6\x33\x4c\x7d\xa3\xd7\xb1\x23\x72\xc3\x4b\x63\xbe\xf7\x5b\x74\x64\x77\xcc\xd3\x85\xde\x1a\x31\x97\xa2\x8b\xfc\x10\x5f\xdc\xd5\xb0\xbd\x55\xc1\xe7\xc\x50\x43\x39\x71\x52\xe5\xaf\x8a\x60\x92\x2d\xd8\x3\xf5\x28\xca\xef\xd0\xc2\x53\x91\xa6\x73\x56\xa5\xf1\x57\x42\xf4\xd4\x36\x8d\xbc\xe9\x7e\x2\x76\x18\xb\x84\x5a\xe2\xbf\x68\x95\x29\x98\xad\x88\x1f\x81\x67\xa1\x3a\xa7\x22\xf8\x1\xa0\xce\x7a\xda\x30\xc4\xe4\xee\x7c\x3b\x4d\x3d\xe3\xfa\x6a\x7f\x99\x0\x93\xe\xff\x90\xa\x2a\x5d\x96\x8\x6b\x83\xba\x1e\x44\x87\x45\x9f\xc9\x94" },
-	{ 0x541588, "\x11\x2b\xc0\x60\xd2\xf5\x1f\x42\xf7\x8e\x13\x8c\x68\x7b\x90\x26\xd1\x28\xa3\x9d\xd\xb6\x9a\x1b\xb5\xa0\xba\x7d\xa8\xd5\xe\x88\x93\xa6\xbe\x98\xd6\xe4\x50\xa1\x3e\xb7\x8d\x94\x46\x4a\xbc\xd7\xd4\xf1\x59\x97\x2a\x66\x2\xe1\x3d\xf\x1e\xe5\xc5\x49\xe9\xa4\x99\x6f\x6\x37\x96\xdb\x58\xd0\xfe\x2c\xe8\x21\x38\x71\x62\xb4\xda\x12\xac\x79\x17\x5b\xc8\x82\xeb\xf0\xe2\x3\x80\xaa\x9e\xb\xe3\x5a\xc1\x91\x35\x75\xea\xfa\x20\xdd\x23\x84\x31\x9b\x5d\x78\x7a\xc\x27\xa7\xf3\xa2\xa9\x87\x52\xb8\xf9\x5e\x9\x6e\x64\xc9\x18\xd8\xee\x86\x2f\x30\x7f\xb2\x3a\x47\xb3\x74\xde\xe7\x4b\x2e\x41\x29\x5\x33\x15\xfd\x7e\x22\xf6\x70\xbb\x67\x34\xf4\xab\x92\x1a\xe6\xa5\x7\x65\x3f\x39\x95\xef\xb1\x24\x85\xfc\x53\xf2\x1c\x8f\x81\x48\x5f\x25\x76\xdc\x19\x56\xcd\x2d\xff\x43\xbf\x4e\xb0\x1\x0\x9f\x51\xc7\x57\xad\x73\x72\xc4\x8\xbd\xa\x7c\x1d\x40\x77\x61\xb9\x89\x9c\x3b\x8a\x16\xc6\xcb\xce\x4f\x63\xd9\x6d\xcf\x3c\x6b\x54\xdf\x4c\x10\x8b\x69\x32\xe0\x45\xaf\x4d\x83\x5c\xec\xc3\x14\xf8\xed\xc2\x6c\xca\x55\x44\x6a\xcc\xfb\x36\xae\x4\xd3" },
-	{ 0x541688, "\x6b\x1d\x53\x81\xa\x82\x7\x16\x41\x54\xa0\xbd\x87\x3\x20\x2d\xf7\xb5\x4\x59\x1b\xdf\x8c\x22\xe2\x10\x9\x55\x9e\xef\xa6\x57\x65\x7f\x3a\x35\x9c\x3e\xfe\x40\xfd\x17\xc0\x26\x33\x38\x7b\x6a\x5c\xd1\x50\x14\xec\x49\xfb\xa9\xe5\x1e\xf3\xea\xde\xdd\x44\x75\x46\xc9\x2b\xcb\xbb\x27\xab\x15\xe7\xed\x91\xda\x25\x4e\x5b\xb7\xee\x77\x58\xb8\xe4\x48\x63\x47\xd9\x0\xb0\xfa\xe1\xff\xb3\x72\x32\x3f\x29\x19\x68\x1\x23\xcc\x93\x8d\xd3\x31\xf9\xcf\xf6\x73\x8a\x4f\x11\xe6\xca\xa8\x18\x97\xc2\xd\x92\x62\x84\x85\x3b\x52\x6f\x9b\x6e\x5f\xe3\x9a\xce\xdb\x3d\x70\x95\xb\xdc\xc1\x2\xae\xc5\x56\x7e\x8b\x2a\xf5\x86\x28\xe0\xf1\x42\x83\xd5\xc8\xc7\x8\x4a\x5e\xf\xf8\x78\x5a\x1a\x66\x36\xfc\xd7\x34\x2c\xc3\x76\xbf\xe8\x21\x8e\x2f\x69\x7d\xa3\x98\x67\xa4\x8f\xe\xf2\xaf\x61\x4d\x24\xba\xaa\x7a\x6d\x5\xb9\x89\xbc\x2e\x30\x4b\xb4\x6c\x80\x1c\x9d\xc6\x3c\xb1\xd0\x88\xb6\xa1\xcd\xb2\xc\xbe\x79\xa2\xd8\x99\x4c\xd2\x74\x37\x51\x71\x9f\x13\x6\x90\xeb\xc4\xa7\xf0\xa5\xd6\x12\x45\xac\x64\xf4\x1f\xe9\x43\x96\x7c\x5d\x39\xd4\xad\x60\x94" },
-	{ 0x541988, "\x4b\x8e\xb4\x43\x5a\xcc\x15\xc0\xa0\x22\x21\x58\xec\xad\xde\x42\x4a\x70\xd4\x26\xc6\xeb\x3a\x61\xbd\x99\x20\x92\xfe\x9d\x68\xae\x1f\x11\x5c\xcb\x8\x66\x49\xe1\x2e\x96\xf2\xca\xdd\xb0\x37\xfd\x86\xa1\x7d\x7b\xbe\xf5\xd9\x60\x6d\x63\xe0\xe8\x84\xf8\x75\x44\x6b\xab\x81\xe5\xa5\xe4\xd6\x3e\x10\x3\x97\xd8\xbc\x5\x98\x1a\xa\xd\x5d\xf1\x8a\x2c\x82\x34\xc8\x4e\x2b\xfa\x7\x4c\x2d\x6c\xc1\x5e\x46\x29\x9a\xc7\xb8\xb9\x56\xa2\x7f\x1d\x3d\x1e\x9c\x80\x6e\xb5\xe\x7a\xcf\xfc\x30\xd5\x95\xa3\xb2\x1b\xf4\xe2\x89\x28\x12\xc5\x3f\xf9\x2f\xc9\x4d\xed\x40\x1\x59\xb6\x85\x50\x77\xe7\xf7\x2a\x76\x51\x78\xc2\x8f\x94\x87\xe6\x8b\x9\x93\x8d\x57\xda\x79\x2\x71\x55\x19\xb3\x5f\x69\xdc\x25\x18\xd2\xf3\x4f\xba\xea\x9e\xaf\x31\xee\xa9\x0\x35\x90\xff\x6\x1c\x4\x13\xce\x14\x39\x5b\xdb\x38\x36\x24\x27\xfb\xac\x52\xd0\x6a\x74\xf0\x62\x45\x72\xbf\x65\x9b\x91\x48\xd1\xb\x32\xb7\xdf\x88\xf6\x41\xa6\x9f\xd3\xc\x7e\x6f\xaa\x73\xd7\xc4\xa4\xe9\x17\xcd\xb1\x3b\x64\x8c\xf\xef\x54\x83\x7c\xa8\x23\xe3\x16\xc3\x47\x3c\xa7\x33\x67\x53\xbb" },
-	{ 0x541b30, "\xc9\x4d\x8e\xe5\xaf\x88\xa5\x73\xeb\x9e\x4e\xdc\x6b\x68\x28\x79\x7b\xad\x2c\xe\x51\xe1\xc6\x1f\x71\xb2\x61\x7\x42\x49\x35\x1a\xf2\x80\xd2\xd7\x82\xc3\x2b\xa2\xb6\x8b\xec\xa0\x2a\x29\xe7\x8a\x1c\x4b\xdf\xf7\xba\xb1\xdb\xee\x43\x7e\x87\xa7\xfa\x19\xb5\xf1\x95\x4f\xce\x66\xd9\xae\x11\x46\xa\xb8\x40\xf6\xe3\xbc\x77\xf8\xb3\x78\xf3\x5a\xac\xb0\x63\x8d\xcd\x64\x39\xa1\xa4\x9a\x4a\x69\x41\xed\x98\x37\xfb\x3f\xd0\xaa\x6\x7c\x7d\x3d\x94\xa6\x5f\x24\x12\x8\x9d\x32\xc4\x3b\xda\xa3\x10\x34\x8c\xd8\x5c\xcb\x20\x5b\x70\x86\x14\x27\x36\x1\xe9\x3\xc5\xa9\x67\xfd\x9b\x57\x6c\x0\x2e\x4\x84\xf\x26\x72\x92\x58\x17\x83\x2d\xdd\x6f\x62\xc7\xc\x55\x6d\xd5\x13\x3c\x5d\xb4\x5e\xea\x47\xc8\x25\xca\x59\xe0\x97\x21\x9c\x96\x93\x2f\x1e\x8f\x7a\xbf\xcc\xde\xf9\x16\x22\xf0\x81\x75\x3e\xd\x4c\xfe\x23\xbe\xa8\x76\x1b\xf5\x56\x18\x2\xe2\x33\xd3\xf4\xab\xb9\x6e\xc0\xff\xb\x1d\x60\x85\x30\x3a\xe6\x65\xd1\x52\x53\x54\xb7\x9f\x48\x89\xc2\x15\x74\xcf\x9\xc1\x38\x7f\x44\x99\xbb\x45\x31\x90\xd4\x5\xbd\x91\xfc\xef\x50\xe8\x6a\xd6\xe4" },
-	{ 0x541c30, "\x76\xad\x9\x82\xbd\xb\x69\x6a\xe0\xac\xd4\x34\x31\xd2\x83\xe2\xe7\x28\x70\xe8\xc1\xdf\xa\x2d\xbe\xd5\xe9\xe3\xfb\x79\x7c\xff\xf0\xe6\x85\x43\x47\xb2\x64\x92\x81\x80\xb4\x6d\xf7\xee\x1\x1f\x60\x48\x8e\xa4\x54\x74\x50\x4a\x2a\x5e\x39\x5f\x8f\x46\xb1\x8\x12\xf3\xde\xbf\xcb\x2\xdd\xa2\x9e\xd6\x6f\x9a\x9c\x3d\x93\x77\x2f\x21\xf1\x19\x9f\xcd\x2c\xeb\x30\x13\x89\x88\xa1\x71\x17\x7\x73\x32\x16\xc6\x4d\x3a\xb5\xa3\xa7\x1e\x10\x65\x23\x7b\x5c\xd7\xcc\x15\xca\xae\x6b\x91\xef\x1c\xe\x8c\xda\x72\x4c\x6\x0\xdb\x8d\xbb\xb7\x26\xd\x6c\x37\x8a\x84\x2b\xf2\xd3\x41\xaa\x6e\x7d\xc2\xfc\x3e\xd1\x4\x45\x68\xb9\x27\xe4\x58\xb0\x1b\x44\x40\xba\x53\xd8\x66\x14\xe1\x67\x5\x5d\xc\x96\xf8\x4e\x98\x7e\xf4\x3\x99\x52\x51\x4f\x11\xa8\x1a\x9d\x86\x97\xc5\xf\x25\x75\xc8\x94\xa5\xb8\xec\xa6\xa0\x38\xab\xc9\x36\x24\x35\xc0\xc7\x90\xd0\x55\xfa\x95\xaf\x49\xfd\x7f\x42\x87\x7a\x3f\x56\xf5\x3c\x62\xc3\x59\xb3\x33\xa9\x2e\x1d\xea\xbc\x63\x18\xed\xd9\x3b\xf9\xc4\x78\x22\x5a\x29\xfe\x9b\x61\xe5\x5b\x8b\xce\x4b\x57\xcf\x20\xdc\xf6\xb6" },
-	{ 0x541db8, "\xf\x3\xdb\xb5\x48\x8b\xe2\xbd\x4a\xc7\xdc\x63\xe9\x71\x94\x3d\xf7\xf9\x1c\xfa\x77\x1e\xea\x97\x9e\x57\x43\x91\xf8\xae\x4f\x55\x9b\xd1\x32\x67\xcf\x90\x2b\xac\x3a\xb4\x6\x85\x98\xc\xc1\x2c\xec\x40\xbf\x9\x59\xde\xcb\x6b\xa1\xad\x47\xbb\xd2\x22\x64\xa4\xb\xe5\xce\xd0\xff\xd4\x41\x45\x51\x65\xb9\xdd\x5\x38\xb6\xc2\x35\x21\xab\xc4\x1d\x1f\xa2\x74\x0\x5e\x93\xa\xe\x68\xda\x95\xf5\x6a\x1\xbc\xfe\x16\x12\xfc\x62\x2a\xf3\xf6\x7c\x5a\x46\x1a\xcd\xc3\x7b\x42\x27\x8f\x25\xa6\xca\x6c\xa7\xf2\x23\x5d\xd5\x54\xe4\xc5\x20\x50\x56\x3e\x69\x70\x52\xed\x7\x17\x66\x8a\xb1\x82\x37\xef\x3b\xfb\xd9\x7e\x36\x2e\x9a\x1b\x2f\x29\xe7\xa9\x83\xe3\xa3\x8c\xf1\x2d\x49\xd7\x31\x10\x78\x8e\xb2\x87\xd8\xe8\x5f\xb0\x76\x9d\x79\xc9\x4e\xe1\xe0\xee\xf4\x13\x9f\x14\xbe\x73\xb8\x88\x3c\x86\x7a\xa5\xba\x58\x7d\x6e\xa0\xc8\x11\x30\x61\x81\x33\xd6\x4c\x9c\x18\xf0\xfd\x99\x3f\xc0\x80\x28\x5b\x72\x4d\x6f\x92\xeb\x24\x75\x89\x8d\x15\xcc\x60\xaa\x4\x26\xd3\xdf\x8\x2\x5c\xa8\xe6\x44\x7f\xb7\x96\x39\xc6\x19\x34\xaf\xd\x53\x6d\x4b\xb3\x84" },
-	{ 0x541fe0, "\x30\x7a\x4b\x48\x47\x3f\xc8\x2e\xde\xb1\x5f\x96\xe3\x40\xb3\xdf\x70\x73\x67\x87\x78\xdd\xa\x6b\xb5\x2f\xf0\x13\xc5\x1c\x7f\xa1\x8b\xb4\x8e\xeb\x63\xd5\x89\x9d\x0\x68\xab\x9\xfe\x76\x71\xb7\x5d\x92\xc1\xdc\x46\x79\x8c\x16\xf3\x1a\xc9\xd\x3b\xf6\xad\xe7\xa5\x45\x3\xee\xd1\x5c\xb6\xbc\x52\xc3\x3a\x94\x1f\xe2\x6f\x14\xca\x29\x69\x4a\xe5\x51\x31\xff\xaf\x50\x9a\xcc\xf4\x39\x7\x86\x82\xfa\xac\x20\x26\x83\x9f\x54\x11\xa3\x1e\x81\x43\x2c\x8\x8d\x5a\x85\xa2\xcb\x2a\x35\xb2\xda\x2d\xfd\xc4\x37\xa7\x3e\x7e\x75\x65\xa8\x66\x1\x25\x32\xd4\x4f\xa0\x1b\x6\xae\x28\x15\x9b\xba\x2b\x34\x77\x8f\xec\x99\x7c\xc0\xb9\xf9\x88\xce\xe9\x84\x93\xb0\x22\xcf\xed\xf\x7d\x74\xe0\x61\x2\xa6\xbf\x58\xea\xf2\x95\xfc\x6c\x56\x91\x4c\xe4\x80\x49\xbb\x18\xd0\xa9\xa4\xaa\x5e\x8a\xb\x33\x38\xd6\x53\xdb\xf7\x60\x44\xc\xc6\x62\x55\xd7\xbd\xfb\xcd\x5\x42\xef\x57\x24\x12\x90\xd9\x19\x27\x5b\x6a\xd2\x98\x23\xbe\x36\x4\xc2\x7b\xf8\x6e\xe\xc7\x6d\xd3\xf1\x97\xe1\xe6\xd8\x10\x9e\xe8\xf5\x59\x9c\x4d\x64\x3d\x21\x1d\x72\x41\x17\x4e\x3c\xb8" },
-	{ 0x5420e0, "\xd8\x40\x46\x1c\x9c\xba\x77\xfd\x1d\xe0\xc0\x42\x92\xf0\xff\xa8\x78\x9e\x3f\xcd\x60\xea\xc7\x3c\x2f\x5f\x72\x74\xb3\x2c\xee\x94\x47\x80\xe8\xf5\x67\x8f\x53\x43\xd\xb9\xe9\xaf\x7e\x7a\xe\x63\xb6\xd2\xd4\x27\xc4\x7\x76\xad\x4e\x3\x5d\x2\xd6\xaa\x56\x6b\x12\x21\x37\xa0\xd1\xab\x3a\x11\x51\x90\x48\x23\x26\x6a\x6\x97\xc1\x9d\x35\xec\xa3\x24\x10\xfb\xf8\x41\x65\x1\x1f\x6d\x5\x8e\x7b\xb1\xfc\x44\xbc\x6e\x89\xa9\xc3\x2d\xb2\x18\xde\x71\xbe\xfe\xc5\x54\x73\x2b\x0\xa7\x5c\xae\xd3\x57\x95\xfa\xf1\x7c\xdf\xc\x31\xa6\x3d\x4a\x58\x79\x66\x87\xb8\x19\xf6\xf7\x8d\xbf\xcb\x45\x33\x6f\xb5\x91\x32\x5a\xbb\xdc\x62\x55\xa1\x4\x70\xa5\x8c\x16\x3e\x49\x64\x82\xf9\xdb\x59\x28\xcc\x50\x96\xb7\x38\xc6\x7d\x69\x29\xb4\x1b\xe7\x2e\xc2\xbd\x84\x85\x4d\xe1\x3b\xf4\xac\xd7\xe3\x8b\x4f\x30\x9f\x7f\x5b\xb\x20\xb0\x86\x88\xeb\xa2\xca\x34\x15\x81\x83\x13\xd9\x5e\x25\xf\xc8\xda\x4b\x99\xe5\x9\xf2\x93\xdd\x52\x6c\x2a\xc9\xef\x14\x9b\xf3\x68\xa4\x22\xce\x1a\x1e\xe4\xd5\x8\xe6\x9a\x98\xed\x61\x17\xa\x39\xcf\xe2\x4c\xd0\x8a\x36\x75" },
-	{ 0x542220, "\xee\xa9\x92\x52\x24\x57\x44\x8e\xa0\xb9\x95\x20\x5b\x70\xbd\xc3\xa7\x17\x4d\x1d\x12\x9a\x0\xd0\xfc\x9d\x41\x6\xf4\x86\x50\x74\xe1\x5d\xa2\xdf\xa1\xa3\xf\xd5\x1b\x62\x28\x7c\x10\x79\x9b\xe2\x13\x7d\xce\x97\xd7\xb\x56\xf0\x63\x3c\x68\xdc\x21\xed\x7\x3d\x7a\xb6\xb5\x23\xe6\x3f\x29\xeb\xd6\x67\x89\xb3\x87\xf2\xfb\x71\x90\x5a\xc6\x42\x2f\x32\x77\xd4\x15\xde\x84\xff\x7b\xd3\x47\xa5\xb8\xc4\x8b\x55\x6c\xc2\x5\x54\x1a\x65\xfe\xcf\x6a\xb7\xa6\x4\xc9\xaf\xf8\xf7\x40\x8d\x16\xae\x3e\x99\x6f\x4b\xac\x26\x3\xb4\x2e\xf3\x69\x34\xb0\x8f\x45\xcc\xd9\x2d\xcd\x4c\x9e\x5f\x85\xe5\xca\x58\xe\x9c\xf5\xfa\x38\xc1\x30\xd\x94\x36\x6b\xc8\xe4\xad\x39\x3b\x22\x46\x96\xc7\xbc\x5c\xe9\x80\xa\x73\x33\xfd\xd8\x88\x2a\x4e\xef\x4f\x5e\xc0\x1e\xc5\x27\xec\x18\xf1\xd2\xc\xba\x8c\xa8\x59\x98\xe8\x9f\x43\x51\x49\x72\x19\xbf\x2\x1f\xbe\x64\xda\x53\x4a\xab\x82\xf6\x3a\xbb\x91\xaa\x6d\x78\x81\x66\x7f\x75\x76\x1\x25\x35\xb2\x8a\xcb\x11\x48\xdb\x61\xe3\x6e\x93\x60\x14\x37\xf9\x9\x1c\x2c\xd1\x2b\x8\xa4\x7e\xea\xdd\x31\x83\xe7\xe0\xb1" },
-	{ 0x53ab20, "\xa5\xff\x5f\x5c\x76\xd0\x2c\x5d\x56\x88\x78\x11\x5\xaa\x2d\x3\x25\x2f\x32\x44\xae\x7d\xd4\xc\x38\xda\x6b\xde\xb1\x9f\xb5\x2b\xd1\xa8\x30\xf8\x1e\x73\xb6\x95\x55\x4\xaf\xf6\x48\x7c\xb3\x3f\x4b\xe2\x8b\xcd\x3e\xe0\x9c\x67\xc9\xf1\xfe\xea\xd6\x42\x63\xcb\x82\x94\x28\xc6\x54\x2e\x81\x52\x46\x41\x1\xe\x12\x43\x9\xf7\x3c\x2\x8c\xc7\x74\xd3\x45\x37\xbf\x58\x59\x6c\xfd\x7\xb0\x16\x39\x64\x23\xf9\x6a\x7a\x14\xd9\xb7\x86\x50\x19\x8\x57\x4e\x97\xac\x22\x7e\xbb\xad\x79\x4f\x85\x27\xc2\x61\x71\xe9\x1c\xc8\xc1\x93\x36\x70\x24\xc3\x3d\x1b\xf2\x6d\x15\x51\xfa\xbe\x87\xc4\xc0\x96\xb\xca\xa4\x75\xd8\x77\x1d\x53\x62\xe6\x2a\xb2\x4a\x8e\xd5\xdc\xf5\x35\x72\x5e\x34\xa1\x33\xc5\x69\x18\xa\xb4\x7b\x83\x31\xab\xa0\x9b\x21\xbc\x84\xfb\xd7\x89\x0\xd2\x3a\xfc\x13\x1a\xcf\xf3\xdd\x10\x90\x3b\xe4\x26\xf4\x4d\xa7\xf\x40\x7f\xe5\x29\x17\x8f\x20\xeb\xbd\x80\x99\x65\xa6\x6f\x4c\x47\xdb\x60\x1f\xec\x98\xe8\xa2\xb8\xb9\x5b\x91\xed\xf0\x9d\x68\x8d\x6\x5a\xba\x66\xdf\xa9\xe7\xe1\xef\x9e\x8a\xcc\x9a\xee\xd\x6e\xa3\xe3\x49\xce\x92" },
-	{ 0x542738, "\xa5\xc3\x4\xb9\x92\x3d\x8a\x86\xe9\x67\x74\xd8\x9b\xcc\xe6\xd\xc6\x23\xf\xa1\xac\x42\x28\x93\xf8\x9c\x8d\xc7\xb7\x3\x8c\x69\x3c\xd1\x81\xf9\xa0\xfd\xba\x0\x75\x49\xc4\xb\xfc\x68\x65\xb0\x80\x64\xa\xda\x83\xf5\x58\x14\xec\x46\x1f\x61\x13\x27\x6b\xce\x1d\xbe\x96\x19\xc2\x9\xef\x37\x2f\xe2\x47\xf1\x7e\x21\x30\x90\xf7\x2b\xf4\x3b\x7\x1a\x56\xd3\x72\x5b\x4b\x85\xe\xd5\x8\x6f\x5d\xc0\x79\x59\x26\x98\xfe\x7d\x6\x4d\x10\xbf\xf3\xee\x2e\xe0\xe7\xd7\xd2\x9f\x60\x88\x25\xde\x7f\x4e\xe1\xae\xdf\xe4\x38\xb8\xe5\x8f\xa2\xd9\xcd\xa4\x73\xdb\x84\xb5\xca\x17\xa7\x54\xab\x97\x91\xfa\x66\x1c\x2d\xea\x31\x35\xe3\x77\xa9\x36\x5c\xc\x76\x95\x5a\x7c\x1b\xbd\x8e\x94\xff\xf2\xbc\xc1\xb4\x87\x2c\x44\xb6\xaa\xc8\x33\xf6\xa8\x45\x48\xa6\x6c\x1\x63\x55\x6a\xd6\x9a\x57\x40\x15\xad\xb3\x3a\x5\x43\x51\xfb\x71\x9d\x22\x1e\xed\x53\xd0\xc5\x8b\xeb\x18\x6d\x20\x3e\xcb\x89\x34\xf0\x3f\x2a\xcf\x39\x16\x4a\xaf\x9e\x29\xb1\x6e\x62\x11\x82\x5f\x7a\xbb\x52\x12\xc9\x99\xa3\xdd\xdc\x4c\x5e\x24\x50\xd4\x78\x70\x4f\xe8\x32\xb2\x2\x7b\x41" },
-	{ 0x542df8, "\x94\x3b\xd0\xd7\xba\xb3\x84\xc4\x36\xdc\x30\xa9\xdd\xc7\xb1\x75\xe6\xa4\x71\xc2\x60\xbf\xf3\xea\x51\x49\x2f\x4e\xa5\x1\xa2\x44\x2\xfe\x85\xf0\x4\xcf\xac\xb7\x2c\x35\x5f\xa6\x18\x6a\x7a\xae\x9\xd3\x3c\x1a\xd1\x12\xcd\xaf\xcb\xb6\xe2\xef\x73\x7d\x47\x2d\xe0\x4b\xf5\x89\xbd\x79\x4c\xdf\x29\x19\x7\xbc\x66\x5c\xed\x62\x68\x3f\x81\x1b\xb4\x11\xc5\x93\xd\xc\x16\x52\x23\xff\xf1\x37\x83\x6d\x58\xab\x77\x59\x65\x46\x97\x56\x6e\xbe\xa1\xf9\x7c\x34\xc3\x76\xf\xb5\x96\x24\x10\xce\x82\x1d\x45\x1f\x67\xd4\xaa\x53\xad\xeb\xe5\x3\xa0\x64\x27\x38\xc8\x8b\x9f\xc1\x8c\x2b\xe9\x2a\xf6\xd8\x4f\xfa\x41\xe4\x7e\x8e\xe8\x90\x63\x9b\xb0\x72\x4a\x40\x57\xde\x61\xfc\x48\x1c\x17\x13\x14\x95\x99\x39\x28\xc0\x31\xe1\x98\x50\x5e\x0\x78\x3d\xfb\xf7\xda\xd5\x70\xca\x8f\x88\x6\xf4\xc9\xb8\xa7\x15\x5d\x6b\xbb\x8\x74\x1e\xcc\xd9\x21\x3a\x20\x3e\x92\x2e\x33\x54\x8d\x4d\x80\xf2\x5b\x91\xee\x42\xa8\xd2\xb9\x7b\xe\x9c\xf8\x9d\x86\x25\xa3\x22\xec\x5\xc6\x87\x32\x9e\xb2\xe7\x5a\x55\xa\xdb\x43\x8a\xb\x6c\x9a\xe3\x26\x69\x7f\x6f\xfd\xd6" },
-	{ 0x5430b8, "\x18\xde\x60\xb0\x52\x81\xc0\x13\xd9\xf6\x7f\x69\x1b\xa4\x27\x73\xa1\xe9\xad\x2a\x9b\x45\xc5\xa5\x2d\x16\xb6\x33\x5e\xc7\x3e\xd5\xbe\x5\x98\xa7\x82\x5c\xec\x29\xd1\x6b\x5b\x85\xf5\x89\xf1\x1c\xf9\x4b\x58\xa9\xac\x23\x2e\xe2\x7c\x36\x8c\x63\x2\x3b\x61\x39\x17\xe0\x32\xc1\xab\x4\x3d\x8f\x26\xd4\xef\xc9\x35\x2f\xe7\xd7\xa6\xcc\x9f\x44\xe4\xc2\xdc\x3f\x4d\x7e\x4a\xf7\x66\x38\x12\x3c\x96\x64\x5f\xf8\xcd\x7d\xb\x70\x76\x99\xba\xdf\xf\xa8\xff\xd2\x56\xeb\x94\xae\xbd\x78\xdb\xf4\xb5\x3\x7b\x80\xfe\xd0\xc6\x41\x0\xc\x86\x8e\x6d\x54\xb3\x4e\x8b\xb2\xb7\xe3\x43\xfd\x53\x11\xd6\xd3\x77\xed\x21\x14\x9a\x6\x9\x1a\x87\x9d\xcf\x37\xc4\x49\x6c\xe1\x10\x5d\x6f\x72\x19\x2b\x51\x15\x4f\x2c\x57\x55\x84\x92\x30\xd\x8d\x25\x24\x8a\xe6\xe\xf0\x22\xc3\x9e\xe8\x28\xbc\x1f\x65\xb1\x1\x20\xa\x46\x67\xfc\x31\x91\xe5\x5a\xca\x71\x90\xbb\xfb\x34\xea\xa0\x79\xee\xa3\xa2\xb9\xdd\x62\x7\xbf\x47\xce\x50\x88\x1d\xf2\x1e\xaa\xda\x9c\xd8\xf3\xcb\xb4\x48\x42\xfa\x4c\xb8\x6a\x68\x6e\x83\x7a\x97\x59\x93\xc8\x40\xaf\x75\x8\x74\x3a\x95" },
-	{ 0x543220, "\xbd\x7f\xc8\xb9\x77\x27\x36\x86\xbf\x96\xfe\xcd\xd\x93\xe0\xae\xec\x69\xee\x90\x3b\x91\x5a\xc0\xcb\x8\xfb\x5d\xa8\xe8\x26\x4c\x22\xf0\xa5\x5e\xff\xd5\x58\xc5\x89\x51\xf9\xfd\xfc\xce\xac\x74\x80\xa6\xde\x2e\x75\xd7\x61\x67\x3d\x35\xf6\x84\xdf\x3f\x5\xd8\x32\xc9\x54\x5b\x24\xc6\x6c\x11\x82\x9e\x2c\x99\x37\x9d\x1d\xd0\xbe\x6d\x6e\x92\xc7\x60\xe9\xaa\x47\x7e\x39\x2f\x97\x2\xad\x9a\xdc\xb3\x34\xca\xdd\x2d\xf5\x18\x81\xa4\x3c\x15\x40\x17\x63\xbc\xef\xcf\x1a\x52\xd2\x41\x55\x4a\x62\x8c\xf3\x68\x57\xe5\x9\xd6\x78\x59\xda\x7d\xe7\x50\x73\xba\x4f\xe1\x2a\xb0\xaf\x1e\x1b\xab\xcc\x9c\x0\x7\xe3\x46\x1f\x13\x85\x64\xe\x12\x45\x38\xdb\x79\x72\x70\xc2\x43\xb\xed\x44\xeb\xf2\x48\x30\x87\x8e\x31\x88\xb6\x49\x8f\xe2\x14\x7c\x76\xc3\xd9\xfa\x71\xa1\x6a\x25\x20\x98\x5c\x10\xf\x66\x94\xe6\xa7\x6b\xb4\xa0\xd4\x5f\x1c\x6\xd1\x7b\x8b\xb1\x4e\x28\x56\xb8\xf1\xc1\x16\x1\xea\xf8\x4\xbb\x19\x9b\x8d\x33\x42\xb7\x3a\x4d\xc\x7a\xe4\xf4\x83\x23\x9f\x3e\xc4\xd3\xb5\x3\x53\xb2\x95\x21\xa3\xa2\x8a\x29\x65\x4b\xf7\x2b\xa9\x6f\xa" },
-	{ 0x543580, "\xb3\xd\xc5\xef\x7f\x75\x36\xd3\xbb\x73\x87\x24\x17\x6b\xeb\x25\x53\x5c\xfb\xf9\x13\x67\x77\xe7\x1c\xcf\x8\x79\xba\xab\xa7\xc8\xc7\x98\x74\x2d\x34\xf\xaa\xf6\x97\x69\x9f\xc0\x8c\xd9\x51\xcc\xa0\xb1\xf3\xd4\x4d\xe8\x88\xd2\x90\xe2\xbd\x52\xf7\x72\x57\xb0\x4a\x96\x81\xd0\x1f\xbf\xf5\x6d\x10\xea\xb4\x4e\x85\xf8\xde\x56\x5\x4c\xa9\x38\x41\x8d\x4b\x0\xae\x84\x80\xc4\xb2\x15\x3f\x7e\xee\xfc\x7d\x27\xbc\xdc\x70\x6c\x2c\x78\x39\x40\x9b\xbe\x68\xe6\xdd\x5e\xc9\xf1\x2a\x2f\xa1\xe4\xa8\xa\xce\x18\xd8\x22\xa3\x4f\x1e\xe3\xe1\x11\x92\x46\xc\x99\x28\x54\x47\x5d\x7c\x3d\xb8\x5f\x6a\xad\xfe\xfd\x63\x60\x43\x59\xb\x91\x71\xcd\x48\x35\xd5\x2e\x61\x9\x65\x33\x3c\xe9\x1d\x26\x89\x1a\xf4\xb5\x9a\x7b\xa4\x37\x93\x94\x14\x8a\x6\x8f\xe0\xd1\x30\x4\xa2\xdb\x7\xc3\xd7\x8b\xaf\xdf\x82\x50\x3b\x23\x49\xfa\x3e\x42\xa6\xc6\x5b\x9e\x9d\x12\x62\x32\xb7\xed\x55\xca\x8e\xcb\xe\x45\xc2\x19\x6e\x64\x31\x86\x2b\xda\xd6\xc1\xe5\x3a\x7a\x3\x95\x5a\xf2\x21\x1\x9c\x29\xb6\xa5\x16\xec\xb9\x2\x66\xac\x1b\x44\xff\x20\x58\x6f\x83\xf0\x76" },
-	{ 0x543680, "\x82\x70\x6d\x44\x64\xe7\xe0\xb\x73\xf7\x12\x60\x5\x13\x9e\xe\x1a\xb8\xe1\xa0\x37\xe8\x61\xde\x55\xe3\x29\x25\x3e\xb6\x92\xcd\x6\x96\x56\x31\xa3\xe4\xcf\xe2\x7c\x23\x53\x84\xfd\xc\x62\x7f\xdd\xb0\x75\x15\x9b\xdf\xf3\x2a\x68\x87\x7\x5c\xd4\xfc\x6e\x80\x38\x5e\xd5\x3a\x50\xd0\x3b\x9\x9c\x4c\x8e\x40\xc2\x91\x58\x22\xae\xb3\x7e\xa6\x54\x90\x5a\x45\x7b\x2f\x18\xf8\x35\x3d\x48\xd\xc6\x20\x51\xfb\x3c\xf5\x2b\xa5\x32\xc3\xd7\x36\x6c\x74\xe6\x85\x1c\x88\xd3\x0\x6a\xa1\xac\xec\x97\xf1\x52\xf0\xf6\x1e\xeb\xfa\xd8\x27\x3f\xa9\x83\x9f\x86\x41\x5d\xaf\xdc\x8b\x8d\xa\x8a\x4b\x4a\xef\x99\xea\x7a\x77\x28\x21\x6b\x8\xc4\x2c\x81\xce\xd9\x14\xf2\xab\x69\x8f\xa2\x1b\xa7\xb7\xc1\x79\x72\x63\x6f\x33\x59\xaa\xb1\x42\x8c\x95\x10\x94\x76\x3\x7d\x16\x1d\xff\x24\xb9\x67\xbf\x66\x47\x4d\x9a\x4f\xc8\xbc\xd1\xed\xdb\xf4\x43\x49\x89\xbd\x1f\x5b\xb2\xc0\x98\x57\x4e\xe9\xc9\xba\x71\x39\xd6\x11\x19\x4\xa4\xfe\xb4\xcb\x26\xc7\x34\xee\x5f\xe5\xbb\x2d\xc5\x93\x46\x1\x78\xca\xad\xf\xcc\x17\xa8\xbe\x65\xda\xb5\x30\x2e\x2\xf9\x9d\xd2" },
-	{ 0x543848, "\x5c\x7c\xa2\x4a\x63\x12\x58\x19\xbb\xc7\x60\xfa\x18\xc3\x49\x84\xc8\x5d\x61\xa\xbc\x55\xb3\xf3\x57\xb\xc4\x5f\x56\xc9\x4c\xd0\xe\x90\x9d\x2d\x4\x54\x93\x8\x17\x52\x79\x3c\xb9\x2c\x51\x4d\xb4\xb8\x3b\xfe\x6b\x3f\xd4\x86\x38\xa7\x92\xa8\xea\x30\xcc\xa3\xd6\x8d\xdd\xeb\xbe\x82\xe5\x1a\x98\x77\x1c\xef\x7b\xe1\x41\x22\xc1\x36\x3d\xe0\x9e\x31\xd7\xe3\xc6\x59\x46\x73\xe2\xae\xcd\x1b\x42\x11\xa4\xdc\x9f\x9\xce\x35\x67\x8f\x96\x4e\x83\x5b\xf2\x10\x80\x81\x4f\x2f\x37\xed\xfc\x64\x0\x24\xf0\x99\x78\x9b\x7d\x7\xc0\x6e\xdb\x7a\x39\x76\x75\xbf\x25\x4b\xa5\xc2\x7e\x1d\xd3\x2e\xc5\x6f\x34\xb1\xee\x8b\x68\x21\x2\xab\xd1\x14\xf4\xd\x5e\x23\xf1\x1\xca\xb7\xf5\x95\xa1\x44\x9c\xc\xb5\x6a\xad\xe4\x29\x8c\xd8\xf\x7f\x3a\xec\x32\x6c\x5\x13\x5a\x70\xda\xcf\x53\xa9\xe8\xd9\x74\xa6\x27\x89\x47\x1e\x8a\xd2\xb0\x50\xa0\x9a\x94\x3\x87\x71\xbd\xb6\x62\x65\xd5\xe9\xb2\xaf\xf7\x26\xac\x66\xfb\x85\xaa\xe7\x33\x88\x20\xdf\xfd\x15\xff\x69\x1f\xcb\x3e\xf9\xe6\x16\x45\xde\x6\x40\x8e\x43\x97\x72\xf8\x48\x2b\x91\xf6\xba\x28\x6d\x2a" },
-	{ 0x543990, "\x43\x8a\x90\x7d\xc9\xb4\x33\x62\x2a\xc8\xdc\xcc\xe5\xd8\x8\x20\x5f\x53\x67\x18\xe0\x23\xad\xae\x93\x69\x59\x6d\x10\xd4\xef\xab\x5\xcf\xa1\xd7\x85\x97\x28\x98\x5e\x4a\xe1\xf\x13\x21\xc5\x86\x76\x22\x57\x2e\xc4\x77\xbe\x1d\x82\xb1\xd1\xf9\x6e\xb8\x81\xc6\xca\x4d\x26\x17\xe8\x12\xdd\xeb\xc0\xa\xe\xf2\x68\x9a\xf4\x61\xde\xa3\x3d\x2b\xe9\xe6\x48\x5d\x16\xa4\xb9\x45\xed\xe2\x55\x51\x4f\x99\xda\x24\x42\xea\x60\x5c\x9f\x37\x46\xbb\xb0\xb6\x7f\x3b\xe4\x8e\x73\xe7\x5b\xec\xe3\xce\xfb\x9d\xf5\x36\xa0\x6b\x40\x27\x3a\x4\xd\x15\x83\x88\x38\x63\x70\x2c\xd5\x5a\x58\x4c\x72\xac\xb3\x75\x29\x0\xd9\x35\x74\xa6\x6c\xc3\x66\x78\x56\xbc\x92\xb5\x50\x1f\xf1\x34\xa9\x1c\xcd\x3e\xb2\x8c\xbf\x44\xfc\x41\xc1\x7a\xdf\xee\x30\x65\xfa\xa2\x32\x91\x25\x80\xba\x3c\x39\x96\x54\x1\xf8\x71\x2d\x84\xa8\x6a\xfe\xaf\xa7\xf6\x4b\xc7\xd3\x8b\xf7\x3f\x8f\x9b\xfd\xbd\x19\x94\xdb\xc2\x52\x2f\x31\x2\x9\xff\xf3\x11\xb7\x95\x6\xaa\x7c\x9e\x7\x49\x4e\xd6\xa5\x1b\x1e\x1a\x64\x6f\xf0\x47\x79\x87\x7b\xc\x14\x9c\x3\x8d\xb\xcb\xd0\x7e\xd2\x89" },
-	{ 0x543bf8, "\x19\xf2\xd0\x35\x72\xe6\xde\xe8\x38\x97\xfe\xd4\x0\xa9\x94\x77\x50\x74\xb9\xc\x15\xce\x54\x71\x45\x65\xba\xa8\x6d\xff\xd2\x63\x86\x5b\x93\xc8\x8a\xb6\x46\x20\x73\xa3\xe2\xae\xfd\x17\x16\x9c\x7\x5\x6b\x4d\x2e\xfc\xaf\x56\xb5\x95\xd7\x42\xb8\x18\x23\xa\x34\xf0\xcd\xfa\x3c\x9d\x9e\x8e\x59\x6f\x67\x92\x68\x5f\xcc\xe3\xe0\x41\x5a\x26\xdb\xe7\x33\x1e\x53\x37\x55\xb2\xf\xdc\x28\x10\x75\xb1\x12\xf7\x6c\xda\x2b\x8c\x89\xf5\xd9\xec\xc1\xb3\xee\xdd\xa2\x4f\xef\x9f\xa1\xbf\xdf\xb7\xca\xc3\x9b\xf4\x8\xb\x83\x3f\x32\xc2\x62\x1a\x2d\x2\x69\x4\x7e\x79\x61\x4c\x44\x84\x3d\x47\x39\xd\x8f\x5c\x81\xe9\x76\x8d\xad\xc5\x80\xd8\xcf\xc6\x7d\x1c\xd6\x7a\x51\x82\xc9\x31\x4b\x6\xb4\x85\x3b\x58\xf6\x6e\xa4\x3e\xe4\xa7\x2f\x25\x7b\x30\x66\x14\xc7\x57\xc0\x64\x21\x4e\x22\x2c\x99\xbc\xbb\x52\x49\x36\x1f\x7c\xf8\xf3\x3\x90\x3a\xc4\xa0\x4a\x91\x87\xcb\xd3\x78\xfb\x11\x70\xd1\xea\xf9\x96\x9a\x9\x5e\x1\xa5\x2a\x1b\xab\xf1\xd5\x43\xed\x13\xeb\x5d\xe\x8b\xe1\x98\x48\x29\xb0\x6a\xe5\xaa\xa6\xbd\x88\x60\xac\x40\x24\xbe\x27\x7f\x1d" },
-	{ 0x543d08, "\x98\x9c\xb6\x1c\x91\xe3\x4d\x7\x3c\x42\xeb\x71\xda\x6c\x45\x61\x99\xd6\xb1\x14\x51\x28\x64\x3\x1e\xcf\x15\x10\xa\x75\x1b\xba\x73\x89\xc7\x69\xab\x3b\x8\x7b\x52\x82\xa9\xa0\x39\xa4\xf8\x6f\xa6\xad\x22\x9e\x50\xfc\xbf\x6\xe9\x5c\x2f\x8b\x1\x8d\xf0\x8c\xe2\xa5\xe\xe5\x4b\xf7\xaa\x66\x60\x4e\x7c\x4f\x34\xa2\xb4\x5d\xaf\xcb\x8a\xd4\xb7\x30\x88\x1d\xfe\xbb\x9a\x74\x9b\x37\xe1\x44\x3d\x38\x3a\xfb\x80\xc8\x41\x65\xc6\x4a\xd7\xf5\x70\x62\x2c\xc2\xb0\xf4\xae\x57\x21\xf6\x4\x54\x5\x2b\x83\x95\xdc\xb\x24\x94\x7f\xd0\x31\x84\x5f\xdd\xe8\x87\xce\xb8\xc5\x40\xc1\xa8\xd2\xc0\xd9\x53\xa3\x3f\x55\x6b\xa7\xf1\x1f\x13\xed\xf9\x3e\xc9\xc\x2e\x67\x96\xd1\x27\x77\xbd\x32\xde\xee\x48\xf\xc3\x76\x36\xcd\x2a\xe4\xea\xdb\x46\x6d\x25\x78\xef\x18\x11\xd8\xe7\xb5\xca\x4c\xbc\xff\xac\x5b\x97\x8e\xf2\xe0\x43\x20\x35\x93\x5e\x81\x63\x2d\x79\x68\x19\x92\x56\x12\x5a\x0\x47\xb9\xd5\xb3\x90\xf3\x1a\x33\x2\x26\xd3\x6a\x85\xcc\x7d\xa1\x23\xec\x9f\x7a\xfd\xe6\xfa\xbe\x29\xb2\x72\x7e\x49\x58\x6e\xd\x86\xc4\x16\x8f\xdf\x9\x17\x59\x9d" },
-	{ 0x544130, "\xc9\x1c\x8\x44\xea\x55\xb5\x3e\x8a\x54\xeb\xd3\x86\xbb\x3b\x6e\x31\x3f\x22\xbc\xe4\xfc\x81\x4b\xd7\x8c\x1e\xb7\xb4\xb\xc8\x7c\xbe\x69\x1d\x9a\xfe\x18\x2b\xde\x4f\x6c\xcb\x52\x35\xe9\xed\xad\x79\x56\xb2\x41\xe2\xf7\xdb\xff\x6b\x71\x15\xf8\x5c\xcf\x48\xa7\x3c\x92\x60\x4a\x9f\x1f\x80\x4e\x8b\x43\x90\xab\x39\xee\x5\xd9\x6a\x40\x66\xf5\xb1\x29\x65\x9b\xf1\x84\x1a\x0\x64\x5f\xe\x76\x6d\x7\xc5\x67\x5b\x4c\x73\xd1\x7a\xf\x82\x7b\x47\x85\x74\xe6\xa1\x21\x42\xd8\x8e\x95\x98\xe3\xaa\x27\xb6\xb8\x26\xc\x6\xe8\x5e\x37\xbd\x6f\xca\xc1\x14\x4d\x10\x50\x3d\xb9\xf9\x19\x97\x1b\x7e\x20\xaf\xd5\x51\x2\xa\x8f\xa3\xd6\xc3\x62\xb0\xf4\x32\x12\x94\x8d\xc0\x78\x61\xc2\xe7\x3\x30\x63\xa8\xdc\x77\x9\x89\xa0\x46\x7f\x58\xd\xac\xa2\xe5\x88\x9e\xe0\xc4\x57\x68\xf0\x36\x38\x24\x1\xec\x91\x25\xef\xfa\xd2\x13\xce\xd4\xbf\x3a\xcc\xba\x93\xf6\xfd\x5a\x45\xcd\x72\x87\x49\xa6\x2d\x53\x28\x99\x2c\xb3\x5d\xd0\x4\x34\x96\x23\x9c\xe1\xc7\x16\xf3\x2f\x17\x75\xa5\xfb\x11\xdd\x2a\xae\xa9\xda\x70\xa4\x7d\x59\xc6\xdf\xf2\x9d\x33\x83\x2e" },
-	{ 0x544298, "\x84\x6d\x8e\x4a\x54\x44\x86\xb1\x7b\x8f\xa3\xfe\xf2\x6f\x9b\x2a\xa\xdd\xd5\x4e\x94\xc6\x7e\x99\x46\x56\x1b\x62\xad\x9a\x1d\x5c\xb6\x11\x15\x7f\xa8\xb\x45\xe8\x18\x41\xf5\x19\x9f\x16\x31\x3e\xc7\x51\x6b\x5\xfd\x70\x10\x93\xd1\x32\x2f\xf4\x89\x64\xf7\x3b\x60\xca\x96\x4c\x90\xbd\xbf\xab\xb7\x68\xb3\xdf\x42\xd4\xa1\xcc\x21\x59\x72\xe4\xdc\x73\x9e\x79\x14\x3\xec\xda\xd7\x92\xf1\xb2\xb5\x39\x81\x4d\x5b\x1f\xf0\x67\x74\x7c\x1e\x57\x6e\xe1\xac\x30\xea\x6c\x13\x37\x3d\x98\x22\xc4\xbb\x20\x50\xc1\x27\xf6\x53\xb8\x87\xcb\xf\xd3\x48\xcd\xc3\x47\x12\x75\x2\xfa\x5d\x4f\x80\x1a\x5f\x8a\x8d\x83\x58\xa0\x52\xbe\x43\x36\x61\x8\x82\x6a\xce\xaa\xb9\xa4\xdb\x76\x3c\x8b\xc\x3a\xde\xef\x24\x2e\x4\x95\x55\xaf\xfb\xf8\xf3\xa2\xa6\x3f\x40\x66\x63\x77\xff\x65\x35\x69\x91\x85\x71\xc9\x2c\xd\xed\x97\x2b\x4b\x33\xba\x23\xf9\xe7\xc2\xc0\xe3\xeb\x5a\x9d\x78\x8c\x7a\x34\x9\x26\xd6\x5e\xe2\x1c\xc8\xb0\xa7\x28\x9c\xe6\x49\xd8\x25\x7d\xe9\x29\xe0\xd9\x6\xcf\xfc\x17\xbc\xd2\x7\xa5\xa9\xae\xc5\x38\xb4\xe5\xe\xee\x1\x2d\xd0\x0\x88" },
-	{ 0x546d50, "\xab\x73\xec\xa\xdc\x52\x12\x6b\xc5\x5c\x71\x5e\x44\x8f\x41\x90\x8b\xe\x83\xba\x9e\xe4\x62\x42\x20\x38\xf3\x75\xb\x1b\x17\xf5\xd4\xcb\xaa\x81\xb1\x6c\x70\xc3\x11\x76\xd1\x69\x47\xf4\x9f\xe9\x95\xf\x4c\xe3\xd8\x92\xc2\x60\x5a\xe8\xf0\xb2\x0\x7b\x18\x4e\x85\x43\x97\x16\xce\x7a\xa7\x2e\xb8\xd2\x30\x2a\x66\xc7\x5f\xdf\xdb\xd0\xb0\xbb\xe1\x96\x3e\xfe\xc0\x26\xf7\x61\xee\xcc\x48\x3d\xfb\x3c\x2b\xae\x32\x55\xb9\x36\x7e\x68\xe5\xe2\xad\xac\x2f\xb3\xf1\xa1\xc9\x1d\x29\x72\x82\x67\x79\x51\x4\x50\xed\x1\x4b\x57\x5b\x1a\xbe\x7\x8a\x4a\x56\x9a\x9b\xca\x99\x2d\xb4\x8c\xb5\xdd\x25\x1f\xa6\xf2\x35\x2c\x89\xcd\x53\x77\x7d\x1c\x19\x84\xd\x6e\xea\x4d\x88\xc1\x24\x40\xa8\x8e\xbf\xa0\x3a\x54\x22\x58\x28\x6a\x3\x94\x64\xa2\x34\xff\xd6\x93\xa3\x23\x37\x9c\x8\xa4\xc6\xfc\x6d\xb7\x45\xde\x49\x31\xa9\xe6\x9d\xd7\xfa\xe0\x4f\x3f\xfd\x78\x98\x39\x6\x91\x21\xbd\xb6\xc8\x3b\x9\xe7\xa5\x7c\xbc\xf8\xc4\xd9\xeb\xf9\x87\x7f\xda\x1e\x86\x63\x46\x5d\xd3\xc\x2\xd5\xf6\x10\x15\xcf\x14\x33\x65\x27\xaf\x59\x13\xef\x80\x5\x8d\x6f\x74" },
-	{ 0x544548, "\x1f\xf4\xd5\xe\x5c\x98\xdc\xdd\x53\x5a\xf0\x9c\x1b\x3b\xcb\xae\x3d\xa9\x99\x45\x97\x6b\x5b\x8\xb9\x44\xe8\x89\x6a\x92\xa0\xb3\xad\x8c\x5e\xd4\x77\x8b\x30\x72\x4e\x8f\xe0\x31\xec\xfb\x1d\xc0\xe1\xca\xab\x20\xb4\x73\x6e\xc9\xfc\x42\x35\xde\x93\x64\xaa\x85\xda\x14\xa5\x46\xa\xd0\xf6\xff\x2b\x6d\x33\x91\xa7\x59\xf1\xeb\xb2\x48\x62\xd9\x39\xf7\xfa\x75\x68\x4\xf8\xc4\x74\x6f\xe7\x41\x58\x15\x63\x55\xf5\x3\x1c\x9b\xe3\x52\xaf\xb0\x1e\x2d\xed\xe5\xa4\x5f\xd\x60\x82\xa2\x49\xbd\x7c\xcc\xb\xc3\x4b\x4a\xd8\x23\x28\x86\x51\xce\x7\x40\x7d\xd2\xe6\x4f\xa8\xfe\x9e\x65\x9a\xc1\x17\xee\x3a\x4d\x7e\xfd\x88\x12\x5\x9f\x78\x7f\xcf\x18\xea\x0\x61\xe4\x96\xdb\x6c\x26\x56\xbf\x1a\x16\x9\x80\xa3\x79\x36\xa1\x2f\x32\xf\xcd\xc5\x3c\xd6\x2c\x70\xd3\xf2\x84\xd7\xc6\xa6\x47\xf9\x34\x22\xf3\x66\x10\x38\x37\x6\x2\x54\x13\xb8\xe9\x29\xbe\x5d\x7b\xac\xb1\x67\x2a\x57\x3e\x7a\x83\x1\xb6\xc7\x9d\x94\x2e\x43\x76\x8d\x69\x8e\x24\x50\x8a\x25\xb7\x19\xd1\x87\xb5\x11\xef\xe2\xc2\xba\x21\x71\x27\x3f\x95\xdf\x81\xbb\x4c\x90\xbc\xc8\xc" },
-	{ 0x544700, "\x78\x6c\xc5\xc\x2d\xa7\x97\x9c\x22\x76\x3e\x81\x51\x47\x59\x71\xb1\xa2\x4a\x3c\xb5\x16\x6\x95\xb9\x1\xe6\x91\x96\x1c\x1b\xad\x61\x64\xb2\xe7\x29\x19\x52\x3b\xfa\xaf\x30\xdb\xd4\xb\xfe\x75\x1f\xbe\xcb\xf6\xea\x31\xf8\xd8\xa3\x82\x73\x1d\x99\xf0\xcc\xb6\x46\x26\xaa\x8c\x87\x90\x24\x8f\x7a\x13\xee\xd1\xa9\x5\xb3\xf7\x2\x7c\x4c\x1e\xff\xe5\x77\xab\xd6\x98\x20\x4d\xc4\x23\xf4\xa4\x85\x9a\x8e\x1a\xe\xf5\x15\x60\x38\x72\xe9\xf1\xc3\x68\xf2\x93\xd3\x2a\x48\x74\xc2\x57\xa1\x7d\x94\x37\x92\x5c\xe1\x41\x83\xd5\x65\x14\xa6\xdc\x44\x27\xef\xd7\x25\x10\x2c\x7f\x40\xa5\x55\xbd\x2b\xd\xd0\xfc\xdf\xa0\x4\x0\x62\xb4\x5a\xeb\x6b\x84\x7e\x6a\xde\xed\x66\x3\xfb\x2e\x4f\x4e\xbb\x36\x5b\x18\xe3\x69\x3f\xec\xe4\xd2\xa\x34\x63\xcf\xa8\xf9\x9b\x7b\x6f\xe8\x49\xc1\x9\x54\xf3\x50\x67\x79\xc0\x9f\x8d\x5f\x17\x70\x11\xc8\xbc\xc6\xe0\x35\x39\xc7\x6e\x21\xbf\xda\x6d\x28\xf\xdd\x33\xac\x8a\x12\xc9\xcd\xb8\x45\xae\x32\xce\xe2\x56\xfd\x42\x89\x86\xca\x4b\x3d\x5e\xba\x8b\x5d\xb0\xb7\xd9\x58\x2f\x8\x43\x3a\x53\x9e\x80\x88\x7\x9d" },
-	{ 0x5448a8, "\x8f\xf2\xa0\xf3\x5c\x91\xbb\xc7\xcf\x42\x8a\x62\xf4\x67\xb0\xd4\xad\x2f\xc8\x64\xe8\x6e\x40\xc5\x5d\x82\x85\xa\x24\x2a\x41\x74\x7e\xcd\xdc\x26\xea\xe7\x96\xfd\x57\x6f\x35\xa7\x29\x4a\xe4\x4e\x43\xe5\xd8\x79\xe1\xeb\x95\xc1\xa4\xed\x80\xa8\x31\x6\x44\x10\x6b\xbf\x3b\x25\x9e\x94\xee\x83\x81\x6d\x1c\x19\x78\xa5\x5\x56\x4d\x0\x93\xb2\x84\x77\xaf\x2e\x18\x7b\xd2\xf1\xd1\x23\x69\x32\x98\x73\x8c\x5b\x70\xac\x8d\x6a\xb\x30\x3e\xd3\xd9\xe6\xf6\xf0\xd\xf9\x20\x72\x50\x68\xd5\x5e\x99\xf7\xa1\xbe\x89\xca\xa9\xcc\x33\x92\x87\xc9\xb1\x9\x1f\x48\x11\xba\x8\x12\xc6\x22\x53\x71\x90\xb3\x7d\x1b\xb8\x45\x4c\xc2\x9a\x15\xdd\x7c\xb4\x55\xdb\xdf\xfc\x60\x3f\xef\x9d\x3c\x4b\x65\xc3\x13\x51\x4\xb9\xbc\x7\xd0\x97\x66\x8e\xec\x46\x54\xbd\xce\xe3\xe\x88\x8b\x16\x2c\xb5\xd6\xa3\xfe\x3a\xa2\x52\x5f\xe0\x9b\x36\x27\x3\xf5\xe9\xf8\xc\xd7\x28\xe2\xc0\xae\x86\xc4\x6c\xaa\xa6\xcb\x58\x61\x39\x1a\x7a\xab\x9f\x47\x34\x38\x2b\xde\xb6\x1\x2d\x1e\xff\x7f\x5a\x59\x4f\x76\x63\x2\x17\x21\xb7\xf\x14\x37\xfb\x49\x75\xda\x3d\xfa\x9c\x1d" },
-	{ 0x544a28, "\x5d\x70\xed\x8d\xab\x3e\xdb\x57\xbc\xf6\x88\xde\xd5\xa1\x80\x2e\xb0\x29\xf1\x41\x9f\x27\xc2\x5b\x1a\xd8\x61\x97\x2a\xcf\xa\x17\xf3\x18\x77\x8\x42\xbb\x2f\x94\x21\x25\x1f\xc\xb8\x3d\xa8\x87\xa7\x71\x0\xd7\x45\x36\x7a\x4a\xca\xf5\xad\x60\x9d\x83\x40\x84\x56\xe\x4\xd1\x2\x96\x73\xe6\xaf\x35\xbe\x95\xc7\x1\x81\xeb\xb5\x7f\x51\x43\x52\xaa\x50\x22\xb9\xda\x54\xea\xd\xa0\xcb\x6f\x4c\x6e\xa5\x31\xdc\xce\xd9\x7b\xb4\x7c\xb\x85\x8b\xae\x12\x2c\x4f\x34\xdd\x6b\x2d\x6a\xfe\x63\xd3\xfc\x3\x20\x6d\xf0\xe5\xc3\x19\x62\x72\x1c\xb3\xc4\x65\x9c\xee\xd6\xfd\x76\xe9\x11\xa9\xe7\x2b\x46\xbd\x78\x89\x13\x9b\xcd\x15\x99\x9a\x69\x3f\x7\x6\xcc\x37\xf4\x98\x9e\x30\x47\x6c\x3a\x23\xe4\x66\xe8\x79\x3c\x5e\x14\x91\xb7\x8c\xfb\x8f\xc0\x3b\x7d\xe0\xa4\xfa\xc6\x4d\x90\x82\x44\x5\x67\x7e\xd2\x49\x64\xc8\x74\x8e\x32\xf9\x10\xff\x5a\x48\x5c\xc9\x92\xac\x16\x68\xd0\xef\x1e\xf\x24\x58\xbf\xb2\x55\x1d\x59\xe2\x33\xb1\xa6\x86\x4e\x4b\xc1\xe1\x39\xa2\x9\xba\x75\x5f\x38\xf8\xec\xdf\x53\xb6\xe3\xc5\x26\xa3\x1b\xd4\x93\x28\x8a\xf7\xf2" },
-	{ 0x547670, "\x41\x55\xc1\xa3\xdf\xde\xf4\x5c\x1\x2e\xa8\xf0\x1f\x4e\x38\xf6\x9d\x24\x1a\xb3\xcc\xcf\x7e\x9a\x60\xd2\xed\xe1\x42\x92\xe\x6b\x39\x57\x8f\xad\xfa\x5f\xfd\x48\x8a\x4c\x73\x64\x7f\xf9\xbc\x77\x6a\xd0\xe7\x47\xd6\xa6\x13\xf7\xd1\xb2\x3b\x49\xbb\xbf\x19\x3e\xb9\x58\x6c\xcb\x32\x5b\xd9\x8\x2b\x86\x90\xa0\x2f\x36\xe8\xbe\x6f\xa\x44\xfb\x8d\xeb\x9f\x4\x75\x82\x72\xb6\xaf\x3\x2c\xfe\xae\xf8\x27\x4b\xf5\xcd\xb0\x4a\x35\x3d\x5d\x2\x7c\x10\xba\x2d\x76\x74\x4d\x21\x65\xdd\x98\x17\xca\x33\xd\x88\xc2\x96\xdb\x84\x53\x1e\x80\x1b\x7b\x5e\xb8\xb4\x3f\xd8\x1d\x56\x99\xec\x52\xc7\x70\xc3\x7a\xc\x34\x25\x5\xa5\xda\x16\x26\x54\xf3\xe0\xd4\x85\xbd\x9c\x68\xac\x8e\xe6\xd3\x87\xa2\x8b\xa1\x15\xb5\x78\xb\x0\x66\xea\x50\x79\x59\xaa\x22\x2a\x29\xc4\x7\x12\xee\x69\xf\xf2\x3c\xc6\x7d\x28\x9e\x6d\xc9\xe3\x20\xa9\x40\x94\x63\x71\x46\xff\x23\x4f\x14\xd5\xc5\xa7\xf1\x31\x67\x95\xe4\x93\x89\x11\x6\x91\xef\x8c\x6e\x62\xab\x51\x9\x5a\xdc\x83\x1c\xb1\xe5\xe2\x9b\xd7\x61\xb7\xc8\x3a\x43\xc0\xe9\x97\x81\x18\xce\x45\x30\xfc\xa4\x37" },
-	{ 0x5480c8, "\xa0\xee\x48\xc3\x70\x1d\x44\x7f\xad\x27\x74\x5c\xe0\x71\x7a\x1a\x5a\x6c\x9d\xef\x28\x88\xa4\x89\xed\x75\x67\x22\x79\xd1\x6d\x1\xc6\x25\x7c\x31\x43\xa2\x66\x10\xac\x4b\x9\x1b\xcc\x3c\x32\xb\x8e\xe4\x60\x73\xf2\x8f\xfb\x47\x9a\x4e\xc0\x55\xd5\x91\x46\x59\xfa\x7\xa3\xbd\x78\xb7\xf\xec\xcd\xa7\xc8\xd4\xe5\x64\x12\x8d\xbb\x7b\xf6\x1e\x9c\xa9\xcb\xbf\x30\x11\x2a\x83\x37\x3a\xc4\x87\x5b\xb9\x6f\xf5\xae\x40\x50\x39\x7e\xb2\xe3\x5\x8c\xf4\xff\x92\x5e\xeb\x57\x77\xb5\x96\xe2\xfd\xba\xb1\x29\x6b\x4c\x51\xf0\x81\x0\x13\xf8\x14\x65\xf7\x3e\xc1\xa1\x5d\x2d\xaf\x69\x35\x3f\xd3\x24\xdf\x1c\x23\xe1\xfe\xf3\xdd\x16\xe6\xd\xb8\xa5\x9b\x9e\x63\x8\x8b\xa\x2f\xf9\x2e\x6e\xb0\x94\xb4\x80\xd8\x4f\x4\x56\xb6\x97\x21\xcf\x93\x3d\x26\x7d\x2\xaa\xd0\x76\xe8\xde\x17\xdb\x86\xb3\xca\xd9\x84\x99\x4d\xc5\xea\x3b\xdc\xab\xbe\x18\xc7\x2c\x3\x6\x68\x4a\x2b\xc9\x62\x95\x82\x85\x33\xf1\x42\xe7\x15\x20\xce\xd2\x58\x49\x98\x45\x41\x5f\xd6\x34\xa8\xda\x8a\x54\x38\xfc\x1f\x19\xd7\xc2\xe9\x61\xa6\xc\x72\x52\x9f\x6a\xbc\xe\x36\x53\x90" },
-	{ 0x546af0, "\x15\x4f\x74\xa6\x26\xb3\xce\x55\x94\x77\xb4\x93\xba\xbc\x7d\xd4\xec\x2a\x79\xa2\x70\xbf\x14\x4c\x35\x4\xd7\x85\x6c\x0\x11\xf6\x69\xb8\x2\xa7\xc4\x6a\x58\x92\x39\x25\xe6\x9d\xa5\xa\xc7\xaa\xda\x36\xb5\x2d\xeb\x86\xa0\x12\x99\xb1\x9c\x34\xcc\xb7\x59\x62\xf0\xcd\x9f\x17\x8a\xca\xc3\xa3\x7\xf3\x57\x41\xe5\x88\xfb\x97\xde\xd1\x1\x24\x43\x68\x90\xa8\x4b\x72\xee\x80\xfa\x52\xf2\xe7\xf\x6f\x22\x5f\x37\x2c\x98\x73\xb2\x3a\xf8\xc9\xd0\x1c\x87\x66\xab\x5d\xf9\x9b\xb0\x32\x61\xa1\xe0\x29\x9\x31\x45\x2f\x2b\x30\x8d\x5b\x5e\xa4\xc5\x3\x51\x16\x1a\xe4\x4a\xc\x18\x1b\x6\x4d\x7c\x82\xef\x19\xb\x8c\x3f\xb9\x13\x53\xd2\x6d\xb6\x81\x64\xc1\xdd\x95\xdb\xc2\xe8\x46\x60\x8\xe1\xaf\x50\x1f\x1d\xea\xd5\xdc\xcb\xd\xdf\x83\x49\x8e\x2e\x44\x67\xff\x8f\x76\x63\xf7\xe9\x3e\x10\x47\x1e\xd6\x21\xf1\xa9\xac\x33\x89\x7b\x23\xbb\xf4\x20\xd9\xfd\xcf\x42\xc0\x3c\xc6\xe\x40\x5\x7e\x56\x7a\x38\x28\xf5\x48\xe2\x4e\x71\xbd\xc8\x5c\xed\x6e\x96\xae\x8b\x9e\xfc\x3d\x9a\x78\x5a\xfe\x91\xad\x65\xbe\x27\x84\x3b\x6b\xe3\x7f\x54\xd8\xd3\x75" },
-	{ 0x546bf0, "\xc5\xb4\xfe\x62\x85\x73\x6d\xa3\x55\x60\x8\x7\xa4\x84\x2f\xcd\xaa\x5a\x36\xd6\x8a\xc\x89\x9c\xa6\x43\xc2\x13\xec\x9\x2c\x16\x52\x63\x81\xf\xed\x1b\x42\xf4\x66\xb6\xfc\xdb\xe7\x1e\xd8\xd5\x29\x5e\xe1\x57\xb0\xb5\xb\x70\xe8\x1\x3b\xde\xd4\x3\x1c\xbf\x5b\x27\x24\x34\xd\xbb\x5d\x39\xbc\xf8\x5c\x4\x3d\x47\x2\xe5\xf2\xdf\xe6\xc4\x95\x7a\x77\x3c\xa0\xff\x6b\x32\x38\x8b\x1a\x7e\x14\x26\x67\xc0\x58\x50\x64\x35\x18\xe2\xd7\x3e\x74\x2d\x41\xb7\x8e\x17\x11\xca\xc7\xd1\xdd\xcb\xd0\x90\xee\xeb\x72\x4e\x53\x80\x68\x4f\x56\xbd\x86\x76\xb2\x6f\x3f\x10\xe4\xba\xfb\x44\xc6\x5\x75\x48\x30\x9a\x19\x8d\x4d\xbe\x7f\xa1\xfd\xab\x9b\xa8\xaf\xf3\x9f\x4c\xad\xef\x8f\x2b\xf0\x31\xe3\x0\x21\xa\x2a\xf5\xc9\x23\xc8\x22\x79\x12\x78\xae\xac\x9d\x3a\x40\xf1\x93\x7b\xa9\x54\x20\x88\xe9\x45\x92\xea\x99\x7d\x6c\xd2\xcf\x6e\xc3\x82\xda\xb1\xd9\xe\x6\x94\x8c\x96\x46\x5f\xd3\x7c\x98\x9e\xb9\xf7\x69\x87\xce\x6a\x83\x28\xa5\xfa\xcc\x4a\x59\xa2\x1d\x61\xf9\x65\x37\xb3\x25\xa7\x91\x71\x1f\xf6\x2e\xb8\xc1\x4b\xdc\x15\x33\x97\x51\xe0\x49" },
-	{ 0x544d20, "\xaf\x3a\xa1\x82\xc\x76\x4d\xed\x6a\x13\x70\xc9\xc0\x32\x7a\x63\xd\x6f\xca\xb5\xdd\x69\x8b\x83\x59\x62\x2b\x98\xa9\x60\x51\x34\xa0\x75\x8f\xef\x1e\x44\xab\x54\x9f\xbc\x4\xb7\xf1\x9a\x68\xf2\x28\x3f\xfd\x87\xfc\xb2\x10\x55\x11\x17\x47\x26\x48\x52\x4f\x25\xaa\x5c\x6c\x1c\x39\x8\xa6\x1d\xb3\xfa\xd4\xe7\x37\xa5\x8c\x22\x58\x24\x8d\x23\xad\x31\xe5\xbd\x1a\x53\xa2\x79\x71\xbf\x7\x67\xc7\xcd\x3e\xdf\x14\x21\x7b\x6b\xea\x4c\x49\x9b\x1b\xe4\x7f\xff\x29\x4b\x5d\xe9\xa8\x65\x77\xf3\xa\x6e\xd1\xe2\x89\x96\x38\xf4\x80\x3c\x6d\x2e\xc5\xc1\xf7\x92\x2c\x1f\x20\x41\x36\x2d\x12\x42\x78\x43\xce\xcf\xf\x7d\x90\x0\x5a\x30\xc6\x81\xd9\xf8\x4e\xeb\xd0\xbb\xa4\xae\xd2\xde\xe8\x5f\x9d\xd8\x27\xe6\x19\x9c\xec\x2\x74\x35\xba\x84\xe1\xb\x3b\x5\xfe\x4a\xfb\xb0\xcb\x97\xf0\x64\x86\x99\x91\x3\xbe\x45\xa3\xda\xb6\x95\x2f\xd6\xf6\xc8\x73\x33\x56\xf5\x15\xa7\xc3\x18\xd5\x8e\x93\xee\xc2\x50\xf9\x46\x7c\x6\xe3\xdc\xd7\xb4\xd3\xcc\xdb\xb9\xb1\x57\x94\x66\x85\xb8\x5b\x3d\x72\xe\x88\x40\x7e\x9\x1\x5e\x9e\x2a\x16\x61\xe0\xac\xc4\x8a" },
-	{ 0x544e20, "\xd7\x3b\xe0\x11\x7a\x3\xca\xc9\xdb\x34\x4a\xc8\x24\x45\x7b\xc\x61\xf9\xcb\xc4\xad\x3d\xea\xaf\x7e\x63\x8f\x66\x2a\x21\x2c\x94\xb5\x72\xb2\xc0\x30\x77\x2f\x51\x91\x6\xf8\x25\x49\x1c\x74\xff\xdf\xbd\x71\x80\x81\x2b\xe1\x0\x4d\xda\x67\x35\x29\xf3\xc1\x89\x46\x32\x7c\x69\x3e\x1b\xf0\xab\x42\x9d\x26\xc5\x20\xb8\x6e\x12\x90\xd\xa\x5f\x23\xf5\xb9\x5e\x8b\x2\xe6\xe3\xf\x6c\x13\x65\xc3\x1f\xd9\x92\xde\x16\xc7\xd8\x75\x2d\x76\x3f\x6b\xc6\x70\xa1\xee\xa0\xed\x47\x4b\xef\xe\xbb\x9c\x9e\x31\x55\x6d\x8c\x79\x60\xa5\x2e\xe9\x37\x83\x40\xcd\x36\x84\xfd\xce\xb6\x57\xa3\x14\xf2\xeb\xdc\x4c\x28\xcc\x15\xd2\x4f\x1a\x5b\x1\x6a\x50\xcf\x8d\xfe\xb0\xbe\x5d\x44\xb\x59\xd5\xd3\x33\x3c\x5a\x27\x6f\x58\xa9\x96\xb7\xd1\xf7\x5c\x68\x8e\x19\x88\x86\xa6\x1e\x7\xa7\x53\xa2\x4\x10\x54\x7f\xf1\xbf\xbc\x3a\xac\x62\x4e\x8\x99\xd0\xe4\x48\x5\xe5\xfc\x98\x9\xf6\xa4\x1d\x9b\xa8\x56\xdd\x41\xb4\xb1\xfa\x97\x52\x9a\xe2\xfb\x95\x85\xc2\x38\xd6\x8a\xaa\x39\x43\xba\x87\xe8\xf4\x22\xae\x17\xd4\x93\x82\x73\x18\xec\x78\x64\x9f\xb3\x7d\xe7" },
-	{ 0x546fd8, "\x40\x2d\xc5\x23\xcb\xf8\x99\x7b\x3b\xae\x91\xa6\xb8\x0\xb0\xe8\x50\x9d\xd\xaf\xd8\x1b\xd1\xe9\x9c\xc0\xc\xcc\x10\xc3\x53\xe0\xd0\x8a\x9\x2b\xb1\x47\x2\xb9\xce\xc4\x3c\xa5\x36\x1\x86\x94\x7f\x72\x7e\x2e\x17\x78\x62\xc8\x3a\x6\xd7\x32\x64\xea\xbb\x18\x8c\x1d\x66\xa9\x58\x8e\x84\x7c\x75\xcd\x45\xc9\x9b\xbf\x4d\x76\x1e\x1c\x49\x44\x3d\xef\x39\xa2\x3\x37\xdb\xbd\x5e\xbe\xf2\x6d\x67\x6c\xd5\x6b\xf\xf5\xd9\x33\x54\x2a\x82\xf6\xbc\xfd\xda\x13\x92\x68\x16\xed\x70\x9f\x5d\xeb\xec\xfc\xfb\xa3\x6e\x90\x5b\x98\x5f\x8f\xe4\xe\x15\xf4\xb5\x3f\x63\x35\x59\x85\x8d\x9e\x5\xb\xa8\x65\x60\xad\x8b\xb6\x8\x41\x12\x80\x1f\x93\xe5\x7d\x88\xa4\x4b\x89\x6f\x25\xdd\xe2\x30\x57\xf0\xac\xe1\x28\xa7\x97\xde\xee\x6a\xc1\xf7\xc7\x55\xd4\x61\x24\x51\xf9\xca\x2f\xe7\x4c\xb7\x4\xe6\x96\xe3\x11\xdf\x43\xcf\x42\xab\xb2\x83\x79\xc6\x52\xdc\xaa\xb4\x7a\x34\x4e\x26\x20\x5c\x19\xa1\xd6\xba\x48\x56\x2c\x9a\xf1\x4a\x46\x74\x5a\x95\x77\xf3\xb3\x71\x27\xd2\x73\xfa\x87\x7\xa\xd3\xa0\x29\x3e\x81\xff\x1a\x38\xc2\xfe\x14\x69\x21\x22\x4f\x31" },
-	{ 0x5470d8, "\x13\x32\xf2\xee\xb5\x4b\x96\xd\x64\xb2\xc\xb0\x2f\xc0\x73\x53\xbe\x4d\x4c\xbc\x6f\xd8\x95\x4f\xe0\x6b\x24\x39\x63\xbb\x2b\xc7\xb3\xf4\xf7\x86\x7c\xa6\x23\x2c\x70\x52\xbd\x8b\x48\x80\x98\xb8\xf0\x56\xed\x91\x35\x65\xc3\xd3\x62\x60\xb9\x88\x31\xe1\x37\x1b\xac\x6e\x9e\x55\x1\xea\x4a\x42\xe8\xd9\x2a\x99\x61\x3f\xe2\x68\x58\xcd\x6\xa5\xa7\xd1\x1a\xae\x20\xca\x81\x5\xc5\x3e\xad\x66\x7b\xdc\x12\xa0\xa3\x74\x0\xa8\xb\x19\xfd\xb7\xdb\xb4\xcc\x9d\x3d\xf3\x5f\x5b\x72\xaf\x87\x92\x44\xff\xd4\xc8\x76\x8e\x5d\xd5\x3b\x22\xa9\x36\x47\xf9\x18\x15\x25\x4\x83\xc9\xda\xd7\x4e\xe5\xe4\xfe\x33\xd0\xa2\x5a\x7f\xc1\xf\x1d\x2e\x8a\x8f\x50\x27\x9f\x57\x1e\xeb\x6d\xf6\x54\x59\x49\x9c\x7e\xcf\x28\x93\x45\xec\xab\xaa\xbf\xa\xd6\x78\x41\x7d\x77\x26\x46\xb6\x2\xe3\x3a\xfb\xe\x8\xcb\x51\x82\x9a\x40\x84\x9\x5e\xfc\x7\xef\x21\x14\x2d\x71\xf5\x67\x85\x29\xb1\x30\x7a\xde\x90\x1f\x3\xf1\x3c\x75\xe6\x79\x11\x94\xc2\x16\xba\x97\xa4\x10\xdd\x1c\x69\xc6\xa1\x8d\x5c\x6a\xf8\xe9\x43\x34\x6c\x17\x8c\xfa\xc4\x38\x89\xce\x9b\xdf\xd2\xe7" },
-	{ 0x546970, "\xe1\x9a\x3f\x1a\x1e\x5d\x57\x52\x34\xd5\x1d\x93\x35\x76\x92\xf7\xea\xb9\x5c\x3a\xe3\x1f\x70\x9b\xc\xf\xd2\x8e\x30\x4c\x4f\xb0\xb7\x8b\xfb\xaf\xd3\x58\x8\x38\x36\xa5\x0\x2c\x45\x3e\xa7\x4a\x32\x37\x2b\x56\xfe\x90\x51\xc1\x7\x6e\x23\x3b\xbc\x95\x15\x86\x16\x5a\xd0\x2e\x4e\xdd\xd8\xe5\x6b\x7d\xfa\x75\x18\x29\x7c\x48\x68\xb3\xf1\xd4\x8d\x63\x20\xba\x98\xad\xa9\x6\xfc\xb5\x84\x67\xc4\x4d\x9c\x7b\x17\xb6\xfd\x91\xcb\xe\xbb\x60\xe9\x99\x49\x83\x5\x8a\xdc\x66\x24\x21\xcc\x54\x28\x78\xd7\x7f\x2d\xcf\xca\x97\xed\x5b\xc5\x59\x94\xbd\x47\x40\x25\xde\x6d\x3d\xe4\x44\xe2\x6c\x1b\xce\x22\xb\x43\xc0\x7a\x2a\x73\x53\x31\x39\x11\x14\x3\xe7\xb2\xef\x2f\x77\x74\x88\xb1\x8c\x4\x72\x7e\x10\xee\xa4\xf5\xf8\xb4\x85\xe0\x41\x87\x9e\xeb\xc9\x50\x96\xd6\x13\x9\x26\x12\x80\x5f\xa8\x3c\xf3\x89\x46\x4b\xf4\xae\x27\xc8\xc7\x61\x82\xb8\xa3\xa1\xe6\x69\x5e\x2\xec\xab\xc3\xd1\xda\xbe\x79\xe8\x9d\xd9\xaa\xdf\xf6\xa0\x62\x8f\xac\x6f\xa6\x71\x81\xa2\xf0\x33\xa\x1\xf2\xc6\xdb\xf9\xcd\xff\x9f\xd\xc2\x64\x65\x55\x42\x1c\x19\x6a\xbf" },
-	{ 0x5467d8, "\xf0\x36\x69\x25\x6b\x37\xee\x56\x5d\x85\xc4\x8b\xc6\x2\x62\xe4\x70\x48\x41\x91\x9d\x38\xff\x55\xfa\x3c\x89\xe6\x73\x30\xa8\x2d\x59\x3e\xec\xf1\x2b\xc9\x9e\x87\x84\x78\x9\x3b\xcd\xb0\xe2\xd9\x31\xf\xfc\x82\xc0\xce\x50\xe3\xbc\x79\x3\x67\x72\x9b\x32\xc1\x7a\xd\xa3\x65\xf2\xd6\x97\x6d\x93\x6f\x83\xab\x11\x74\xc3\xbf\x1f\x6c\xb1\xd8\x64\xb5\x19\xdc\x2c\xac\xe\x8\xb8\x76\xcf\x26\xbb\x6e\x51\x99\xa4\x9c\x53\x4\x88\x3d\xa1\xaf\x9f\x47\x7e\xe5\xd1\x52\xf7\x18\xd7\x15\xf3\x95\xd5\x1a\x86\x68\x8f\xba\x77\xc2\xf9\x5a\x90\x46\xe0\x61\x60\x2a\xef\xdf\x12\x1d\x5c\x7\x21\x34\x9a\xb3\x57\xb4\xe7\x1c\x4c\x35\xa2\xf5\x7b\x5b\x1\x8d\xda\x42\x71\xad\xc8\xf4\x13\x4d\x63\xb6\xfb\xbd\xed\x4f\x8e\x75\x16\x20\x28\xd4\x3a\x8a\xdd\x49\x14\x10\xa0\xde\x4e\x96\xdb\xb\x40\x7f\xcb\x80\x4b\xc\x5\x1e\x24\xfd\x44\x5e\xc7\x17\xae\x7c\xb2\x22\xd3\x92\x8c\x98\x81\x0\xb9\x27\xa7\x58\xb7\xa5\x29\x54\x4a\x6\x45\x1b\x6a\x3f\x23\xf8\xe9\xaa\xca\x66\xc5\x2e\x43\xcc\xfe\xd2\x33\x2f\xa9\xe1\xe8\x7d\x5f\xa\xbe\xf6\xd0\xea\x94\xeb\xa6\x39" },
-	{ 0x546690, "\x34\xa1\x39\xaf\x83\xdd\x8b\xb9\xe3\xd3\x61\x77\xc\x52\x66\x5d\x31\x4\x9d\xb7\x6e\xeb\xb\x9b\x19\x2a\xb3\x7c\xe6\x53\xfc\x48\x1d\x68\x69\xed\xf8\xcb\xf1\x17\xb8\x84\xc5\x9c\x6c\x49\x97\x78\xa6\x18\xf7\xdc\x7a\x2d\x65\xd\x26\x56\xb4\xa2\x3\x93\xe9\x1c\x82\x14\x6f\xee\xd2\x74\xac\x62\xc0\x7b\x8f\xd7\x20\x35\x21\xe1\xa0\xcf\xcc\xc3\x67\x80\x55\xfe\x70\x4e\x58\xc8\x27\x0\x36\x5\xe0\x1f\x6d\x51\xd8\x25\x89\x2\x2c\x85\xde\x76\x81\x4d\x11\x9e\x2b\xe5\xcd\xda\x3b\xbd\x92\xc4\xdb\xf6\x46\xbb\xba\x75\xb6\x71\x7e\x79\x1b\xfa\xea\x64\xc1\xa9\x8c\x59\x5f\xe7\x90\x63\xb5\x5c\x98\x6b\x9f\xae\x5e\x7d\xad\xc6\x7f\x8d\x15\x6\xc2\x38\x43\x5b\x73\xa3\x96\xec\x3e\xe2\x99\x94\x1\x54\xca\xf9\x8\x24\xd0\x4f\xef\xf\x3a\x13\x72\xe8\xe4\xb0\x3d\xfd\x4c\x44\x5a\xf0\x60\xa5\xa7\x40\x88\x8a\xf4\xaa\x9\x4b\xf2\xd4\xbc\x12\x1e\x47\x41\x6a\x86\x45\xd6\x2f\x37\x50\xbe\xab\x91\xf3\x22\x8e\x95\xb1\x28\x87\xb2\x7\x3f\xdf\x16\xa4\x4a\x57\x33\x30\x23\xbf\x3c\xd9\x42\xc7\xff\xa\xf5\x29\xd1\x2e\x1a\x32\xfb\x9a\xc9\xe\xce\xa8\xd5\x10" },
-	{ 0x546548, "\xab\x48\xd1\x4b\xbe\x95\x99\x9\x10\x36\x91\xe\x4c\xe7\x14\xb\x96\x16\xb4\xdf\x75\x20\x80\x7f\x74\xb3\x47\x12\xf6\xb2\x4\xca\x44\xe8\x42\x9c\xd5\x86\x30\xe0\x1d\x1e\x28\xe2\x81\xde\x2a\xa2\x45\xf0\xaa\xcc\x5f\xe6\x63\x64\xd9\x1f\x70\x49\xe1\x85\x7c\xf2\xc5\x88\x9e\xb7\xba\x9b\x17\x6e\x82\xd3\x69\x3d\x6\x1\x68\x11\x71\xf7\xd8\x24\xb6\xc7\x67\x50\x7e\x9f\xfc\xe4\xf5\xbb\x55\x7\xeb\x3c\x13\xc\x4d\xd4\x25\x23\x56\xa0\x6d\x5e\xc8\x84\x61\x8f\xdc\x2\xbd\xbc\x6f\xcd\xf3\x6c\x92\xfd\x3e\x21\xed\x1c\x6b\x79\x59\xec\x41\xac\x2c\x58\x8d\x89\x35\xaf\xda\xb0\xd6\x22\x5d\xc3\xd0\xa\x1a\x2e\x43\xe9\x7d\x52\x5c\x34\xa9\xd7\x60\xb9\x53\xee\x39\x3b\xc9\xe3\xae\xdd\x4e\x57\x8e\xf8\x19\x46\xa6\x3f\xb8\x90\x8a\xc1\x33\x4f\xea\xff\x51\x2f\x66\xc6\xf\xef\xa7\x7a\x9a\xdb\x94\xd2\xfa\xa5\xd\x8c\x18\x77\xad\x87\xc0\x54\x32\x31\xa3\x38\x62\x37\xf4\x93\x98\xf9\x83\x40\xce\x15\x1b\x3a\xfe\x3\xfb\x6a\x8b\x27\xf1\x9d\x73\x5b\x65\xe5\x7b\xb5\x4a\x8\xc2\x72\xbf\xa8\xc4\x76\x29\x26\xa1\x2b\xb1\xa4\x0\x78\xcf\xcb\x5a\x5\x2d\x97" },
-	{ 0x545c58, "\x6\x15\x2e\xa6\xed\x8\xdb\x7b\x2a\x85\xcb\x50\x31\xf5\xb4\x63\x53\xc2\x6e\x91\x92\xe6\xaf\x68\x41\x61\x74\xf3\xbb\x23\xe4\x6a\xf8\xbc\xfe\xee\x93\x90\x6f\x5f\x8a\xf9\x81\xae\xe7\xad\xd0\x59\xcd\x57\x5b\xa5\xbe\x30\xc8\x39\x79\x35\x64\x3a\x6c\x73\x29\x13\x1c\x3c\x2d\xfa\x32\xa7\x71\xe5\x6d\x4d\xa1\x99\x51\x1d\xea\xaa\x67\x96\xe8\x98\xe0\x58\x5d\x8f\x49\x9e\x20\xb\xc6\xeb\xb5\xe\x7a\x4\xc5\x34\xc1\x1b\x77\xf6\xb3\x18\xd4\x47\x9a\x87\xca\x3d\x37\x21\x5\x3\xf2\x83\xa9\xce\x8c\xac\xd3\x9\x8d\xba\xe3\xd8\x4f\x24\x72\x36\x86\xb2\xcc\x69\xfc\x75\x9b\xd5\xd\x4c\xc3\x56\x25\x9c\x5e\x6b\x2b\xb1\x22\x60\x7\xd1\xdc\x8e\xf0\x4b\xb0\x97\x1e\x88\x27\x7c\xd7\xa0\xdf\x43\x1f\x5a\x54\xcf\xa\xa3\xd6\x78\x28\x66\x26\x89\xbd\xb6\x94\xc9\x2c\x95\x1a\x5c\xd2\xb7\xb9\x48\x17\x44\x70\xc7\x80\x52\x40\x11\xc4\x4e\xab\xda\xf\x45\x7e\x3e\x7f\xde\xbf\x1\xa2\x7d\xc\x55\xc0\x84\xa8\x65\x3b\x46\x2f\x62\x82\xef\x33\x76\x10\x14\xe2\x9f\x38\xf4\x42\xe1\xa4\xfb\xff\xfd\xec\x3f\xf1\xd9\xe9\x4a\x8b\xdd\x2\x9d\xb8\x0\x19\x16\x12\xf7" },
-	{ 0x545aa0, "\x93\x1a\x38\x7a\xa7\x8c\x82\x3b\x40\x4d\x17\x1\x33\x4b\x7c\xe9\x7f\x41\xcc\x62\xc4\xf2\x70\x2f\x2\xe8\x86\x81\xce\xfe\xab\xdc\xad\x30\x4\x6e\x55\xff\x59\xbd\xf5\x23\x2d\x5b\x98\x13\x52\xc7\x7e\xaa\x1e\x4c\xfb\x95\xa8\xf0\x47\xf6\xea\xa2\x1c\xfa\x1d\xe3\xcf\xd9\x12\x57\xc0\x49\x0\xbb\x68\x7d\x3d\x3\xfc\xc1\xd7\xd2\x3c\x91\xae\xa5\xbe\xb2\x51\x69\xd8\xee\xb5\xdd\xf4\x6b\xd3\x4a\x65\x8b\xaf\xde\xe2\x36\x66\xd4\xa9\xc5\x94\x46\xc3\x6\xd0\x73\x87\x27\x9a\xb6\xdb\xb3\xa6\xe0\xe6\xc9\xd\x28\x21\x60\x97\xf8\x71\x2a\x2e\x3a\xfd\xcd\x67\x63\x72\x54\x9f\xf7\x9c\xef\x9\xca\x32\x5\x37\xac\x8a\x96\xe7\x7b\x2c\x4e\xa3\x29\xdf\x31\x84\x20\x8f\xc2\x44\xf\xb7\x39\x76\x6d\x5e\xd6\xbc\x74\x9e\x5f\x78\x64\x99\x92\x6f\x42\x43\xf3\x77\x6c\x79\xb1\xa\xbf\xa1\x9b\xf1\x15\x34\xeb\x88\x50\xc\xe4\xb4\xec\x19\x7\x18\xba\x75\x6a\x48\x22\x3f\x8d\xb\x8e\x89\x5d\xc8\x11\xc6\x61\xda\x5a\xd1\xa4\x8\x10\xf9\xb8\xe\x85\x9d\x45\x56\xe1\x26\xd5\xcb\x1b\x5c\x24\x2b\x25\xb0\x83\x16\x53\xb9\x90\x80\xed\x35\x3e\x1f\x4f\x58\xe5\xa0\x14" },
-	{ 0x545d78, "\x28\x45\x39\x3a\x7e\x23\xae\x4c\xe5\x44\x3\x6c\x9a\xe3\xf8\x6d\x29\x79\x12\x48\xaf\x84\x19\x33\xf2\x94\x40\x9\x8\x56\x64\xa\x1\x5e\x34\x30\x95\xd5\x5d\x2b\x7b\xa1\xcd\x75\xf6\x61\xb4\xc6\x99\xe9\x1c\xde\x59\xb6\xe\xd3\xe7\xa9\xce\x5b\x15\xc8\xe8\xc5\x71\x42\x26\xa8\xb\x68\x3c\x70\x87\xc0\x5c\x20\xa3\x1d\xed\xd2\x91\xbc\x4a\x53\xfc\xb1\xbf\xc9\x37\x74\xb3\x69\x36\x5a\x32\x6e\xa6\xc4\x96\x10\x6b\x82\xbb\xe0\x93\x51\x3b\xe2\xd9\x98\x88\x47\x57\x63\xba\x1e\x4d\x8d\xb0\xa0\x22\x9d\xff\x3f\xab\x2\x9e\x41\xf\xf9\x8a\x76\xfb\x6\x6f\x14\xcb\x24\x90\xaa\xb8\xdc\x81\xfe\xb5\x83\x2c\x4\xc7\x55\xfa\xa2\xee\xc\xef\xbd\x5\x5f\x2f\x2e\xa4\xc2\x11\xf4\xe4\xf0\xcc\xf5\x4f\x92\x43\x4b\x54\xca\x3d\x8f\xb9\x66\x3e\x7a\x13\x46\xdf\xad\x7d\x72\xd1\x65\xdb\x35\xd6\x17\x31\xa5\xf7\x97\xc3\x1f\x73\x38\xe6\x89\x0\x50\xa7\x2a\x8c\xea\xec\x77\xc1\xeb\x8e\x67\xd7\xd0\xb2\x9c\x21\x7\xfd\xd\xbe\x85\x78\xcf\x2d\x86\xf3\x1a\x27\x6a\x80\xac\xf1\xd8\x58\x9f\xb7\x18\x25\xd4\x62\x4e\x1b\xe1\x49\x8b\x52\x7c\x60\xdd\xda\x16\x7f\x9b" },
-	{ 0x545e78, "\xa2\xb4\xa\xde\x9f\x7f\x85\x5d\xea\x41\x31\x7a\xae\x71\xd0\x1d\x56\x14\xd9\x61\xc7\x59\x69\xbf\x47\xe7\x8c\x29\xd7\xf4\x86\xb5\x2\x93\x22\x8f\x60\x11\xc1\x95\x4f\x3d\x6b\xcc\xd2\xd\x3f\x3a\xdb\xf9\xf0\x8\xb9\x4e\xb\x65\x43\x5a\xce\x4d\x91\x49\x2e\x5b\x99\x8d\xd5\x3e\xe1\x4a\x9c\x38\x78\x77\x7d\xbe\x4b\xfc\x3\x35\x33\x5\xe9\x45\xb6\x1c\xf\x2d\xaf\x53\x57\x54\xc0\xab\xfd\xa9\xcd\x12\x81\x39\x70\xc3\xff\x94\x0\x98\x96\xf5\x79\x20\x6d\xf7\x7e\x88\xf3\x5f\x75\x73\x15\xc5\xb2\x52\xda\x9e\xa5\xc4\x36\x25\xc\x7c\x42\xee\x1e\x6a\x66\x8a\x8e\xbc\xd6\x44\x74\xe8\x10\xa0\x5c\x26\x1\x68\xd4\xa7\xe3\xbd\x3c\xbb\x28\x24\xdd\xf1\x18\x27\x30\x6f\x4c\xdf\x9a\x8b\xa1\x46\xe4\xcf\x4\x67\xd1\xac\xdc\x76\xf6\x34\xa4\x80\x89\xe0\xa6\x55\x19\xb3\xad\x3b\xfe\x5e\xc8\x7\x6\x87\xd3\xfb\x6c\xe2\xf8\x6e\x48\xd8\x2b\xef\x2a\xe6\xc9\x63\xa8\x62\xb0\x2f\xc2\x16\x82\xec\x90\x1b\x23\x51\x97\x9\xf2\x7b\xcb\xe\xb1\xaa\xc6\x9d\xfa\x64\xed\xe5\x32\x50\x92\x72\xb8\x9b\x17\x58\x2c\x83\xeb\x84\x13\x40\x1a\x37\xb7\xca\xba\x21\xa3\x1f" },
-	{ 0x545ff8, "\xd3\x15\xec\xfd\x78\x34\xa2\x0\xbb\x4f\x7e\x3e\x16\x5e\x2f\x2e\x58\x3c\xd9\xcc\x49\x74\x1\xc\x84\xab\xfe\x2c\x93\xc7\x19\xea\x92\x36\x37\x47\x8c\xc6\x2d\x33\x6f\xf9\x5a\xd5\x56\xf\xef\xd1\xbf\xfb\xf6\x11\x7a\xbe\x6c\x57\xd2\x68\x6\xb2\x86\xf4\x89\x4e\x5d\xa\x9f\xb9\x42\x3a\x72\x65\xce\x7\xa8\xd6\x3b\x69\x64\xcf\x9e\x55\x4a\xe7\x1c\x1b\x67\x25\x7f\x38\x1e\x17\xeb\x88\xa3\x26\xa4\x8d\x87\xb7\xbc\x32\xad\xaf\x8\xde\x5f\x3f\xe8\xa9\xf8\x4b\xa5\x61\x79\xc3\x41\xe4\x9c\x83\x3\x21\x75\xb6\x54\xdd\x43\x91\x27\xfa\x66\xd4\x53\xb\x9d\xf1\x5b\x94\x39\x8e\xaa\xc8\x20\xc2\xb8\xe0\xa1\x28\x1d\x4c\xa7\xcb\x90\x6a\xd7\x40\x6b\x29\x13\x5c\x4\x8f\xe1\x9a\x31\xb1\x7c\xe2\x62\x1f\xc9\x10\x1a\xa0\x9\xb3\xe6\xf3\xc1\x5\xba\x82\x71\xc0\xe9\x60\x9b\xf0\x18\x12\x46\x48\xbd\xe3\xb4\xac\x30\xdf\xc5\x8b\xfc\x77\x81\x44\x97\xf5\xf7\x59\x98\x24\x3d\x2\x76\x22\xed\x6e\x2b\xff\xd\xc4\x70\x8a\xe5\xb5\x73\x99\xf2\x23\x52\xd8\xdb\x14\x96\xda\xb0\xd0\x45\x51\xae\xa6\x7d\x50\x6d\x95\xee\x80\x4d\xe\xca\xdc\x85\x63\x2a\x7b\xcd\x35" },
-	{ 0x546190, "\x96\xef\xf6\x25\x2a\x8e\x6d\xc1\x11\x1d\xb8\x33\x85\xa7\x4c\xc8\x76\xad\x24\x29\xbe\x30\xbf\x54\x5b\x21\xb5\x2f\x51\xde\xca\x74\x9f\x80\xec\xc2\x37\xb9\xe6\xc5\x3a\xe0\xf2\xc4\xd3\x3\xaa\xed\xcb\xc6\xa3\xf4\xe4\xba\x49\xb\x18\x50\xac\xf3\x4e\x64\xe3\x4f\xe\x22\x38\xdf\x94\xc7\xd7\x17\x84\x6c\xb7\xc3\x13\x4b\x47\xb0\x6\xa1\x40\x5f\xa0\x89\xf9\x8a\x3e\xab\x81\x9c\x36\x5\x1a\x62\x8b\x5c\xe8\x7f\x23\xe1\x14\x32\x61\xea\x2\xf1\x5a\x0\x4\x19\xf8\x7e\x7\xa8\x9d\x69\x8f\x1e\x79\xb6\x2d\x59\x6f\xdc\xd4\x8d\x8\x75\x16\x63\x88\x26\x99\x42\xee\x55\x77\xbb\x1c\x1b\xf0\xaf\xbc\xfa\x98\x9e\xc0\xa2\xf\x60\xa\x52\xa9\x2e\x7a\x82\x86\x2b\xce\xf7\x73\x28\xe9\xd6\x4a\x90\x43\x2c\x5e\x8c\x10\x6a\x3b\xf5\xda\x68\x3c\xe2\x91\x56\xa5\x15\xae\xcc\x31\x95\x35\x39\x71\xd0\x7b\x78\xcf\x65\x53\x41\xa4\x6b\x7c\x67\xc\x57\x4d\xfc\xa6\xd\xd2\xc9\x9\xcd\x48\x12\x97\xb4\xfd\x3d\x83\xd8\xfb\xfe\xe5\xdd\x45\x92\x7d\x6e\x1\x5d\xe7\x20\x66\x58\xff\xb3\x3f\x27\xbd\x46\x34\x72\xd5\x1f\xb1\x70\xd9\xb2\xeb\x87\x9b\x9a\xd1\x93\x44\xdb" },
-	{ 0x546290, "\x35\x7e\xbe\xb8\x37\x3c\x49\x22\xfe\x94\x24\x93\x78\x2\xcf\xdd\xe3\xb0\xe1\x70\xd3\xc3\xaf\x68\x6\x31\xb4\x7\x3d\xeb\x75\x76\x62\x5e\x73\xe6\xbf\x32\xd8\x9e\xdb\xda\x1b\xca\x11\xbc\x2f\x47\x6b\xed\xdc\x86\x64\x90\x65\xd0\xf4\xe4\x39\xa7\x16\x43\x8b\x5d\x61\x8a\x0\xf\xc4\xe9\xb9\x53\xe7\x15\x92\x21\xe0\x6e\xcb\x4a\xfb\x91\x9c\x97\x28\xc8\xd7\xd2\x99\x74\xb7\x4d\x63\x8e\x80\xe\xd9\xa0\x95\x2e\xc9\x7b\x42\x3a\x58\xd\x1c\xce\x84\xc6\x1e\x67\xa8\xc5\x17\x33\xcd\xd1\xdf\x8f\x66\x9f\xc7\x1\x3e\x2a\x23\x5\xb\xf9\x51\x81\x40\xb5\xef\xab\xf2\x5f\x50\x30\x6c\x26\x82\xfc\x60\x83\x3\x3b\x56\xe8\xfd\x18\xb2\x98\xba\x72\x27\xf5\xa1\xaa\x36\xec\x69\x4c\x77\x34\x59\xf3\x38\x9b\x7d\xc0\xa6\x48\xae\x20\xfa\xcc\xd5\xde\xb3\x14\xa4\xa\x5c\xad\x25\x7a\x4e\xe5\x46\x6f\xff\x52\x4b\x1d\xea\x8c\x79\xf1\x9a\x8d\xa2\xc2\xac\x89\x6a\x41\x44\xf8\x57\x9d\x9\x13\x7f\x10\x12\x2d\x45\xee\xa9\xe2\xc1\x3f\x1a\xbd\x29\x19\x54\xf7\xa5\x71\xd4\x96\x7c\x5b\x1f\x87\x4f\x4\xf0\x5a\xb6\x6d\xa3\xd6\xb1\x2b\xbb\x55\x8\x88\xf6\x85\xc\x2c" },
-	{ 0x546398, "\x2f\x62\x9b\xe4\xee\xdb\x3f\x8d\xd3\xd7\x9c\x32\xd6\x4a\xca\x50\xe1\x8e\x6e\xf9\x99\xc5\x4e\xdf\x46\x5d\xd5\xb7\x6d\xb1\xb9\x7e\xf\xad\x44\x96\x13\x6c\x97\x26\xa8\x9f\x85\xde\xed\x56\xce\xda\xb0\xb\x1c\xb8\x3d\x5a\x1f\xdd\x84\xf3\xcd\x9e\x73\x28\x61\x8c\xbb\x69\x64\x4f\x0\x49\x3c\x75\xc3\x29\x8a\xe2\x4d\xc7\xcb\x10\xd\xe9\x7f\xc4\x60\x1b\x5f\xd1\x45\x42\x93\x59\xe8\x74\xff\x7a\x72\xea\xd4\xa\x3e\x7d\xc1\x31\xa4\x66\x92\xfd\xf6\x6b\x3b\xba\xbc\x19\x6a\x54\x4b\x38\x47\x43\x33\x91\x8b\xe\xae\x4\x76\x4c\xab\xc6\xbe\x36\xd0\xa0\x67\x90\x87\xf5\x9a\x77\xe6\xcf\xb2\x12\x22\x8\x37\x30\xaf\x16\x3\x58\xf1\xaa\x1e\x25\xeb\xf4\x21\xa9\xfe\x27\x83\xdc\x6\x2a\x48\x78\x68\xb4\xa7\x79\x9\x80\x81\xc8\x52\x17\xcc\x2d\x15\x94\x8f\xa1\x14\x98\xe7\xd9\x7b\xb6\x82\x5\xbf\x39\x88\xac\x86\xa2\xf8\xef\x23\x2e\x95\xd2\xa6\xf2\x2c\x3a\x2b\x65\x55\x18\xc9\x35\x57\x24\xd8\xec\xf7\xf0\xb3\x5b\x6f\xfb\x20\xbd\x5c\xfa\x71\x63\xc0\x1d\xe0\x53\x2\xa5\x7c\x51\x11\xb5\xfc\x1a\x5e\x9d\x40\x34\x1\x7\x89\xa3\xc\x70\xe5\xe3\x41\xc2" },
-};
-
-static const struct buffer_t type_four_list[NUM_TYPE_FOURS]={
-	{ 0x55f320, "\x39\x25\x29\x3c\x2b\x3a\x32\x23\x26\x24\x2d\x3d\x35\x2e\x3b\x38\x20\x27\x28\x22\x33\x3f\x2c\x3e\x36\x2a\x30\x2f\x21\x34\x31\x37\x00" },
-	{ 0x55f340, "\x5f\x4b\x40\x5e\x43\x4e\x55\x41\x5a\x57\x5d\x5b\x51\x4f\x4a\x52\x53\x58\x42\x44\x49\x46\x4d\x47\x48\x45\x50\x59\x4c\x54\x56\x5c\x00" },
-	{ 0x55f360, "\x7a\x7c\x6f\x6c\x60\x62\x73\x69\x71\x65\x6d\x72\x78\x6b\x64\x70\x74\x7b\x7e\x76\x67\x68\x63\x77\x79\x7f\x61\x6e\x75\x66\x6a\x7d\x00" },
-	{ 0x55f604, "\x17\xc\x1a\x19\x13\x12\x3\x1b\xa\x7\x1e\x1d\x5\x16\x15\x14\xd\x8\xb\x10\xf\x1\x4\x0\x18\x1c\xe\x11\x6\x1f\x2\x9\x00" },
-	{ 0x5628c4, "\xd9\xd6\xd5\xc9\xda\xdd\xd2\xdf\xdc\xd7\xc3\xd3\xc8\xc6\xc4\xd1\xca\xcc\xc1\xc5\xd4\xc2\xc0\xcb\xdb\xde\xcf\xcd\xce\xd0\xd8\xc7\x00" },
-	{ 0x5628e4, "\xf0\xff\xfc\xe4\xfb\xf1\xf3\xe3\xf5\xfe\xea\xf7\xf6\xe2\xe5\xe7\xf8\xe8\xef\xf9\xf4\xeb\xed\xfd\xe9\xfa\xe0\xe1\xec\xf2\xee\xe6\x00" },
-	{ 0x5628a4, "\xa0\xb0\xb7\xb1\xbe\xbf\xab\xb2\xa6\xa9\xa8\xa2\xb4\xb3\xa5\xaf\xba\xac\xb8\xbc\xbd\xae\xbb\xa1\xb5\xad\xb9\xa3\xaa\xb6\xa7\xa4\x00" },
-	{ 0x55f6a4, "\xa9\xaf\xb5\xa6\xa1\xbf\xac\xb9\xa0\xb0\xa5\xad\xa4\xbd\xba\xb1\xbb\xae\xab\xb8\xb4\xb2\xa8\xa3\xb7\xbe\xa2\xb3\xaa\xb6\xbc\xa7\x00" },
-	{ 0x55f6c4, "\xcf\xd1\xd8\xc8\xc2\xce\xd9\xd2\xd6\xca\xc0\xd5\xdb\xcb\xc3\xc6\xd3\xd7\xdd\xdc\xc9\xd4\xde\xc1\xc7\xc4\xc5\xcc\xcd\xd0\xdf\xda\x00" },
-	{ 0x55f6e4, "\xee\xf5\xf3\xe7\xe1\xef\xfc\xf7\xed\xe6\xe4\xf8\xe8\xec\xff\xf0\xe2\xea\xe5\xe9\xf2\xfa\xf9\xfd\xeb\xfe\xf4\xe0\xf6\xf1\xe3\xfb\x00" },
-	{ 0x562928, "\x31\x3b\x33\x29\x34\x25\x24\x3d\x23\x28\x32\x27\x3a\x3e\x20\x22\x2b\x2e\x3c\x38\x30\x2c\x39\x35\x37\x2f\x3f\x2d\x2a\x26\x36\x21\x00" },
-	{ 0x55f744, "\x51\x41\x4c\x5d\x46\x5c\x5a\x43\x49\x48\x5e\x42\x53\x47\x54\x4d\x45\x55\x58\x40\x4b\x5b\x56\x4f\x5f\x57\x4e\x52\x4a\x44\x59\x50\x00" },
-	{ 0x562884, "\x84\x98\x8a\x88\x82\x92\x8d\x96\x85\x97\x8f\x90\x95\x8c\x80\x9c\x94\x9f\x91\x87\x86\x9d\x9e\x93\x9a\x9b\x8b\x83\x89\x81\x99\x8e\x00" },
-	{ 0x55f784, "\x96\x9c\x8a\x8c\x92\x81\x82\x84\x95\x93\x91\x9f\x90\x85\x9b\x9d\x80\x89\x8e\x8b\x94\x83\x99\x87\x8f\x97\x88\x8d\x9a\x86\x9e\x98\x00" },
-	{ 0x55f7a4, "\xb2\xa6\xa2\xaa\xa9\xb8\xac\xae\xab\xb7\xaf\xbc\xa3\xa0\xb0\xa5\xbf\xa1\xb3\xba\xb5\xbe\xb4\xbb\xb6\xbd\xb9\xa7\xa8\xa4\xad\xb1\x00" },
-	{ 0x55f7c4, "\xd7\xdc\xc0\xdb\xd9\xd5\xc7\xc4\xd4\xd6\xc2\xce\xd8\xc3\xd1\xca\xcc\xc1\xc8\xcd\xc5\xc6\xd2\xcf\xde\xd3\xd0\xda\xc9\xcb\xdd\xdf\x00" },
-	{ 0x55f7e4, "\xe4\xec\xf1\xf9\xe1\xfc\xe2\xe3\xfb\xe5\xef\xe7\xfd\xf7\xe6\xf8\xf3\xf5\xea\xfa\xe8\xeb\xed\xfe\xff\xf2\xf4\xe9\xee\xf0\xf6\xe0\x00" },
-	{ 0x55f804, "\x1e\xa\xe\x13\x1b\xc\x14\x10\x8\xb\xd\x18\x2\x1c\x1a\x16\x11\x4\x15\x17\x9\x5\xf\x7\x12\x1d\x1\x19\x6\x3\x0\x1f\x00" },
-	{ 0x55f824, "\x3c\x39\x32\x34\x35\x20\x3a\x2c\x3d\x2a\x2b\x26\x30\x38\x23\x33\x29\x2d\x36\x3e\x21\x25\x2f\x2e\x37\x31\x28\x24\x22\x3b\x27\x3f\x00" },
-	{ 0x55f844, "\x57\x4c\x51\x45\x53\x54\x4b\x5b\x59\x49\x56\x47\x42\x4e\x58\x5d\x5e\x40\x5f\x46\x52\x5a\x55\x44\x50\x4d\x48\x5c\x41\x43\x4a\x4f\x00" },
-	{ 0x55f864, "\x7b\x6b\x7d\x63\x7c\x61\x7a\x79\x71\x6c\x73\x74\x6e\x6a\x68\x7f\x66\x77\x67\x69\x60\x7e\x62\x6d\x76\x78\x6f\x72\x70\x65\x75\x64\x00" },
-	{ 0x55f884, "\x92\x9c\x98\x8a\x96\x84\x80\x9f\x9b\x97\x93\x8e\x9a\x87\x88\x85\x8b\x94\x86\x8c\x90\x8d\x9d\x91\x82\x89\x8f\x99\x81\x83\x95\x9e\x00" },
-	{ 0x55f8a4, "\xb8\xa9\xbf\xa3\xb3\xaa\xa2\xa5\xb6\xbd\xa7\xaf\xb4\xac\xa4\xba\xae\xa0\xbe\xb9\xa8\xbc\xa6\xb7\xab\xb5\xa1\xad\xb1\xb2\xbb\xb0\x00" },
-	{ 0x55f91c, "\x1d\x1e\x1\xc\x12\xd\x14\x8\xe\x15\x9\xb\xa\x18\x1a\x7\x1b\x6\x4\xf\x16\x2\x0\x3\x10\x17\x11\x19\x13\x1c\x5\x1f\x00" },
-	{ 0x55f93c, "\x3d\x2e\x2f\x35\x37\x25\x3f\x32\x3e\x23\x21\x27\x22\x2d\x3a\x39\x3c\x2a\x3b\x30\x29\x31\x26\x34\x24\x2c\x33\x2b\x20\x36\x38\x28\x00" },
-	{ 0x55f9d0, "\xcc\xd6\xce\xc0\xcd\xd5\xd0\xde\xdc\xd2\xc1\xc9\xc5\xc8\xc6\xd7\xcf\xdb\xc4\xd1\xdf\xd9\xdd\xc3\xd3\xd8\xc2\xd4\xcb\xda\xc7\xca\x00" },
-	{ 0x560280, "\x83\x85\x8d\x89\x9a\x96\x88\x90\x86\x9e\x9c\x95\x82\x84\x97\x8c\x98\x8b\x99\x91\x9b\x94\x93\x8a\x8e\x80\x9d\x9f\x81\x8f\x87\x92\x00" },
-	{ 0x56034c, "\x4d\x46\x52\x58\x5c\x51\x41\x5b\x42\x40\x43\x5e\x48\x56\x49\x4e\x44\x50\x45\x53\x47\x5f\x55\x57\x5d\x4c\x5a\x4a\x4f\x54\x59\x4b\x00" },
-	{ 0x56036c, "\x70\x74\x60\x65\x69\x6f\x79\x7e\x61\x6e\x64\x62\x75\x6b\x7f\x7b\x72\x71\x73\x7d\x6a\x66\x67\x78\x63\x7c\x6d\x77\x6c\x68\x76\x7a\x00" },
-	{ 0x5605b0, "\xa7\xa3\xbe\xaa\xbd\xa8\xa9\xa0\xa4\xa1\xa6\xb5\xb4\xb0\xa2\xba\xb2\xb7\xb3\xbb\xb9\xaf\xac\xbf\xbc\xb6\xab\xb8\xad\xb1\xa5\xae\x00" },
-	{ 0x560bcc, "\xd0\xc1\xd2\xcd\xca\xda\xd4\xdb\xc7\xd3\xc8\xc3\xcc\xd5\xc4\xc6\xdd\xcf\xc9\xcb\xc5\xc0\xd9\xd8\xd6\xde\xdf\xc2\xd1\xdc\xce\xd7\x00" },
-	{ 0x560bec, "\xe2\xee\xfb\xfe\xf2\xe5\xf9\xef\xed\xe7\xe3\xfd\xfc\xe6\xfa\xea\xeb\xec\xf0\xf1\xf3\xe0\xf4\xe8\xff\xe1\xf7\xe4\xf5\xf8\xe9\xf6\x00" },
-	{ 0x560c10, "\x2\x1b\x1\x11\x17\x1e\xa\x1d\xe\x8\x4\xf\x1a\x7\x9\xb\x10\x0\x1c\x18\x3\x12\x1f\xd\x19\x16\x14\x6\x5\xc\x15\x13\x00" },
-	{ 0x560d34, "\x37\x36\x29\x3a\x3d\x2e\x38\x25\x28\x39\x3c\x26\x2d\x24\x30\x23\x21\x31\x3e\x34\x27\x22\x2f\x2c\x2a\x3f\x3b\x35\x33\x20\x2b\x32\x00" },
-	{ 0x560e38, "\x23\x32\x27\x39\x28\x30\x36\x20\x3e\x3c\x38\x24\x34\x21\x35\x2e\x3a\x3b\x31\x3f\x2b\x37\x3d\x2a\x2f\x26\x22\x25\x33\x29\x2c\x2d\x00" },
-	{ 0x561014, "\x16\xe\x19\x1\x15\x2\xa\x14\x1c\xf\x10\x4\x8\xc\xd\x0\x18\x5\x1f\x1a\x17\x1e\x13\x6\x9\x3\x7\x12\x1b\x11\x1d\xb\x00" },
-	{ 0x561074, "\x65\x73\x7b\x7e\x6d\x69\x7f\x7d\x68\x6a\x60\x72\x78\x62\x67\x70\x61\x6c\x74\x79\x66\x71\x7c\x76\x64\x6e\x6b\x75\x63\x7a\x77\x6f\x00" },
-	{ 0x561094, "\x83\x9a\x89\x87\x9f\x8d\x97\x92\x9d\x95\x99\x81\x88\x82\x8c\x8f\x85\x84\x94\x8a\x8b\x9c\x86\x9b\x96\x90\x93\x8e\x80\x9e\x98\x91\x00" },
-	{ 0x5610b4, "\xbd\xbc\xa3\xa4\xbe\xb3\xa8\xab\xb0\xba\xb5\xb8\xb9\xaf\xb7\xa1\xb6\xaa\xac\xad\xbb\xb2\xae\xbf\xb1\xa5\xa0\xb4\xa2\xa9\xa6\xa7\x00" },
-	{ 0x5610d4, "\xc1\xc8\xc9\xc0\xdb\xce\xd1\xd6\xd3\xdd\xd2\xdc\xcb\xd4\xc4\xc7\xd9\xd7\xd8\xcc\xda\xc2\xcf\xca\xc6\xd0\xc5\xde\xd5\xdf\xc3\xcd\x00" },
-	{ 0x561190, "\x93\x94\x9c\x88\x80\x9d\x83\x8b\x8f\x97\x81\x87\x8c\x8d\x95\x96\x9a\x82\x92\x8a\x9b\x91\x9e\x98\x84\x86\x90\x85\x89\x99\x9f\x8e\x00" },
-	{ 0x5611b0, "\xae\xa0\xb1\xb7\xa1\xa6\xa5\xa7\xaf\xa4\xbc\xac\xb6\xb3\xb0\xa8\xb8\xbe\xb2\xab\xb9\xbd\xa9\xb5\xbf\xa2\xbb\xa3\xba\xb4\xad\xaa\x00" },
-	{ 0x5611d0, "\xcc\xd7\xd5\xca\xc0\xcd\xc4\xc2\xd8\xdf\xdc\xd1\xd4\xcb\xc6\xda\xc1\xd2\xcf\xc3\xdd\xce\xc7\xd6\xde\xd9\xc5\xc9\xd3\xc8\xd0\xdb\x00" },
-	{ 0x562968, "\x7a\x78\x79\x7d\x6b\x62\x7c\x6d\x75\x6f\x7f\x65\x61\x60\x73\x77\x63\x6e\x71\x66\x70\x6c\x68\x6a\x76\x74\x69\x64\x72\x67\x7b\x7e\x00" },
-	{ 0x55f214, "\xd\x14\x4\xc\x1d\x5\x7\x9\x1c\xe\x16\x11\x17\x3\x6\x15\xb\x0\x12\x13\x1\x19\x1b\x1f\x1a\x2\xa\x10\xf\x1e\x18\x8\x00" },
-	{ 0x55f380, "\x98\x88\x94\x97\x83\x90\x99\x84\x8d\x9c\x86\x9d\x9e\x92\x91\x8b\x8f\x82\x8e\x9b\x93\x85\x87\x96\x95\x8a\x8c\x9a\x80\x81\x9f\x89\x00" }
-};
-
-static const struct buffer_t type_five_list[NUM_TYPE_FIVES]={
-	{ 0x55f3f8, "\xef\xe7\xf6\xfd\xeb\xf4\xec\xe2\xf7\xf9\xea\xe4\xf8\xff\xf5\xfa\xe8\xee\xfc\xe9\xe5\xfb\xe6\xe0\xfe\xed\xf2\xe1\xf1\xf0\xe3\xf3\x00" },
-	{ 0x562948, "\x47\x41\x56\x59\x45\x40\x58\x48\x49\x57\x55\x54\x5a\x4c\x4f\x4d\x51\x5c\x53\x4a\x52\x5d\x5f\x5e\x50\x43\x42\x5b\x44\x46\x4b\x4e\x00" },
-	{ 0x561258, "\x5b\x49\x5f\x43\x57\x4c\x54\x59\x5c\x5a\x51\x52\x5d\x4a\x5e\x47\x44\x56\x55\x4d\x40\x50\x58\x48\x46\x45\x4f\x41\x4b\x4e\x53\x42\x00" },
-	{ 0x561278, "\x6b\x63\x7e\x69\x64\x7f\x70\x76\x68\x7d\x71\x60\x7c\x6d\x66\x77\x67\x6a\x7a\x78\x6f\x61\x62\x75\x7b\x74\x72\x65\x6c\x79\x6e\x73\x00" },
-	{ 0x561298, "\x91\x97\x98\x8d\x8a\x8f\x82\x95\x84\x93\x99\x92\x9d\x86\x85\x94\x83\x90\x81\x80\x8c\x9f\x96\x9b\x88\x8e\x89\x87\x9c\x9e\x9a\x8b\x00" },
-	{ 0x5613a0, "\xb1\xb0\xa4\xbd\xa8\xb5\xba\xbb\xb4\xb8\xaf\xb7\xb6\xa7\xbe\xae\xb2\xaa\xb3\xab\xac\xa0\xa6\xa2\xbf\xb9\xa9\xbc\xa1\xad\xa3\xa5\x00" },
-	{ 0x5613c0, "\xc0\xc5\xd0\xdc\xcc\xda\xc4\xdb\xca\xcd\xd4\xcb\xc7\xc3\xd2\xde\xc6\xd1\xc1\xc8\xd5\xc9\xdf\xcf\xd9\xd8\xd6\xc2\xd3\xce\xd7\xdd\x00" },
-	{ 0x5613e4, "\xf0\xee\xf8\xe4\xe8\xfb\xfa\xef\xf6\xf9\xf3\xec\xe3\xe0\xed\xf4\xe7\xff\xea\xfe\xe1\xe9\xf5\xf1\xfc\xe6\xe2\xe5\xfd\xf2\xf7\xeb\x00" },
-	{ 0x561404, "\x1a\x16\x2\x19\x11\x1b\x17\xf\x14\x9\x18\x5\xe\xa\x6\x1d\x0\x1e\x7\x15\x4\x12\x8\x13\x10\xc\x1c\x1\xd\xb\x1f\x3\x00" },
-	{ 0x5615a0, "\xba\xb8\xb2\xb5\xa0\xbc\xa1\xab\xb9\xbb\xbf\xb1\xa7\xb0\xbe\xa6\xb7\xa4\xaa\xae\xad\xac\xb6\xa8\xa2\xa3\xb3\xb4\xa9\xbd\xa5\xaf\x00" },
-	{ 0x561628, "\x34\x35\x2f\x3a\x30\x32\x31\x21\x27\x3c\x37\x23\x3b\x2c\x26\x36\x24\x25\x29\x3f\x33\x3e\x22\x2d\x3d\x38\x39\x20\x28\x2b\x2e\x2a\x00" },
-	{ 0x561748, "\x52\x54\x41\x5f\x53\x43\x5e\x56\x5c\x44\x5a\x46\x4d\x4b\x57\x5d\x51\x45\x58\x5b\x42\x49\x48\x59\x4a\x40\x47\x50\x4f\x4c\x55\x4e\x00" },
-	{ 0x561768, "\x6f\x6b\x7d\x63\x6a\x79\x7f\x7c\x6d\x78\x62\x67\x69\x74\x75\x66\x7a\x6e\x70\x7e\x72\x61\x7b\x71\x73\x68\x60\x65\x64\x76\x6c\x77\x00" },
-	{ 0x5617f0, "\xed\xe3\xeb\xe0\xf7\xf3\xfa\xf2\xf0\xfc\xfe\xfb\xfd\xe8\xe2\xef\xea\xf4\xe5\xe1\xee\xf8\xec\xe4\xe9\xf5\xff\xe7\xf6\xf1\xf9\xe6\x00" },
-	{ 0x561ea0, "\xa9\xaf\xb0\xac\xa3\xb5\xa7\xb7\xae\xab\xbd\xa8\xb9\xb1\xa0\xaa\xa1\xa6\xb8\xb6\xad\xb3\xb4\xb2\xa2\xbb\xba\xa4\xa5\xbf\xbc\xbe\x00" },
-	{ 0x561f38, "\x37\x31\x3a\x3e\x20\x33\x26\x3d\x29\x25\x2e\x39\x2b\x28\x36\x22\x23\x38\x35\x30\x2d\x2c\x21\x2f\x3b\x27\x32\x2a\x34\x3f\x3c\x24\x00" },
-	{ 0x561f58, "\x55\x44\x47\x4d\x57\x4c\x43\x4a\x51\x53\x41\x5f\x49\x4e\x54\x5c\x4b\x5d\x45\x5b\x56\x52\x50\x46\x59\x5e\x40\x4f\x48\x42\x5a\x58\x00" },
-	{ 0x561f7c, "\x79\x69\x61\x7e\x73\x7f\x6b\x66\x76\x7c\x63\x6e\x72\x6d\x67\x6f\x77\x71\x75\x64\x62\x74\x68\x7b\x70\x78\x6a\x65\x60\x7a\x6c\x7d\x00" },
-	{ 0x561f9c, "\x9a\x82\x90\x8d\x8f\x94\x89\x9d\x81\x9f\x93\x85\x84\x98\x9c\x88\x8e\x86\x97\x92\x9e\x87\x9b\x99\x83\x8b\x95\x96\x91\x8a\x8c\x80\x00" },
-	{ 0x562198, "\x96\x8e\x80\x89\x94\x99\x8a\x87\x90\x8d\x92\x9e\x84\x86\x9a\x82\x8f\x9b\x9f\x8b\x9d\x81\x88\x97\x95\x8c\x91\x93\x83\x98\x85\x9c\x00" },
-	{ 0x5622f0, "\xf0\xeb\xe7\xe9\xed\xe1\xfd\xea\xe3\xf3\xee\xf9\xe0\xfe\xe5\xf5\xfb\xec\xef\xf8\xfa\xf6\xf1\xff\xe6\xe4\xf2\xf4\xf7\xe8\xe2\xfc\x00" },
-	{ 0x562864, "\x73\x63\x69\x72\x64\x7f\x7b\x6d\x74\x75\x70\x6e\x66\x62\x77\x68\x6c\x7a\x6b\x76\x61\x71\x7d\x65\x78\x7e\x67\x7c\x60\x6f\x79\x6a\x00" },
-	{ 0x56238c, "\x97\x87\x80\x8a\x93\x9b\x88\x96\x92\x8e\x83\x9a\x82\x85\x9c\x8d\x9f\x95\x9d\x8c\x86\x89\x8f\x90\x94\x91\x98\x81\x8b\x84\x99\x9e\x00" },
-	{ 0x5623ac, "\xae\xb6\xbb\xb1\xad\xaf\xbf\xb2\xa9\xb4\xaa\xa6\xa0\xa8\xb7\xac\xb0\xa5\xb3\xba\xab\xa3\xa7\xa2\xb8\xbe\xa1\xbc\xb5\xbd\xa4\xb9\x00" },
-	{ 0x5623cc, "\xc2\xd8\xde\xd2\xd0\xce\xca\xda\xd4\xc1\xdb\xc0\xd1\xdd\xc4\xd5\xcb\xc3\xdf\xc8\xcf\xd7\xc7\xd3\xd6\xc6\xc9\xdc\xcc\xcd\xd9\xc5\x00" },
-	{ 0x5623ec, "\xec\xe1\xef\xee\xfd\xe8\xf4\xe7\xf8\xf1\xf0\xff\xf7\xfb\xfc\xf9\xed\xf5\xeb\xe5\xf6\xfa\xfe\xf2\xe4\xea\xe0\xe2\xf3\xe3\xe6\xe9\x00" },
-	{ 0x562908, "\x13\x1c\x1a\x1d\x19\x15\x1f\x11\x18\x1\x0\xe\x12\x1e\xf\x1b\x17\x3\x14\xd\x6\x8\x10\x2\xc\x9\xb\x4\x5\x16\xa\x7\x00" },
-	{ 0x56249c, "\x89\x9c\x8c\x97\x81\x96\x9a\x80\x91\x83\x8b\x93\x9f\x88\x8f\x8e\x87\x84\x94\x82\x8a\x95\x86\x98\x9e\x90\x92\x9d\x9b\x85\x8d\x99\x00" },
-	{ 0x562544, "\x43\x42\x55\x4c\x48\x5b\x5d\x46\x50\x40\x49\x5c\x5e\x41\x53\x57\x58\x5f\x51\x47\x45\x4b\x52\x5a\x59\x54\x44\x56\x4f\x4a\x4d\x4e\x00" },
-	{ 0x562564, "\x75\x65\x7b\x62\x7e\x60\x66\x6d\x61\x69\x6f\x7c\x6a\x76\x7f\x73\x63\x6c\x79\x7a\x70\x7d\x72\x71\x67\x68\x64\x74\x6e\x78\x6b\x77\x00" },
-	{ 0x5625a0, "\xbf\xab\xb3\xa0\xb6\xb5\xb4\xaa\xbd\xa5\xbe\xba\xaf\xa4\xae\xa1\xb9\xa7\xa2\xb2\xac\xb7\xa8\xa9\xa3\xb1\xb8\xb0\xbc\xbb\xa6\xad\x00" },
-	{ 0x5625c0, "\xc2\xdb\xcc\xd7\xdf\xc5\xd5\xde\xd6\xc9\xda\xd2\xcf\xdc\xd8\xca\xd9\xd0\xcd\xd3\xc4\xd1\xc8\xd4\xdd\xce\xc6\xc0\xc1\xc7\xcb\xc3\x00" },
-	{ 0x5625e0, "\xe0\xe6\xeb\xe8\xec\xe4\xfa\xfc\xe5\xfe\xf4\xe3\xea\xf8\xf2\xfd\xf6\xff\xe7\xe9\xef\xee\xf7\xf3\xf1\xf9\xf0\xed\xfb\xe2\xe1\xf5\x00" },
-	{ 0x562600, "\x12\x3\x1a\x15\x4\x19\xb\x1b\x17\x1e\xd\x5\x11\x14\x1c\x0\x18\x10\xa\x6\xe\x8\x2\x7\x13\x9\x16\x1d\xf\xc\x1\x1f\x00" },
-	{ 0x562620, "\x3e\x3b\x31\x27\x28\x26\x38\x37\x2d\x2f\x32\x23\x3d\x24\x2a\x3a\x2c\x33\x34\x3f\x2b\x39\x30\x21\x36\x25\x3c\x2e\x22\x20\x29\x35\x00" },
-	{ 0x562640, "\x4f\x5d\x57\x56\x4d\x45\x53\x5f\x5b\x49\x5c\x5e\x55\x41\x46\x48\x4c\x50\x4b\x42\x44\x4a\x47\x5a\x58\x4e\x43\x51\x52\x54\x59\x40\x00" },
-	{ 0x562660, "\x6f\x64\x7d\x7b\x75\x70\x61\x6b\x60\x77\x73\x67\x7e\x7f\x68\x6a\x79\x69\x65\x66\x6c\x7a\x74\x76\x6e\x78\x63\x7c\x72\x71\x6d\x62\x00" }
-};
-
-static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop);
-static unsigned char yahoo_auth_read45(unsigned int buffer, int offset);
-static unsigned char yahoo_auth_read3(unsigned int buffer, int offset);
-static unsigned int yahoo_auth_typefourfive(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int initial);
-static unsigned int yahoo_auth_typethree(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int offset);
-static unsigned int yahoo_auth_typetwo(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_two_variable, int type_two_variable2);
-static unsigned int yahoo_auth_typeone(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_one_variable);
-
-/******************************************************************************
- y a h o o _ a u t h _ f i b o n a c c i ()
-******************************************************************************/
-
-static unsigned int yahoo_auth_fibonacci(unsigned int challenge, int divisor, int outer_loop, int inner_loop)
-{
-	unsigned int	hash = (challenge & 0xff) * 0x9e3779b1;
-
-	hash ^= (challenge & 0xff00) >> 0x8;
-	hash *= 0x9e3779b1;
-	hash ^= (challenge & 0xff0000) >> 0x10;
-	hash *= 0x9e3779b1;
-	hash ^= (challenge & 0xff000000) >> 0x18;
-	hash *= 0x9e3779b1;
-		
-	if (outer_loop > 1) {
-		const auth_function_t		*ft;
-
-		int					remainder;
-
-		hash = ((((hash ^ (hash >> 0x8)) >> 0x10) ^ hash) ^ (hash >> 0x8)) & 0xff;
-
-		remainder = hash % divisor;
-
-		outer_loop--;
-		challenge *= 0x10dcd;
-
-		ft = &main_function_list[inner_loop][remainder];
-
-		if (ft) {
-
-			switch (ft->type) {
-
-				case 0:
-					return challenge;
-				case 1:
-					return yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1);
-
-				case 2:
-					return yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2);
-
-				case 3:
-					return yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1);
-
-				case 4:
-				case 5:
-					return yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1);
-
-				default:
-					break;
-			}
-		}
-	}
-
-	return challenge;
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ r e a d 4 5 ()
-******************************************************************************/
-
-static unsigned char yahoo_auth_read45(unsigned int buffer, int offset)
-{
-	int		i;
-
-	if (offset > 32)
-		return 0;
-
-	for (i = 0; i < NUM_TYPE_FOURS; i++) {
-		if (type_four_list[i].buffer_start == buffer)
-			return type_four_list[i].buffer[offset] ^ (buffer & 0xff);
-	}
-
-	for (i = 0; i < NUM_TYPE_FIVES; i++) {
-		if (type_five_list[i].buffer_start == buffer)
-			return type_five_list[i].buffer[offset] ^ (buffer & 0xff);
-	}
-
-	return 0;
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ r e a d 3 ()
-******************************************************************************/
-
-static unsigned char yahoo_auth_read3(unsigned int buffer, int offset)
-{
-	int		i;
-
-	if (offset > 256)
-		return 0;
-
-	for (i = 0; i < NUM_TYPE_THREES; i++) {
-		if (type_three_list[i].buffer_start == buffer)
-			return type_three_list[i].buffer[offset] ^ (buffer & 0xff);
-	}
-
-	return 0;
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ t y p e f o u r f i v e ()
-******************************************************************************/
-
-static unsigned int yahoo_auth_typefourfive(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int initial)
-{
-	unsigned int	final_value = 0;
-
-	int				i;
-
-	/* Run through each bit. */
-
-	for (i = 0; i < 32; i++)
-	{
-		unsigned char	buffer = yahoo_auth_read45(initial, i);		/* Find the location in the challenge to put the 1/0 bit */
-		int				mask = ~(1 << buffer);						/* so that we can do a replace of our current value. */
-		int				new_value = (challenge >> i) & 1;			/* Is this bit 1 or 0? */
-
-		final_value = (final_value & mask) | (new_value << buffer);
-	}
-
-	return yahoo_auth_fibonacci(final_value, divisor, outer_loop, inner_loop);
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ t y p e t h r e e ()
-******************************************************************************/
-
-static unsigned int yahoo_auth_typethree(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int offset)
-{
-	int				new_challenge = yahoo_auth_read3(offset, (challenge & 0xff000000) >> 0x18) << 0x18;
-
-	new_challenge |= yahoo_auth_read3(offset, (challenge & 0x00ff0000) >> 0x10) << 0x10;
-	new_challenge |= yahoo_auth_read3(offset, (challenge & 0x0000ff00) >> 0x8) << 0x8;
-	new_challenge |= yahoo_auth_read3(offset, (challenge & 0x000000ff));
-	
-	return yahoo_auth_fibonacci(new_challenge, divisor, outer_loop, inner_loop);
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ t y p e t w o ()
-******************************************************************************/
-
-static unsigned int yahoo_auth_typetwo(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_two_variable, int type_two_variable2)
-{
-	return yahoo_auth_fibonacci((challenge * type_two_variable) + type_two_variable2, divisor, outer_loop, inner_loop);
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ t y p e o n e ()
-******************************************************************************/
-
-static unsigned int yahoo_auth_typeone(unsigned int challenge, int divisor, int outer_loop, int inner_loop, int type_one_variable)
-{
-	return yahoo_auth_fibonacci(challenge ^ type_one_variable, divisor, outer_loop, inner_loop);
-}
-
-/******************************************************************************
- y a h o o _ a u t h _ f i n a l C o u n t d o w n ()
-******************************************************************************/
-
-unsigned int yahoo_auth_finalCountdown(unsigned int challenge, int divisor, int inner_loop, int outer_loop)
-{
-	const auth_function_t		*ft;
-
-	int					remainder = challenge % divisor;
-
-	ft = &main_function_list[inner_loop][remainder];
-
-	if (ft) {
-
-		switch(ft->type) {
-
-			case 0:
-				break;
-
-			case 1:
-				challenge = yahoo_auth_typeone(challenge, divisor, outer_loop, inner_loop, ft->var1);
-				break;
-
-			case 2:
-				challenge = yahoo_auth_typetwo(challenge, divisor, outer_loop, inner_loop, ft->var1, ft->var2);
-				break;
-
-			case 3:
-				challenge = yahoo_auth_typethree(challenge, divisor, outer_loop, inner_loop, ft->var1);
-				break;
-
-			case 4:
-			case 5:
-				challenge = yahoo_auth_typefourfive(challenge, divisor, outer_loop, inner_loop, ft->var1);
-				break;
-		}
-	}
-
-	return challenge;
-}
--- a/libpurple/protocols/yahoo/yahoo_auth.h	Sun May 10 06:24:26 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,48 +0,0 @@
-/*
- * yahoo_auth.h: Header for Yahoo Messenger authentication schemes.  Eew.
- *
- * Copyright(c) 2003 Cerulean Studios
- *
- * 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 _YAHOO_AUTH_H_
-#define _YAHOO_AUTH_H_ 
-
-#define NUM_TYPE_THREES 105
-#define NUM_TYPE_FOURS 56
-#define NUM_TYPE_FIVES 37
-
-unsigned int yahoo_auth_finalCountdown(unsigned int challenge, int divisor, int inner_loop, int outer_loop);
-
-/* We've defined the Yahoo authentication functions as having types 1-5; all take either 1 or 2 arguments.
- */
-
-typedef struct _auth {
-	int				type;
-	int				var1; 
-	int				var2;
-} auth_function_t;
-
-/* Type 3, 4 and 5 require lookups into ypager.exe's many static chunks of 256 bytes.  Store them here.
- */
-
-struct buffer_t {
-	unsigned int	buffer_start;
-	unsigned char	buffer[257];
-};
-
-#endif /* _YAHOO_AUTH_H_ */
--- a/libpurple/protocols/yahoo/yahoo_crypt.c	Sun May 10 06:24:26 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,207 +0,0 @@
-/* One way encryption based on MD5 sum.
-   Copyright (C) 1996, 1997, 1999, 2000 Free Software Foundation, Inc.
-   This file is part of the GNU C Library.
-   Contributed by Ulrich Drepper <drepper@cygnus.com>, 1996.
-
-   The GNU C Library is free software; you can redistribute it and/or
-   modify it under the terms of the GNU Lesser General Public
-   License as published by the Free Software Foundation; either
-   version 2.1 of the License, or (at your option) any later version.
-
-   The GNU C Library is distributed in the hope that it will be useful,
-   but WITHOUT ANY WARRANTY; without even the implied warranty of
-   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
-   Lesser General Public License for more details.
-
-   You should have received a copy of the GNU Lesser General Public
-   License along with the GNU C Library; if not, write to the Free
-   Software Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
-   02111-1301 USA.  */
-
-/* warmenhoven took this file and made it work with the md5.[ch] we
- * already had. isn't that lovely. people should just use linux or
- * freebsd, crypt works properly on those systems. i hate solaris */
-
-#include <string.h>
-#include <stdlib.h>
-#include <glib.h>
-
-#include "cipher.h"
-#include "yahoo_crypt.h"
-
-/* Define our magic string to mark salt for MD5 "encryption"
-   replacement.  This is meant to be the same as for other MD5 based
-   encryption implementations.  */
-static const char md5_salt_prefix[] = "$1$";
-
-/* Table with characters for base64 transformation.  */
-static const char b64t[64] =
-"./0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
-
-char *yahoo_crypt(const char *key, const char *salt)
-{
-	PurpleCipher *cipher;
-	PurpleCipherContext *context1, *context2;
-	guchar digest[16];
-	static char *buffer = NULL;
-	static int buflen = 0;
-	int needed = 3 + strlen (salt) + 1 + 26 + 1;
-
-	size_t salt_len;
-	size_t key_len;
-	size_t cnt;
-
-	char *cp;
-
-	if (buflen < needed) {
-		buflen = needed;
-		if ((buffer = g_realloc(buffer, buflen)) == NULL)
-			return NULL;
-	}
-
-	cipher = purple_ciphers_find_cipher("md5");
-	context1 = purple_cipher_context_new(cipher, NULL);
-	context2 = purple_cipher_context_new(cipher, NULL);
-
-	/* Find beginning of salt string.  The prefix should normally always
-	 * be present.  Just in case it is not.
-	 */
-	if (strncmp (md5_salt_prefix, salt, sizeof (md5_salt_prefix) - 1) == 0)
-		/* Skip salt prefix.  */
-		salt += sizeof (md5_salt_prefix) - 1;
-
-	salt_len = MIN (strcspn (salt, "$"), 8);
-	key_len = strlen (key);
-
-	/* Add the key string.  */
-	purple_cipher_context_append(context1, (const guchar *)key, key_len);
-
-	/* Because the SALT argument need not always have the salt prefix we
-	 * add it separately.
-	 */
-	purple_cipher_context_append(context1, (const guchar *)md5_salt_prefix,
-							   sizeof(md5_salt_prefix) - 1);
-
-	/* The last part is the salt string.  This must be at most 8
-	 * characters and it ends at the first `$' character (for
-	 * compatibility which existing solutions).
-	 */
-	purple_cipher_context_append(context1, (const guchar *)salt, salt_len);
-
-	/* Compute alternate MD5 sum with input KEY, SALT, and KEY.  The
-	 * final result will be added to the first context.
-	 */
-
-	/* Add key.  */
-	purple_cipher_context_append(context2, (const guchar *)key, key_len);
-
-	/* Add salt.  */
-	purple_cipher_context_append(context2, (const guchar *)salt, salt_len);
-
-	/* Add key again.  */
-	purple_cipher_context_append(context2, (const guchar *)key, key_len);
-
-	/* Now get result of this (16 bytes) and add it to the other context.  */
-	purple_cipher_context_digest(context2, sizeof(digest), digest, NULL);
-
-	/* Add for any character in the key one byte of the alternate sum.  */
-	for (cnt = key_len; cnt > 16; cnt -= 16)
-		purple_cipher_context_append(context1, digest, 16);
-	purple_cipher_context_append(context1, digest, cnt);
-
-	/* For the following code we need a NUL byte.  */
-	digest[0] = '\0';
-
-	/* The original implementation now does something weird: for every 1
-	 * bit in the key the first 0 is added to the buffer, for every 0
-	 * bit the first character of the key.  This does not seem to be
-	 * what was intended but we have to follow this to be compatible.
-	 */
-	for (cnt = key_len; cnt > 0; cnt >>= 1)
-		purple_cipher_context_append(context1,
-								   (cnt & 1) != 0 ? digest : (guchar *)key, 1);
-
-	/* Create intermediate result.  */
-	purple_cipher_context_digest(context1, sizeof(digest), digest, NULL);
-
-	/* Now comes another weirdness.  In fear of password crackers here
-	 * comes a quite long loop which just processes the output of the
-	 * previous round again.  We cannot ignore this here.
-	 */
-	for (cnt = 0; cnt < 1000; ++cnt) {
-		/* New context.  */
-		purple_cipher_context_reset(context2, NULL);
-
-		/* Add key or last result.  */
-		if ((cnt & 1) != 0)
-			purple_cipher_context_append(context2, (const guchar *)key, key_len);
-		else
-			purple_cipher_context_append(context2, digest, 16);
-
-		/* Add salt for numbers not divisible by 3.  */
-		if (cnt % 3 != 0)
-			purple_cipher_context_append(context2, (const guchar *)salt, salt_len);
-
-		/* Add key for numbers not divisible by 7.  */
-		if (cnt % 7 != 0)
-			purple_cipher_context_append(context2, (const guchar *)key, key_len);
-
-		/* Add key or last result.  */
-		if ((cnt & 1) != 0)
-			purple_cipher_context_append(context2, digest, 16);
-		else
-			purple_cipher_context_append(context2, (const guchar *)key, key_len);
-
-		/* Create intermediate result.  */
-		purple_cipher_context_digest(context2, sizeof(digest), digest, NULL);
-	}
-
-	/* Now we can construct the result string.  It consists of three parts. */
-	strncpy(buffer, md5_salt_prefix, MAX (0, buflen));
-	cp = buffer + strlen(buffer);
-	buflen -= sizeof (md5_salt_prefix);
-
-	strncpy(cp, salt, MIN ((size_t) buflen, salt_len));
-	cp = cp + strlen(cp);
-	buflen -= MIN ((size_t) buflen, salt_len);
-
-	if (buflen > 0) {
-		*cp++ = '$';
-		--buflen;
-	}
-
-#define b64_from_24bit(B2, B1, B0, N) \
-	do { \
-		unsigned int w = ((B2) << 16) | ((B1) << 8) | (B0); \
-		int n = (N); \
-		while (n-- > 0 && buflen > 0) { \
-			*cp++ = b64t[w & 0x3f]; \
-			--buflen; \
-			w >>= 6; \
-		}\
-	} while (0)
-
-	b64_from_24bit (digest[0], digest[6], digest[12], 4);
-	b64_from_24bit (digest[1], digest[7], digest[13], 4);
-	b64_from_24bit (digest[2], digest[8], digest[14], 4);
-	b64_from_24bit (digest[3], digest[9], digest[15], 4);
-	b64_from_24bit (digest[4], digest[10], digest[5], 4);
-	b64_from_24bit (0, 0, digest[11], 2);
-	if (buflen <= 0) {
-		g_free(buffer);
-		buffer = NULL;
-	} else
-		*cp = '\0';	/* Terminate the string.  */
-
-	/* Clear the buffer for the intermediate result so that people
-	 * attaching to processes or reading core dumps cannot get any
-	 * information.  We do it in this way to clear correct_words[]
-	 * inside the MD5 implementation as well.
-	 */
-	purple_cipher_context_reset(context1, NULL);
-	purple_cipher_context_digest(context1, sizeof(digest), digest, NULL);
-	purple_cipher_context_destroy(context1);
-	purple_cipher_context_destroy(context2);
-
-	return buffer;
-}
--- a/libpurple/protocols/yahoo/yahoo_crypt.h	Sun May 10 06:24:26 2009 +0000
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,27 +0,0 @@
-/*
- * 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 _YAHOO_CRYPT_H_
-#define _YAHOO_CRYPT_H_
-
-char *yahoo_crypt(const char *key, const char *salt);
-
-#endif /* _YAHOO_CRYPT_H */
--- a/libpurple/protocols/yahoo/yahoo_doodle.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_doodle.c	Sun Jun 28 04:41:07 2009 +0000
@@ -46,7 +46,6 @@
 #include "yahoo_friend.h"
 #include "yahoochat.h"
 #include "ycht.h"
-#include "yahoo_auth.h"
 #include "yahoo_filexfer.h"
 #include "yahoo_picture.h"
 
--- a/libpurple/protocols/yahoo/yahoo_filexfer.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_filexfer.c	Sun Jun 28 04:41:07 2009 +0000
@@ -320,7 +320,7 @@
 
 	if (purple_xfer_get_type(xfer) == PURPLE_XFER_SEND) {
 		if (yd->jp) {
-			if (purple_proxy_connect(NULL, account, purple_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
+			if (purple_proxy_connect(gc, account, purple_account_get_string(account, "xferjp_host",  YAHOOJP_XFER_HOST),
 			                       purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 			                       yahoo_sendfile_connected, xfer) == NULL)
 			{
@@ -329,7 +329,7 @@
 				purple_xfer_cancel_remote(xfer);
 			}
 		} else {
-			if (purple_proxy_connect(NULL, account, purple_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
+			if (purple_proxy_connect(gc, account, purple_account_get_string(account, "xfer_host",  YAHOO_XFER_HOST),
 			                       purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT),
 			                       yahoo_sendfile_connected, xfer) == NULL)
 			{
@@ -340,7 +340,7 @@
 		}
 	} else {
 		xfer->fd = -1;
-		if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
+		if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port,
 		                              yahoo_receivefile_connected, xfer) == NULL) {
 			purple_notify_error(gc, NULL, _("File Transfer Failed"),
 			             _("Unable to establish file descriptor."));
@@ -380,12 +380,12 @@
 			28,  xfer->size,
 			301, 268,
 			303, 268);
-		g_free(filename); 
+		g_free(filename);
 	} else {
 		if(xfer_data->firstoflist == TRUE) {
 			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_15,
 				YAHOO_STATUS_AVAILABLE, yd->session_id);
-	
+
 			yahoo_packet_hash(pkt, "sssi",
 				1, purple_normalize(account, purple_account_get_username(account)),
 				5, xfer->who,
@@ -394,7 +394,7 @@
 		} else {
 			pkt = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
 				YAHOO_STATUS_AVAILABLE, yd->session_id);
-	
+
 			yahoo_packet_hash(pkt, "sssi",
 				1, purple_normalize(account, purple_account_get_username(account)),
 				5, xfer->who,
@@ -623,7 +623,7 @@
 	else if (written <= 0)
 		purple_debug_info("yahoo", "p2p filetransfer: Unable to write HTTP OK");
 
-	/* close connection */	
+	/* close connection */
 	close(xfer->fd);
 	xfer->fd = -1;
 	g_free(tx);
@@ -644,14 +644,14 @@
 		/* Send HTTP OK in case of p2p transfer, when we act as server */
 		if((xfer_data->xfer_url != NULL) && (xfer_old->fd >=0) && (purple_xfer_get_status(xfer_old) == PURPLE_XFER_STATUS_DONE))
 			yahoo_p2p_ft_server_send_OK(xfer_old);
-		
+
 		/* removing top of filename & size list completely */
 		g_free( xfer_data->filename_list->data );
 		g_free( xfer_data->size_list->data );
-		   
+
 		xfer_data->filename_list->data = NULL;
 		xfer_data->size_list->data = NULL;
-		   
+
 		xfer_data->filename_list = g_slist_delete_link(xfer_data->filename_list, xfer_data->filename_list);
 		xfer_data->size_list = g_slist_delete_link(xfer_data->size_list, xfer_data->size_list);
 
@@ -697,16 +697,16 @@
 			/* Build the file transfer handle. */
 			xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, xfer_old->who);
 
-			
+
 			if (xfer) {
 				/* Set the info about the incoming file. */
 				char *utf8_filename = yahoo_string_decode(gc, filename, TRUE);
 				purple_xfer_set_filename(xfer, utf8_filename);
 				g_free(utf8_filename);
 				purple_xfer_set_size(xfer, filesize);
-		
+
 				xfer->data = xfer_data;
-	
+
 				/* Setup our I/O op functions */
 				purple_xfer_set_init_fnc(xfer,        yahoo_xfer_init_15);
 				purple_xfer_set_start_fnc(xfer,       yahoo_xfer_start);
@@ -1003,7 +1003,7 @@
 		purple_xfer_cancel_remote(xfer);
 		return;
 	}
-	
+
 	/* Discard the length... */
 	hosts = g_slist_remove(hosts, hosts->data);
 	if(!hosts)
@@ -1012,7 +1012,7 @@
 		purple_xfer_cancel_remote(xfer);
 		return;
 	}
-	
+
 	/* TODO:actually, u must try with addr no.1 , if its not working addr no.2 ..... */
 	addr = hosts->data;
 	actaddr = addr->sin_addr.s_addr;
@@ -1113,14 +1113,15 @@
 	while((did = read(source, buf, 998)) > 0)
 	{
 		xd->txbuflen += did;
-		buf[did] = '\0';  
+		buf[did] = '\0';
 		t = xd->txbuf;
 		xd->txbuf = g_strconcat(t,buf,NULL);
 		g_free(t);
 	}
 	g_free(buf);
 
-	if (did < 0 && errno == EAGAIN) return;
+	if (did < 0 && errno == EAGAIN)
+		return;
 	else if (did < 0) {
 		purple_debug_error("yahoo", "Unable to write in order to start ft errno = %d\n", errno);
 		purple_xfer_cancel_remote(xfer);
@@ -1136,7 +1137,7 @@
 		close(source);/* Is this required? */
 		g_free(xd->txbuf);
 		xd->txbuf = NULL;
-		if (purple_proxy_connect(NULL, account, xd->host, xd->port, yahoo_xfer_connected_15, xfer) == NULL)
+		if (purple_proxy_connect(gc, account, xd->host, xd->port, yahoo_xfer_connected_15, xfer) == NULL)
 		{
 			purple_notify_error(gc, NULL, _("File Transfer Failed"),
 				_("Unable to establish file descriptor."));
@@ -1249,7 +1250,11 @@
 			if(xd->info_val_249 == 2)
 				{
 				/* sending file via p2p, we are connected as client */
-				xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n",
+				xd->txbuf = g_strdup_printf("POST /%s HTTP/1.1\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Content-Length: %ld\r\n"
+						"Cache-Control: no-cache\r\n\r\n",
 										xd->path,
 										xd->host,
 										(long int)xfer->size);	/* to do, add Referer */
@@ -1257,7 +1262,12 @@
 			else
 				{
 				/* sending file via relaying */
-				xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: %ld\r\nCache-Control: no-cache\r\n\r\n",
+				xd->txbuf = g_strdup_printf("POST /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n"
+						"Cookie:%s\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Content-Length: %ld\r\n"
+						"Cache-Control: no-cache\r\n\r\n",
 										purple_url_encode(xd->xfer_idstring_for_relay),
 										purple_normalize(account, purple_account_get_username(account)),
 										xfer->who,
@@ -1267,16 +1277,28 @@
 				}
 		}
 		else if(purple_xfer_get_type(xfer) == PURPLE_XFER_RECEIVE && xd->status_15 == STARTED)
-		{	
+		{
 			if(xd->info_val_249 == 1)
 				{
 				/* receiving file via p2p, connected as client */
-				xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\nAccept:*/*\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n",xd->path,xd->host);
+				xd->txbuf = g_strdup_printf("HEAD /%s HTTP/1.1\r\n"
+						"Accept: */*\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Content-Length: 0\r\n"
+						"Cache-Control: no-cache\r\n\r\n",
+						xd->path,xd->host);
 			}
 			else
 				{
 				/* receiving file via relaying */
-				xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nAccept:*/*\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nContent-Length: 0\r\nCache-Control: no-cache\r\n\r\n",
+				xd->txbuf = g_strdup_printf("HEAD /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n"
+						"Accept: */*\r\n"
+						"Cookie: %s\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Content-Length: 0\r\n"
+						"Cache-Control: no-cache\r\n\r\n",
 										purple_url_encode(xd->xfer_idstring_for_relay),
 										purple_normalize(account, purple_account_get_username(account)),
 										xfer->who,
@@ -1289,12 +1311,20 @@
 			if(xd->info_val_249 == 1)
 				{
 				/* receiving file via p2p, connected as client */
-				xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost: %s\r\nConnection: Keep-Alive\r\n\r\n",xd->path,xd->host);
+				xd->txbuf = g_strdup_printf("GET /%s HTTP/1.1\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Connection: Keep-Alive\r\n\r\n",
+						xd->path, xd->host);
 			}
 			else
 				{
 				/* receiving file via relaying */
-				xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\nCookie:%s\r\nUser-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\nHost:%s\r\nConnection: Keep-Alive\r\n\r\n",
+				xd->txbuf = g_strdup_printf("GET /relay?token=%s&sender=%s&recver=%s HTTP/1.1\r\n"
+						"Cookie: %s\r\n"
+						"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
+						"Host: %s\r\n"
+						"Connection: Keep-Alive\r\n\r\n",
 										purple_url_encode(xd->xfer_idstring_for_relay),
 										purple_normalize(account, purple_account_get_username(account)),
 										xfer->who,
@@ -1563,7 +1593,7 @@
 	GSList *filename_list = NULL;
 	GSList *size_list = NULL;
 	int nooffiles = 0;
-	
+
 	yd = gc->proto_data;
 
 	for (l = pkt->hash; l; l = l->next) {
@@ -1588,7 +1618,7 @@
 			break;
 		case 222:
 			val_222 = atol(pair->value);
-			/* 1=send, 2=cancel, 3=accept, 4=reject */ 
+			/* 1=send, 2=cancel, 3=accept, 4=reject */
 			break;
 
 		/* check for p2p and imviron .... not sure it comes by this service packet. Since it was bundled with filexfer in old ymsg version, still keeping it. */
@@ -1626,7 +1656,7 @@
 		*	so, purple dnsquery is used... but retries, trying with next ip
 		*	address etc. is not implemented..TODO
 		*/
-		
+
 		/* To send through p2p */
 		if( g_hash_table_lookup(yd->peers, from) )	{
 			/* send p2p file transfer information */
@@ -1656,7 +1686,7 @@
 		g_hash_table_replace(yd->imvironments, g_strdup(from), g_strdup(imv));
 		return;
 	}
-	
+
 	if (pkt->service == YAHOO_SERVICE_P2PFILEXFER) {
 		if (service && (strcmp("FILEXFER", service) != 0)) {
 			purple_debug_misc("yahoo", "unhandled service 0x%02x\n", pkt->service);
@@ -1681,7 +1711,7 @@
 	xfer_data->xfer_peer_idstring = g_strdup(xfer_peer_idstring);
 	xfer_data->filename_list = filename_list;
 	xfer_data->size_list = size_list;
-	
+
 	/* Build the file transfer handle. */
 	xfer = purple_xfer_new(gc->account, PURPLE_XFER_RECEIVE, from);
 	xfer->message = NULL;
@@ -1710,7 +1740,7 @@
 		g_hash_table_insert(yd->xfer_peer_idstring_map,
 							xfer_data->xfer_peer_idstring,
 							xfer);
-		
+
 		if(nooffiles > 1) {
 			gchar* message;
 			message = g_strdup_printf(_("%s is trying to send you a group of %d files.\n"), xfer->who, nooffiles);
@@ -1796,23 +1826,22 @@
 			purple_xfer_cancel_remote(xfer);
 			return;
 		}
-		
+
 		account = purple_connection_get_account(xfer_data->gc);
 
 		pkt_to_send = yahoo_packet_new(YAHOO_SERVICE_FILETRANS_ACC_15,
 			YAHOO_STATUS_AVAILABLE, yd->session_id);
-		yahoo_packet_hash(pkt_to_send, "ssssisi",
+		yahoo_packet_hash(pkt_to_send, "ssssis",
 			1, purple_normalize(account, purple_account_get_username(account)),
 			5, xfer->who,
 			265, xfer_data->xfer_peer_idstring,
 			27, xfer->filename,
 			249, xfer_data->info_val_249,
-			251, xfer_data->xfer_idstring_for_relay,
-			222, 3);
+			251, xfer_data->xfer_idstring_for_relay);
 
 		yahoo_packet_send_and_free(pkt_to_send, yd);
 
-		if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
+		if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port,
 			yahoo_xfer_connected_15, xfer) == NULL) {
 			purple_notify_error(gc, NULL, _("File Transfer Failed"),
 				_("Unable to establish file descriptor."));
@@ -1887,12 +1916,12 @@
 	xfer_data = xfer->data;
 	if(url)
 		purple_url_parse(url, &(xfer_data->host), &(xfer_data->port), &(xfer_data->path), NULL, NULL);
-		
+
 	xfer_data->xfer_idstring_for_relay = g_strdup(xfer_idstring_for_relay);
 	xfer_data->status_15 = ACCEPTED;
 	account = purple_connection_get_account(gc);
 
-	if (purple_proxy_connect(NULL, account, xfer_data->host, xfer_data->port,
+	if (purple_proxy_connect(gc, account, xfer_data->host, xfer_data->port,
 		yahoo_xfer_connected_15, xfer) == NULL)
 	{
 		purple_notify_error(gc, NULL, _("File Transfer Failed"),_("Unable to connect"));
--- a/libpurple/protocols/yahoo/yahoo_friend.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_friend.c	Sun Jun 28 04:41:07 2009 +0000
@@ -172,16 +172,16 @@
 		l = l->next;
 	}
 
+	if (value != 1 && value != 2) {
+		purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value);
+		return;
+	}
+
 	if(msn)
 		who = g_strconcat("msn/", temp, NULL);
 	else
 		who = g_strdup(temp);
 
-	if (value != 1 && value != 2) {
-		purple_debug_error("yahoo", "Received unknown value for presence key: %d\n", value);
-		return;
-	}
-
 	g_return_if_fail(who != NULL);
 
 	f = yahoo_friend_find(gc, who);
--- a/libpurple/protocols/yahoo/yahoo_packet.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.c	Sun Jun 28 04:41:07 2009 +0000
@@ -195,7 +195,7 @@
 						   "Key: %d  \tValue: %s\n", pair->key, esc);
 				g_free(esc);
 			}
-#endif
+#endif /* DEBUG */
 		} else {
 			g_free(pair);
 		}
@@ -282,7 +282,7 @@
 	}
 
 	purple_debug(PURPLE_DEBUG_MISC, NULL, "\n");
-#endif
+#endif /* YAHOO_DEBUG */
 }
 
 static void
@@ -329,7 +329,7 @@
 	if (wm)
 		pos += yahoo_put16(data + pos, YAHOO_WEBMESSENGER_PROTO_VER);
 	else if (jp)
-		pos += yahoo_put16(data + pos, YAHOO_PROTO_VER_JAPAN);		
+		pos += yahoo_put16(data + pos, YAHOO_PROTO_VER_JAPAN);
 	else
 		pos += yahoo_put16(data + pos, YAHOO_PROTO_VER);
 	pos += yahoo_put16(data + pos, 0x0000);
--- a/libpurple/protocols/yahoo/yahoo_packet.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_packet.h	Sun Jun 28 04:41:07 2009 +0000
@@ -107,6 +107,7 @@
 	YAHOO_SERVICE_CHGRP_15 = 0xe7,
 	YAHOO_SERVICE_STATUS_15 = 0xf0,
 	YAHOO_SERVICE_LIST_15 = 0xf1,
+	YAHOO_SERVICE_MESSAGE_ACK = 0xfb,
 	YAHOO_SERVICE_WEBLOGIN = 0x0226,
 	YAHOO_SERVICE_SMS_MSG = 0x02ea
 	/* YAHOO_SERVICE_DISCONNECT = 0x07d1 Server forces us to disconnect. Is sent with TCP FIN flag set */
@@ -125,8 +126,8 @@
 };
 
 #define YAHOO_WEBMESSENGER_PROTO_VER 0x0065
-#define YAHOO_PROTO_VER 0x000f
-#define YAHOO_PROTO_VER_JAPAN 0x000f
+#define YAHOO_PROTO_VER 0x0010
+#define YAHOO_PROTO_VER_JAPAN 0x0010
 
 #define YAHOO_PACKET_HDRLEN (4 + 2 + 2 + 2 + 2 + 4 + 4)
 
--- a/libpurple/protocols/yahoo/yahoo_picture.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_picture.c	Sun Jun 28 04:41:07 2009 +0000
@@ -110,6 +110,9 @@
 		l = l->next;
 	}
 
+	if (!who)
+		return;
+
 	if (!purple_privacy_check(purple_connection_get_account(gc), who)) {
 		purple_debug_info("yahoo", "Picture packet from %s dropped.\n", who);
 		return;
@@ -126,7 +129,7 @@
 		gboolean use_whole_url = yahoo_account_use_http_proxy(gc);
 
 		/* FIXME: Cleanup this strtol() stuff if possible. */
-		if (b && (locksum = purple_buddy_icons_get_checksum_for_user(b)) != NULL && 
+		if (b && (locksum = purple_buddy_icons_get_checksum_for_user(b)) != NULL &&
 				(checksum == strtol(locksum, NULL, 10)))
 			return;
 
@@ -134,8 +137,9 @@
 		data->gc = gc;
 		data->who = g_strdup(who);
 		data->checksum = checksum;
+		/* TODO: Does this need to be MSIE 5.0? */
 		url_data = purple_util_fetch_url(url, use_whole_url,
-				"Mozilla/4.0 (compatible; MSIE 5.0)", FALSE,
+				"Mozilla/4.0 (compatible; MSIE 5.5)", FALSE,
 				yahoo_fetch_picture_cb, data);
 		if (url_data != NULL) {
 			yd = gc->proto_data;
@@ -311,8 +315,8 @@
 	}
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash(pkt, "sssssi", 1, purple_connection_get_display_name(gc),
-	                  4, purple_connection_get_display_name(gc), 5, who,
+	yahoo_packet_hash(pkt, "ssssi", 1, purple_connection_get_display_name(gc),
+	                  5, who,
 	                  13, "2", 20, yd->picture_url, 192, yd->picture_checksum);
 	yahoo_packet_send_and_free(pkt, yd);
 }
@@ -323,7 +327,7 @@
 	struct yahoo_packet *pkt;
 
 	pkt = yahoo_packet_new(YAHOO_SERVICE_PICTURE, YAHOO_STATUS_AVAILABLE, 0);
-	yahoo_packet_hash_str(pkt, 4, purple_connection_get_display_name(gc)); /* me */
+	yahoo_packet_hash_str(pkt, 1, purple_connection_get_display_name(gc)); /* me */
 	yahoo_packet_hash_str(pkt, 5, who); /* the other guy */
 	yahoo_packet_hash_str(pkt, 13, "1"); /* 1 = request, 2 = reply */
 	yahoo_packet_send_and_free(pkt, yd);
@@ -499,13 +503,13 @@
 	port = purple_account_get_int(account, "xfer_port", YAHOO_XFER_PORT);
 	tmp = g_strdup_printf("%s:%d", host, port);
 	header = g_strdup_printf("POST %s%s/notifyft HTTP/1.1\r\n"
-		"User-Agent: Mozilla/4.0 (compatible; MSIE 5.5)\r\n"
+		"User-Agent: " YAHOO_CLIENT_USERAGENT "\r\n"
 		"Cookie: T=%s; Y=%s\r\n"
 		"Host: %s\r\n"
 		"Content-Length: %" G_GSIZE_FORMAT "\r\n"
 		"Cache-Control: no-cache\r\n\r\n",
 		use_whole_url ? "http://" : "", use_whole_url ? tmp : "",
-		yd->cookie_t, yd->cookie_y, 
+		yd->cookie_t, yd->cookie_y,
 		tmp,
 		pkt_buf_len + 4 + d->str->len);
 	g_free(tmp);
@@ -572,7 +576,7 @@
 	purple_debug_misc("yahoo", "Calculated buddy icon checksum: %d\n", checksum);
 
 	return checksum;
-} 
+}
 
 void yahoo_set_buddy_icon(PurpleConnection *gc, PurpleStoredImage *img)
 {
--- a/libpurple/protocols/yahoo/yahoo_profile.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoo_profile.c	Sun Jun 28 04:41:07 2009 +0000
@@ -29,7 +29,7 @@
 #include "util.h"
 #if PHOTO_SUPPORT
 #include "imgstore.h"
-#endif
+#endif /* PHOTO_SUPPORT */
 
 #include "yahoo.h"
 #include "yahoo_friend.h"
@@ -40,11 +40,11 @@
 } YahooGetInfoData;
 
 typedef enum profile_lang_id {
-	XX, DA, DE, EL, 
-	EN, EN_GB, 
+	XX, DA, DE, EL,
+	EN, EN_GB,
 	ES_AR, ES_ES, ES_MX, ES_US,
-	FR_CA, FR_FR, 
-	IT, JA, KO, NO, PT, SV, 
+	FR_CA, FR_FR,
+	IT, JA, KO, NO, PT, SV,
 	ZH_CN, ZH_HK, ZH_TW, ZH_US, PT_BR
 } profile_lang_id_t;
 
@@ -702,7 +702,7 @@
 		const char *balias = purple_buddy_get_local_buddy_alias(b);
 		if(balias && balias[0]) {
 			char *aliastext = g_markup_escape_text(balias, -1);
-			purple_notify_user_info_add_pair(user_info, _("Alias"), aliastext); 
+			purple_notify_user_info_add_pair(user_info, _("Alias"), aliastext);
 			g_free(aliastext);
 		}
 		#if 0
@@ -777,7 +777,7 @@
 	char *stripped;
 	int stripped_len;
 	char *last_updated_utf8_string = NULL;
-#endif
+#endif /* !PHOTO_SUPPORT */
 	const char *last_updated_string = NULL;
 	char *url_buffer;
 	GString *s;
@@ -899,7 +899,7 @@
 
 #if PHOTO_SUPPORT
 	photo_url_text = yahoo_get_photo_url(url_text, info_data->name);
-#endif
+#endif /* PHOTO_SUPPORT */
 
 	url_buffer = g_strdup(url_text);
 
@@ -1048,7 +1048,7 @@
 			purple_debug_info("yahoo", "%s is %" G_GSIZE_FORMAT
 					" bytes\n", photo_url_text, len);
 			id = purple_imgstore_add_with_id(g_memdup(url_text, len), len, NULL);
-			
+
 			tmp = g_strdup_printf("<img id=\"%d\"><br>", id);
 			purple_notify_user_info_add_pair(user_info, NULL, tmp);
 			g_free(tmp);
@@ -1259,7 +1259,7 @@
 	g_free(info2_data);
 	if (id != -1)
 		purple_imgstore_unref_by_id(id);
-#endif
+#endif /* PHOTO_SUPPORT */
 }
 
 void yahoo_get_info(PurpleConnection *gc, const char *name)
--- a/libpurple/protocols/yahoo/yahoochat.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/yahoochat.c	Sun Jun 28 04:41:07 2009 +0000
@@ -30,7 +30,7 @@
 
 #ifdef HAVE_CONFIG_H
 #include "config.h"
-#endif
+#endif /* HAVE_CONFIG_H */
 
 #include "debug.h"
 #include "privacy.h"
@@ -1519,7 +1519,7 @@
 
 	purple_roomlist_set_fields(rl, fields);
 
-	if (purple_proxy_connect(NULL, account, yrl->host, 80,
+	if (purple_proxy_connect(gc, account, yrl->host, 80,
 	                       yahoo_roomlist_got_connected, yrl) == NULL)
 	{
 		purple_notify_error(gc, NULL, _("Connection problem"), _("Unable to fetch room list."));
@@ -1588,8 +1588,9 @@
 	yrl->ucat = purple_roomlist_room_new(PURPLE_ROOMLIST_ROOMTYPE_CATEGORY, _("User Rooms"), yrl->cat);
 	purple_roomlist_room_add(list, yrl->ucat);
 
-	if (purple_proxy_connect(NULL, list->account, yrl->host, 80,
-	                       yahoo_roomlist_got_connected, yrl) == NULL)
+	if (purple_proxy_connect(purple_account_get_connection(list->account),
+			list->account, yrl->host, 80,
+			yahoo_roomlist_got_connected, yrl) == NULL)
 	{
 		purple_notify_error(purple_account_get_connection(list->account),
 		                  NULL, _("Connection problem"), _("Unable to fetch room list."));
--- a/libpurple/protocols/yahoo/ycht.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/yahoo/ycht.c	Sun Jun 28 04:41:07 2009 +0000
@@ -225,7 +225,7 @@
 	}
 
 	purple_debug(PURPLE_DEBUG_MISC, NULL, "\n");
-#endif
+#endif /* YAHOO_YCHT_DEBUG */
 }
 
 static YchtPkt *ycht_packet_new(guint version, guint service, int status)
@@ -578,7 +578,7 @@
 
 	yd->ycht = ycht;
 
-	if (purple_proxy_connect(NULL, account,
+	if (purple_proxy_connect(gc, account,
 	                       purple_account_get_string(account, "ycht-server",  YAHOO_YCHT_HOST),
 	                       purple_account_get_int(account, "ycht-port", YAHOO_YCHT_PORT),
 	                       ycht_got_connected, ycht) == NULL)
--- a/libpurple/protocols/zephyr/zephyr.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/protocols/zephyr/zephyr.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1254,45 +1254,32 @@
 
 #ifdef WIN32
 
-static gint check_loc(gpointer_data)
+static gint check_loc(gpointer data)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	GSList *buddies;
 	ZLocations_t locations;
+	PurpleConnection *gc = data;
+	zephyr_account *zephyr = gc->proto_data;
+	PurpleAccount *account = purple_connection_get_account(gc);
 	int numlocs;
 	int one = 1;
 
-	for (gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				PurpleBuddy *b = (PurpleBuddy *) bnode;
-
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				if (purple_buddy_get_account(b)->gc == zgc) {
-					char *chk;
-					const char *bname = purple_buddy_get_name(b);
-					chk = local_zephyr_normalize(bname);
-					ZLocateUser(chk,&numlocs, ZAUTH);
-					if (numlocs) {
-						int i;
-						for(i=0;i<numlocs;i++) {
-							ZGetLocations(&locations,&one);
-							serv_got_update(zgc,bname,1,0,0,0,0);
-						}
-					}
-				}
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *b = buddies->data;
+		char *chk;
+		const char *bname = purple_buddy_get_name(b);
+		chk = local_zephyr_normalize(bname);
+		ZLocateUser(chk,&numlocs, ZAUTH);
+		if (numlocs) {
+			int i;
+			for(i=0;i<numlocs;i++) {
+				ZGetLocations(&locations,&one);
+				serv_got_update(zgc,bname,1,0,0,0,0);
 			}
 		}
 	}
+
 	return TRUE;
 }
 
@@ -1300,7 +1287,7 @@
 
 static gint check_loc(gpointer data)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
+	GSList *buddies;
 	ZAsyncLocateData_t ald;
 	PurpleConnection *gc = (PurpleConnection *)data;
 	zephyr_account *zephyr = gc->proto_data;
@@ -1312,65 +1299,49 @@
 		ald.version = NULL;
 	}
 
-	for (gnode = purple_blist_get_root(); gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				PurpleBuddy *b = (PurpleBuddy *) bnode;
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *b = buddies->data;
 
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				if (purple_buddy_get_account(b) == account) {
-					const char *chk;
-					const char *name = purple_buddy_get_name(b);
+		const char *chk;
+		const char *name = purple_buddy_get_name(b);
 
-					chk = local_zephyr_normalize(zephyr,name);
-					purple_debug_info("zephyr","chk: %s b->name %s\n",chk,name);
-					/* XXX add real error reporting */
-					/* doesn't matter if this fails or not; we'll just move on to the next one */
-					if (use_zeph02(zephyr)) {
+		chk = local_zephyr_normalize(zephyr,name);
+		purple_debug_info("zephyr","chk: %s b->name %s\n",chk,name);
+		/* XXX add real error reporting */
+		/* doesn't matter if this fails or not; we'll just move on to the next one */
+		if (use_zeph02(zephyr)) {
 #ifdef WIN32
-						int numlocs;
-						int one=1;
-						ZLocateUser(chk,&numlocs,ZAUTH);
-						if (numlocs) {
-							int i;
-							for(i=0;i<numlocs;i++) {
-								ZGetLocations(&locations,&one);
-								if (nlocs>0) 
-									purple_prpl_got_user_status(account,name,"available",NULL);
-								else 
-									purple_prpl_got_user_status(account,name,"offline",NULL);
-							}
-						}
-#else
-						ZRequestLocations(chk, &ald, UNACKED, ZAUTH);
-						g_free(ald.user);
-						g_free(ald.version);
-#endif /* WIN32 */
-					} else 
-						if (use_tzc(zephyr)) {
-							gchar *zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",chk);
-							size_t len = strlen(zlocstr);
-							size_t result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len);
-							if (result != len) {
-								purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno));
-							}
-							g_free(zlocstr);
-						}
+			int numlocs;
+			int one=1;
+			ZLocateUser(chk,&numlocs,ZAUTH);
+			if (numlocs) {
+				int i;
+				for(i=0;i<numlocs;i++) {
+					ZGetLocations(&locations,&one);
+					if (nlocs>0) 
+						purple_prpl_got_user_status(account,name,"available",NULL);
+					else 
+						purple_prpl_got_user_status(account,name,"offline",NULL);
 				}
 			}
-		}
+#else
+			ZRequestLocations(chk, &ald, UNACKED, ZAUTH);
+			g_free(ald.user);
+			g_free(ald.version);
+#endif /* WIN32 */
+		} else 
+			if (use_tzc(zephyr)) {
+				gchar *zlocstr = g_strdup_printf("((tzcfodder . zlocate) \"%s\")\n",chk);
+				size_t len = strlen(zlocstr);
+				size_t result = write(zephyr->totzc[ZEPHYR_FD_WRITE],zlocstr,len);
+				if (result != len) {
+					purple_debug_error("zephyr", "Unable to write a message: %s\n", g_strerror(errno));
+				}
+				g_free(zlocstr);
+			}
 	}
-	
+
 	return TRUE;
 }
 
@@ -1955,8 +1926,7 @@
 
 static void write_anyone(PurpleConnection *gc)
 {
-	PurpleBlistNode *gnode, *cnode, *bnode;
-	PurpleBuddy *b;
+	GSList *buddies;
 	char *fname;
 	FILE *fd;
 	PurpleAccount *account;
@@ -1969,29 +1939,12 @@
 	}
 
 	account = purple_connection_get_account(gc);
-	for (gnode = purple_blist_get_root();
-			gnode;
-			gnode = purple_blist_node_get_sibling_next(gnode)) {
-		if (!PURPLE_BLIST_NODE_IS_GROUP(gnode))
-			continue;
-		for (cnode = purple_blist_node_get_first_child(gnode);
-				cnode;
-				cnode = purple_blist_node_get_sibling_next(cnode)) {
-			if (!PURPLE_BLIST_NODE_IS_CONTACT(cnode))
-				continue;
-			for (bnode = purple_blist_node_get_first_child(cnode);
-					bnode;
-					bnode = purple_blist_node_get_sibling_next(bnode)) {
-				if (!PURPLE_BLIST_NODE_IS_BUDDY(bnode))
-					continue;
-				b = (PurpleBuddy *) bnode;
-				if (purple_buddy_get_account(b) == account) {
-					gchar *stripped_user = zephyr_strip_local_realm(zephyr, purple_buddy_get_name(b));
-					fprintf(fd, "%s\n", stripped_user);
-					g_free(stripped_user);
-				}
-			}
-		}
+	for (buddies = purple_find_buddies(account, NULL); buddies;
+			buddies = g_slist_delete_link(buddies, buddies)) {
+		PurpleBuddy *b = buddies->data;
+		gchar *stripped_user = zephyr_strip_local_realm(zephyr, purple_buddy_get_name(b));
+		fprintf(fd, "%s\n", stripped_user);
+		g_free(stripped_user);
 	}
 
 	fclose(fd);
--- a/libpurple/proxy.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/proxy.c	Sun Jun 28 04:41:07 2009 +0000
@@ -47,6 +47,7 @@
 	gchar *host;
 	int port;
 	int fd;
+	int socket_type;
 	guint inpa;
 	PurpleProxyInfo *gpi;
 	PurpleDnsQueryData *query_data;
@@ -676,6 +677,68 @@
 }
 
 static void
+proxy_connect_udp_none(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
+{
+	int flags;
+
+	purple_debug_info("proxy", "UDP Connecting to %s:%d with no proxy\n",
+			connect_data->host, connect_data->port);
+
+	connect_data->fd = socket(addr->sa_family, SOCK_DGRAM, 0);
+	if (connect_data->fd < 0)
+	{
+		purple_proxy_connect_data_disconnect_formatted(connect_data,
+				_("Unable to create socket:\n%s"), g_strerror(errno));
+		return;
+	}
+
+	flags = fcntl(connect_data->fd, F_GETFL);
+	fcntl(connect_data->fd, F_SETFL, flags | O_NONBLOCK);
+#ifndef _WIN32
+	fcntl(connect_data->fd, F_SETFD, FD_CLOEXEC);
+#endif
+
+	if (connect(connect_data->fd, addr, addrlen) != 0)
+	{
+		if ((errno == EINPROGRESS) || (errno == EINTR))
+		{
+			purple_debug_info("proxy", "UDP Connection in progress\n");
+			connect_data->inpa = purple_input_add(connect_data->fd,
+					PURPLE_INPUT_WRITE, socket_ready_cb, connect_data);
+		}
+		else
+		{
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(errno));
+		}
+	}
+	else
+	{
+		/*
+		 * The connection happened IMMEDIATELY... strange, but whatever.
+		 */
+		int error = ETIMEDOUT;
+		int ret;
+
+		purple_debug_info("proxy", "UDP Connected immediately.\n");
+
+		ret = purple_input_get_error(connect_data->fd, &error);
+		if ((ret != 0) || (error != 0))
+		{
+			if (ret != 0)
+				error = errno;
+			purple_proxy_connect_data_disconnect(connect_data, g_strerror(error));
+			return;
+		}
+
+		/*
+		 * We want to call the "connected" callback eventually, but we
+		 * don't want to call it before we return, just in case.
+		 */
+		purple_timeout_add(10, clean_connect, connect_data);
+	}
+}
+
+static void
 proxy_connect_none(PurpleProxyConnectData *connect_data, struct sockaddr *addr, socklen_t addrlen)
 {
 	int flags;
@@ -2042,6 +2105,12 @@
 #endif
 	purple_debug_info("proxy", "Attempting connection to %s\n", ipaddr);
 
+	if (connect_data->socket_type == SOCK_DGRAM) {
+		proxy_connect_udp_none(connect_data, addr, addrlen);
+		g_free(addr);
+		return;
+	}
+
 	switch (purple_proxy_info_get_type(connect_data->gpi)) {
 		case PURPLE_PROXY_NONE:
 			proxy_connect_none(connect_data, addr, addrlen);
@@ -2193,6 +2262,7 @@
 
 	connect_data = g_new0(PurpleProxyConnectData, 1);
 	connect_data->fd = -1;
+	connect_data->socket_type = SOCK_STREAM;
 	connect_data->handle = handle;
 	connect_data->connect_cb = connect_cb;
 	connect_data->data = data;
@@ -2243,6 +2313,71 @@
 	return connect_data;
 }
 
+PurpleProxyConnectData *
+purple_proxy_connect_udp(void *handle, PurpleAccount *account,
+				   const char *host, int port,
+				   PurpleProxyConnectFunction connect_cb, gpointer data)
+{
+	const char *connecthost = host;
+	int connectport = port;
+	PurpleProxyConnectData *connect_data;
+
+	g_return_val_if_fail(host       != NULL, NULL);
+	g_return_val_if_fail(port       >  0,    NULL);
+	g_return_val_if_fail(connect_cb != NULL, NULL);
+
+	connect_data = g_new0(PurpleProxyConnectData, 1);
+	connect_data->fd = -1;
+	connect_data->socket_type = SOCK_DGRAM;
+	connect_data->handle = handle;
+	connect_data->connect_cb = connect_cb;
+	connect_data->data = data;
+	connect_data->host = g_strdup(host);
+	connect_data->port = port;
+	connect_data->gpi = purple_proxy_get_setup(account);
+
+	if ((purple_proxy_info_get_type(connect_data->gpi) != PURPLE_PROXY_NONE) &&
+		(purple_proxy_info_get_host(connect_data->gpi) == NULL ||
+		 purple_proxy_info_get_port(connect_data->gpi) <= 0)) {
+
+		purple_notify_error(NULL, NULL, _("Invalid proxy settings"), _("Either the host name or port number specified for your given proxy type is invalid."));
+		purple_proxy_connect_data_destroy(connect_data);
+		return NULL;
+	}
+
+	switch (purple_proxy_info_get_type(connect_data->gpi))
+	{
+		case PURPLE_PROXY_NONE:
+			break;
+
+		case PURPLE_PROXY_HTTP:
+		case PURPLE_PROXY_SOCKS4:
+		case PURPLE_PROXY_SOCKS5:
+		case PURPLE_PROXY_USE_ENVVAR:
+			purple_debug_info("proxy", "Ignoring Proxy type (%d) for UDP.\n",
+			                  purple_proxy_info_get_type(connect_data->gpi));
+			break;
+
+		default:
+			purple_debug_error("proxy", "Invalid Proxy type (%d) specified.\n",
+			                   purple_proxy_info_get_type(connect_data->gpi));
+			purple_proxy_connect_data_destroy(connect_data);
+			return NULL;
+	}
+
+	connect_data->query_data = purple_dnsquery_a(connecthost,
+			connectport, connection_host_resolved, connect_data);
+	if (connect_data->query_data == NULL)
+	{
+		purple_proxy_connect_data_destroy(connect_data);
+		return NULL;
+	}
+
+	handles = g_slist_prepend(handles, connect_data);
+
+	return connect_data;
+}
+
 /*
  * Combine some of this code with purple_proxy_connect()
  */
@@ -2260,6 +2395,7 @@
 
 	connect_data = g_new0(PurpleProxyConnectData, 1);
 	connect_data->fd = -1;
+	connect_data->socket_type = SOCK_STREAM;
 	connect_data->handle = handle;
 	connect_data->connect_cb = connect_cb;
 	connect_data->data = data;
--- a/libpurple/proxy.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/proxy.h	Sun Jun 28 04:41:07 2009 +0000
@@ -257,6 +257,35 @@
 			PurpleProxyConnectFunction connect_cb, gpointer data);
 
 /**
+ * Makes a connection to the specified host and port.  Note that this
+ * function name can be misleading--although it is called "proxy
+ * connect," it is used for establishing any outgoing UDP connection,
+ * whether through a proxy or not.
+ *
+ * @param handle     A handle that should be associated with this
+ *                   connection attempt.  The handle can be used
+ *                   to cancel the connection attempt using the
+ *                   purple_proxy_connect_cancel_with_handle()
+ *                   function.
+ * @param account    The account making the connection.
+ * @param host       The destination host.
+ * @param port       The destination port.
+ * @param connect_cb The function to call when the connection is
+ *                   established.  If the connection failed then
+ *                   fd will be -1 and error message will be set
+ *                   to something descriptive (hopefully).
+ * @param data       User-defined data.
+ *
+ * @return NULL if there was an error, or a reference to an
+ *         opaque data structure that can be used to cancel
+ *         the pending connection, if needed.
+ */
+PurpleProxyConnectData *purple_proxy_connect_udp(void *handle,
+			PurpleAccount *account,
+			const char *host, int port,
+			PurpleProxyConnectFunction connect_cb, gpointer data);
+
+/**
  * Makes a connection through a SOCKS5 proxy.
  *
  * @param handle     A handle that should be associated with this
--- a/libpurple/prpl.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/prpl.h	Sun Jun 28 04:41:07 2009 +0000
@@ -126,10 +126,10 @@
 typedef enum
 {
 	/**
-	 * Use a unique name, not an alias, for chat rooms.
+	 * User names are unique to a chat and are not shared between rooms.
 	 *
-	 * XMPP lets you choose what name you want for chat.
-	 * So it shouldn't be pulling the alias for when you're in chat;
+	 * XMPP lets you choose what name you want in chats, so it shouldn't
+	 * be pulling the aliases from the buddy list for the chat list;
 	 * it gets annoying.
 	 */
 	OPT_PROTO_UNIQUE_CHATNAME = 0x00000004,
--- a/libpurple/savedstatuses.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/savedstatuses.c	Sun Jun 28 04:41:07 2009 +0000
@@ -285,13 +285,13 @@
 		xmlnode_set_attrib(node, "transient", "true");
 	}
 
-	snprintf(buf, sizeof(buf), "%lu", status->creation_time);
+	g_snprintf(buf, sizeof(buf), "%lu", status->creation_time);
 	xmlnode_set_attrib(node, "created", buf);
 
-	snprintf(buf, sizeof(buf), "%lu", status->lastused);
+	g_snprintf(buf, sizeof(buf), "%lu", status->lastused);
 	xmlnode_set_attrib(node, "lastused", buf);
 
-	snprintf(buf, sizeof(buf), "%u", status->usage_count);
+	g_snprintf(buf, sizeof(buf), "%u", status->usage_count);
 	xmlnode_set_attrib(node, "usage_count", buf);
 
 	child = xmlnode_new_child(node, "state");
--- a/libpurple/server.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/server.c	Sun Jun 28 04:41:07 2009 +0000
@@ -728,7 +728,6 @@
 		im = PURPLE_CONV_IM(conv);
 
 		purple_conv_im_set_typing_state(im, state);
-		purple_conv_im_update_typing(im);
 	} else {
 		switch (state)
 		{
@@ -766,7 +765,6 @@
 
 		purple_conv_im_stop_typing_timeout(im);
 		purple_conv_im_set_typing_state(im, PURPLE_NOT_TYPING);
-		purple_conv_im_update_typing(im);
 	}
 	else
 	{
--- a/libpurple/signals.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/signals.c	Sun Jun 28 04:41:07 2009 +0000
@@ -975,6 +975,26 @@
 }
 
 void
+purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(
+		PurpleCallback cb, va_list args, void *data, void **return_val)
+{
+	gboolean ret_val;
+	void *arg1 = va_arg(args, void *);
+	void *arg2 = va_arg(args, void *);
+	void *arg3 = va_arg(args, void *);
+	void *arg4 = va_arg(args, void *);
+	void *arg5 = va_arg(args, void *);
+	void *arg6 = va_arg(args, void *);
+
+	ret_val =
+		((gboolean (*)(void *, void *, void *, void *, void *, void *, void *))cb)(
+			arg1, arg2, arg3, arg4, arg5, arg6, data);
+
+	if (return_val != NULL)
+		*return_val = GINT_TO_POINTER(ret_val);
+}
+
+void
 purple_marshal_BOOLEAN__INT_POINTER(PurpleCallback cb, va_list args, void *data,
                                   void **return_val)
 {
--- a/libpurple/signals.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/signals.h	Sun Jun 28 04:41:07 2009 +0000
@@ -349,6 +349,8 @@
 		PurpleCallback cb, va_list args, void *data, void **return_val);
 void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_UINT(
 		PurpleCallback cb, va_list args, void *data, void **return_val);
+void purple_marshal_BOOLEAN__POINTER_POINTER_POINTER_POINTER_POINTER_POINTER(
+		PurpleCallback cb, va_list args, void *data, void **return_val);
 
 void purple_marshal_BOOLEAN__INT_POINTER(
 		PurpleCallback cb, va_list args, void *data, void **return_val);
--- a/libpurple/theme.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/theme.c	Sun Jun 28 04:41:07 2009 +0000
@@ -241,9 +241,12 @@
 static gchar *
 theme_clean_text(const gchar *text)
 {
-	gchar *clean_text = g_markup_escape_text(text, -1);
-	g_strdelimit(clean_text, "\n", ' ');
-	purple_str_strip_char(clean_text, '\r');
+	gchar *clean_text = NULL;
+	if (text != NULL) {
+		clean_text = g_markup_escape_text(text, -1);
+		g_strdelimit(clean_text, "\n", ' ');
+		purple_str_strip_char(clean_text, '\r');
+	}
 	return clean_text;
 }
 
@@ -389,9 +392,10 @@
 {
 	const gchar *filename = purple_theme_get_image(theme);
 
-	g_return_val_if_fail(filename, NULL);
-
-	return g_build_filename(purple_theme_get_dir(PURPLE_THEME(theme)), filename, NULL);
+	if (filename)
+		return g_build_filename(purple_theme_get_dir(PURPLE_THEME(theme)), filename, NULL);
+	else
+		return NULL;
 }
 
 void
--- a/libpurple/util.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/util.c	Sun Jun 28 04:41:07 2009 +0000
@@ -129,7 +129,7 @@
 	ascii = g_malloc(len * 2 + 1);
 
 	for (i = 0; i < len; i++)
-		snprintf(&ascii[i * 2], 3, "%02hhx", data[i]);
+		g_snprintf(&ascii[i * 2], 3, "%02hhx", data[i]);
 
 	return ascii;
 }
@@ -1041,6 +1041,35 @@
 	return ret;
 }
 
+gboolean purple_markup_is_rtl(const char *html)
+{
+	GData *attributes;
+	const gchar *start, *end;
+	gboolean res = FALSE;
+
+	if (purple_markup_find_tag("span", html, &start, &end, &attributes))
+	{
+		/* tmp is a member of attributes and is free with g_datalist_clear call */
+		const char *tmp = g_datalist_get_data(&attributes, "dir");
+		if (tmp && !g_ascii_strcasecmp(tmp, "RTL"))
+			res = TRUE;
+		if (!res)
+		{
+			tmp = g_datalist_get_data(&attributes, "style");
+			if (tmp)
+			{
+				char *tmp2 = purple_markup_get_css_property(tmp, "direction");
+				if (tmp2 && !g_ascii_strcasecmp(tmp2, "RTL"))
+					res = TRUE;
+				g_free(tmp2);
+			}
+
+		}
+		g_datalist_clear(&attributes);
+	}
+	return res;
+}
+
 gboolean
 purple_markup_find_tag(const char *needle, const char *haystack,
 					 const char **start, const char **end, GData **attributes)
@@ -1623,7 +1652,7 @@
 					pt->dest_tag = "a";
 					tags = g_list_prepend(tags, pt);
 					if(xhtml)
-						g_string_append_printf(xhtml, "<a href='%s'>", url ? g_strstrip(url->str) : "");
+						g_string_append_printf(xhtml, "<a href=\"%s\">", url ? g_strstrip(url->str) : "");
 					continue;
 				}
 				if(!g_ascii_strncasecmp(c, "<font", 5) && (*(c+5) == '>' || *(c+5) == ' ')) {
@@ -2017,7 +2046,6 @@
 	case '<':
 	case '>':
 	case '"':
-	case '\'':
 		return TRUE;
 	default:
 		return FALSE;
@@ -3870,7 +3898,7 @@
 	url_fetch_recv_cb(data, -1, cond);
 }
 
-/*
+/**
  * This function is called when the socket is available to be written
  * to.
  *
@@ -3920,7 +3948,10 @@
 		}
 	}
 
-	purple_debug_misc("util", "Request: '%s'\n", gfud->request);
+	if(g_getenv("PURPLE_UNSAFE_DEBUG"))
+		purple_debug_misc("util", "Request: '%s'\n", gfud->request);
+	else
+		purple_debug_misc("util", "request constructed\n");
 
 	total_len = strlen(gfud->request);
 
@@ -4006,7 +4037,7 @@
 		const char *request, gboolean include_headers,
 		PurpleUtilFetchUrlCallback callback, void *user_data)
 {
-	return purple_util_fetch_url_request_len(url, full,
+	return purple_util_fetch_url_request_len_with_account(NULL, url, full,
 					     user_agent, http11,
 					     request, include_headers, -1,
 					     callback, user_data);
@@ -4018,14 +4049,28 @@
 		const char *request, gboolean include_headers, gssize max_len,
 		PurpleUtilFetchUrlCallback callback, void *user_data)
 {
+	return purple_util_fetch_url_request_len_with_account(NULL, url, full,
+			user_agent, http11, request, include_headers, max_len, callback,
+			user_data);
+}
+
+PurpleUtilFetchUrlData *
+purple_util_fetch_url_request_len_with_account(PurpleAccount *account,
+		const char *url, gboolean full,	const char *user_agent, gboolean http11,
+		const char *request, gboolean include_headers, gssize max_len,
+		PurpleUtilFetchUrlCallback callback, void *user_data)
+{
 	PurpleUtilFetchUrlData *gfud;
 
 	g_return_val_if_fail(url      != NULL, NULL);
 	g_return_val_if_fail(callback != NULL, NULL);
 
-	purple_debug_info("util",
-			 "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n",
-			 url, full, user_agent?user_agent:"(null)", http11);
+	if(g_getenv("PURPLE_UNSAFE_DEBUG"))
+		purple_debug_info("util",
+				 "requested to fetch (%s), full=%d, user_agent=(%s), http11=%d\n",
+				 url, full, user_agent?user_agent:"(null)", http11);
+	else
+		purple_debug_info("util", "requesting to fetch a URL\n");
 
 	gfud = g_new0(PurpleUtilFetchUrlData, 1);
 
@@ -4052,11 +4097,11 @@
 		}
 
 		gfud->is_ssl = TRUE;
-		gfud->ssl_connection = purple_ssl_connect(NULL,
+		gfud->ssl_connection = purple_ssl_connect(account,
 				gfud->website.address, gfud->website.port,
 				ssl_url_fetch_connect_cb, ssl_url_fetch_error_cb, gfud);
 	} else {
-		gfud->connect_data = purple_proxy_connect(NULL, NULL,
+		gfud->connect_data = purple_proxy_connect(NULL, account,
 				gfud->website.address, gfud->website.port,
 				url_fetch_connect_cb, gfud);
 	}
@@ -4379,6 +4424,37 @@
 	return g_string_free(workstr, FALSE);
 }
 
+gchar *
+purple_utf8_strip_unprintables(const gchar *str)
+{
+	gchar *workstr, *iter;
+
+	if (str == NULL)
+		/* Act like g_strdup */
+		return NULL;
+
+	g_return_val_if_fail(g_utf8_validate(str, -1, NULL), NULL);
+
+	workstr = iter = g_new(gchar, strlen(str) + 1);
+	while (*str) {
+		gunichar c = g_utf8_get_char(str);
+		const gchar *next = g_utf8_next_char(str);
+		size_t len = next - str;
+
+		if (g_unichar_isprint(c)) {
+			memcpy(iter, str, len);
+			iter += len;
+		}
+
+		str = next;
+	}
+
+	/* nul-terminate the new string */
+	*iter = '\0';
+
+	return workstr;
+}
+
 /*
  * This function is copied from g_strerror() but changed to use
  * gai_strerror().
--- a/libpurple/util.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/util.h	Sun Jun 28 04:41:07 2009 +0000
@@ -506,8 +506,6 @@
  *
  * @return The text with HTML entities literalized.  You must g_free
  *         this string when finished with it.
- *
- * @see purple_escape_html
  */
 char *purple_unescape_html(const char *html);
 
@@ -581,6 +579,16 @@
  */
 char * purple_markup_get_css_property(const gchar *style, const gchar *opt);
 
+/**
+ * Check if the given HTML contains RTL text.
+ *
+ * @param html  The HTML text.
+ *
+ * @return  TRUE if the text contains RTL text, FALSE otherwise.
+ *
+ * @since 2.6.0
+ */
+gboolean purple_markup_is_rtl(const char *html);
 
 /*@}*/
 
@@ -1106,9 +1114,33 @@
  * @param max_len    The maximum number of bytes to retrieve (-1 for unlimited)
  * @param callback   The callback function.
  * @param data       The user data to pass to the callback function.
+ * @deprecated       In 3.0.0, this will go away.
+ */
+PurpleUtilFetchUrlData *purple_util_fetch_url_request_len(const gchar *url,
+		gboolean full, const gchar *user_agent, gboolean http11,
+		const gchar *request, gboolean include_headers, gssize max_len,
+		PurpleUtilFetchUrlCallback callback, gpointer data);
+
+/**
+ * Fetches the data from a URL, and passes it to a callback function.
+ *
+ * @param account    The account for which the request is needed, or NULL.
+ * @param url        The URL.
+ * @param full       TRUE if this is the full URL, or FALSE if it's a
+ *                   partial URL.
+ * @param user_agent The user agent field to use, or NULL.
+ * @param http11     TRUE if HTTP/1.1 should be used to download the file.
+ * @param request    A HTTP request to send to the server instead of the
+ *                   standard GET
+ * @param include_headers
+ *                   If TRUE, include the HTTP headers in the response.
+ * @param max_len    The maximum number of bytes to retrieve (-1 for unlimited)
+ * @param callback   The callback function.
+ * @param data       The user data to pass to the callback function.
  * @deprecated       In 3.0.0, we'll rename this to "purple_util_fetch_url_request" and get rid of the old one
  */
-PurpleUtilFetchUrlData *purple_util_fetch_url_request_len(const gchar *url,
+PurpleUtilFetchUrlData *purple_util_fetch_url_request_len_with_account(
+		PurpleAccount *account, const gchar *url,
 		gboolean full, const gchar *user_agent, gboolean http11,
 		const gchar *request, gboolean include_headers, gssize max_len,
 		PurpleUtilFetchUrlCallback callback, gpointer data);
@@ -1216,6 +1248,22 @@
 gchar *purple_utf8_salvage(const char *str);
 
 /**
+ * Removes unprintable characters from a UTF-8 string. These characters
+ * (in particular low-ASCII characters) are invalid in XML 1.0 and thus
+ * are not allowed in XMPP and are rejected by libxml2 by default. This
+ * function uses g_unichar_isprint to determine what characters should
+ * be stripped. The returned string must be freed by the caller.
+ *
+ * @param str A valid UTF-8 string.
+ *
+ * @return A newly allocated UTF-8 string without the unprintable characters.
+ * @since 2.6.0
+ *
+ * @see g_unichar_isprint
+ */
+gchar *purple_utf8_strip_unprintables(const gchar *str);
+
+/**
  * Return the UTF-8 version of gai_strerror().  It calls gai_strerror()
  * then converts the result to UTF-8.  This function is analogous to
  * g_strerror().
--- a/libpurple/win32/global.mak	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/win32/global.mak	Sun Jun 28 04:41:07 2009 +0000
@@ -103,6 +103,7 @@
 endif
 GMSGFMT ?= $(GTK_BIN)/msgfmt
 MAKENSIS ?= makensis.exe
+MAKENSISOPT ?= /
 PERL ?= /cygdrive/c/perl/bin/perl
 WINDRES ?= windres
 STRIP ?= strip
--- a/libpurple/xmlnode.c	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/xmlnode.c	Sun Jun 28 04:41:07 2009 +0000
@@ -382,7 +382,7 @@
 }
 
 char *
-xmlnode_get_data(xmlnode *node)
+xmlnode_get_data(const xmlnode *node)
 {
 	GString *str = NULL;
 	xmlnode *c;
@@ -405,7 +405,7 @@
 }
 
 char *
-xmlnode_get_data_unescaped(xmlnode *node)
+xmlnode_get_data_unescaped(const xmlnode *node)
 {
 	char *escaped = xmlnode_get_data(node);
 
--- a/libpurple/xmlnode.h	Sun May 10 06:24:26 2009 +0000
+++ b/libpurple/xmlnode.h	Sun Jun 28 04:41:07 2009 +0000
@@ -136,7 +136,7 @@
  * @return The data from the node or NULL. This data is in raw escaped format.
  *         You must g_free this string when finished using it.
  */
-char *xmlnode_get_data(xmlnode *node);
+char *xmlnode_get_data(const xmlnode *node);
 
 /**
  * Gets unescaped data from a node.
@@ -146,7 +146,7 @@
  * @return The data from the node, in unescaped form.   You must g_free
  *         this string when finished using it.
  */
-char *xmlnode_get_data_unescaped(xmlnode *node);
+char *xmlnode_get_data_unescaped(const xmlnode *node);
 
 /**
  * Sets an attribute for a node.
--- a/pidgin/Makefile.am	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -140,8 +140,6 @@
 	gtkcellrendererprogress.h \
 	gtkcellview.h \
 	gtkcellviewmenuitem.h \
-	gtkcellview.h \
-	gtkcellviewmenuitem.h \
 	gtkcertmgr.h \
 	pidgincombobox.h \
 	gtkconn.h \
--- a/pidgin/eggtrayicon.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/eggtrayicon.c	Sun Jun 28 04:41:07 2009 +0000
@@ -400,9 +400,35 @@
 static gboolean
 transparent_expose_event (GtkWidget *widget, GdkEventExpose *event, gpointer user_data)
 {
-	gdk_window_clear_area (widget->window, event->area.x, event->area.y,
-	                      event->area.width, event->area.height);
-	return FALSE;
+  GtkWidget *focus_child = NULL;
+  gint border_width, x, y, width, height;
+  gboolean retval = FALSE;
+
+  gdk_window_clear_area (widget->window, event->area.x, event->area.y,
+                         event->area.width, event->area.height);
+
+  if (GTK_WIDGET_CLASS (parent_class)->expose_event)
+    retval = GTK_WIDGET_CLASS (parent_class)->expose_event (widget, event);
+
+  if (GTK_CONTAINER (widget)->focus_child)
+    focus_child = GTK_CONTAINER (GTK_CONTAINER (widget)->focus_child)->focus_child;
+  if (focus_child && GTK_WIDGET_HAS_FOCUS (focus_child))
+    {
+      border_width = GTK_CONTAINER (widget)->border_width;
+
+      x = widget->allocation.x + border_width;
+      y = widget->allocation.y + border_width;
+
+      width  = widget->allocation.width  - 2 * border_width;
+      height = widget->allocation.height - 2 * border_width;
+
+      gtk_paint_focus (widget->style, widget->window,
+                       GTK_WIDGET_STATE (widget),
+                       &event->area, widget, "tray_icon",
+                       x, y, width, height);
+    }
+
+  return retval;
 }
 
 static void
--- a/pidgin/gtkblist.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkblist.c	Sun Jun 28 04:41:07 2009 +0000
@@ -75,47 +75,40 @@
 typedef struct
 {
 	PurpleAccount *account;
-
 	GtkWidget *window;
+	GtkBox *vbox;
+	GtkWidget *account_menu;
+	GtkSizeGroup *sg;
+} PidginBlistRequestData;
+
+typedef struct
+{
+	PidginBlistRequestData rq_data;
 	GtkWidget *combo;
 	GtkWidget *entry;
 	GtkWidget *entry_for_alias;
-	GtkWidget *account_box;
 
 } PidginAddBuddyData;
 
 typedef struct
 {
-	PurpleAccount *account;
+	PidginBlistRequestData rq_data;
 	gchar *default_chat_name;
-
-	GtkWidget *window;
-	GtkWidget *account_menu;
+	GList *entries;
+} PidginChatData;
+
+typedef struct
+{
+	PidginChatData chat_data;
+
 	GtkWidget *alias_entry;
 	GtkWidget *group_combo;
-	GtkWidget *entries_box;
-	GtkSizeGroup *sg;
 	GtkWidget *autojoin;
 	GtkWidget *persistent;
-
-	GList *entries;
-
 } PidginAddChatData;
 
 typedef struct
 {
-	PurpleAccount *account;
-
-	GtkWidget *window;
-	GtkWidget *account_menu;
-	GtkWidget *entries_box;
-	GtkSizeGroup *sg;
-
-	GList *entries;
-} PidginJoinChatData;
-
-typedef struct
-{
 	/** Used to hold error minidialogs.  Gets packed
 	 *  inside PidginBuddyList.error_buttons
 	 */
@@ -868,7 +861,7 @@
 }
 
 static void
-do_join_chat(PidginJoinChatData *data)
+do_join_chat(PidginChatData *data)
 {
 	if (data)
 	{
@@ -894,14 +887,14 @@
 			}
 		}
 
-		chat = purple_chat_new(data->account, NULL, components);
+		chat = purple_chat_new(data->rq_data.account, NULL, components);
 		gtk_blist_join_chat(chat);
 		purple_blist_remove_chat(chat);
 	}
 }
 
 static void
-do_joinchat(GtkWidget *dialog, int id, PidginJoinChatData *info)
+do_joinchat(GtkWidget *dialog, int id, PidginChatData *info)
 {
 	switch(id)
 	{
@@ -910,7 +903,7 @@
 			break;
 
 		case 1:
-			pidgin_roomlist_dialog_show_with_account(info->account);
+			pidgin_roomlist_dialog_show_with_account(info->rq_data.account);
 			return;
 
 		break;
@@ -926,11 +919,11 @@
  * strings are empty then don't allow the user to click on "OK."
  */
 static void
-joinchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data)
+set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data)
 {
 	PurplePluginProtocolInfo *prpl_info;
 	PurpleConnection *gc;
-	PidginJoinChatData *data;
+	PidginChatData *data;
 	GList *tmp;
 	const char *text;
 	gboolean required;
@@ -949,13 +942,13 @@
 		}
 	}
 
-	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive);
-
-	gc = purple_account_get_connection(data->account);
+	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), GTK_RESPONSE_OK, sensitive);
+
+	gc = purple_account_get_connection(data->rq_data.account);
 	prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL;
 	sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL);
 
-	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive);
+	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window), 1, sensitive);
 }
 
 static void
@@ -967,97 +960,6 @@
 	pidgin_blist_update_buddy(purple_get_blist(), PURPLE_BLIST_NODE(buddy), TRUE);
 }
 
-static void
-rebuild_joinchat_entries(PidginJoinChatData *data)
-{
-	PurpleConnection *gc;
-	GList *list = NULL, *tmp;
-	GHashTable *defaults = NULL;
-	struct proto_chat_entry *pce;
-	gboolean focus = TRUE;
-
-	g_return_if_fail(data->account != NULL);
-
-	gc = purple_account_get_connection(data->account);
-
-	gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL);
-
-	g_list_free(data->entries);
-	data->entries = NULL;
-
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL)
-		list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc);
-
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
-		defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, NULL);
-
-	for (tmp = list; tmp; tmp = tmp->next)
-	{
-		GtkWidget *input;
-
-		pce = tmp->data;
-
-		if (pce->is_int)
-		{
-			GtkObject *adjust;
-			adjust = gtk_adjustment_new(pce->min, pce->min, pce->max,
-										1, 10, 10);
-			input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
-			gtk_widget_set_size_request(input, 50, -1);
-			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL);
-		}
-		else
-		{
-			char *value;
-			input = gtk_entry_new();
-			gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE);
-			value = g_hash_table_lookup(defaults, pce->identifier);
-			if (value != NULL)
-				gtk_entry_set_text(GTK_ENTRY(input), value);
-			if (pce->secret)
-			{
-				gtk_entry_set_visibility(GTK_ENTRY(input), FALSE);
-#if !GTK_CHECK_VERSION(2,16,0)
-				if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
-					gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
-#endif /* Less than GTK+ 2.16 */
-			}
-			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL);
-			g_signal_connect(G_OBJECT(input), "changed",
-							 G_CALLBACK(joinchat_set_sensitive_if_input_cb), data);
-		}
-
-		/* Do the following for any type of input widget */
-		if (focus)
-		{
-			gtk_widget_grab_focus(input);
-			focus = FALSE;
-		}
-		g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
-		g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
-		g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
-		data->entries = g_list_append(data->entries, input);
-
-		g_free(pce);
-	}
-
-	g_list_free(list);
-	g_hash_table_destroy(defaults);
-
-	/* Set whether the "OK" button should be clickable initially */
-	joinchat_set_sensitive_if_input_cb(NULL, data);
-
-	gtk_widget_show_all(data->entries_box);
-}
-
-static void
-joinchat_select_account_cb(GObject *w, PurpleAccount *account,
-                           PidginJoinChatData *data)
-{
-    data->account = account;
-    rebuild_joinchat_entries(data);
-}
-
 static gboolean
 chat_account_filter_func(PurpleAccount *account)
 {
@@ -1085,32 +987,38 @@
 	return FALSE;
 }
 
-void
-pidgin_blist_joinchat_show(void)
-{
-	GtkWidget *hbox, *vbox;
+static GtkWidget *
+make_blist_request_dialog(PidginBlistRequestData *data, PurpleAccount *account,
+	const char *title, const char *window_role, const char *label_text, 
+	GCallback callback_func, PurpleFilterAccountFunc filter_func,
+	GCallback response_cb)
+{
 	GtkWidget *label;
+	GtkWidget *img;
+	GtkWidget *hbox;
+	GtkWidget *vbox;
+	GtkWindow *blist_window;
 	PidginBuddyList *gtkblist;
-	GtkWidget *img = NULL;
-	PidginJoinChatData *data = NULL;
-
-	gtkblist = purple_blist_get_ui_data();
+
+	data->account = account;
+
 	img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
-					gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
-	data = g_new0(PidginJoinChatData, 1);
-
-	data->window = gtk_dialog_new_with_buttons(_("Join a Chat"),
-		NULL, GTK_DIALOG_NO_SEPARATOR,
-		_("Room _List"), 1,
-		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
-		PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL);
+		gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
+
+	gtkblist = PIDGIN_BLIST(purple_get_blist());
+	blist_window = gtkblist ? GTK_WINDOW(gtkblist->window) : NULL;
+
+	data->window = gtk_dialog_new_with_buttons(title,
+		blist_window, GTK_DIALOG_NO_SEPARATOR,
+		NULL);
+
+	gtk_window_set_transient_for(GTK_WINDOW(data->window), blist_window);
 	gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
 	gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
 	gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
 	gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
-	gtk_container_set_border_width(
-		GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
-	gtk_window_set_role(GTK_WINDOW(data->window), "join_chat");
+	gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
+	gtk_window_set_role(GTK_WINDOW(data->window), window_role);
 
 	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
 	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
@@ -1118,37 +1026,154 @@
 	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
 
 	vbox = gtk_vbox_new(FALSE, 5);
-	gtk_container_set_border_width(GTK_CONTAINER(vbox), 0);
 	gtk_container_add(GTK_CONTAINER(hbox), vbox);
 
-	label = gtk_label_new(_("Please enter the appropriate information "
-							"about the chat you would like to join.\n"));
+	label = gtk_label_new(label_text);
+
+	gtk_widget_set_size_request(label, 400, -1);
 	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
 	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
 
 	data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-	data->account_menu = pidgin_account_option_menu_new(NULL, FALSE,
-			G_CALLBACK(joinchat_select_account_cb),
-			chat_account_filter_func, data);
-
-	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
-
-	data->entries_box = gtk_vbox_new(FALSE, 5);
-	gtk_container_add(GTK_CONTAINER(vbox), data->entries_box);
-	gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
-
-	data->account =	pidgin_account_option_menu_get_selected(data->account_menu);
-
-	rebuild_joinchat_entries(data);
-
-	g_signal_connect(G_OBJECT(data->window), "response",
-					 G_CALLBACK(do_joinchat), data);
+	data->account_menu = pidgin_account_option_menu_new(account, FALSE,
+			callback_func, filter_func, data);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_ccount"), data->sg, data->account_menu, TRUE, NULL);
+
+	data->vbox = GTK_BOX(gtk_vbox_new(FALSE, 5));
+	gtk_container_set_border_width(GTK_CONTAINER(data->vbox), 0);
+	gtk_box_pack_start(GTK_BOX(vbox), GTK_WIDGET(data->vbox), FALSE, FALSE, 0);
+
+	g_signal_connect(G_OBJECT(data->window), "response", response_cb, data);
 
 	g_object_unref(data->sg);
 
-	gtk_widget_show_all(data->window);
+	return vbox;
+}
+
+static void
+rebuild_chat_entries(PidginChatData *data, const char *default_chat_name)
+{
+	PurpleConnection *gc;
+	GList *list = NULL, *tmp;
+	GHashTable *defaults = NULL;
+	struct proto_chat_entry *pce;
+	gboolean focus = TRUE;
+
+	g_return_if_fail(data->rq_data.account != NULL);
+
+	gc = purple_account_get_connection(data->rq_data.account);
+
+	gtk_container_foreach(GTK_CONTAINER(data->rq_data.vbox), (GtkCallback)gtk_widget_destroy, NULL);
+
+	g_list_free(data->entries);
+	data->entries = NULL;
+
+	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL)
+		list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc);
+
+	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
+		defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, default_chat_name);
+
+	for (tmp = list; tmp; tmp = tmp->next)
+	{
+		GtkWidget *input;
+
+		pce = tmp->data;
+
+		if (pce->is_int)
+		{
+			GtkObject *adjust;
+			adjust = gtk_adjustment_new(pce->min, pce->min, pce->max,
+										1, 10, 10);
+			input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
+			gtk_widget_set_size_request(input, 50, -1);
+			pidgin_add_widget_to_vbox(GTK_BOX(data->rq_data.vbox), pce->label, data->rq_data.sg, input, FALSE, NULL);
+		}
+		else
+		{
+			char *value;
+			input = gtk_entry_new();
+			gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE);
+			value = g_hash_table_lookup(defaults, pce->identifier);
+			if (value != NULL)
+				gtk_entry_set_text(GTK_ENTRY(input), value);
+			if (pce->secret)
+			{
+				gtk_entry_set_visibility(GTK_ENTRY(input), FALSE);
+#if !GTK_CHECK_VERSION(2,16,0)
+				if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
+					gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
+#endif /* Less than GTK+ 2.16 */
+			}
+			pidgin_add_widget_to_vbox(data->rq_data.vbox, pce->label, data->rq_data.sg, input, TRUE, NULL);
+			g_signal_connect(G_OBJECT(input), "changed",
+							 G_CALLBACK(set_sensitive_if_input_cb), data);
+		}
+
+		/* Do the following for any type of input widget */
+		if (focus)
+		{
+			gtk_widget_grab_focus(input);
+			focus = FALSE;
+		}
+		g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
+		g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
+		g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
+		data->entries = g_list_append(data->entries, input);
+
+		g_free(pce);
+	}
+
+	g_list_free(list);
+	g_hash_table_destroy(defaults);
+
+	/* Set whether the "OK" button should be clickable initially */
+	set_sensitive_if_input_cb(NULL, data);
+
+	gtk_widget_show_all(GTK_WIDGET(data->rq_data.vbox));
+}
+
+static void
+chat_select_account_cb(GObject *w, PurpleAccount *account,
+                       PidginChatData *data)
+{
+	if (strcmp(purple_account_get_protocol_id(data->rq_data.account),
+	           purple_account_get_protocol_id(account)) == 0)
+	{
+		data->rq_data.account = account;
+	}
+	else
+	{
+		data->rq_data.account = account;
+		rebuild_chat_entries(data, data->default_chat_name);
+	}
+}
+
+void
+pidgin_blist_joinchat_show(void)
+{
+	PidginChatData *data = NULL;
+
+	data = g_new0(PidginChatData, 1);
+
+	make_blist_request_dialog((PidginBlistRequestData *)data, NULL,
+		_("Join a Chat"), "join_chat",
+		_("Please enter the appropriate information about the chat "
+			"you would like to join.\n"),
+		G_CALLBACK(chat_select_account_cb),
+		chat_account_filter_func, (GCallback)do_joinchat);
+	gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window),
+		_("Room _List"), 1,
+		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
+		PIDGIN_STOCK_CHAT, GTK_RESPONSE_OK, NULL);
+	data->default_chat_name = NULL;
+	data->rq_data.account = pidgin_account_option_menu_get_selected(data->rq_data.account_menu);
+
+	rebuild_chat_entries(data, NULL);
+
+	gtk_widget_show_all(data->rq_data.window);
 }
 
 static void gtk_blist_row_expanded_cb(GtkTreeView *tv, GtkTreeIter *iter, GtkTreePath *path, gpointer user_data)
@@ -1586,8 +1611,9 @@
 {
 	PurpleBlistNode *node;
 	GValue val;
-	GtkTreeIter iter;
+	GtkTreeIter iter, parent;
 	GtkTreeSelection *sel;
+	GtkTreePath *path;
 
 	sel = gtk_tree_view_get_selection(GTK_TREE_VIEW(tv));
 	if(!gtk_tree_selection_get_selected(sel, NULL, &iter))
@@ -1611,8 +1637,62 @@
 		}
 		if(buddy)
 			pidgin_retrieve_user_info(buddy->account->gc, buddy->name);
-	} else if (event->keyval == GDK_F2) {
-		gtk_blist_menu_alias_cb(tv, node);
+	} else {
+		switch (event->keyval) {
+			case GDK_F2:
+				gtk_blist_menu_alias_cb(tv, node);
+				break;
+
+			case GDK_Left:
+				path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter);
+				if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(tv), path)) {
+					/* Collapse the Group */
+					gtk_tree_view_collapse_row(GTK_TREE_VIEW(tv), path);
+					gtk_tree_path_free(path);
+					return TRUE;
+				} else {
+					/* Select the Parent */
+					if (gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &iter, path)) {
+						if (gtk_tree_model_iter_parent(GTK_TREE_MODEL(gtkblist->treemodel), &parent, &iter)) {
+							gtk_tree_path_free(path);
+							path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &parent);
+							gtk_tree_view_set_cursor(GTK_TREE_VIEW(tv), path, NULL, FALSE);
+							gtk_tree_path_free(path);
+							return TRUE;
+						}
+					}
+				}
+				gtk_tree_path_free(path);
+				break;
+
+			case GDK_Right:
+				path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter);
+				if (!gtk_tree_view_row_expanded(GTK_TREE_VIEW(tv), path)) {
+					/* Expand the Group */
+					if (PURPLE_BLIST_NODE_IS_CONTACT(node)) {
+						pidgin_blist_expand_contact_cb(NULL, node);
+						gtk_tree_path_free(path);
+						return TRUE;
+					} else if (!PURPLE_BLIST_NODE_IS_BUDDY(node)) {
+						gtk_tree_view_expand_row(GTK_TREE_VIEW(tv), path, FALSE);
+						gtk_tree_path_free(path);
+						return TRUE;
+					}
+				} else {
+					/* Select the First Child */
+					if (gtk_tree_model_get_iter(GTK_TREE_MODEL(gtkblist->treemodel), &parent, path)) {
+						if (gtk_tree_model_iter_nth_child(GTK_TREE_MODEL(gtkblist->treemodel), &iter, &parent, 0)) {
+							gtk_tree_path_free(path);
+							path = gtk_tree_model_get_path(GTK_TREE_MODEL(gtkblist->treemodel), &iter);
+							gtk_tree_view_set_cursor(GTK_TREE_VIEW(tv), path, NULL, FALSE);
+							gtk_tree_path_free(path);
+							return TRUE;
+						}
+					}
+				}
+				gtk_tree_path_free(path);
+				break;
+		}
 	}
 
 	return FALSE;
@@ -5552,9 +5632,12 @@
 	gtkblist = PIDGIN_BLIST(list);
 	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
 
+	if (priv->current_theme)
+		g_object_unref(priv->current_theme);
+
 	theme_name = purple_prefs_get_string(PIDGIN_PREFS_ROOT "/blist/theme");
 	if (theme_name && *theme_name)
-		priv->current_theme = PIDGIN_BLIST_THEME(purple_theme_manager_find_theme(theme_name, "blist"));
+		priv->current_theme = g_object_ref(PIDGIN_BLIST_THEME(purple_theme_manager_find_theme(theme_name, "blist")));
 	else
 		priv->current_theme = NULL;
 
@@ -6160,10 +6243,9 @@
 
 	if (count > 0 || purple_prefs_get_bool(PIDGIN_PREFS_ROOT "/blist/show_empty_groups"))
 		show = TRUE;
-	else if (PURPLE_BLIST_NODE_IS_BUDDY(node)) { /* Or chat? */
-		if (buddy_is_displayable((PurpleBuddy*)node))
-			show = TRUE;
-	} else if (!show_offline && PURPLE_BLIST_NODE_IS_GROUP(node)) {
+	else if (PURPLE_BLIST_NODE_IS_BUDDY(node) && buddy_is_displayable((PurpleBuddy*)node)) { /* Or chat? */
+		show = TRUE;
+	} else if (!show_offline) {
 		show = pidgin_blist_group_has_show_offline_buddy(group);
 	}
 
@@ -6687,6 +6769,8 @@
 	gtkblist->arrow_cursor = NULL;
 
 	priv = PIDGIN_BUDDY_LIST_GET_PRIVATE(gtkblist);
+	if (priv->current_theme)
+		g_object_unref(priv->current_theme);
 	g_free(priv);
 
 	g_free(gtkblist);
@@ -6755,7 +6839,7 @@
 							PidginAddBuddyData *data)
 {
 	/* Save our account */
-	data->account = account;
+	data->rq_data.account = account;
 }
 
 static void
@@ -6768,6 +6852,7 @@
 add_buddy_cb(GtkWidget *w, int resp, PidginAddBuddyData *data)
 {
 	const char *grp, *who, *whoalias;
+	PurpleAccount *account;
 	PurpleGroup *g;
 	PurpleBuddy *b;
 	PurpleConversation *c;
@@ -6781,6 +6866,8 @@
 		if (*whoalias == '\0')
 			whoalias = NULL;
 
+		account = data->rq_data.account;
+
 		g = NULL;
 		if ((grp != NULL) && (*grp != '\0'))
 		{
@@ -6790,20 +6877,20 @@
 				purple_blist_add_group(g, NULL);
 			}
 
-			b = purple_find_buddy_in_group(data->account, who, g);
-		}
-		else if ((b = purple_find_buddy(data->account, who)) != NULL)
+			b = purple_find_buddy_in_group(account, who, g);
+		}
+		else if ((b = purple_find_buddy(account, who)) != NULL)
 		{
 			g = purple_buddy_get_group(b);
 		}
 
 		if (b == NULL)
 		{
-			b = purple_buddy_new(data->account, who, whoalias);
+			b = purple_buddy_new(account, who, whoalias);
 			purple_blist_add_buddy(b, NULL, g, NULL);
 		}
 
-		purple_account_add_buddy(data->account, b);
+		purple_account_add_buddy(account, b);
 
 		/* Offer to merge people with the same alias. */
 		if (whoalias != NULL && g != NULL)
@@ -6824,7 +6911,7 @@
 		 * Or something.  --Mark
 		 */
 
-		c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->account);
+		c = purple_find_conversation_with_account(PURPLE_CONV_TYPE_IM, who, data->rq_data.account);
 		if (c != NULL) {
 			icon = purple_conv_im_get_icon(PURPLE_CONV_IM(c));
 			if (icon != NULL)
@@ -6832,103 +6919,52 @@
 		}
 	}
 
-	gtk_widget_destroy(data->window);
+	gtk_widget_destroy(data->rq_data.window);
 }
 
 static void
 pidgin_blist_request_add_buddy(PurpleAccount *account, const char *username,
 								 const char *group, const char *alias)
 {
-	GtkWidget *table;
-	GtkWidget *label;
-	GtkWidget *hbox;
-	GtkWidget *vbox;
-	GtkWidget *img;
-	PidginBuddyList *gtkblist;
 	PidginAddBuddyData *data = g_new0(PidginAddBuddyData, 1);
 
-	data->account =
+	make_blist_request_dialog((PidginBlistRequestData *)data,
 		(account != NULL
-		 ? account
-		 : purple_connection_get_account(purple_connections_get_all()->data));
-
-	img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
-					gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
-
-	gtkblist = PIDGIN_BLIST(purple_get_blist());
-
-	data->window = gtk_dialog_new_with_buttons(_("Add Buddy"),
-			gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR,
+			? account : purple_connection_get_account(purple_connections_get_all()->data)),
+		_("Add Buddy"), "add_buddy",
+		_("Add a buddy.\n"),
+		G_CALLBACK(add_buddy_select_account_cb), NULL,
+		G_CALLBACK(add_buddy_cb));
+	gtk_dialog_add_buttons(GTK_DIALOG(data->rq_data.window),
 			GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 			GTK_STOCK_ADD, GTK_RESPONSE_OK,
 			NULL);
 
-	if (gtkblist)
-		gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window));
-	gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
-	gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
-	gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
-	gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
-	gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
-	gtk_window_set_role(GTK_WINDOW(data->window), "add_buddy");
-	gtk_window_set_type_hint(GTK_WINDOW(data->window),
-							 GDK_WINDOW_TYPE_HINT_DIALOG);
-
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
-	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
-
-	vbox = gtk_vbox_new(FALSE, 0);
-	gtk_container_add(GTK_CONTAINER(hbox), vbox);
-
-	g_signal_connect(G_OBJECT(data->window), "destroy",
+	g_signal_connect(G_OBJECT(data->rq_data.window), "destroy",
 	                 G_CALLBACK(destroy_add_buddy_dialog_cb), data);
 
-	label = gtk_label_new(_("Add a buddy.\n"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-	table = gtk_table_new(4, 2, FALSE);
-	gtk_table_set_row_spacings(GTK_TABLE(table), 5);
-	gtk_table_set_col_spacings(GTK_TABLE(table), 5);
-	gtk_container_set_border_width(GTK_CONTAINER(table), 0);
-	gtk_box_pack_start(GTK_BOX(vbox), table, FALSE, FALSE, 0);
-
-	data->account_box = pidgin_account_option_menu_new(account, FALSE,
-			G_CALLBACK(add_buddy_select_account_cb), NULL, data);
-
-	gtk_table_attach_defaults(GTK_TABLE(table), data->account_box, 0, 2, 0, 1);
-
-	label = gtk_label_new_with_mnemonic(_("Buddy's _username:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 1, 2);
-
 	data->entry = gtk_entry_new();
-	gtk_table_attach_defaults(GTK_TABLE(table), data->entry, 1, 2, 1, 2);
+
+	pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Buddy's _username:"),
+		data->rq_data.sg, data->entry, TRUE, NULL);
 	gtk_widget_grab_focus(data->entry);
 
 	if (username != NULL)
 		gtk_entry_set_text(GTK_ENTRY(data->entry), username);
 	else
-		gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window),
+		gtk_dialog_set_response_sensitive(GTK_DIALOG(data->rq_data.window),
 		                                  GTK_RESPONSE_OK, FALSE);
 
 	gtk_entry_set_activates_default (GTK_ENTRY(data->entry), TRUE);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry);
-	pidgin_set_accessible_label (data->entry, label);
 
 	g_signal_connect(G_OBJECT(data->entry), "changed",
 	                 G_CALLBACK(pidgin_set_sensitive_if_input),
-	                 data->window);
-
-	label = gtk_label_new_with_mnemonic(_("(Optional) A_lias:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 2, 3);
+	                 data->rq_data.window);
 
 	data->entry_for_alias = gtk_entry_new();
-	gtk_table_attach_defaults(GTK_TABLE(table),
-	                          data->entry_for_alias, 1, 2, 2, 3);
+	pidgin_add_widget_to_vbox(data->rq_data.vbox, _("(Optional) A_lias:"),
+	                          data->rq_data.sg, data->entry_for_alias, TRUE,
+	                          NULL);
 
 	if (alias != NULL)
 		gtk_entry_set_text(GTK_ENTRY(data->entry_for_alias), alias);
@@ -6936,23 +6972,11 @@
 	if (username != NULL)
 		gtk_widget_grab_focus(GTK_WIDGET(data->entry_for_alias));
 
-	gtk_entry_set_activates_default (GTK_ENTRY(data->entry_for_alias), TRUE);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), data->entry_for_alias);
-	pidgin_set_accessible_label (data->entry_for_alias, label);
-
-	label = gtk_label_new_with_mnemonic(_("Add buddy to _group:"));
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0.5);
-	gtk_table_attach_defaults(GTK_TABLE(table), label, 0, 1, 3, 4);
-
 	data->combo = pidgin_text_combo_box_entry_new(group, groups_tree());
-	gtk_table_attach_defaults(GTK_TABLE(table), data->combo, 1, 2, 3, 4);
-	gtk_label_set_mnemonic_widget(GTK_LABEL(label), GTK_BIN(data->combo)->child);
-	pidgin_set_accessible_label (data->combo, label);
-
-	g_signal_connect(G_OBJECT(data->window), "response",
-					 G_CALLBACK(add_buddy_cb), data);
-
-	gtk_widget_show_all(data->window);
+	pidgin_add_widget_to_vbox(data->rq_data.vbox, _("Add buddy to _group:"),
+	                          data->rq_data.sg, data->combo, TRUE, NULL);
+
+	gtk_widget_show_all(data->rq_data.window);
 }
 
 static void
@@ -6968,7 +6992,7 @@
 	components = g_hash_table_new_full(g_str_hash, g_str_equal,
 									   g_free, g_free);
 
-	for (tmp = data->entries; tmp; tmp = tmp->next)
+	for (tmp = data->chat_data.entries; tmp; tmp = tmp->next)
 	{
 		if (g_object_get_data(tmp->data, "is_spin"))
 		{
@@ -6987,7 +7011,7 @@
 		}
 	}
 
-	chat = purple_chat_new(data->account,
+	chat = purple_chat_new(data->chat_data.rq_data.account,
 							   gtk_entry_get_text(GTK_ENTRY(data->alias_entry)),
 							   components);
 
@@ -7011,9 +7035,9 @@
 	if (gtk_toggle_button_get_active(GTK_TOGGLE_BUTTON(data->persistent)))
 		purple_blist_node_set_bool((PurpleBlistNode*)chat, "gtk-persistent", TRUE);
 
-	gtk_widget_destroy(data->window);
-	g_free(data->default_chat_name);
-	g_list_free(data->entries);
+	gtk_widget_destroy(data->chat_data.rq_data.window);
+	g_free(data->chat_data.default_chat_name);
+	g_list_free(data->chat_data.entries);
 	g_free(data);
 }
 
@@ -7026,166 +7050,25 @@
 	}
 	else if (resp == 1)
 	{
-		pidgin_roomlist_dialog_show_with_account(data->account);
+		pidgin_roomlist_dialog_show_with_account(data->chat_data.rq_data.account);
 	}
 	else
 	{
-		gtk_widget_destroy(data->window);
-		g_free(data->default_chat_name);
-		g_list_free(data->entries);
+		gtk_widget_destroy(data->chat_data.rq_data.window);
+		g_free(data->chat_data.default_chat_name);
+		g_list_free(data->chat_data.entries);
 		g_free(data);
 	}
 }
 
-/*
- * Check the values of all the text entry boxes.  If any required input
- * strings are empty then don't allow the user to click on "OK."
- */
-static void
-addchat_set_sensitive_if_input_cb(GtkWidget *entry, gpointer user_data)
-{
-	PurplePluginProtocolInfo *prpl_info;
-	PurpleConnection *gc;
-	PidginAddChatData *data;
-	GList *tmp;
-	const char *text;
-	gboolean required;
-	gboolean sensitive = TRUE;
-
-	data = user_data;
-
-	for (tmp = data->entries; tmp != NULL; tmp = tmp->next)
-	{
-		if (!g_object_get_data(tmp->data, "is_spin"))
-		{
-			required = GPOINTER_TO_INT(g_object_get_data(tmp->data, "required"));
-			text = gtk_entry_get_text(tmp->data);
-			if (required && (*text == '\0'))
-				sensitive = FALSE;
-		}
-	}
-
-	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), GTK_RESPONSE_OK, sensitive);
-
-	gc = purple_account_get_connection(data->account);
-	prpl_info = (gc != NULL) ? PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl) : NULL;
-	sensitive = (prpl_info != NULL && prpl_info->roomlist_get_list != NULL);
-
-	gtk_dialog_set_response_sensitive(GTK_DIALOG(data->window), 1, sensitive);
-}
-
-static void
-rebuild_addchat_entries(PidginAddChatData *data)
-{
-	PurpleConnection *gc;
-	GList *list = NULL, *tmp;
-	GHashTable *defaults = NULL;
-	struct proto_chat_entry *pce;
-	gboolean focus = TRUE;
-
-	g_return_if_fail(data->account != NULL);
-
-	gc = purple_account_get_connection(data->account);
-
-	gtk_container_foreach(GTK_CONTAINER(data->entries_box), (GtkCallback)gtk_widget_destroy, NULL);
-
-	g_list_free(data->entries);
-
-	data->entries = NULL;
-
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info != NULL)
-		list = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info(gc);
-
-	if (PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults != NULL)
-		defaults = PURPLE_PLUGIN_PROTOCOL_INFO(gc->prpl)->chat_info_defaults(gc, data->default_chat_name);
-
-	for (tmp = list; tmp; tmp = tmp->next)
-	{
-		GtkWidget *input;
-
-		pce = tmp->data;
-
-		if (pce->is_int)
-		{
-			GtkObject *adjust;
-			adjust = gtk_adjustment_new(pce->min, pce->min, pce->max,
-										1, 10, 10);
-			input = gtk_spin_button_new(GTK_ADJUSTMENT(adjust), 1, 0);
-			gtk_widget_set_size_request(input, 50, -1);
-			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, FALSE, NULL);
-		}
-		else
-		{
-			char *value;
-			input = gtk_entry_new();
-			gtk_entry_set_activates_default(GTK_ENTRY(input), TRUE);
-			value = g_hash_table_lookup(defaults, pce->identifier);
-			if (value != NULL)
-				gtk_entry_set_text(GTK_ENTRY(input), value);
-			if (pce->secret)
-			{
-				gtk_entry_set_visibility(GTK_ENTRY(input), FALSE);
-#if !GTK_CHECK_VERSION(2,16,0)
-				if (gtk_entry_get_invisible_char(GTK_ENTRY(input)) == '*')
-					gtk_entry_set_invisible_char(GTK_ENTRY(input), PIDGIN_INVISIBLE_CHAR);
-#endif /* Less than GTK+ 2.16 */
-			}
-			pidgin_add_widget_to_vbox(GTK_BOX(data->entries_box), pce->label, data->sg, input, TRUE, NULL);
-			g_signal_connect(G_OBJECT(input), "changed",
-							 G_CALLBACK(addchat_set_sensitive_if_input_cb), data);
-		}
-
-		/* Do the following for any type of input widget */
-		if (focus)
-		{
-			gtk_widget_grab_focus(input);
-			focus = FALSE;
-		}
-		g_object_set_data(G_OBJECT(input), "identifier", (gpointer)pce->identifier);
-		g_object_set_data(G_OBJECT(input), "is_spin", GINT_TO_POINTER(pce->is_int));
-		g_object_set_data(G_OBJECT(input), "required", GINT_TO_POINTER(pce->required));
-		data->entries = g_list_append(data->entries, input);
-
-		g_free(pce);
-	}
-
-	g_list_free(list);
-	g_hash_table_destroy(defaults);
-
-	/* Set whether the "OK" button should be clickable initially */
-	addchat_set_sensitive_if_input_cb(NULL, data);
-
-	gtk_widget_show_all(data->entries_box);
-}
-
-static void
-addchat_select_account_cb(GObject *w, PurpleAccount *account,
-						   PidginAddChatData *data)
-{
-	if (strcmp(purple_account_get_protocol_id(data->account),
-		purple_account_get_protocol_id(account)) == 0)
-	{
-		data->account = account;
-	}
-	else
-	{
-		data->account = account;
-		rebuild_addchat_entries(data);
-	}
-}
-
 static void
 pidgin_blist_request_add_chat(PurpleAccount *account, PurpleGroup *group,
 								const char *alias, const char *name)
 {
 	PidginAddChatData *data;
-	PidginBuddyList *gtkblist;
 	GList *l;
 	PurpleConnection *gc;
-	GtkWidget *label;
-	GtkWidget *hbox;
-	GtkWidget *vbox;
-	GtkWidget *img;
+	GtkBox *vbox;
 
 	if (account != NULL) {
 		gc = purple_account_get_connection(account);
@@ -7214,82 +7097,44 @@
 	}
 
 	data = g_new0(PidginAddChatData, 1);
-	data->account = account;
-	data->default_chat_name = g_strdup(name);
-
-	img = gtk_image_new_from_stock(PIDGIN_STOCK_DIALOG_QUESTION,
-					gtk_icon_size_from_name(PIDGIN_ICON_SIZE_TANGO_HUGE));
-
-	gtkblist = PIDGIN_BLIST(purple_get_blist());
-
-	data->sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-	data->window = gtk_dialog_new_with_buttons(_("Add Chat"),
-		gtkblist ? GTK_WINDOW(gtkblist->window) : NULL, GTK_DIALOG_NO_SEPARATOR,
-		_("Room _List"), 1,
+	vbox = GTK_BOX(make_blist_request_dialog((PidginBlistRequestData *)data, account,
+			_("Add Chat"), "add_chat",
+			_("Please enter an alias, and the appropriate information "
+			  "about the chat you would like to add to your buddy list.\n"),
+			G_CALLBACK(chat_select_account_cb), chat_account_filter_func,
+			G_CALLBACK(add_chat_resp_cb)));
+	gtk_dialog_add_buttons(GTK_DIALOG(data->chat_data.rq_data.window),
+		_("Room List"), 1,
 		GTK_STOCK_CANCEL, GTK_RESPONSE_CANCEL,
 		GTK_STOCK_ADD, GTK_RESPONSE_OK,
 		NULL);
 
-	if (gtkblist)
-		gtk_window_set_transient_for(GTK_WINDOW(data->window), GTK_WINDOW(gtkblist->window));
-	gtk_dialog_set_default_response(GTK_DIALOG(data->window), GTK_RESPONSE_OK);
-	gtk_container_set_border_width(GTK_CONTAINER(data->window), PIDGIN_HIG_BOX_SPACE);
-	gtk_window_set_resizable(GTK_WINDOW(data->window), FALSE);
-	gtk_box_set_spacing(GTK_BOX(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BORDER);
-	gtk_container_set_border_width(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), PIDGIN_HIG_BOX_SPACE);
-	gtk_window_set_role(GTK_WINDOW(data->window), "add_chat");
-	gtk_window_set_type_hint(GTK_WINDOW(data->window),
-							 GDK_WINDOW_TYPE_HINT_DIALOG);
-
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_BORDER);
-	gtk_container_add(GTK_CONTAINER(GTK_DIALOG(data->window)->vbox), hbox);
-	gtk_box_pack_start(GTK_BOX(hbox), img, FALSE, FALSE, 0);
-	gtk_misc_set_alignment(GTK_MISC(img), 0, 0);
-
-	vbox = gtk_vbox_new(FALSE, 5);
-	gtk_container_add(GTK_CONTAINER(hbox), vbox);
-
-	label = gtk_label_new(
-		_("Please enter an alias, and the appropriate information "
-		  "about the chat you would like to add to your buddy list.\n"));
-	gtk_widget_set_size_request(label, 400, -1);
-	gtk_label_set_line_wrap(GTK_LABEL(label), TRUE);
-	gtk_misc_set_alignment(GTK_MISC(label), 0, 0);
-	gtk_box_pack_start(GTK_BOX(vbox), label, FALSE, FALSE, 0);
-
-	data->account_menu = pidgin_account_option_menu_new(account, FALSE,
-			G_CALLBACK(addchat_select_account_cb),
-			chat_account_filter_func, data);
-	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Account:"), data->sg, data->account_menu, TRUE, NULL);
-
-	data->entries_box = gtk_vbox_new(FALSE, 5);
-	gtk_container_set_border_width(GTK_CONTAINER(data->entries_box), 0);
-	gtk_box_pack_start(GTK_BOX(vbox), data->entries_box, TRUE, TRUE, 0);
-
-	rebuild_addchat_entries(data);
+	data->chat_data.default_chat_name = g_strdup(name);
+
+	rebuild_chat_entries((PidginChatData *)data, name);
 
 	data->alias_entry = gtk_entry_new();
 	if (alias != NULL)
 		gtk_entry_set_text(GTK_ENTRY(data->alias_entry), alias);
 	gtk_entry_set_activates_default(GTK_ENTRY(data->alias_entry), TRUE);
 
-	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"), data->sg, data->alias_entry, TRUE, NULL);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("A_lias:"),
+	                          data->chat_data.rq_data.sg, data->alias_entry,
+	                          TRUE, NULL);
 	if (name != NULL)
 		gtk_widget_grab_focus(data->alias_entry);
 
 	data->group_combo = pidgin_text_combo_box_entry_new(group ? group->name : NULL, groups_tree());
-	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"), data->sg, data->group_combo, TRUE, NULL);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox), _("_Group:"),
+	                          data->chat_data.rq_data.sg, data->group_combo,
+	                          TRUE, NULL);
 
 	data->autojoin = gtk_check_button_new_with_mnemonic(_("Auto_join when account becomes online."));
 	data->persistent = gtk_check_button_new_with_mnemonic(_("_Remain in chat after window is closed."));
 	gtk_box_pack_start(GTK_BOX(vbox), data->autojoin, FALSE, FALSE, 0);
 	gtk_box_pack_start(GTK_BOX(vbox), data->persistent, FALSE, FALSE, 0);
 
-	g_signal_connect(G_OBJECT(data->window), "response",
-					 G_CALLBACK(add_chat_resp_cb), data);
-
-	gtk_widget_show_all(data->window);
+	gtk_widget_show_all(data->chat_data.rq_data.window);
 }
 
 static void
@@ -7496,7 +7341,10 @@
 	else
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/blist/theme", "");
 
-	priv->current_theme = theme;
+	if (priv->current_theme)
+		g_object_unref(priv->current_theme);
+
+	priv->current_theme = theme ? g_object_ref(theme) : NULL;
 
 	pidgin_blist_build_layout(list);
 
@@ -8216,4 +8064,3 @@
 	if (activeitem)
 		gtk_check_menu_item_set_active(GTK_CHECK_MENU_ITEM(activeitem), TRUE);
 }
-
--- a/pidgin/gtkconv.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkconv.c	Sun Jun 28 04:41:07 2009 +0000
@@ -2700,7 +2700,7 @@
 	scale_width = gdk_pixbuf_get_width(buf);
 	scale_height = gdk_pixbuf_get_height(buf);
 
-	gtk_widget_get_size_request(gtkconv->infopane_hbox, NULL, &size);
+	gtk_widget_get_size_request(gtkconv->u.im->icon_container, NULL, &size);
 	size = MIN(size, MIN(scale_width, scale_height));
 	size = CLAMP(size, BUDDYICON_SIZE_MIN, BUDDYICON_SIZE_MAX);
 
@@ -2758,13 +2758,22 @@
 static void
 remove_icon(GtkWidget *widget, PidginConversation *gtkconv)
 {
+	GList *children;
+	GtkWidget *event;
 	PurpleConversation *conv = gtkconv->active_conv;
 	PidginWindow *gtkwin;
 
 	g_return_if_fail(conv != NULL);
 
-	if (gtkconv->u.im->icon_container != NULL)
-		gtk_widget_destroy(gtkconv->u.im->icon_container);
+	gtk_widget_set_size_request(gtkconv->u.im->icon_container, -1, BUDDYICON_SIZE_MIN);
+	children = gtk_container_get_children(GTK_CONTAINER(gtkconv->u.im->icon_container));
+	if (children) {
+		/* We know there's only one child here. It'd be nice to shortcut to the
+		   event box, but we can't change the PidginConversation until 3.0 */
+		event = (GtkWidget *)children->data;
+		gtk_container_remove(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
+		g_list_free(children);
+	}
 
 	if (gtkconv->u.im->anim != NULL)
 		g_object_unref(G_OBJECT(gtkconv->u.im->anim));
@@ -2779,7 +2788,6 @@
 	gtkconv->u.im->icon = NULL;
 	gtkconv->u.im->anim = NULL;
 	gtkconv->u.im->iter = NULL;
-	gtkconv->u.im->icon_container = NULL;
 	gtkconv->u.im->show_icon = FALSE;
 
 	gtkwin = gtkconv->win;
@@ -2840,7 +2848,7 @@
 	PurpleConversation *conv = gtkconv->active_conv;
 	GSList *buddies;
 
-	gtk_widget_get_size_request(gtkconv->infopane_hbox, NULL, &size);
+	gtk_widget_get_size_request(gtkconv->u.im->icon_container, NULL, &size);
 
 	if (size == BUDDYICON_SIZE_MAX) {
 		size = BUDDYICON_SIZE_MIN;
@@ -2848,7 +2856,7 @@
 		size = BUDDYICON_SIZE_MAX;
 	}
 
-	gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, size);
+	gtk_widget_set_size_request(gtkconv->u.im->icon_container, -1, size);
 	pidgin_conv_update_buddy_icon(conv);
 
 	buddies = purple_find_buddies(purple_conversation_get_account(conv),
@@ -4629,6 +4637,7 @@
 		gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
 
 		gtkchat->topic_text = gtk_entry_new();
+		gtk_widget_set_size_request(gtkchat->topic_text, -1, BUDDYICON_SIZE_MIN);
 
 		if(prpl_info->set_chat_topic == NULL) {
 			gtk_editable_set_editable(GTK_EDITABLE(gtkchat->topic_text), FALSE);
@@ -4847,15 +4856,37 @@
 	gtk_cell_view_set_displayed_row(GTK_CELL_VIEW(gtkconv->infopane), path);
 	gtk_tree_path_free(path);
 
-	if ((buddy = purple_find_buddy(purple_conversation_get_account(conv),
-					purple_conversation_get_name(conv))) != NULL) {
-		PurpleContact *contact = purple_buddy_get_contact(buddy);
-		if (contact) {
-			buddyicon_size = purple_blist_node_get_int((PurpleBlistNode*)contact, "pidgin-infopane-iconsize");
-		}
-	}
-	buddyicon_size = CLAMP(buddyicon_size, BUDDYICON_SIZE_MIN, BUDDYICON_SIZE_MAX);
-	gtk_widget_set_size_request(gtkconv->infopane_hbox, -1, buddyicon_size);
+	if (chat) {
+		/* This empty widget is used to ensure that the infopane is consistently
+		   sized for chat windows. The correct fix is to put an icon in the chat
+		   window as well, because that would make "Set Custom Icon" consistent
+		   for both the buddy list and the chat window, but PidginConversation
+		   is pretty much stuck until 3.0. */
+		GtkWidget *sizing_vbox;
+		sizing_vbox = gtk_vbox_new(FALSE, 0);
+		gtk_widget_set_size_request(sizing_vbox, -1, BUDDYICON_SIZE_MIN);
+		gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox), sizing_vbox, FALSE, FALSE, 0);
+		gtk_widget_show(sizing_vbox);
+	}
+	else {
+		gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0);
+
+		if ((buddy = purple_find_buddy(purple_conversation_get_account(conv),
+						purple_conversation_get_name(conv))) != NULL) {
+			PurpleContact *contact = purple_buddy_get_contact(buddy);
+			if (contact) {
+				buddyicon_size = purple_blist_node_get_int((PurpleBlistNode*)contact, "pidgin-infopane-iconsize");
+			}
+		}
+		buddyicon_size = CLAMP(buddyicon_size, BUDDYICON_SIZE_MIN, BUDDYICON_SIZE_MAX);
+		gtk_widget_set_size_request(gtkconv->u.im->icon_container, -1, buddyicon_size);
+
+		gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox),
+				   gtkconv->u.im->icon_container, FALSE, FALSE, 0);
+
+		gtk_widget_show(gtkconv->u.im->icon_container);
+	}
+
 	gtk_widget_show(gtkconv->infopane);
 
 	rend = gtk_cell_renderer_pixbuf_new();
@@ -5602,38 +5633,6 @@
 #endif
 }
 
-/* Returns true if the given HTML contains RTL text */
-static gboolean
-html_is_rtl(const char *html)
-{
-	GData *attributes;
-	const gchar *start, *end;
-	gboolean res = FALSE;
-
-	if (purple_markup_find_tag("span", html, &start, &end, &attributes))
-	{
-		/* tmp is a member of attributes and is free with g_datalist_clear call */
-		const char *tmp = g_datalist_get_data(&attributes, "dir");
-		if (tmp && !g_ascii_strcasecmp(tmp, "RTL"))
-			res = TRUE;
-		if (!res)
-		{
-			tmp = g_datalist_get_data(&attributes, "style");
-			if (tmp)
-			{
-				char *tmp2 = purple_markup_get_css_property(tmp, "direction");
-				if (tmp2 && !g_ascii_strcasecmp(tmp2, "RTL"))
-					res = TRUE;
-				g_free(tmp2);
-			}
-
-		}
-		g_datalist_clear(&attributes);
-	}
-	return res;
-}
-
-
 static void
 pidgin_conv_write_conv(PurpleConversation *conv, const char *name, const char *alias,
 						const char *message, PurpleMessageFlags flags,
@@ -5795,7 +5794,7 @@
 	}
 
 	/* Bi-Directional support - set timestamp direction using unicode characters */
-	is_rtl_message = html_is_rtl(message);
+	is_rtl_message = purple_markup_is_rtl(message);
 	/* Enforce direction only if message is RTL - doesn't effect LTR users */
 	if (is_rtl_message)
 		str_embed_direction_chars(&mdate);
@@ -6313,6 +6312,10 @@
 	if (!smiley)
 		return;
 
+	smiley->data = g_realloc(smiley->data, smiley->datasize + size);
+	g_memmove((guchar *)smiley->data + smiley->datasize, data, size);
+	smiley->datasize += size;
+
 	loader = smiley->loader;
 	if (!loader)
 		return;
@@ -6914,6 +6917,7 @@
 
 	GdkPixbuf *buf;
 
+	GList *children;
 	GtkWidget *event;
 	GdkPixbuf *scale;
 	int scale_width, scale_height;
@@ -6941,9 +6945,14 @@
 		prpl_info = PURPLE_PLUGIN_PROTOCOL_INFO(account->gc->prpl);
 
 	/* Remove the current icon stuff */
-	if (gtkconv->u.im->icon_container != NULL)
-		gtk_widget_destroy(gtkconv->u.im->icon_container);
-	gtkconv->u.im->icon_container = NULL;
+	children = gtk_container_get_children(GTK_CONTAINER(gtkconv->u.im->icon_container));
+	if (children) {
+		/* We know there's only one child here. It'd be nice to shortcut to the
+		   event box, but we can't change the PidginConversation until 3.0 */
+		event = (GtkWidget *)children->data;
+		gtk_container_remove(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
+		g_list_free(children);
+	}
 
 	if (gtkconv->u.im->anim != NULL)
 		g_object_unref(G_OBJECT(gtkconv->u.im->anim));
@@ -7031,7 +7040,7 @@
 	scale_width = gdk_pixbuf_get_width(buf);
 	scale_height = gdk_pixbuf_get_height(buf);
 
-	gtk_widget_get_size_request(gtkconv->infopane_hbox, NULL, &size);
+	gtk_widget_get_size_request(gtkconv->u.im->icon_container, NULL, &size);
 	size = MIN(size, MIN(scale_width, scale_height));
 
 	/* Some sanity checks */
@@ -7050,7 +7059,6 @@
 	g_object_unref(buf);
 	if (pidgin_gdk_pixbuf_is_opaque(scale))
 		pidgin_gdk_pixbuf_make_round(scale);
-	gtkconv->u.im->icon_container = gtk_vbox_new(FALSE, 0);
 
 	event = gtk_event_box_new();
 	gtk_container_add(GTK_CONTAINER(gtkconv->u.im->icon_container), event);
@@ -7071,11 +7079,6 @@
 
 	g_object_unref(G_OBJECT(scale));
 
-	gtk_box_pack_start(GTK_BOX(gtkconv->infopane_hbox),
-			   gtkconv->u.im->icon_container, FALSE, FALSE, 0);
-
-	gtk_widget_show(gtkconv->u.im->icon_container);
-
 	/* The buddy icon code needs badly to be fixed. */
 	if(pidgin_conv_window_is_active_conversation(conv))
 	{
--- a/pidgin/gtkdialogs.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkdialogs.c	Sun Jun 28 04:41:07 2009 +0000
@@ -74,7 +74,7 @@
 static const struct developer developers[] = {
 	{"Daniel 'datallah' Atallah",	NULL, NULL},
 	{"Paul 'darkrain42' Aurich",	NULL, NULL },
-	{"John 'rekkanoryo' Bailey",	N_("bug master"), "rekkanoryo@pidgin.im"},
+	{"John 'rekkanoryo' Bailey",	N_("bug master"), NULL},
 	{"Ethan 'Paco-Paco' Blanton",	NULL, NULL},
 	{"Hylke Bons",			N_("artist"), "h.bons@student.rug.nl"},
 	{"Thomas Butter",				NULL, NULL},
@@ -186,6 +186,7 @@
 	{N_("Hebrew"),              "he", "Shalom Craimer", "scraimer@gmail.com"},
 	{N_("Hindi"),               "hi", "Ravishankar Shrivastava", "raviratlami@yahoo.com"},
 	{N_("Hungarian"),           "hu", "Kelemen Gábor", "kelemeng@gnome.hu"},
+	{N_("Armenian"),            "hy", "David Avsharyan", "avsharyan@gmail.com"},
 	{N_("Indonesian"),          "id", "Rai S. Regawa", "raireg@yahoo.com"},
 	{N_("Italian"),             "it", "Claudio Satriano", "satriano@na.infn.it"},
 	{N_("Japanese"),            "ja", "Takashi Aihana", "aihana@gnome.gr.jp"},
@@ -223,6 +224,7 @@
 	{N_("Sinhala"),             "si", "Danishka Navin", "snavin@redhat.com"},
 	{N_("Sinhala"),             "si", "Yajith Ajantha Dayarathna", "yajith@gmail.com"},
 	{N_("Swedish"),             "sv", "Peter Hjalmarsson", "xake@telia.com"},
+	{N_("Swahili"),             "sw", "Paul Msegeya", "msegeya@gmail.com"},
 	{N_("Tamil"),               "ta", "Viveka Nathan K", "vivekanathan@users.sourceforge.net"},
 	{N_("Telugu"),              "te", "Mr. Subbaramaih", "info.gist@cdac.in"},
 	{N_("Thai"),                "th", "Isriya Paireepairit", "markpeak@gmail.com"},
--- a/pidgin/gtkdocklet-x11.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkdocklet-x11.c	Sun Jun 28 04:41:07 2009 +0000
@@ -32,6 +32,7 @@
 
 #include "eggtrayicon.h"
 #include "gtkdocklet.h"
+#include <gdk/gdkkeysyms.h>
 
 #define SHORT_EMBED_TIMEOUT 5000
 #define LONG_EMBED_TIMEOUT 15000
@@ -91,6 +92,33 @@
 	return TRUE;
 }
 
+static gboolean
+docklet_x11_pressed_cb(GtkWidget *button, GdkEventKey *event)
+{
+	guint state, keyval;
+
+	state = event->state & gtk_accelerator_get_default_mod_mask();
+	keyval = event->keyval;
+	if (state == 0 &&
+	    (keyval == GDK_Return ||
+	     keyval == GDK_KP_Enter ||
+	     keyval == GDK_ISO_Enter ||
+	     keyval == GDK_space ||
+	     keyval == GDK_KP_Space))
+	{
+		pidgin_docklet_clicked(1);
+		return TRUE;
+	}
+
+	return FALSE;
+}
+
+static void
+docklet_x11_popup_cb(GtkWidget *button)
+{
+	pidgin_docklet_clicked(3);
+}
+
 static void
 docklet_x11_update_icon(PurpleStatusPrimitive status, gboolean connecting, gboolean pending)
 {
@@ -269,11 +297,14 @@
 	docklet = egg_tray_icon_new(PIDGIN_NAME);
 	box = gtk_event_box_new();
 	image = gtk_image_new();
+	GTK_WIDGET_SET_FLAGS (image, GTK_CAN_FOCUS);
 
 	g_signal_connect(G_OBJECT(docklet), "embedded", G_CALLBACK(docklet_x11_embedded_cb), NULL);
 	g_signal_connect(G_OBJECT(docklet), "destroy", G_CALLBACK(docklet_x11_destroyed_cb), NULL);
 	g_signal_connect(G_OBJECT(docklet), "size-allocate", G_CALLBACK(docklet_x11_resize_icon), NULL);
 	g_signal_connect(G_OBJECT(box), "button-press-event", G_CALLBACK(docklet_x11_clicked_cb), NULL);
+	g_signal_connect(G_OBJECT(box), "key-press-event", G_CALLBACK(docklet_x11_pressed_cb), NULL);
+	g_signal_connect(G_OBJECT(box), "popup-menu", G_CALLBACK(docklet_x11_popup_cb), NULL);
 	gtk_container_add(GTK_CONTAINER(box), image);
 	gtk_container_add(GTK_CONTAINER(docklet), box);
 
--- a/pidgin/gtkft.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkft.c	Sun Jun 28 04:41:07 2009 +0000
@@ -705,12 +705,12 @@
 	};
 
 	/* Setup the initial table */
-	dialog->table = table = gtk_table_new(9, 2, FALSE);
+	dialog->table = table = gtk_table_new(G_N_ELEMENTS(labels) + 1, 2, FALSE);
 	gtk_table_set_row_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE);
 	gtk_table_set_col_spacings(GTK_TABLE(table), PIDGIN_HIG_BOX_SPACE);
 
 	/* Setup the labels */
-	for (i = 0; i < sizeof(labels) / sizeof(*labels); i++) {
+	for (i = 0; i < G_N_ELEMENTS(labels); i++) {
 		GtkWidget *label;
 		char buf[256];
 
@@ -734,7 +734,9 @@
 
 	/* Setup the progress bar */
 	dialog->progress = gtk_progress_bar_new();
-	gtk_table_attach(GTK_TABLE(table), dialog->progress, 0, 2, 8, 9,
+	gtk_table_attach(GTK_TABLE(table), dialog->progress,
+					 0, 2,
+					 G_N_ELEMENTS(labels), G_N_ELEMENTS(labels) + 1,
 					 GTK_FILL, GTK_FILL, 0, 0);
 	gtk_widget_show(dialog->progress);
 
--- a/pidgin/gtkicon-theme-loader.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkicon-theme-loader.c	Sun Jun 28 04:41:07 2009 +0000
@@ -41,7 +41,7 @@
 	filename_full = g_build_filename(dir, "theme.xml", NULL);
 
 	if (g_file_test(filename_full, G_FILE_TEST_IS_REGULAR))
-		root_node = xmlnode_from_file(dir, "theme.xml", "sound themes", "sound-theme-loader");
+		root_node = xmlnode_from_file(dir, "theme.xml", "icon themes", "icon-theme-loader");
 
 	g_free(filename_full);
 	g_return_val_if_fail(root_node != NULL, NULL);
--- a/pidgin/gtkimhtml.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkimhtml.c	Sun Jun 28 04:41:07 2009 +0000
@@ -82,6 +82,11 @@
 	GtkTextMark *mark;
 };
 
+typedef struct {
+	GtkIMHtmlScalable *image;
+	gpointer data;
+	gsize datasize;
+} GtkIMHtmlImageSave;
 
 struct im_image_data {
 	int id;
@@ -2991,10 +2996,21 @@
 							break;
 
 						id = gtk_imhtml_get_html_opt(tag, "ID=");
-						if (!id)
-							break;
-						gtk_imhtml_insert_image_at_iter(imhtml, atoi(id), iter);
-						g_free(id);
+						if (id) {
+							gtk_imhtml_insert_image_at_iter(imhtml, atoi(id), iter);
+							g_free(id);
+						} else {
+							char *src, *alt;
+							src = gtk_imhtml_get_html_opt(tag, "SRC=");
+							alt = gtk_imhtml_get_html_opt(tag, "ALT=");
+							if (src) {
+								gtk_imhtml_toggle_link(imhtml, src);
+								gtk_text_buffer_insert(imhtml->text_buffer, iter, alt ? alt : src, -1);
+								gtk_imhtml_toggle_link(imhtml, NULL);
+							}
+							g_free (src);
+							g_free (alt);
+						}
 						break;
 					}
 				case 47:	/* P (opt) */
@@ -3641,96 +3657,109 @@
 }
 
 static void
-image_save_yes_cb(GtkIMHtmlImage *image, const char *filename)
-{
-	gchar *type = NULL;
+image_save_yes_cb(GtkIMHtmlImageSave *save, const char *filename)
+{
 	GError *error = NULL;
-#if GTK_CHECK_VERSION(2,2,0)
-	GSList *formats = gdk_pixbuf_get_formats();
-#else
-	char *basename = g_path_get_basename(filename);
-	char *ext = strrchr(basename, '.');
-#endif
-	char *newfilename;
+	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
 
 	gtk_widget_destroy(image->filesel);
 	image->filesel = NULL;
 
+	if (save->data && save->datasize) {
+#if GLIB_CHECK_VERSION(2,8,0)
+		g_file_set_contents(filename, save->data, save->datasize, &error);
+#else
+		purple_util_write_data_to_file_absolute(filename, save->data, save->datasize);
+#endif
+	} else {
+		gchar *type = NULL;
 #if GTK_CHECK_VERSION(2,2,0)
-	while (formats) {
-		GdkPixbufFormat *format = formats->data;
-		gchar **extensions = gdk_pixbuf_format_get_extensions(format);
-		gpointer p = extensions;
-
-		while(gdk_pixbuf_format_is_writable(format) && extensions && extensions[0]){
-			gchar *fmt_ext = extensions[0];
-			const gchar* file_ext = filename + strlen(filename) - strlen(fmt_ext);
-
-			if(!g_ascii_strcasecmp(fmt_ext, file_ext)){
-				type = gdk_pixbuf_format_get_name(format);
+		GSList *formats = gdk_pixbuf_get_formats();
+#else
+		char *basename = g_path_get_basename(filename);
+		char *ext = strrchr(basename, '.');
+#endif
+		char *newfilename;
+
+#if GTK_CHECK_VERSION(2,2,0)
+		while (formats) {
+			GdkPixbufFormat *format = formats->data;
+			gchar **extensions = gdk_pixbuf_format_get_extensions(format);
+			gpointer p = extensions;
+
+			while(gdk_pixbuf_format_is_writable(format) && extensions && extensions[0]){
+				gchar *fmt_ext = extensions[0];
+				const gchar* file_ext = filename + strlen(filename) - strlen(fmt_ext);
+
+				if(!g_ascii_strcasecmp(fmt_ext, file_ext)){
+					type = gdk_pixbuf_format_get_name(format);
+					break;
+				}
+
+				extensions++;
+			}
+
+			g_strfreev(p);
+
+			if (type)
 				break;
-			}
-
-			extensions++;
+
+			formats = formats->next;
 		}
 
-		g_strfreev(p);
-
-		if (type)
-			break;
-
-		formats = formats->next;
-	}
-
-	g_slist_free(formats);
+		g_slist_free(formats);
+#else
+		/* this is really ugly code, but I think it will work */
+		if (ext) {
+			ext++;
+			if (!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg"))
+				type = g_strdup("jpeg");
+			else if (!g_ascii_strcasecmp(ext, "png"))
+				type = g_strdup("png");
+		}
+
+		g_free(basename);
+#endif
+
+		/* If I can't find a valid type, I will just tell the user about it and then assume
+		   it's a png */
+		if (!type){
+			char *basename, *tmp;
+			char *dirname;
+#if GTK_CHECK_VERSION(2,4,0)
+			GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+							_("<span size='larger' weight='bold'>Unrecognized file type</span>\n\nDefaulting to PNG."));
 #else
-	/* this is really ugly code, but I think it will work */
-	if (ext) {
-		ext++;
-		if (!g_ascii_strcasecmp(ext, "jpeg") || !g_ascii_strcasecmp(ext, "jpg"))
-			type = g_strdup("jpeg");
-		else if (!g_ascii_strcasecmp(ext, "png"))
+			GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
+							_("Unrecognized file type\n\nDefaulting to PNG."));
+#endif
+
+			g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
+			gtk_widget_show(dialog);
+
 			type = g_strdup("png");
+			dirname = g_path_get_dirname(filename);
+			basename = g_path_get_basename(filename);
+			tmp = strrchr(basename, '.');
+			if (tmp != NULL)
+				tmp[0] = '\0';
+			newfilename = g_strdup_printf("%s" G_DIR_SEPARATOR_S  "%s.png", dirname, basename);
+			g_free(dirname);
+			g_free(basename);
+		} else {
+			/*
+			 * We're able to save the file in it's original format, so we
+			 * can use the original file name.
+			 */
+			newfilename = g_strdup(filename);
+		}
+
+		gdk_pixbuf_save(image->pixbuf, newfilename, type, &error, NULL);
+
+		g_free(newfilename);
+		g_free(type);
 	}
 
-	g_free(basename);
-#endif
-
-	/* If I can't find a valid type, I will just tell the user about it and then assume
-	   it's a png */
-	if (!type){
-		char *basename, *tmp;
-#if GTK_CHECK_VERSION(2,4,0)
-		GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
-						_("<span size='larger' weight='bold'>Unrecognized file type</span>\n\nDefaulting to PNG."));
-#else
-		GtkWidget *dialog = gtk_message_dialog_new(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
-						_("Unrecognized file type\n\nDefaulting to PNG."));
-#endif
-
-		g_signal_connect_swapped(dialog, "response", G_CALLBACK (gtk_widget_destroy), dialog);
-		gtk_widget_show(dialog);
-
-		type = g_strdup("png");
-		basename = g_path_get_basename(filename);
-		tmp = strrchr(basename, '.');
-		if (tmp != NULL)
-			tmp[0] = '\0';
-		newfilename = g_strdup_printf("%s.png", basename);
-		g_free(basename);
-	} else {
-		/*
-		 * We're able to save the file in it's original format, so we
-		 * can use the original file name.
-		 */
-		newfilename = g_strdup(filename);
-	}
-
-	gdk_pixbuf_save(image->pixbuf, newfilename, type, &error, NULL);
-
-	g_free(newfilename);
-	g_free(type);
-
 	if (error){
 #if GTK_CHECK_VERSION(2,4,0)
 		GtkWidget *dialog = gtk_message_dialog_new_with_markup(NULL, 0, GTK_MESSAGE_ERROR, GTK_BUTTONS_OK,
@@ -3747,9 +3776,10 @@
 
 #if GTK_CHECK_VERSION(2,4,0) /* FILECHOOSER */
 static void
-image_save_check_if_exists_cb(GtkWidget *widget, gint response, GtkIMHtmlImage *image)
+image_save_check_if_exists_cb(GtkWidget *widget, gint response, GtkIMHtmlImageSave *save)
 {
 	gchar *filename;
+	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
 
 	if (response != GTK_RESPONSE_ACCEPT) {
 		gtk_widget_destroy(widget);
@@ -3760,9 +3790,10 @@
 	filename = gtk_file_chooser_get_filename(GTK_FILE_CHOOSER(widget));
 #else /* FILECHOOSER */
 static void
-image_save_check_if_exists_cb(GtkWidget *button, GtkIMHtmlImage *image)
+image_save_check_if_exists_cb(GtkWidget *button, GtkIMHtmlImageSave *save)
 {
 	gchar *filename;
+	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
 
 	filename = g_strdup(gtk_file_selection_get_filename(GTK_FILE_SELECTION(image->filesel)));
 
@@ -3795,7 +3826,7 @@
 		image_save_yes_cb(image, filename);
 	*/
 
-	image_save_yes_cb(image, filename);
+	image_save_yes_cb(save, filename);
 
 	g_free(filename);
 }
@@ -3810,8 +3841,10 @@
 #endif /* FILECHOOSER */
 
 static void
-gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImage *image)
-{
+gtk_imhtml_image_save(GtkWidget *w, GtkIMHtmlImageSave *save)
+{
+	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
+
 	if (image->filesel != NULL) {
 		gtk_window_present(GTK_WINDOW(image->filesel));
 		return;
@@ -3828,7 +3861,7 @@
 	if (image->filename != NULL)
 		gtk_file_chooser_set_current_name(GTK_FILE_CHOOSER(image->filesel), image->filename);
 	g_signal_connect(G_OBJECT(GTK_FILE_CHOOSER(image->filesel)), "response",
-					 G_CALLBACK(image_save_check_if_exists_cb), image);
+					 G_CALLBACK(image_save_check_if_exists_cb), save);
 #else /* FILECHOOSER */
 	image->filesel = gtk_file_selection_new(_("Save Image"));
 	if (image->filename != NULL)
@@ -3838,19 +3871,22 @@
 	g_signal_connect_swapped(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->cancel_button),
 							 "clicked", G_CALLBACK(image_save_cancel_cb), image);
 	g_signal_connect(G_OBJECT(GTK_FILE_SELECTION(image->filesel)->ok_button), "clicked",
-					 G_CALLBACK(image_save_check_if_exists_cb), image);
+					 G_CALLBACK(image_save_check_if_exists_cb), save);
 #endif /* FILECHOOSER */
 
 	gtk_widget_show(image->filesel);
 }
 
 static void
-gtk_imhtml_custom_smiley_save(GtkWidget *w, GtkIMHtmlImage *image)
-{
+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);
 	pidgin_smiley_editor_set_image(editor, image->pixbuf);
+	pidgin_smiley_editor_set_data(editor, save->data, save->datasize);
 }
 
 /*
@@ -3860,33 +3896,32 @@
  * embedded in the conversation.  Someone should make the Purple core handle
  * all of that.
  */
-static gboolean gtk_imhtml_image_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlImage *image)
+static gboolean gtk_imhtml_image_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlImageSave *save)
 {
 	GdkEventButton *event_button = (GdkEventButton *) event;
+	GtkIMHtmlImage *image = (GtkIMHtmlImage *)save->image;
 
 	if (event->type == GDK_BUTTON_RELEASE) {
 		if(event_button->button == 3) {
 			GtkWidget *img, *item, *menu;
-			gchar *text = g_strdup_printf(_("_Save Image..."));
 			menu = gtk_menu_new();
 
 			/* buttons and such */
 			img = gtk_image_new_from_stock(GTK_STOCK_SAVE, GTK_ICON_SIZE_MENU);
-			item = gtk_image_menu_item_new_with_mnemonic(text);
+			item = gtk_image_menu_item_new_with_mnemonic(_("_Save Image..."));
 			gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
-			g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), image);
+			g_signal_connect(G_OBJECT(item), "activate", G_CALLBACK(gtk_imhtml_image_save), save);
 			gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 
 			/* Add menu item for adding custom smiley to local smileys */
 			/* we only add the menu if the image is of "custom smiley size"
 			  <= 96x96 pixels */
 			if (image->width <= 96 && image->height <= 96) {
-				text = g_strdup_printf(_("_Add Custom Smiley..."));
 				img = gtk_image_new_from_stock(GTK_STOCK_ADD, GTK_ICON_SIZE_MENU);
-				item = gtk_image_menu_item_new_with_mnemonic(text);
+				item = gtk_image_menu_item_new_with_mnemonic(_("_Add Custom Smiley..."));
 				gtk_image_menu_item_set_image(GTK_IMAGE_MENU_ITEM(item), img);
 				g_signal_connect(G_OBJECT(item), "activate",
-								 G_CALLBACK(gtk_imhtml_custom_smiley_save), image);
+								 G_CALLBACK(gtk_imhtml_custom_smiley_save), save);
 				gtk_menu_shell_append(GTK_MENU_SHELL(menu), item);
 			}
 
@@ -3894,7 +3929,6 @@
 			gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL,
 							event_button->button, event_button->time);
 
-			g_free(text);
 			return TRUE;
 		}
 	}
@@ -3909,7 +3943,7 @@
 static gboolean gtk_imhtml_smiley_clicked(GtkWidget *w, GdkEvent *event, GtkIMHtmlSmiley *smiley)
 {
 	GdkPixbufAnimation *anim = NULL;
-	GtkIMHtmlScalable *image = NULL;
+	GtkIMHtmlImageSave *save = NULL;
 	gboolean ret;
 
 	if (event->type != GDK_BUTTON_RELEASE || ((GdkEventButton*)event)->button != 3)
@@ -3919,9 +3953,14 @@
 	if (!anim)
 		return FALSE;
 
-	image = gtk_imhtml_animation_new(anim, smiley->smile, 0);
-	ret = gtk_imhtml_image_clicked(w, event, (GtkIMHtmlImage*)image);
-	g_object_set_data_full(G_OBJECT(w), "image-data", image, (GDestroyNotify)gtk_imhtml_animation_free);
+	save = g_new0(GtkIMHtmlImageSave, 1);
+	save->image = (GtkIMHtmlScalable *)gtk_imhtml_animation_new(anim, smiley->smile, 0);
+	save->data = smiley->data;        /* Do not need to memdup here, since the smiley is not
+	                                     destroyed before this GtkIMHtmlImageSave */
+	save->datasize = smiley->datasize;
+	ret = gtk_imhtml_image_clicked(w, event, save);
+	g_object_set_data_full(G_OBJECT(w), "image-data", save->image, (GDestroyNotify)gtk_imhtml_animation_free);
+	g_object_set_data_full(G_OBJECT(w), "image-save-data", save, (GDestroyNotify)g_free);
 	return ret;
 }
 
@@ -3955,6 +3994,7 @@
 	GtkWidget *box = gtk_event_box_new();
 	char *tag;
 	GtkTextChildAnchor *anchor = gtk_text_buffer_create_child_anchor(imhtml->text_buffer, iter);
+	GtkIMHtmlImageSave *save;
 
 	gtk_container_add(GTK_CONTAINER(box), GTK_WIDGET(image->image));
 
@@ -3969,7 +4009,11 @@
 	g_object_set_data(G_OBJECT(anchor), "gtkimhtml_plaintext", "[Image]");
 
 	gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), box, anchor);
-	g_signal_connect(G_OBJECT(box), "event", G_CALLBACK(gtk_imhtml_image_clicked), image);
+
+	save = g_new0(GtkIMHtmlImageSave, 1);
+	save->image = scale;
+	g_signal_connect(G_OBJECT(box), "event", G_CALLBACK(gtk_imhtml_image_clicked), save);
+	g_object_set_data_full(G_OBJECT(box), "image-save-data", save, (GDestroyNotify)g_free);
 }
 
 GtkIMHtmlScalable *gtk_imhtml_hr_new()
@@ -5032,6 +5076,7 @@
 			gtk_widget_show(img);
 			g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_plaintext", text, g_free);
 			g_object_set_data(G_OBJECT(anchor), "gtkimhtml_tiptext", text);
+			g_object_set_data_full(G_OBJECT(anchor), "gtkimhtml_htmltext", g_strdup(smiley), g_free);
 			gtk_text_view_add_child_at_anchor(GTK_TEXT_VIEW(imhtml), ebox, anchor);
 		}
 	} else {
@@ -5773,6 +5818,7 @@
 		g_object_unref(smiley->icon);
 	if (smiley->loader)
 		g_object_unref(smiley->loader);
+	g_free(smiley->data);
 	g_free(smiley);
 }
 
@@ -5887,13 +5933,25 @@
 
 void gtk_imhtml_set_populate_primary_clipboard(GtkIMHtml *imhtml, gboolean populate)
 {
+	gulong signal_id;
+	signal_id = g_signal_handler_find(imhtml->text_buffer,
+			G_SIGNAL_MATCH_FUNC | G_SIGNAL_MATCH_UNBLOCKED, 0, 0, NULL,
+			mark_set_so_update_selection_cb, NULL);
 	if (populate) {
-		g_signal_handlers_unblock_matched(imhtml->text_buffer,
-				G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
-				mark_set_so_update_selection_cb, NULL);
+		if (!signal_id) {
+			/* We didn't find an unblocked signal handler, which means there
+			   is a blocked handler. Now unblock it.
+			   This is necessary to avoid a mutex-lock when the debug message
+			   saying 'no handler is blocked' is printed in the debug window.
+				-- sad
+			 */
+			g_signal_handlers_unblock_matched(imhtml->text_buffer,
+					G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
+					mark_set_so_update_selection_cb, NULL);
+		}
 	} else {
-		g_signal_handlers_block_matched(imhtml->text_buffer,
-				G_SIGNAL_MATCH_FUNC, 0, 0, NULL,
-				mark_set_so_update_selection_cb, NULL);
+		/* Block only if we found an unblocked handler */
+		if (signal_id)
+			g_signal_handler_block(imhtml->text_buffer, signal_id);
 	}
 }
--- a/pidgin/gtkimhtml.h	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkimhtml.h	Sun Jun 28 04:41:07 2009 +0000
@@ -188,6 +188,8 @@
 	GSList *anchors;
 	GtkIMHtmlSmileyFlags flags;
 	GtkIMHtml *imhtml;
+	gpointer data;       /** @Since 2.6.0 */
+	gsize datasize;      /** @Since 2.6.0 */
 };
 
 struct _GtkIMHtmlScalable {
--- a/pidgin/gtkmain.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkmain.c	Sun Jun 28 04:41:07 2009 +0000
@@ -353,6 +353,7 @@
 		g_hash_table_insert(ui_info, "version", VERSION);
 		g_hash_table_insert(ui_info, "website", "http://pidgin.im");
 		g_hash_table_insert(ui_info, "dev_website", "http://developer.pidgin.im");
+		g_hash_table_insert(ui_info, "client_type", "pc");
 	}
 
 	return ui_info;
--- a/pidgin/gtknotify.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtknotify.c	Sun Jun 28 04:41:07 2009 +0000
@@ -120,7 +120,7 @@
 {
 	PIDGIN_NOTIFY_MAIL,
 	PIDGIN_NOTIFY_POUNCE,
-        PIDGIN_NOTIFY_TYPES
+	PIDGIN_NOTIFY_TYPES
 } PidginNotifyType;
 
 static PidginNotifyDialog *mail_dialog = NULL;
@@ -557,7 +557,10 @@
 						gtk_tree_store_remove(treemodel, &iter);
 						advanced = (iter.stamp == 0) ? FALSE : TRUE;
 #endif
-						purple_notify_close(PURPLE_NOTIFY_EMAILS, data);
+						if (data->purple_has_handle)
+							purple_notify_close(PURPLE_NOTIFY_EMAILS, data);
+						else
+							pidgin_close_notify(PURPLE_NOTIFY_EMAILS, data);
 						/* We're completely done if we've processed all entries */
 						if (!advanced)
 							return NULL;
@@ -612,7 +615,7 @@
 	char *notification;
 	PurpleAccount *account;
 	PidginNotifyMailData *data = NULL, *data2;
-	gboolean new_data;
+	gboolean new_data = FALSE;
 
 	/* Don't bother updating if there aren't new emails and we don't have any displayed currently */
 	if (count == 0 && mail_dialog == NULL)
@@ -660,7 +663,7 @@
 
 			/* If we don't keep track of this, will leak "data" for each of the notifications except the last */
 			data2 = pidgin_notify_add_mail(mail_dialog->treemodel, account, notification, urls ? *urls : NULL, 0, FALSE, &new_data);
-			if (new_data) {
+			if (data2 && new_data) {
 				if (data)
 					data->purple_has_handle = FALSE;
 				data = data2;
@@ -677,7 +680,7 @@
 							   (int)count),
 							   *tos, (int)count);
 			data2 = pidgin_notify_add_mail(mail_dialog->treemodel, account, notification, urls ? *urls : NULL, count, FALSE, &new_data);
-			if (new_data) {
+			if (data2 && new_data) {
 				if (data)
 					data->purple_has_handle = FALSE;
 				data = data2;
@@ -1379,7 +1382,6 @@
 
 	spec_dialog = g_new0(PidginNotifyDialog, 1);
 	spec_dialog->dialog = dialog;
-	spec_dialog->open_button = button;
 
 	spec_dialog->treemodel = treemodel;
 	spec_dialog->treeview = gtk_tree_view_new_with_model(GTK_TREE_MODEL(spec_dialog->treemodel));
@@ -1399,6 +1401,7 @@
 
 		button = gtk_dialog_add_button(GTK_DIALOG(dialog),
 						 PIDGIN_STOCK_OPEN_MAIL, GTK_RESPONSE_YES);
+		spec_dialog->open_button = button;
 
 		gtk_tree_view_set_headers_visible(GTK_TREE_VIEW(spec_dialog->treeview), FALSE);
 
@@ -1496,7 +1499,7 @@
 		mail_dialog = spec_dialog;
 	else if (type == PIDGIN_NOTIFY_POUNCE) {
 		pounce_dialog = spec_dialog;
-        }
+	}
 
 	return spec_dialog->dialog;
 
--- a/pidgin/gtkprefs.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkprefs.c	Sun Jun 28 04:41:07 2009 +0000
@@ -1268,14 +1268,15 @@
 static void
 prefs_set_blist_theme_cb(GtkComboBox *combo_box, gpointer user_data)
 {
-	PidginBlistTheme *theme;
+	PidginBlistTheme *theme = NULL;
 	GtkTreeIter iter;
 	gchar *name = NULL;
 
 	g_return_if_fail(gtk_combo_box_get_active_iter(combo_box, &iter));
 	gtk_tree_model_get(GTK_TREE_MODEL(prefs_blist_themes), &iter, 2, &name, -1);
 
-	theme = PIDGIN_BLIST_THEME(purple_theme_manager_find_theme(name, "blist"));
+	if (name && *name)
+		theme = PIDGIN_BLIST_THEME(purple_theme_manager_find_theme(name, "blist"));
 	g_free(name);
 
 	pidgin_blist_set_theme(theme);
--- a/pidgin/gtksmiley.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtksmiley.c	Sun Jun 28 04:41:07 2009 +0000
@@ -47,6 +47,8 @@
 	GtkWidget *smiley_image;
 	gchar *filename;
 	GdkPixbuf *custom_pixbuf;
+	gpointer data; /** @since 2.6.0 */
+	gsize datasize; /** @since 2.6.0 */
 };
 
 typedef struct
@@ -277,7 +279,6 @@
 		purple_debug_info("gtksmiley", "adding a new smiley\n");
 
 		if (s->filename == NULL) {
-			/* Get the smiley from the custom pixbuf */
 			gchar *buffer = NULL;
 			gsize size = 0;
 			gchar *filename;
@@ -296,8 +297,16 @@
 				}
 			}
 
-			gdk_pixbuf_save_to_buffer(s->custom_pixbuf, &buffer, &size,
-				"png", NULL, "compression", "9", NULL, NULL);
+			if (s->data && s->datasize) {
+				/* Cached data & size in memory */
+				buffer = s->data;
+				size = s->datasize;
+			}
+			else {
+				/* Get the smiley from the custom pixbuf */
+				gdk_pixbuf_save_to_buffer(s->custom_pixbuf, &buffer, &size,
+					"png", NULL, "compression", "9", NULL, NULL);
+			}
 			filename = purple_util_get_image_filename(buffer, size);
 			s->filename = g_build_filename(dirname, filename, NULL);
 			purple_util_write_data_to_file_absolute(s->filename, buffer, size);
@@ -465,6 +474,13 @@
 		gtk_image_set_from_pixbuf(GTK_IMAGE(editor->smiley_image), image);
 }
 
+void
+pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize)
+{
+	editor->data = data;
+	editor->datasize = datasize;
+}
+
 /******************************************************************************
  * Delete smiley
  *****************************************************************************/
--- a/pidgin/gtksmiley.h	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtksmiley.h	Sun Jun 28 04:41:07 2009 +0000
@@ -100,4 +100,15 @@
  */
 void pidgin_smiley_editor_set_image(PidginSmiley *editor, GdkPixbuf *image);
 
+/**
+ * Sets the image data in a smiley add dialog
+ *
+ * @param editor A smiley editor dialog
+ * @param data A pointer to smiley's data
+ * @param datasize The size of smiley's data
+ *
+ * @since 2.6.0
+ */
+void pidgin_smiley_editor_set_data(PidginSmiley *editor, gpointer *data, gsize datasize);
+
 #endif /* PIDGIN_GTKSMILEY_H */
--- a/pidgin/gtkstatusbox.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkstatusbox.c	Sun Jun 28 04:41:07 2009 +0000
@@ -93,6 +93,7 @@
 static void do_colorshift (GdkPixbuf *dest, GdkPixbuf *src, int shift);
 static void icon_choose_cb(const char *filename, gpointer data);
 static void remove_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box);
+static void choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box);
 
 enum {
 	/** A PidginStatusBoxItemType */
@@ -317,6 +318,10 @@
 
 		box->icon_box_menu = gtk_menu_new();
 
+		menu_item = pidgin_new_item_from_stock(box->icon_box_menu, _("Select Buddy Icon"), GTK_STOCK_ADD,
+						     G_CALLBACK(choose_buddy_icon_cb),
+						     box, 0, 0, NULL);
+
 		menu_item = pidgin_new_item_from_stock(box->icon_box_menu, _("Remove"), GTK_STOCK_REMOVE,
 						     G_CALLBACK(remove_buddy_icon_cb),
 						     box, 0, 0, NULL);
@@ -327,13 +332,7 @@
 			       event->button, event->time);
 
 	} else {
-		if (box->buddy_icon_sel) {
-			gtk_window_present(GTK_WINDOW(box->buddy_icon_sel));
-			return FALSE;
-		}
-
-		box->buddy_icon_sel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(widget)), icon_choose_cb, box);
-		gtk_widget_show_all(box->buddy_icon_sel);
+		choose_buddy_icon_cb(widget, box);
 	}
 	return FALSE;
 }
@@ -1529,6 +1528,17 @@
 }
 
 static void
+choose_buddy_icon_cb(GtkWidget *w, PidginStatusBox *box)
+{
+	if (box->buddy_icon_sel) {
+		gtk_window_present(GTK_WINDOW(box->buddy_icon_sel));
+	} else {
+		box->buddy_icon_sel = pidgin_buddy_icon_chooser_new(GTK_WINDOW(gtk_widget_get_toplevel(w)), icon_choose_cb, box);
+		gtk_widget_show_all(box->buddy_icon_sel);
+	}
+}
+
+static void
 icon_choose_cb(const char *filename, gpointer data)
 {
 	PidginStatusBox *box = data;
@@ -2035,17 +2045,11 @@
 
 	if (status_box->icon_box)
 	{
-		GtkTextDirection dir = gtk_widget_get_direction(widget);
 		parent_alc.width -= (parent_alc.height + border_width);
 		icon_alc = parent_alc;
 		icon_alc.height = MAX(1, icon_alc.height) - 2;
 		icon_alc.width = icon_alc.height;
-		if (dir == GTK_TEXT_DIR_RTL) {
-			icon_alc.x = parent_alc.x;
-			parent_alc.x += icon_alc.width + border_width;
-		} else {
-			icon_alc.x = allocation->width - (icon_alc.width + border_width + 1);
-		}
+		icon_alc.x = allocation->width - (icon_alc.width + border_width + 1);
 		icon_alc.y += 1;
 
 		if (status_box->icon_size != icon_alc.height)
@@ -2254,14 +2258,22 @@
 
 	if (status_box->buddy_icon_img != NULL)
 	{
+		GdkPixbuf *buf, *scale;
+		int scale_width, scale_height;
 		GdkPixbufLoader *loader = gdk_pixbuf_loader_new();
 		g_signal_connect(G_OBJECT(loader), "size-prepared", G_CALLBACK(pixbuf_size_prepared_cb), NULL);
 		gdk_pixbuf_loader_write(loader, purple_imgstore_get_data(status_box->buddy_icon_img),
 		                        purple_imgstore_get_size(status_box->buddy_icon_img), NULL);
 		gdk_pixbuf_loader_close(loader, NULL);
-		status_box->buddy_icon = gdk_pixbuf_loader_get_pixbuf(loader);
-		if (status_box->buddy_icon)
-			g_object_ref(status_box->buddy_icon);
+		buf = gdk_pixbuf_loader_get_pixbuf(loader);
+		scale_width = gdk_pixbuf_get_width(buf);
+		scale_height = gdk_pixbuf_get_height(buf);
+		scale = gdk_pixbuf_new(GDK_COLORSPACE_RGB, TRUE, 8, scale_width, scale_height);
+		gdk_pixbuf_fill(scale, 0x00000000);
+		gdk_pixbuf_copy_area(buf, 0, 0, scale_width, scale_height, scale, 0, 0);
+		if (pidgin_gdk_pixbuf_is_opaque(scale))
+			pidgin_gdk_pixbuf_make_round(scale);
+		status_box->buddy_icon = scale;
 		g_object_unref(loader);
 	}
 
--- a/pidgin/gtkutils.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/gtkutils.c	Sun Jun 28 04:41:07 2009 +0000
@@ -525,7 +525,7 @@
 	GtkWidget *item = gtk_menu_get_active(GTK_MENU(menu));
 	if (p_item)
 		(*p_item) = item;
-	return g_object_get_data(G_OBJECT(item), "aop_per_item_data");
+	return item ? g_object_get_data(G_OBJECT(item), "aop_per_item_data") : NULL;
 }
 
 static void
--- a/pidgin/pidginstock.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/pidginstock.c	Sun Jun 28 04:41:07 2009 +0000
@@ -114,120 +114,121 @@
 };
 
 typedef struct {
-  const char *name;
-  const char *dir;
-  const char *filename;
-  gboolean microscopic;
-  gboolean extra_small;
-  gboolean small;
-  gboolean medium;
-  gboolean large;
-  gboolean huge;
-  gboolean rtl;
-  const char *translucent_name;
+	const char *name;
+ 	const char *dir;
+	const char *filename;
+	gboolean microscopic;
+	gboolean extra_small;
+	gboolean small;
+	gboolean medium;
+	gboolean large;
+	gboolean huge;
+	gboolean rtl;
+	const char *translucent_name;
 } SizedStockIcon;
 
 const SizedStockIcon sized_stock_icons [] = {
 
-	{ PIDGIN_STOCK_STATUS_IGNORED,	"emblems", "blocked.png",	FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_STATUS_FOUNDER,	"emblems", "founder.png",	FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_STATUS_OPERATOR,	"emblems", "operator.png",	FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_STATUS_HALFOP, 	"emblems", "half-operator.png",	FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_STATUS_VOICE, 	"emblems", "voice.png",		FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
+	{ PIDGIN_STOCK_STATUS_IGNORED,  "emblems", "blocked.png",       FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_FOUNDER,  "emblems", "founder.png",       FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_OPERATOR, "emblems", "operator.png",      FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_HALFOP,   "emblems", "half-operator.png",	FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_VOICE,    "emblems", "voice.png",         FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
 
-	{ PIDGIN_STOCK_DIALOG_AUTH,	"dialogs", "auth.png",		FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_COOL,	"dialogs", "cool.png", 		FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_ERROR,	"dialogs", "error.png",		FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_INFO,	"dialogs", "info.png",		FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_MAIL,	"dialogs", "mail.png",		FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_QUESTION,	"dialogs", "question.png",	FALSE, TRUE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
-	{ PIDGIN_STOCK_DIALOG_WARNING,	"dialogs", "warning.png",	FALSE, FALSE, FALSE, FALSE, FALSE, TRUE, FALSE, NULL  },
+	{ PIDGIN_STOCK_DIALOG_AUTH,     "dialogs", "auth.png",      FALSE, TRUE,  FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_COOL,     "dialogs", "cool.png",      FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_ERROR,    "dialogs", "error.png",     FALSE, TRUE,  FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_INFO,     "dialogs", "info.png",      FALSE, TRUE,  FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_MAIL,     "dialogs", "mail.png",      FALSE, TRUE,  FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_QUESTION, "dialogs", "question.png",  FALSE, TRUE,  FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
+	{ PIDGIN_STOCK_DIALOG_WARNING,  "dialogs", "warning.png",   FALSE, FALSE, FALSE, FALSE, FALSE, TRUE,  FALSE, NULL },
 
-	{ PIDGIN_STOCK_ANIMATION_CONNECT0, "animations", "process-working0.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT1, "animations", "process-working1.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT2, "animations", "process-working2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT3, "animations", "process-working3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT4, "animations", "process-working4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT5, "animations", "process-working5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT6, "animations", "process-working6.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT7, "animations", "process-working7.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT8, "animations", "process-working8.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT9, "animations", "process-working9.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT10, "animations", "process-working10.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT11, "animations", "process-working11.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT12, "animations", "process-working12.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT13, "animations", "process-working13.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT14, "animations", "process-working14.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT15, "animations", "process-working15.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT16, "animations", "process-working16.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT17, "animations", "process-working17.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT18, "animations", "process-working18.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT19, "animations", "process-working19.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT20, "animations", "process-working20.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT21, "animations", "process-working21.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT22, "animations", "process-working22.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT23, "animations", "process-working23.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT24, "animations", "process-working24.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT25, "animations", "process-working25.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT26, "animations", "process-working26.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT27, "animations", "process-working27.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT28, "animations", "process-working28.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT29, "animations", "process-working29.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_CONNECT30, "animations", "process-working30.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING0,  "animations", "typing0.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING1,  "animations", "typing1.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING2,  "animations", "typing2.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING3,  "animations", "typing3.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING4,  "animations", "typing4.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_ANIMATION_TYPING5,  "animations", "typing5.png",FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT0,  "animations", "process-working0.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT1,  "animations", "process-working1.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT2,  "animations", "process-working2.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT3,  "animations", "process-working3.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT4,  "animations", "process-working4.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT5,  "animations", "process-working5.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT6,  "animations", "process-working6.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT7,  "animations", "process-working7.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT8,  "animations", "process-working8.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT9,  "animations", "process-working9.png",  FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT10, "animations", "process-working10.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT11, "animations", "process-working11.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT12, "animations", "process-working12.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT13, "animations", "process-working13.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT14, "animations", "process-working14.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT15, "animations", "process-working15.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT16, "animations", "process-working16.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT17, "animations", "process-working17.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT18, "animations", "process-working18.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT19, "animations", "process-working19.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT20, "animations", "process-working20.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT21, "animations", "process-working21.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT22, "animations", "process-working22.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT23, "animations", "process-working23.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT24, "animations", "process-working24.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT25, "animations", "process-working25.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT26, "animations", "process-working26.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT27, "animations", "process-working27.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT28, "animations", "process-working28.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT29, "animations", "process-working29.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_CONNECT30, "animations", "process-working30.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
 
-	{ PIDGIN_STOCK_TOOLBAR_BGCOLOR,		"toolbar", "change-bgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_BLOCK,		"emblems", "blocked.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_FGCOLOR,		"toolbar", "change-fgcolor.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_SMILEY,		"toolbar", "emote-select.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_FONT_FACE,	"toolbar", "font-face.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER,	"toolbar", "font-size-down.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_TEXT_LARGER,	"toolbar", "font-size-up.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_INSERT,		"toolbar", "insert.png", 	 FALSE,	TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE,	"toolbar", "insert-image.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_INSERT_LINK,	"toolbar", "insert-link.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW,	"toolbar", "message-new.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_PENDING,		"toolbar", "message-new.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_PLUGINS,		"toolbar", "plugins.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_UNBLOCK,		"toolbar", "unblock.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR,	"toolbar", "select-avatar.png",	 FALSE, FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_SEND_FILE,	"toolbar", "send-file.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_TRANSFER,	"toolbar", "transfer.png",	 FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
+	{ PIDGIN_STOCK_ANIMATION_TYPING0,  "animations", "typing0.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_TYPING1,  "animations", "typing1.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_TYPING2,  "animations", "typing2.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_TYPING3,  "animations", "typing3.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_TYPING4,  "animations", "typing4.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_ANIMATION_TYPING5,  "animations", "typing5.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+
+	{ PIDGIN_STOCK_TOOLBAR_BGCOLOR,         "toolbar", "change-bgcolor.png", FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_BLOCK,           "emblems", "blocked.png",        FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_FGCOLOR,         "toolbar", "change-fgcolor.png", FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_SMILEY,          "toolbar", "emote-select.png",   FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_FONT_FACE,       "toolbar", "font-face.png",      FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_TEXT_SMALLER,    "toolbar", "font-size-down.png", FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_TEXT_LARGER,     "toolbar", "font-size-up.png",	 FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_INSERT,          "toolbar", "insert.png",         FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_INSERT_IMAGE,    "toolbar", "insert-image.png",	 FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_INSERT_LINK,     "toolbar", "insert-link.png",	 FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_MESSAGE_NEW,     "toolbar", "message-new.png",	 FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_PENDING,         "toolbar", "message-new.png",	 FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_PLUGINS,         "toolbar", "plugins.png",        FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_UNBLOCK,         "toolbar", "unblock.png",        FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_SELECT_AVATAR,   "toolbar", "select-avatar.png",  FALSE, FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_SEND_FILE,       "toolbar", "send-file.png",      FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_TRANSFER,        "toolbar", "transfer.png",       FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
 #ifdef USE_VV
-	{ PIDGIN_STOCK_TOOLBAR_AUDIO_CALL, "toolbar", "audio-call.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_VIDEO_CALL, "toolbar", "video-call.png", FALSE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL, "toolbar", "audio-video-call.png", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
+	{ PIDGIN_STOCK_TOOLBAR_AUDIO_CALL,       "toolbar", "audio-call.png",       FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_VIDEO_CALL,       "toolbar", "video-call.png",       FALSE, TRUE,  FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TOOLBAR_AUDIO_VIDEO_CALL, "toolbar", "audio-video-call.png", FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
 #endif
 };
 
 const SizedStockIcon sized_status_icons [] = {
 
-	{ PIDGIN_STOCK_STATUS_AVAILABLE, "status", "available.png", 	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I },
-	{ PIDGIN_STOCK_STATUS_AWAY, 	 "status", "away.png",		TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I },
-	{ PIDGIN_STOCK_STATUS_BUSY, 	 "status", "busy.png", 		TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I },
-	{ PIDGIN_STOCK_STATUS_CHAT, 	 "status", "chat.png",		TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
-	{ PIDGIN_STOCK_STATUS_INVISIBLE, "status", "invisible.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
-	{ PIDGIN_STOCK_STATUS_XA, 	 "status", "extended-away.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,  PIDGIN_STOCK_STATUS_XA_I },
-	{ PIDGIN_STOCK_STATUS_LOGIN, 	 "status", "log-in.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,  NULL },
-	{ PIDGIN_STOCK_STATUS_LOGOUT, 	 "status", "log-out.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, TRUE,  NULL },
-	{ PIDGIN_STOCK_STATUS_OFFLINE, 	 "status", "offline.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I  },
-	{ PIDGIN_STOCK_STATUS_PERSON, 	 "status", "person.png",	TRUE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_STATUS_MESSAGE, 	 "toolbar", "message-new.png",  TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL  },
+	{ PIDGIN_STOCK_STATUS_AVAILABLE, "status",  "available.png",     TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, PIDGIN_STOCK_STATUS_AVAILABLE_I },
+	{ PIDGIN_STOCK_STATUS_AWAY,      "status",  "away.png",          TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, PIDGIN_STOCK_STATUS_AWAY_I },
+	{ PIDGIN_STOCK_STATUS_BUSY,      "status",  "busy.png",          TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, PIDGIN_STOCK_STATUS_BUSY_I },
+	{ PIDGIN_STOCK_STATUS_CHAT,      "status",  "chat.png",          TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_INVISIBLE, "status",  "invisible.png",     TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_XA,        "status",  "extended-away.png", TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,  PIDGIN_STOCK_STATUS_XA_I },
+	{ PIDGIN_STOCK_STATUS_LOGIN,     "status",  "log-in.png",        TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,  NULL },
+	{ PIDGIN_STOCK_STATUS_LOGOUT,    "status",  "log-out.png",       TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, TRUE,  NULL },
+	{ PIDGIN_STOCK_STATUS_OFFLINE,   "status",  "offline.png",       TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, PIDGIN_STOCK_STATUS_OFFLINE_I  },
+	{ PIDGIN_STOCK_STATUS_PERSON,    "status",  "person.png",        TRUE, TRUE, TRUE,  TRUE,  TRUE,  FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_STATUS_MESSAGE,   "toolbar", "message-new.png",   TRUE, TRUE, FALSE, FALSE, FALSE, FALSE, FALSE, NULL },
 
-	{ PIDGIN_STOCK_TRAY_AVAILABLE,	"tray", "tray-online.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_INVISIBLE,	"tray", "tray-invisible.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_AWAY,	"tray", "tray-away.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_BUSY,	"tray", "tray-busy.png", 	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_XA,		"tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_OFFLINE,	"tray", "tray-offline.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_CONNECT,	"tray", "tray-connecting.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_PENDING,	"tray", "tray-new-im.png", 	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  },
-	{ PIDGIN_STOCK_TRAY_EMAIL,	"tray", "tray-message.png",	  FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL  }
+	{ PIDGIN_STOCK_TRAY_AVAILABLE, "tray", "tray-online.png",        FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_INVISIBLE, "tray", "tray-invisible.png",     FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_AWAY,      "tray", "tray-away.png",          FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_BUSY,      "tray", "tray-busy.png",          FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_XA,        "tray", "tray-extended-away.png", FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_OFFLINE,   "tray", "tray-offline.png",       FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_CONNECT,   "tray", "tray-connecting.png",    FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_PENDING,   "tray", "tray-new-im.png",        FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL },
+	{ PIDGIN_STOCK_TRAY_EMAIL,     "tray", "tray-message.png",       FALSE, TRUE, TRUE, TRUE, TRUE, FALSE, FALSE, NULL }
 };
 
 /*****************************************************************************
@@ -287,36 +288,36 @@
 static void
 do_alphashift(GdkPixbuf *dest, GdkPixbuf *src)
 {
-        gint i, j;
-        gint width, height, has_alpha, srcrowstride, destrowstride;
-        guchar *target_pixels;
-        guchar *original_pixels;
-        guchar *pixsrc;
-        guchar *pixdest;
-        guchar a;
+	gint i, j;
+	gint width, height, has_alpha, srcrowstride, destrowstride;
+	guchar *target_pixels;
+	guchar *original_pixels;
+	guchar *pixsrc;
+	guchar *pixdest;
+	guchar a;
 
-        has_alpha = gdk_pixbuf_get_has_alpha (src);
-        if (!has_alpha)
-          return;
+	has_alpha = gdk_pixbuf_get_has_alpha (src);
+	if (!has_alpha)
+		return;
 
-        width = gdk_pixbuf_get_width (src);
-        height = gdk_pixbuf_get_height (src);
-        srcrowstride = gdk_pixbuf_get_rowstride (src);
-        destrowstride = gdk_pixbuf_get_rowstride (dest);
-        target_pixels = gdk_pixbuf_get_pixels (dest);
-        original_pixels = gdk_pixbuf_get_pixels (src);
+	width = gdk_pixbuf_get_width (src);
+	height = gdk_pixbuf_get_height (src);
+	srcrowstride = gdk_pixbuf_get_rowstride (src);
+	destrowstride = gdk_pixbuf_get_rowstride (dest);
+	target_pixels = gdk_pixbuf_get_pixels (dest);
+	original_pixels = gdk_pixbuf_get_pixels (src);
 
-        for (i = 0; i < height; i++) {
-                pixdest = target_pixels + i*destrowstride;
-                pixsrc = original_pixels + i*srcrowstride;
-                for (j = 0; j < width; j++) {
-                        *(pixdest++) = *(pixsrc++);
-                        *(pixdest++) = *(pixsrc++);
-                        *(pixdest++) = *(pixsrc++);
-                        a = *(pixsrc++);
-                        *(pixdest++) = a / 2;
-                }
-        }
+	for (i = 0; i < height; i++) {
+		pixdest = target_pixels + i*destrowstride;
+		pixsrc = original_pixels + i*srcrowstride;
+		for (j = 0; j < width; j++) {
+			*(pixdest++) = *(pixsrc++);
+			*(pixdest++) = *(pixsrc++);
+			*(pixdest++) = *(pixsrc++);
+			a = *(pixsrc++);
+			*(pixdest++) = a / 2;
+		}
+	}
 }
 
 static gchar *
@@ -434,9 +435,9 @@
 
 	if (theme != NULL) {
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme",
-				        purple_theme_get_name(PURPLE_THEME(theme)));
+		                        purple_theme_get_name(PURPLE_THEME(theme)));
 		purple_prefs_set_path(PIDGIN_PREFS_ROOT "/status/icon-theme-dir",
-				      purple_theme_get_dir(PURPLE_THEME(theme)));
+		                      purple_theme_get_dir(PURPLE_THEME(theme)));
 	}
 	else {
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/status/icon-theme", "");
@@ -456,11 +457,12 @@
 		if (sized_status_icons[i].translucent_name)
 			translucent = gtk_icon_set_new();
 
-#define ADD_SIZED_ICON(name, size) if (sized_status_icons[i].name) { \
-					add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], FALSE); \
-					if (sized_status_icons[i].translucent_name) \
-						add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], TRUE); \
-				   }
+#define ADD_SIZED_ICON(name, size) \
+		if (sized_status_icons[i].name) { \
+			add_sized_icon(normal, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], FALSE); \
+			if (sized_status_icons[i].translucent_name) \
+				add_sized_icon(translucent, name, PIDGIN_ICON_THEME(theme), size, sized_status_icons[i], TRUE); \
+		}
 		ADD_SIZED_ICON(microscopic, "11");
 		ADD_SIZED_ICON(extra_small, "16");
 		ADD_SIZED_ICON(small, "22");
@@ -478,7 +480,6 @@
 		}
 	}
 
-
 	gtk_widget_destroy(win);
 	g_object_unref(G_OBJECT(icon_factory));
 	reload_settings();
@@ -493,9 +494,9 @@
 
 	if (theme != NULL) {
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme",
-				        purple_theme_get_name(PURPLE_THEME(theme)));
+		                        purple_theme_get_name(PURPLE_THEME(theme)));
 		purple_prefs_set_path(PIDGIN_PREFS_ROOT "/stock/icon-theme-dir",
-				      purple_theme_get_dir(PURPLE_THEME(theme)));
+		                      purple_theme_get_dir(PURPLE_THEME(theme)));
 	}
 	else {
 		purple_prefs_set_string(PIDGIN_PREFS_ROOT "/stock/icon-theme", "");
@@ -548,8 +549,9 @@
 	{
 		GtkIconSet *iconset = gtk_icon_set_new();
 
-#define ADD_SIZED_ICON(name, size) if (sized_stock_icons[i].name) \
-					add_sized_icon(iconset, name, PIDGIN_ICON_THEME(theme), size, sized_stock_icons[i], FALSE);
+#define ADD_SIZED_ICON(name, size) \
+		if (sized_stock_icons[i].name) \
+			add_sized_icon(iconset, name, PIDGIN_ICON_THEME(theme), size, sized_stock_icons[i], FALSE);
 		ADD_SIZED_ICON(microscopic, "11");
 		ADD_SIZED_ICON(extra_small, "16");
 		ADD_SIZED_ICON(small, "22");
@@ -592,10 +594,10 @@
 	/* register custom icon sizes */
 	microscopic =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MICROSCOPIC, 11, 11);
 	extra_small =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_EXTRA_SMALL, 16, 16);
-	small =        gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22);
-	medium =       gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32);
-	large =        gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48);
-	huge =         gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_HUGE, 64, 64);
+	small       =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_SMALL, 22, 22);
+	medium      =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_MEDIUM, 32, 32);
+	large       =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_LARGE, 48, 48);
+	huge        =  gtk_icon_size_register(PIDGIN_ICON_SIZE_TANGO_HUGE, 64, 64);
 
 	pidgin_stock_load_stock_icon_theme(NULL);
 
@@ -607,7 +609,9 @@
 		pidgin_stock_load_status_icon_theme(theme);
 		g_object_unref(G_OBJECT(theme));
 
-	} else pidgin_stock_load_status_icon_theme(NULL);
+	}
+	else
+		pidgin_stock_load_status_icon_theme(NULL);
 
 	/* Register the stock items. */
 	gtk_stock_add_static(stock_items, G_N_ELEMENTS(stock_items));
--- a/pidgin/plugins/Makefile.am	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -1,4 +1,4 @@
-DIST_SUBDIRS = cap gestures gevolution musicmessaging perl ticker
+DIST_SUBDIRS = cap disco gestures gevolution musicmessaging perl ticker
 
 if BUILD_GEVOLUTION
 GEVOLUTION_DIR = gevolution
@@ -26,6 +26,7 @@
 	$(GEVOLUTION_DIR) \
 	$(MUSICMESSAGING_DIR) \
 	$(PERL_DIR) \
+	disco \
 	ticker
 
 plugindir = $(libdir)/pidgin
--- a/pidgin/plugins/Makefile.mingw	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/Makefile.mingw	Sun Jun 28 04:41:07 2009 +0000
@@ -7,6 +7,7 @@
 PIDGIN_TREE_TOP := ../..
 include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
 
+DISCO_PLUGIN := ./disco
 GTKPERL_PLUGIN := ./perl
 TICKER_PLUGIN := ./ticker
 TRANSPARENCY_PLUGIN := ./win32/transparency
@@ -58,12 +59,14 @@
 .PHONY: all clean plugins install
 
 all: plugins
+	$(MAKE) -C $(DISCO_PLUGIN) -f $(MINGW_MAKEFILE)
 	$(MAKE) -C $(GTKPERL_PLUGIN) -f $(MINGW_MAKEFILE)
 	$(MAKE) -C $(TICKER_PLUGIN) -f $(MINGW_MAKEFILE)
 	$(MAKE) -C $(TRANSPARENCY_PLUGIN) -f $(MINGW_MAKEFILE)
 	$(MAKE) -C $(WINPREFS_PLUGIN) -f $(MINGW_MAKEFILE)
 
 install: all $(PIDGIN_INSTALL_PLUGINS_DIR)
+	$(MAKE) -C $(DISCO_PLUGIN) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(GTKPERL_PLUGIN) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(TICKER_PLUGIN) -f $(MINGW_MAKEFILE) install
 	$(MAKE) -C $(TRANSPARENCY_PLUGIN) -f $(MINGW_MAKEFILE) install
@@ -95,6 +98,7 @@
 ##
 clean:
 	rm -f *.o *.dll
+	$(MAKE) -C $(DISCO_PLUGIN) -f $(MINGW_MAKEFILE) clean
 	$(MAKE) -C $(GTKPERL_PLUGIN) -f $(MINGW_MAKEFILE) clean
 	$(MAKE) -C $(TICKER_PLUGIN) -f $(MINGW_MAKEFILE) clean
 	$(MAKE) -C $(TRANSPARENCY_PLUGIN) -f $(MINGW_MAKEFILE) clean
--- a/pidgin/plugins/convcolors.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/convcolors.c	Sun Jun 28 04:41:07 2009 +0000
@@ -101,6 +101,7 @@
 	gboolean bold, italic, underline;
 	int f;
 	const char *color;
+	gboolean rtl = FALSE;
 
 	for (i = 0; formats[i].prefix; i++)
 		if (flags & formats[i].flag)
@@ -126,6 +127,7 @@
 	bold = (f & FONT_BOLD);
 	italic = (f & FONT_ITALIC);
 	underline = (f & FONT_UNDERLINE);
+	rtl = purple_markup_is_rtl(*displaying);
 
 	if (purple_prefs_get_bool(PREF_IGNORE))
 	{
@@ -156,11 +158,13 @@
 	}
 
 	t = *displaying;
-	*displaying = g_strdup_printf("%s%s%s%s%s%s%s",
+	*displaying = g_strdup_printf("%s%s%s%s%s%s%s%s%s",
 						bold ? "<B>" : "</B>",
 						italic ? "<I>" : "</I>",
 						underline ? "<U>" : "</U>",
-						t, 
+						rtl ? "<SPAN style=\"direction:rtl;text-align:right;\">" : "",
+						t,
+						rtl ? "</SPAN>" : "",
 						bold ? "</B>" : "<B>",
 						italic ? "</I>" : "<I>",
 						underline ? "</U>" : "<U>"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,25 @@
+plugindir = $(libdir)/pidgin
+
+xmppdisco_la_LDFLAGS = -module -avoid-version
+
+if PLUGINS
+
+plugin_LTLIBRARIES = xmppdisco.la
+
+xmppdisco_la_SOURCES = \
+	gtkdisco.c \
+	gtkdisco.h \
+	xmppdisco.c \
+	xmppdisco.h
+
+xmppdisco_la_LIBADD = $(GTK_LIBS)
+
+endif
+
+AM_CPPFLAGS = \
+	-DDATADIR=\"$(datadir)\" \
+	-I$(top_srcdir)/libpurple \
+	-I$(top_builddir)/libpurple \
+	-I$(top_srcdir)/pidgin \
+	$(DEBUG_CFLAGS) \
+	$(GTK_CFLAGS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/Makefile.mingw	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,79 @@
+#
+# Makefile.mingw
+#
+# Description: Makefile for xmppdisco plugin.
+#
+
+PIDGIN_TREE_TOP := ../../..
+include $(PIDGIN_TREE_TOP)/libpurple/win32/global.mak
+
+TARGET = xmppdisco
+
+##
+## INCLUDE PATHS
+##
+INCLUDE_PATHS +=	-I. \
+			-I$(GTK_TOP)/include \
+			-I$(GTK_TOP)/include/gtk-2.0 \
+			-I$(GTK_TOP)/include/glib-2.0 \
+			-I$(GTK_TOP)/include/pango-1.0 \
+			-I$(GTK_TOP)/include/atk-1.0 \
+			-I$(GTK_TOP)/include/cairo \
+			-I$(GTK_TOP)/lib/glib-2.0/include \
+			-I$(GTK_TOP)/lib/gtk-2.0/include \
+			-I$(PURPLE_TOP) \
+			-I$(PURPLE_TOP)/win32 \
+			-I$(PIDGIN_TOP) \
+			-I$(PIDGIN_TOP)/win32 \
+			-I$(PIDGIN_TREE_TOP)
+
+LIB_PATHS +=		-L$(GTK_TOP)/lib \
+			-L$(PURPLE_TOP) \
+			-L$(PIDGIN_TOP)
+
+##
+##  SOURCES, OBJECTS
+##
+C_SRC =			xmppdisco.c \
+			gtkdisco.c
+
+OBJECTS = $(C_SRC:%.c=%.o)
+
+##
+## LIBRARIES
+##
+LIBS =			-lgtk-win32-2.0 \
+			-lglib-2.0 \
+			-lgdk-win32-2.0 \
+			-lgobject-2.0 \
+			-lpango-1.0 \
+			-lgdk_pixbuf-2.0 \
+			-lintl \
+			-lpurple \
+			-lpidgin
+
+include $(PIDGIN_COMMON_RULES)
+
+##
+## TARGET DEFINITIONS
+##
+.PHONY: all install clean
+
+all: $(TARGET).dll
+
+install: $(PIDGIN_INSTALL_PLUGINS_DIR) all
+	cp $(TARGET).dll $(PIDGIN_INSTALL_PLUGINS_DIR)
+
+$(OBJECTS): $(PIDGIN_CONFIG_H)
+
+$(TARGET).dll: $(PURPLE_DLL).a $(PIDGIN_DLL).a $(OBJECTS)
+	$(CC) -shared $(OBJECTS) $(LIB_PATHS) $(LIBS) $(DLL_LD_FLAGS) -o $(TARGET).dll
+
+##
+## CLEAN RULES
+##
+clean:
+	rm -rf $(OBJECTS)
+	rm -rf $(TARGET).dll
+
+include $(PIDGIN_COMMON_TARGETS)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/gtkdisco.c	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,767 @@
+/**
+ * @file gtkdisco.c GTK+ Service Discovery UI
+ * @ingroup pidgin
+ */
+
+/* pidgin
+ *
+ * Pidgin 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
+ */
+
+#include "internal.h"
+#include "debug.h"
+#include "gtkutils.h"
+#include "pidgin.h"
+#include "request.h"
+#include "pidgintooltip.h"
+
+#include "gtkdisco.h"
+#include "xmppdisco.h"
+
+GList *dialogs = NULL;
+
+enum {
+	PIXBUF_COLUMN = 0,
+	NAME_COLUMN,
+	DESCRIPTION_COLUMN,
+	SERVICE_COLUMN,
+	NUM_OF_COLUMNS
+};
+
+static void
+pidgin_disco_list_destroy(PidginDiscoList *list)
+{
+	g_hash_table_destroy(list->services);
+	if (list->dialog && list->dialog->discolist == list)
+		list->dialog->discolist = NULL;
+
+	if (list->tree) {
+		gtk_widget_destroy(list->tree);
+		list->tree = NULL;
+	}
+
+	g_free((gchar*)list->server);
+	g_free(list);
+}
+
+PidginDiscoList *pidgin_disco_list_ref(PidginDiscoList *list)
+{
+	g_return_val_if_fail(list != NULL, NULL);
+
+	++list->ref;
+	purple_debug_misc("xmppdisco", "reffing list, ref count now %d\n", list->ref);
+
+	return list;
+}
+
+void pidgin_disco_list_unref(PidginDiscoList *list)
+{
+	g_return_if_fail(list != NULL);
+
+	--list->ref;
+
+	purple_debug_misc("xmppdisco", "unreffing list, ref count now %d\n", list->ref);
+	if (list->ref == 0)
+		pidgin_disco_list_destroy(list);
+}
+
+void pidgin_disco_list_set_in_progress(PidginDiscoList *list, gboolean in_progress)
+{
+	PidginDiscoDialog *dialog = list->dialog;
+
+	if (!dialog)
+		return;
+
+	list->in_progress = in_progress;
+
+	if (in_progress) {
+		gtk_widget_set_sensitive(dialog->account_widget, FALSE);
+		gtk_widget_set_sensitive(dialog->stop_button, TRUE);
+		gtk_widget_set_sensitive(dialog->browse_button, FALSE);
+	} else {
+		gtk_progress_bar_set_fraction(GTK_PROGRESS_BAR(dialog->progress), 0.0);
+
+		gtk_widget_set_sensitive(dialog->account_widget, TRUE);
+
+		gtk_widget_set_sensitive(dialog->stop_button, FALSE);
+		gtk_widget_set_sensitive(dialog->browse_button, TRUE);
+/*
+		gtk_widget_set_sensitive(dialog->register_button, FALSE);
+		gtk_widget_set_sensitive(dialog->add_button, FALSE);
+*/
+	}
+}
+
+static GdkPixbuf *
+pidgin_disco_load_icon(XmppDiscoService *service, const char *size)
+{
+	GdkPixbuf *pixbuf = NULL;
+	char *filename;
+
+	g_return_val_if_fail(service != NULL, NULL);
+	g_return_val_if_fail(size != NULL, NULL);
+
+	if (service->type == XMPP_DISCO_SERVICE_TYPE_GATEWAY && service->gateway_type) {
+		char *tmp = g_strconcat(service->gateway_type, ".png", NULL);
+		filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "protocols", size, tmp, NULL);
+		g_free(tmp);
+#if 0
+	} else if (service->type == XMPP_DISCO_SERVICE_TYPE_USER) {
+		filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", size, "person.png", NULL);
+#endif
+	} else if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT)
+		filename = g_build_filename(DATADIR, "pixmaps", "pidgin", "status", size, "chat.png", NULL);
+
+	if (filename) {
+		pixbuf = gdk_pixbuf_new_from_file(filename, NULL);
+		g_free(filename);
+	}
+
+	return pixbuf;
+}
+
+static void pidgin_disco_create_tree(PidginDiscoList *pdl);
+
+static void dialog_select_account_cb(GObject *w, PurpleAccount *account,
+                                     PidginDiscoDialog *dialog)
+{
+	dialog->account = account;
+	gtk_widget_set_sensitive(dialog->browse_button, account != NULL);
+}
+
+static void register_button_cb(GtkWidget *unused, PidginDiscoDialog *dialog)
+{
+	xmpp_disco_service_register(dialog->selected);
+}
+
+static void discolist_cancel_cb(PidginDiscoList *pdl, const char *server)
+{
+	pidgin_disco_list_set_in_progress(pdl, FALSE);
+	pidgin_disco_list_unref(pdl);
+}
+
+static void discolist_ok_cb(PidginDiscoList *pdl, const char *server)
+{
+	gtk_widget_set_sensitive(pdl->dialog->browse_button, TRUE);
+
+	if (!server || !*server) {
+		purple_notify_error(my_plugin, _("Invalid Server"), _("Invalid Server"),
+		                    NULL);
+
+		pidgin_disco_list_set_in_progress(pdl, FALSE);
+		pidgin_disco_list_unref(pdl);
+		return;
+	}
+
+	pdl->server = g_strdup(server);
+	pidgin_disco_list_set_in_progress(pdl, TRUE);
+	xmpp_disco_start(pdl);
+}
+
+static void browse_button_cb(GtkWidget *button, PidginDiscoDialog *dialog)
+{
+	PurpleConnection *pc;
+	PidginDiscoList *pdl;
+	const char *username;
+	const char *at, *slash;
+	char *server = NULL;
+
+	pc = purple_account_get_connection(dialog->account);
+	if (!pc)
+		return;
+
+	gtk_widget_set_sensitive(dialog->browse_button, FALSE);
+	gtk_widget_set_sensitive(dialog->add_button, FALSE);
+	gtk_widget_set_sensitive(dialog->register_button, FALSE);
+
+	if (dialog->discolist != NULL) {
+		if (dialog->discolist->tree) {
+			gtk_widget_destroy(dialog->discolist->tree);
+			dialog->discolist->tree = NULL;
+		}
+		pidgin_disco_list_unref(dialog->discolist);
+	}
+
+	pdl = dialog->discolist = g_new0(PidginDiscoList, 1);
+	pdl->services = g_hash_table_new_full(NULL, NULL, NULL,
+			(GDestroyNotify)gtk_tree_row_reference_free);
+	pdl->pc = pc;
+	/* We keep a copy... */
+	pidgin_disco_list_ref(pdl);
+
+	pdl->dialog = dialog;
+	pidgin_disco_create_tree(pdl);
+
+	if (dialog->account_widget)
+		gtk_widget_set_sensitive(dialog->account_widget, FALSE);
+
+	username = purple_account_get_username(dialog->account);
+	at = g_utf8_strchr(username, -1, '@');
+	slash = g_utf8_strchr(username, -1, '/');
+	if (at && !slash) {
+		server = g_strdup_printf("%s", at + 1);
+	} else if (at && slash && at + 1 < slash) {
+		server = g_strdup_printf("%.*s", (int)(slash - (at + 1)), at + 1);
+	}
+
+	if (server == NULL)
+		/* This shouldn't ever happen since the account is connected */
+		server = g_strdup("jabber.org");
+
+	purple_request_input(my_plugin, _("Server name request"), _("Enter an XMPP Server"),
+			_("Select an XMPP server to query"),
+			server, FALSE, FALSE, NULL,
+			_("Find Services"), PURPLE_CALLBACK(discolist_ok_cb),
+			_("Cancel"), PURPLE_CALLBACK(discolist_cancel_cb),
+			purple_connection_get_account(pc), NULL, NULL, pdl);
+
+	g_free(server);
+}
+
+static void add_to_blist_cb(GtkWidget *unused, PidginDiscoDialog *dialog)
+{
+	XmppDiscoService *service = dialog->selected;
+	PurpleAccount *account;
+	const char *jid;
+
+	g_return_if_fail(service != NULL);
+
+	account = purple_connection_get_account(service->list->pc);
+	jid = service->jid;
+
+	if (service->type == XMPP_DISCO_SERVICE_TYPE_CHAT)
+		purple_blist_request_add_chat(account, NULL, NULL, jid);
+	else
+		purple_blist_request_add_buddy(account, jid, NULL, NULL);
+}
+
+static gboolean
+service_click_cb(GtkTreeView *tree, GdkEventButton *event, gpointer user_data)
+{
+	PidginDiscoList *pdl;
+	XmppDiscoService *service;
+	GtkWidget *menu;
+
+	GtkTreePath *path;
+	GtkTreeIter iter;
+	GValue val;
+
+	if (event->button != 3 || event->type != GDK_BUTTON_PRESS)
+		return FALSE;
+
+	pdl = user_data;
+
+	/* Figure out what was clicked */
+	if (!gtk_tree_view_get_path_at_pos(tree, event->x, event->y, &path,
+		                               NULL, NULL, NULL))
+		return FALSE;
+	gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path);
+	gtk_tree_path_free(path);
+	val.g_type = 0;
+	gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN,
+	                         &val);
+	service = g_value_get_pointer(&val);
+
+	if (!service)
+		return FALSE;
+
+	menu = gtk_menu_new();
+
+	if (service->flags & XMPP_DISCO_ADD)
+		pidgin_new_item_from_stock(menu, _("Add to Buddy List"), GTK_STOCK_ADD,
+		                           G_CALLBACK(add_to_blist_cb), pdl->dialog,
+		                           0, 0, NULL);
+
+	if (service->flags & XMPP_DISCO_REGISTER) {
+		GtkWidget *item = pidgin_new_item(menu, _("Register"));
+		g_signal_connect(G_OBJECT(item), "activate",
+		                 G_CALLBACK(register_button_cb), pdl->dialog);
+	}
+
+	gtk_widget_show_all(menu);
+	gtk_menu_popup(GTK_MENU(menu), NULL, NULL, NULL, NULL, event->button,
+	               event->time);
+	return FALSE;
+}
+
+static void
+selection_changed_cb(GtkTreeSelection *selection, PidginDiscoList *pdl)
+{
+	GtkTreeIter iter;
+	GValue val;
+	PidginDiscoDialog *dialog = pdl->dialog;
+
+	if (gtk_tree_selection_get_selected(selection, NULL, &iter)) {
+		val.g_type = 0;
+		gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN, &val);
+		dialog->selected = g_value_get_pointer(&val);
+		if (!dialog->selected) {
+			gtk_widget_set_sensitive(dialog->add_button, FALSE);
+			gtk_widget_set_sensitive(dialog->register_button, FALSE);
+			return;
+		}
+
+		gtk_widget_set_sensitive(dialog->add_button, dialog->selected->flags & XMPP_DISCO_ADD);
+		gtk_widget_set_sensitive(dialog->register_button, dialog->selected->flags & XMPP_DISCO_REGISTER);
+	} else {
+		gtk_widget_set_sensitive(dialog->add_button, FALSE);
+		gtk_widget_set_sensitive(dialog->register_button, FALSE);
+	}
+}
+
+static void
+row_expanded_cb(GtkTreeView *tree, GtkTreeIter *arg1, GtkTreePath *rg2,
+                gpointer user_data)
+{
+	PidginDiscoList *pdl;
+	XmppDiscoService *service;
+	GValue val;
+
+	pdl = user_data;
+
+	val.g_type = 0;
+	gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), arg1, SERVICE_COLUMN,
+	                         &val);
+	service = g_value_get_pointer(&val);
+	xmpp_disco_service_expand(service);
+}
+
+static void
+row_activated_cb(GtkTreeView       *tree_view,
+                 GtkTreePath       *path,
+                 GtkTreeViewColumn *column,
+                 gpointer           user_data)
+{
+	PidginDiscoList *pdl = user_data;
+	GtkTreeIter iter;
+	XmppDiscoService *service;
+	GValue val;
+
+	if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path))
+		return;
+
+	val.g_type = 0;
+	gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN,
+	                         &val);
+	service = g_value_get_pointer(&val);
+
+	if (service->flags & XMPP_DISCO_BROWSE)
+		if (gtk_tree_view_row_expanded(GTK_TREE_VIEW(pdl->tree), path))
+			gtk_tree_view_collapse_row(GTK_TREE_VIEW(pdl->tree), path);
+		else
+			gtk_tree_view_expand_row(GTK_TREE_VIEW(pdl->tree), path, FALSE);
+	else if (service->flags & XMPP_DISCO_REGISTER)
+		register_button_cb(NULL, pdl->dialog);
+	else if (service->flags & XMPP_DISCO_ADD)
+		add_to_blist_cb(NULL, pdl->dialog);
+}
+
+static void
+destroy_win_cb(GtkWidget *window, gpointer d)
+{
+	PidginDiscoDialog *dialog = d;
+	PidginDiscoList *list = dialog->discolist;
+
+	if (list) {
+		list->dialog = NULL;
+
+		if (list->in_progress)
+			list->in_progress = FALSE;
+
+		pidgin_disco_list_unref(list);
+	}
+
+	dialogs = g_list_remove(dialogs, d);
+	g_free(dialog);
+}
+
+static void stop_button_cb(GtkButton *button, PidginDiscoDialog *dialog)
+{
+	pidgin_disco_list_set_in_progress(dialog->discolist, FALSE);
+}
+
+static void close_button_cb(GtkButton *button, PidginDiscoDialog *dialog)
+{
+	GtkWidget *window = dialog->window;
+
+	gtk_widget_destroy(window);
+}
+
+static gboolean account_filter_func(PurpleAccount *account)
+{
+	return purple_strequal(purple_account_get_protocol_id(account), XMPP_PLUGIN_ID);
+}
+
+static gboolean
+disco_paint_tooltip(GtkWidget *tipwindow, gpointer data)
+{
+	PangoLayout *layout = g_object_get_data(G_OBJECT(tipwindow), "tooltip-plugin");
+	gtk_paint_layout(tipwindow->style, tipwindow->window, GTK_STATE_NORMAL, FALSE,
+			NULL, tipwindow, "tooltip",
+			6, 6, layout);
+	return TRUE;
+}
+
+static gboolean
+disco_create_tooltip(GtkWidget *tipwindow, GtkTreePath *path,
+		gpointer data, int *w, int *h)
+{
+	PidginDiscoList *pdl = data;
+	GtkTreeIter iter;
+	PangoLayout *layout;
+	int width, height;
+	XmppDiscoService *service;
+	GValue val;
+	const char *type = NULL;
+	char *markup, *jid, *name, *desc = NULL;
+
+	if (!gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &iter, path))
+		return FALSE;
+
+	val.g_type = 0;
+	gtk_tree_model_get_value(GTK_TREE_MODEL(pdl->model), &iter, SERVICE_COLUMN,
+	                         &val);
+	service = g_value_get_pointer(&val);
+
+	switch (service->type) {
+		case XMPP_DISCO_SERVICE_TYPE_UNSET:
+			type = _("Unknown");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_GATEWAY:
+			type = _("Gateway");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_DIRECTORY:
+			type = _("Directory");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_CHAT:
+			type = _("Chat");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION:
+			type = _("PubSub Collection");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_PUBSUB_LEAF:
+			type = _("PubSub Leaf");
+			break;
+
+		case XMPP_DISCO_SERVICE_TYPE_OTHER:
+			type = _("Other");
+			break;
+	}
+
+	markup = g_strdup_printf("<span size='x-large' weight='bold'>%s</span>\n<b>%s:</b> %s%s%s",
+	                         name = g_markup_escape_text(service->name, -1),
+	                         type,
+	                         jid = g_markup_escape_text(service->jid, -1),
+	                         service->description ? _("\n<b>Description:</b> ") : "",
+	                         service->description ? desc = g_markup_escape_text(service->description, -1) : "");
+
+	layout = gtk_widget_create_pango_layout(tipwindow, NULL);
+	pango_layout_set_markup(layout, markup, -1);
+	pango_layout_set_wrap(layout, PANGO_WRAP_WORD);
+	pango_layout_set_width(layout, 500000);
+	pango_layout_get_size(layout, &width, &height);
+	g_object_set_data_full(G_OBJECT(tipwindow), "tooltip-plugin", layout, g_object_unref);
+
+	if (w)
+		*w = PANGO_PIXELS(width) + 12;
+	if (h)
+		*h = PANGO_PIXELS(height) + 12;
+
+	g_free(markup);
+	g_free(jid);
+	g_free(name);
+	g_free(desc);
+
+	return TRUE;
+}
+
+static void pidgin_disco_create_tree(PidginDiscoList *pdl)
+{
+	GtkCellRenderer *text_renderer, *pixbuf_renderer;
+	GtkTreeViewColumn *column;
+	GtkTreeSelection *selection;
+
+	pdl->model = gtk_tree_store_new(NUM_OF_COLUMNS,
+			GDK_TYPE_PIXBUF,	/* PIXBUF_COLUMN */
+			G_TYPE_STRING,		/* NAME_COLUMN */
+			G_TYPE_STRING,		/* DESCRIPTION_COLUMN */
+			G_TYPE_POINTER		/* SERVICE_COLUMN */
+	);
+
+	pdl->tree = gtk_tree_view_new_with_model(GTK_TREE_MODEL(pdl->model));
+	gtk_tree_view_set_rules_hint(GTK_TREE_VIEW(pdl->tree), TRUE);
+
+	selection = gtk_tree_view_get_selection(GTK_TREE_VIEW(pdl->tree));
+	g_signal_connect(G_OBJECT(selection), "changed",
+					 G_CALLBACK(selection_changed_cb), pdl);
+
+	g_object_unref(pdl->model);
+
+	gtk_container_add(GTK_CONTAINER(pdl->dialog->sw), pdl->tree);
+	gtk_widget_show(pdl->tree);
+
+	text_renderer = gtk_cell_renderer_text_new();
+	pixbuf_renderer = gtk_cell_renderer_pixbuf_new();
+
+	column = gtk_tree_view_column_new();
+	gtk_tree_view_column_set_title(column, _("Name"));
+
+	gtk_tree_view_column_pack_start(column, pixbuf_renderer, FALSE);
+	gtk_tree_view_column_set_attributes(column, pixbuf_renderer,
+			"pixbuf", PIXBUF_COLUMN, NULL);
+
+	gtk_tree_view_column_pack_start(column, text_renderer, TRUE);
+	gtk_tree_view_column_set_attributes(column, text_renderer,
+			"text", NAME_COLUMN, NULL);
+
+	gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column),
+	                                GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+	gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE);
+	gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), NAME_COLUMN);
+	gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column);
+
+	column = gtk_tree_view_column_new_with_attributes(_("Description"), text_renderer,
+				"text", DESCRIPTION_COLUMN, NULL);
+	gtk_tree_view_column_set_sizing(GTK_TREE_VIEW_COLUMN(column),
+	                                GTK_TREE_VIEW_COLUMN_GROW_ONLY);
+	gtk_tree_view_column_set_resizable(GTK_TREE_VIEW_COLUMN(column), TRUE);
+	gtk_tree_view_column_set_sort_column_id(GTK_TREE_VIEW_COLUMN(column), DESCRIPTION_COLUMN);
+	gtk_tree_view_column_set_reorderable(GTK_TREE_VIEW_COLUMN(column), TRUE);
+	gtk_tree_view_append_column(GTK_TREE_VIEW(pdl->tree), column);
+
+	g_signal_connect(G_OBJECT(pdl->tree), "button-press-event", G_CALLBACK(service_click_cb), pdl);
+	g_signal_connect(G_OBJECT(pdl->tree), "row-expanded", G_CALLBACK(row_expanded_cb), pdl);
+	g_signal_connect(G_OBJECT(pdl->tree), "row-activated", G_CALLBACK(row_activated_cb), pdl);
+
+	pidgin_tooltip_setup_for_treeview(pdl->tree, pdl,
+	                                  disco_create_tooltip,
+	                                  disco_paint_tooltip);
+}
+
+void pidgin_disco_signed_off_cb(PurpleConnection *pc)
+{
+	GList *node;
+
+	for (node = dialogs; node; node = node->next) {
+		PidginDiscoDialog *dialog = node->data;
+		PidginDiscoList *list = dialog->discolist;
+
+		if (list && list->pc == pc) {
+			if (list->in_progress)
+				pidgin_disco_list_set_in_progress(list, FALSE);
+
+			if (list->tree) {
+				gtk_widget_destroy(list->tree);
+				list->tree = NULL;
+			}
+
+			pidgin_disco_list_unref(list);
+			dialog->discolist = NULL;
+
+			gtk_widget_set_sensitive(dialog->browse_button,
+					pidgin_account_option_menu_get_selected(dialog->account_widget) != NULL);
+
+			gtk_widget_set_sensitive(dialog->register_button, FALSE);
+			gtk_widget_set_sensitive(dialog->add_button, FALSE);
+		}
+	}
+}
+
+void pidgin_disco_dialogs_destroy_all(void)
+{
+	while (dialogs) {
+		PidginDiscoDialog *dialog = dialogs->data;
+
+		gtk_widget_destroy(dialog->window);
+		/* destroy_win_cb removes the dialog from the list */
+	}
+}
+
+PidginDiscoDialog *pidgin_disco_dialog_new(void)
+{
+	PidginDiscoDialog *dialog;
+	GtkWidget *window, *vbox, *vbox2, *bbox;
+
+	dialog = g_new0(PidginDiscoDialog, 1);
+	dialogs = g_list_prepend(dialogs, dialog);
+
+	/* Create the window. */
+	dialog->window = window = pidgin_create_dialog(_("Service Discovery"), PIDGIN_HIG_BORDER, "service discovery", TRUE);
+
+	g_signal_connect(G_OBJECT(window), "destroy",
+					 G_CALLBACK(destroy_win_cb), dialog);
+
+	/* Create the parent vbox for everything. */
+	vbox = pidgin_dialog_get_vbox_with_properties(GTK_DIALOG(window), FALSE, PIDGIN_HIG_BORDER);
+
+	vbox2 = gtk_vbox_new(FALSE, PIDGIN_HIG_BORDER);
+	gtk_container_add(GTK_CONTAINER(vbox), vbox2);
+	gtk_widget_show(vbox2);
+
+	/* accounts dropdown list */
+	dialog->account_widget = pidgin_account_option_menu_new(NULL, FALSE,
+	                         G_CALLBACK(dialog_select_account_cb), account_filter_func, dialog);
+	dialog->account = pidgin_account_option_menu_get_selected(dialog->account_widget);
+	pidgin_add_widget_to_vbox(GTK_BOX(vbox2), _("_Account:"), NULL, dialog->account_widget, TRUE, NULL);
+
+	/* scrolled window */
+	dialog->sw = gtk_scrolled_window_new(NULL, NULL);
+	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(dialog->sw),
+	                                    GTK_SHADOW_IN);
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(dialog->sw),
+	                               GTK_POLICY_AUTOMATIC,
+	                               GTK_POLICY_AUTOMATIC);
+	gtk_box_pack_start(GTK_BOX(vbox2), dialog->sw, TRUE, TRUE, 0);
+	gtk_widget_set_size_request(dialog->sw, -1, 250);
+	gtk_widget_show(dialog->sw);
+
+	/* progress bar */
+	dialog->progress = gtk_progress_bar_new();
+	gtk_progress_bar_set_pulse_step(GTK_PROGRESS_BAR(dialog->progress), 0.1);
+	gtk_box_pack_start(GTK_BOX(vbox2), dialog->progress, FALSE, FALSE, 0);
+	gtk_widget_show(dialog->progress);
+
+	/* button box */
+	bbox = pidgin_dialog_get_action_area(GTK_DIALOG(window));
+	gtk_box_set_spacing(GTK_BOX(bbox), PIDGIN_HIG_BOX_SPACE);
+	gtk_button_box_set_layout(GTK_BUTTON_BOX(bbox), GTK_BUTTONBOX_END);
+
+	/* stop button */
+	dialog->stop_button =
+		pidgin_dialog_add_button(GTK_DIALOG(window), GTK_STOCK_STOP,
+		                         G_CALLBACK(stop_button_cb), dialog);
+	gtk_widget_set_sensitive(dialog->stop_button, FALSE);
+
+	/* browse button */
+	dialog->browse_button =
+		pidgin_pixbuf_button_from_stock(_("_Browse"), GTK_STOCK_REFRESH,
+		                                PIDGIN_BUTTON_HORIZONTAL);
+	gtk_box_pack_start(GTK_BOX(bbox), dialog->browse_button, FALSE, FALSE, 0);
+	g_signal_connect(G_OBJECT(dialog->browse_button), "clicked",
+	                 G_CALLBACK(browse_button_cb), dialog);
+	gtk_widget_set_sensitive(dialog->browse_button, dialog->account != NULL);
+	gtk_widget_show(dialog->browse_button);
+
+	/* register button */
+	dialog->register_button =
+		pidgin_dialog_add_button(GTK_DIALOG(dialog->window), _("Register"),
+		                         G_CALLBACK(register_button_cb), dialog);
+	gtk_widget_set_sensitive(dialog->register_button, FALSE);
+
+	/* add button */
+	dialog->add_button =
+		pidgin_pixbuf_button_from_stock(_("_Add"), GTK_STOCK_ADD,
+	                                    PIDGIN_BUTTON_HORIZONTAL);
+	gtk_box_pack_start(GTK_BOX(bbox), dialog->add_button, FALSE, FALSE, 0);
+	g_signal_connect(G_OBJECT(dialog->add_button), "clicked",
+	                 G_CALLBACK(add_to_blist_cb), dialog);
+	gtk_widget_set_sensitive(dialog->add_button, FALSE);
+	gtk_widget_show(dialog->add_button);
+
+	/* close button */
+	dialog->close_button =
+		pidgin_dialog_add_button(GTK_DIALOG(window), GTK_STOCK_CLOSE,
+		                         G_CALLBACK(close_button_cb), dialog);
+
+	/* show the dialog window and return the dialog */
+	gtk_widget_show(dialog->window);
+
+	return dialog;
+}
+
+void pidgin_disco_add_service(PidginDiscoList *pdl, XmppDiscoService *service, XmppDiscoService *parent)
+{
+	PidginDiscoDialog *dialog;
+	GtkTreeIter iter, parent_iter, child;
+	GdkPixbuf *pixbuf = NULL;
+	gboolean append = TRUE;
+
+	dialog = pdl->dialog;
+	g_return_if_fail(dialog != NULL);
+
+	if (service != NULL)
+		purple_debug_info("xmppdisco", "Adding service \"%s\"\n", service->name);
+	else
+		purple_debug_info("xmppdisco", "Service \"%s\" has no childrens\n", parent->name);
+
+	gtk_progress_bar_pulse(GTK_PROGRESS_BAR(dialog->progress));
+
+	if (parent) {
+		GtkTreeRowReference *rr;
+		GtkTreePath *path;
+
+		rr = g_hash_table_lookup(pdl->services, parent);
+		path = gtk_tree_row_reference_get_path(rr);
+		if (path) {
+			gtk_tree_model_get_iter(GTK_TREE_MODEL(pdl->model), &parent_iter, path);
+			gtk_tree_path_free(path);
+
+			if (gtk_tree_model_iter_children(GTK_TREE_MODEL(pdl->model), &child,
+			                                 &parent_iter)) {
+				PidginDiscoList *tmp;
+				gtk_tree_model_get(GTK_TREE_MODEL(pdl->model), &child,
+				                   SERVICE_COLUMN, &tmp, -1);
+				if (!tmp)
+					append = FALSE;
+			}
+		}
+	}
+
+	if (service == NULL) {
+		if (parent != NULL && !append)
+			gtk_tree_store_remove(pdl->model, &child);
+		return;
+	}
+
+	if (append)
+		gtk_tree_store_append(pdl->model, &iter, (parent ? &parent_iter : NULL));
+	else
+		iter = child;
+
+	if (service->flags & XMPP_DISCO_BROWSE) {
+		GtkTreeRowReference *rr;
+		GtkTreePath *path;
+
+		gtk_tree_store_append(pdl->model, &child, &iter);
+
+		path = gtk_tree_model_get_path(GTK_TREE_MODEL(pdl->model), &iter);
+		rr = gtk_tree_row_reference_new(GTK_TREE_MODEL(pdl->model), path);
+		g_hash_table_insert(pdl->services, service, rr);
+		gtk_tree_path_free(path);
+	}
+
+	pixbuf = pidgin_disco_load_icon(service, "16");
+
+	gtk_tree_store_set(pdl->model, &iter,
+			PIXBUF_COLUMN, pixbuf,
+			NAME_COLUMN, service->name,
+			DESCRIPTION_COLUMN, service->description,
+			SERVICE_COLUMN, service,
+			-1);
+
+	if (pixbuf)
+		g_object_unref(pixbuf);
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/gtkdisco.h	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,80 @@
+/* pidgin
+ *
+ * Pidgin 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 PIDGIN_XMPP_DISCO_UI_H
+#define PIDGIN_XMPP_DISCO_UI_H
+
+typedef struct _PidginDiscoDialog PidginDiscoDialog;
+typedef struct _PidginDiscoList PidginDiscoList;
+
+#include "xmppdisco.h"
+
+struct _PidginDiscoDialog {
+	GtkWidget *window;
+	GtkWidget *account_widget;
+
+	GtkWidget *sw;
+	GtkWidget *progress;
+
+	GtkWidget *stop_button;
+	GtkWidget *browse_button;
+	GtkWidget *register_button;
+	GtkWidget *add_button;
+	GtkWidget *close_button;
+	XmppDiscoService *selected;
+
+	PurpleAccount *account;
+	PidginDiscoList *discolist;
+};
+
+struct _PidginDiscoList {
+	PurpleConnection *pc;
+	gboolean in_progress;
+	const gchar *server;
+
+	gint ref;
+	guint fetch_count;
+
+	PidginDiscoDialog *dialog;
+	GtkTreeStore *model;
+	GtkWidget *tree;
+	GHashTable *services;
+};
+
+/**
+ * Shows a new service discovery dialog.
+ */
+PidginDiscoDialog *pidgin_disco_dialog_new(void);
+
+/**
+ * Destroy all the open dialogs (called when unloading the plugin).
+ */
+void pidgin_disco_dialogs_destroy_all(void);
+void pidgin_disco_signed_off_cb(PurpleConnection *pc);
+
+void pidgin_disco_add_service(PidginDiscoList *list, XmppDiscoService *service,
+                              XmppDiscoService *parent);
+
+PidginDiscoList *pidgin_disco_list_ref(PidginDiscoList *list);
+void pidgin_disco_list_unref(PidginDiscoList *list);
+
+void pidgin_disco_list_set_in_progress(PidginDiscoList *list, gboolean in_progress);
+#endif /* PIDGIN_XMPP_DISCO_UI_H */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/xmppdisco.c	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,680 @@
+/*
+ * Purple - XMPP Service Disco Browser
+ *
+ * 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
+ *
+ */
+
+/* TODO list (a little bit of a brain dump):
+	* Support more actions than "register" and "add" based on context.
+		- Subscribe to pubsub nodes (just...because?)
+		- Execute ad-hoc commands
+		- Change 'Register' to 'Unregister' if we're registered?
+		- Administer MUCs
+	* Enumerate pubsub node contents.
+		- PEP too? (useful development tool at times)
+	* See if we can better handle the ad-hoc commands that ejabberd returns
+	  when disco'ing a server as an administrator:
+from disco#items:
+	<item jid='darkrain42.org' node='announce' name='Announcements'/>
+disco#info:
+	<iq from='darkrain42.org' type='result'>
+		<query xmlns='http://jabber.org/protocol/disco#info' node='announce'/>
+	</iq>
+	* For services that are a JID w/o a node, handle fetching ad-hoc commands?
+*/
+
+#include "internal.h"
+#include "pidgin.h"
+
+#include "debug.h"
+#include "signals.h"
+#include "version.h"
+
+#include "gtkconv.h"
+#include "gtkimhtml.h"
+#include "gtkplugin.h"
+
+#include "xmppdisco.h"
+#include "gtkdisco.h"
+
+/* Variables */
+PurplePlugin *my_plugin = NULL;
+static GHashTable *iq_callbacks = NULL;
+static gboolean iq_listening = FALSE;
+
+typedef void (*XmppIqCallback)(PurpleConnection *pc, const char *type,
+                               const char *id, const char *from, xmlnode *iq,
+                               gpointer data);
+
+struct xmpp_iq_cb_data
+{
+	gpointer context;
+	PurpleConnection *pc;
+	XmppIqCallback cb;
+};
+
+struct item_data {
+	PidginDiscoList *list;
+	XmppDiscoService *parent;
+	char *name;
+	char *node; /* disco#info replies don't always include the node */
+};
+
+static char*
+generate_next_id()
+{
+	static guint32 index = 0;
+
+	if (index == 0) {
+		do {
+			index = g_random_int();
+		} while (index == 0);
+	}
+
+	return g_strdup_printf("purpledisco%x", index++);
+}
+
+static gboolean
+remove_iq_callbacks_by_pc(gpointer key, gpointer value, gpointer user_data)
+{
+	struct xmpp_iq_cb_data *cb_data = value;
+
+	if (cb_data && cb_data->pc == user_data) {
+		/*
+		 * This is a hack. All the IQ callback datas in this code are
+		 * the same structure so that we can free them here. Ideally they'd
+		 * be objects and this would be polymorphic. That's overkill, here.
+		 */
+		struct item_data *item_data = cb_data->context;
+
+		if (item_data) {
+			pidgin_disco_list_unref(item_data->list);
+			g_free(item_data->name);
+			g_free(item_data->node);
+			g_free(item_data);
+		}
+
+		return TRUE;
+	} else
+		return FALSE;
+}
+
+static gboolean
+xmpp_iq_received(PurpleConnection *pc, const char *type, const char *id,
+                 const char *from, xmlnode *iq)
+{
+	struct xmpp_iq_cb_data *cb_data;
+
+	cb_data = g_hash_table_lookup(iq_callbacks, id);
+	if (!cb_data)
+		return FALSE;
+
+	cb_data->cb(cb_data->pc, type, id, from, iq, cb_data->context);
+
+	g_hash_table_remove(iq_callbacks, id);
+	if (g_hash_table_size(iq_callbacks) == 0) {
+		PurplePlugin *prpl = purple_connection_get_prpl(pc);
+		iq_listening = FALSE;
+		purple_signal_disconnect(prpl, "jabber-receiving-iq", my_plugin,
+		                         PURPLE_CALLBACK(xmpp_iq_received));
+	}
+
+	/* Om nom nom nom */
+	return TRUE;
+}
+
+static void
+xmpp_iq_register_callback(PurpleConnection *pc, gchar *id, gpointer data,
+                          XmppIqCallback cb)
+{
+	struct xmpp_iq_cb_data *cbdata = g_new0(struct xmpp_iq_cb_data, 1);
+
+	cbdata->context = data;
+	cbdata->cb = cb;
+	cbdata->pc = pc;
+
+	g_hash_table_insert(iq_callbacks, id, cbdata);
+
+	if (!iq_listening) {
+		PurplePlugin *prpl = purple_plugins_find_with_id(XMPP_PLUGIN_ID);
+		iq_listening = TRUE;
+		purple_signal_connect(prpl, "jabber-receiving-iq", my_plugin,
+		                      PURPLE_CALLBACK(xmpp_iq_received), NULL);
+	}
+}
+
+static void
+xmpp_disco_info_do(PurpleConnection *pc, gpointer cbdata, const char *jid,
+                   const char *node, XmppIqCallback cb)
+{
+	xmlnode *iq, *query;
+	char *id = generate_next_id();
+
+	iq = xmlnode_new("iq");
+	xmlnode_set_attrib(iq, "type", "get");
+	xmlnode_set_attrib(iq, "to", jid);
+	xmlnode_set_attrib(iq, "id", id);
+
+	query = xmlnode_new_child(iq, "query");
+	xmlnode_set_namespace(query, NS_DISCO_INFO);
+	if (node)
+		xmlnode_set_attrib(query, "node", node);
+
+	/* Steals id */
+	xmpp_iq_register_callback(pc, id, cbdata, cb);
+
+	purple_signal_emit(purple_connection_get_prpl(pc), "jabber-sending-xmlnode",
+	                   pc, &iq);
+	if (iq != NULL)
+		xmlnode_free(iq);
+}
+
+static void
+xmpp_disco_items_do(PurpleConnection *pc, gpointer cbdata, const char *jid,
+                    const char *node, XmppIqCallback cb)
+{
+	xmlnode *iq, *query;
+	char *id = generate_next_id();
+
+	iq = xmlnode_new("iq");
+	xmlnode_set_attrib(iq, "type", "get");
+	xmlnode_set_attrib(iq, "to", jid);
+	xmlnode_set_attrib(iq, "id", id);
+
+	query = xmlnode_new_child(iq, "query");
+	xmlnode_set_namespace(query, NS_DISCO_ITEMS);
+	if (node)
+		xmlnode_set_attrib(query, "node", node);
+
+	/* Steals id */
+	xmpp_iq_register_callback(pc, id, cbdata, cb);
+
+	purple_signal_emit(purple_connection_get_prpl(pc), "jabber-sending-xmlnode",
+	                   pc, &iq);
+	if (iq != NULL)
+		xmlnode_free(iq);
+}
+
+static XmppDiscoServiceType
+disco_service_type_from_identity(xmlnode *identity)
+{
+	const char *category, *type;
+
+	if (!identity)
+		return XMPP_DISCO_SERVICE_TYPE_OTHER;
+
+	category = xmlnode_get_attrib(identity, "category");
+	type = xmlnode_get_attrib(identity, "type");
+
+	if (!category)
+		return XMPP_DISCO_SERVICE_TYPE_OTHER;
+
+	if (g_str_equal(category, "conference"))
+		return XMPP_DISCO_SERVICE_TYPE_CHAT;
+	else if (g_str_equal(category, "directory"))
+		return XMPP_DISCO_SERVICE_TYPE_DIRECTORY;
+	else if (g_str_equal(category, "gateway"))
+		return XMPP_DISCO_SERVICE_TYPE_GATEWAY;
+	else if (g_str_equal(category, "pubsub")) {
+		if (!type || g_str_equal(type, "collection"))
+			return XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION;
+		else if (g_str_equal(type, "leaf"))
+			return XMPP_DISCO_SERVICE_TYPE_PUBSUB_LEAF;
+		else if (g_str_equal(type, "service"))
+			return XMPP_DISCO_SERVICE_TYPE_OTHER;
+		else {
+			purple_debug_warning("xmppdisco", "Unknown pubsub type '%s'\n", type);
+			return XMPP_DISCO_SERVICE_TYPE_OTHER;
+		}
+	}
+
+	return XMPP_DISCO_SERVICE_TYPE_OTHER;
+}
+
+static const struct {
+	const char *from;
+	const char *to;
+} disco_type_mappings[] = {
+	{ "gadu-gadu", "gadu-gadu" }, /* the prpl is prpl-gg, but list_icon returns "gadu-gadu" */
+	{ "sametime",  "meanwhile" },
+	{ "myspaceim", "myspace" },
+	{ "xmpp",      "jabber" }, /* prpl-jabber (mentioned in case the prpl is renamed so this line will match) */
+	{ NULL,        NULL }
+};
+
+static const gchar *
+disco_type_from_string(const gchar *str)
+{
+	int i = 0;
+
+	g_return_val_if_fail(str != NULL, "");
+
+	for ( ; disco_type_mappings[i].from; ++i) {
+		if (!strcasecmp(str, disco_type_mappings[i].from))
+			return disco_type_mappings[i].to;
+	}
+
+	/* fallback to the string itself */
+	return str;
+}
+
+static void
+got_info_cb(PurpleConnection *pc, const char *type, const char *id,
+            const char *from, xmlnode *iq, gpointer data)
+{
+	struct item_data *item_data = data;
+	PidginDiscoList *list = item_data->list;
+	xmlnode *query;
+
+	--list->fetch_count;
+
+	if (!list->in_progress)
+		goto out;
+
+	if (g_str_equal(type, "result") &&
+			(query = xmlnode_get_child(iq, "query"))) {
+		xmlnode *identity = xmlnode_get_child(query, "identity");
+		XmppDiscoService *service;
+		xmlnode *feature;
+
+		service = g_new0(XmppDiscoService, 1);
+		service->list = item_data->list;
+		purple_debug_info("xmppdisco", "parent for %s is %p\n", from, item_data->parent);
+		service->parent = item_data->parent;
+		service->flags = 0;
+		service->type = disco_service_type_from_identity(identity);
+
+		if (item_data->node) {
+			if (item_data->name) {
+				service->name = item_data->name;
+				item_data->name = NULL;
+			} else
+				service->name = g_strdup(item_data->node);
+
+			service->node = item_data->node;
+			item_data->node = NULL;
+
+			if (service->type == XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION)
+				service->flags |= XMPP_DISCO_BROWSE;
+		} else
+			service->name = g_strdup(from);
+
+		if (!service->node)
+			/* Only support adding JIDs, not JID+node combos */
+			service->flags |= XMPP_DISCO_ADD;
+
+		if (item_data->name) {
+			service->description = item_data->name;
+			item_data->name = NULL;
+		} else if (identity)
+			service->description = g_strdup(xmlnode_get_attrib(identity, "name"));
+
+		/* TODO: Overlap with service->name a bit */
+		service->jid = g_strdup(from);
+
+		for (feature = xmlnode_get_child(query, "feature"); feature;
+				feature = xmlnode_get_next_twin(feature)) {
+			const char *var;
+			if (!(var = xmlnode_get_attrib(feature, "var")))
+				continue;
+
+			if (g_str_equal(var, NS_REGISTER))
+				service->flags |= XMPP_DISCO_REGISTER;
+			else if (g_str_equal(var, NS_DISCO_ITEMS))
+				service->flags |= XMPP_DISCO_BROWSE;
+			else if (g_str_equal(var, NS_MUC)) {
+				service->flags |= XMPP_DISCO_BROWSE;
+				service->type = XMPP_DISCO_SERVICE_TYPE_CHAT;
+			}
+		}
+
+		if (service->type == XMPP_DISCO_SERVICE_TYPE_GATEWAY)
+			service->gateway_type = g_strdup(disco_type_from_string(
+					xmlnode_get_attrib(identity, "type")));
+
+		pidgin_disco_add_service(list, service, service->parent);
+	}
+
+out:
+	if (list->fetch_count == 0)
+		pidgin_disco_list_set_in_progress(list, FALSE);
+
+	g_free(item_data->name);
+	g_free(item_data->node);
+	g_free(item_data);
+	pidgin_disco_list_unref(list);
+}
+
+static void
+got_items_cb(PurpleConnection *pc, const char *type, const char *id,
+             const char *from, xmlnode *iq, gpointer data)
+{
+	struct item_data *item_data = data;
+	PidginDiscoList *list = item_data->list;
+	xmlnode *query;
+	gboolean has_items = FALSE;
+
+	--list->fetch_count;
+
+	if (!list->in_progress)
+		goto out;
+
+	if (g_str_equal(type, "result") &&
+			(query = xmlnode_get_child(iq, "query"))) {
+		xmlnode *item;
+
+		for (item = xmlnode_get_child(query, "item"); item;
+				item = xmlnode_get_next_twin(item)) {
+			const char *jid = xmlnode_get_attrib(item, "jid");
+			const char *name = xmlnode_get_attrib(item, "name");
+			const char *node = xmlnode_get_attrib(item, "node");
+
+			has_items = TRUE;
+
+			if (item_data->parent->type == XMPP_DISCO_SERVICE_TYPE_CHAT) {
+				/* This is a hacky first-order approximation. Any MUC
+				 * component that has a >1 level hierarchy (a Yahoo MUC
+				 * transport component probably does) will violate this.
+				 *
+				 * On the other hand, this is better than querying all the
+				 * chats at conference.jabber.org to enumerate them.
+				 */
+				XmppDiscoService *service = g_new0(XmppDiscoService, 1);
+				service->list = item_data->list;
+				service->parent = item_data->parent;
+				service->flags = XMPP_DISCO_ADD;
+				service->type = XMPP_DISCO_SERVICE_TYPE_CHAT;
+
+				service->name = g_strdup(name);
+				service->jid = g_strdup(jid);
+				service->node = g_strdup(node);
+				pidgin_disco_add_service(list, service, item_data->parent);
+			} else {
+				struct item_data *item_data2 = g_new0(struct item_data, 1);
+
+				item_data2->list = item_data->list;
+				item_data2->parent = item_data->parent;
+				item_data2->name = g_strdup(name);
+				item_data2->node = g_strdup(node);
+
+				++list->fetch_count;
+				pidgin_disco_list_ref(list);
+				xmpp_disco_info_do(pc, item_data2, jid, node, got_info_cb);
+			}
+		}
+	}
+
+	if (!has_items)
+		pidgin_disco_add_service(list, NULL, item_data->parent);
+
+out:
+	if (list->fetch_count == 0)
+		pidgin_disco_list_set_in_progress(list, FALSE);
+
+	g_free(item_data);
+	pidgin_disco_list_unref(list);
+}
+
+static void
+server_items_cb(PurpleConnection *pc, const char *type, const char *id,
+                const char *from, xmlnode *iq, gpointer data)
+{
+	struct item_data *cb_data = data;
+	PidginDiscoList *list = cb_data->list;
+	xmlnode *query;
+
+	g_free(cb_data);
+	--list->fetch_count;
+
+	if (g_str_equal(type, "result") &&
+			(query = xmlnode_get_child(iq, "query"))) {
+		xmlnode *item;
+
+		for (item = xmlnode_get_child(query, "item"); item;
+				item = xmlnode_get_next_twin(item)) {
+			const char *jid = xmlnode_get_attrib(item, "jid");
+			const char *name = xmlnode_get_attrib(item, "name");
+			const char *node = xmlnode_get_attrib(item, "node");
+			struct item_data *item_data;
+
+			if (!jid)
+				continue;
+
+			item_data = g_new0(struct item_data, 1);
+			item_data->list = list;
+			item_data->name = g_strdup(name);
+			item_data->node = g_strdup(node);
+
+			++list->fetch_count;
+			pidgin_disco_list_ref(list);
+			xmpp_disco_info_do(pc, item_data, jid, node, got_info_cb);
+		}
+	}
+
+	if (list->fetch_count == 0)
+		pidgin_disco_list_set_in_progress(list, FALSE);
+
+	pidgin_disco_list_unref(list);
+}
+
+static void
+server_info_cb(PurpleConnection *pc, const char *type, const char *id,
+               const char *from, xmlnode *iq, gpointer data)
+{
+	struct item_data *cb_data = data;
+	PidginDiscoList *list = cb_data->list;
+	xmlnode *query;
+	xmlnode *error;
+	gboolean items = FALSE;
+
+	--list->fetch_count;
+
+	if (g_str_equal(type, "result") &&
+			(query = xmlnode_get_child(iq, "query"))) {
+		xmlnode *feature;
+
+		for (feature = xmlnode_get_child(query, "feature"); feature;
+				feature = xmlnode_get_next_twin(feature)) {
+			const char *var = xmlnode_get_attrib(feature, "var");
+			if (purple_strequal(var, NS_DISCO_ITEMS)) {
+				items = TRUE;
+				break;
+			}
+		}
+
+		if (items) {
+			xmpp_disco_items_do(pc, cb_data, from, NULL /* node */, server_items_cb);
+			++list->fetch_count;
+			pidgin_disco_list_ref(list);
+		}
+	}
+	else {
+		error = xmlnode_get_child(iq, "error");
+		if (xmlnode_get_child(error, "remote-server-not-found")
+		 || xmlnode_get_child(error, "jid-malformed")) {
+			purple_notify_error(my_plugin, _("Error"),
+			                    _("Server does not exist"),
+ 			                    NULL);
+		}
+		else {
+			purple_notify_error(my_plugin, _("Error"),
+			                    _("Server does not support service discovery"),
+			                    NULL);
+		}
+		pidgin_disco_list_set_in_progress(list, FALSE);
+		g_free(cb_data);
+	}
+
+	pidgin_disco_list_unref(list);
+}
+
+void xmpp_disco_start(PidginDiscoList *list)
+{
+	struct item_data *cb_data;
+
+	g_return_if_fail(list != NULL);
+
+	++list->fetch_count;
+	pidgin_disco_list_ref(list);
+
+	cb_data = g_new0(struct item_data, 1);
+	cb_data->list = list;
+
+	xmpp_disco_info_do(list->pc, cb_data, list->server, NULL, server_info_cb);
+}
+
+void xmpp_disco_service_expand(XmppDiscoService *service)
+{
+	struct item_data *item_data;
+
+	g_return_if_fail(service != NULL);
+
+	if (service->expanded)
+		return;
+
+	item_data = g_new0(struct item_data, 1);
+	item_data->list = service->list;
+	item_data->parent = service;
+
+	++service->list->fetch_count;
+	pidgin_disco_list_ref(service->list);
+
+	pidgin_disco_list_set_in_progress(service->list, TRUE);
+
+	xmpp_disco_items_do(service->list->pc, item_data, service->jid, service->node,
+	                    got_items_cb);
+	service->expanded = TRUE;
+}
+
+void xmpp_disco_service_register(XmppDiscoService *service)
+{
+	xmlnode *iq, *query;
+	char *id = generate_next_id();
+
+	iq = xmlnode_new("iq");
+	xmlnode_set_attrib(iq, "type", "get");
+	xmlnode_set_attrib(iq, "to", service->jid);
+	xmlnode_set_attrib(iq, "id", id);
+
+	query = xmlnode_new_child(iq, "query");
+	xmlnode_set_namespace(query, NS_REGISTER);
+
+	purple_signal_emit(purple_connection_get_prpl(service->list->pc),
+			"jabber-sending-xmlnode", service->list->pc, &iq);
+	if (iq != NULL)
+		xmlnode_free(iq);
+	g_free(id);
+}
+
+static void
+create_dialog(PurplePluginAction *action)
+{
+	pidgin_disco_dialog_new();
+}
+
+static GList *
+actions(PurplePlugin *plugin, gpointer context)
+{
+	GList *l = NULL;
+	PurplePluginAction *action = NULL;
+
+	action = purple_plugin_action_new(_("XMPP Service Discovery"),
+	                                  create_dialog);
+	l = g_list_prepend(l, action);
+
+	return l;
+}
+
+static void
+signed_off_cb(PurpleConnection *pc, gpointer unused)
+{
+	/* Deal with any dialogs */
+	pidgin_disco_signed_off_cb(pc);
+
+	/* Remove all the IQ callbacks for this connection */
+	g_hash_table_foreach_remove(iq_callbacks, remove_iq_callbacks_by_pc, pc);
+}
+
+static gboolean
+plugin_load(PurplePlugin *plugin)
+{
+	PurplePlugin *xmpp_prpl;
+
+	my_plugin = plugin;
+
+	xmpp_prpl = purple_plugins_find_with_id(XMPP_PLUGIN_ID);
+	if (NULL == xmpp_prpl)
+		return FALSE;
+
+	purple_signal_connect(purple_connections_get_handle(), "signing-off",
+	                      plugin, PURPLE_CALLBACK(signed_off_cb), NULL);
+
+	iq_callbacks = g_hash_table_new_full(g_str_hash, g_str_equal, g_free, g_free);
+
+	return TRUE;
+}
+
+static gboolean
+plugin_unload(PurplePlugin *plugin)
+{
+	g_hash_table_destroy(iq_callbacks);
+	iq_callbacks = NULL;
+
+	purple_signals_disconnect_by_handle(plugin);
+	pidgin_disco_dialogs_destroy_all();
+
+	return TRUE;
+}
+
+static PurplePluginInfo info =
+{
+	PURPLE_PLUGIN_MAGIC,
+	PURPLE_MAJOR_VERSION,
+	PURPLE_MINOR_VERSION,
+	PURPLE_PLUGIN_STANDARD,
+	PIDGIN_PLUGIN_TYPE,
+	0,
+	NULL,
+	PURPLE_PRIORITY_DEFAULT,
+	"gtk-xmppdisco",
+	N_("XMPP Service Discovery"),
+	DISPLAY_VERSION,
+	N_("Allows browsing and registering services."),
+	N_("This plugin is useful for registering with legacy transports or other "
+	   "XMPP services."),
+	"Paul Aurich <paul@darkrain42.org>",
+	PURPLE_WEBSITE,
+	plugin_load,
+	plugin_unload,
+	NULL,               /**< destroy    */
+	NULL,               /**< ui_info    */
+	NULL,               /**< extra_info */
+	NULL,               /**< prefs_info */
+	actions,
+
+	/* padding */
+	NULL,
+	NULL,
+	NULL,
+	NULL
+};
+
+static void
+init_plugin(PurplePlugin *plugin)
+{
+}
+
+PURPLE_INIT_PLUGIN(xmppdisco, init_plugin, info)
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/pidgin/plugins/disco/xmppdisco.h	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,107 @@
+/* pidgin
+ *
+ * Pidgin 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 PIDGIN_XMPP_DISCO_H
+#define PIDGIN_XMPP_DISCO_H
+
+typedef struct _XmppDiscoService XmppDiscoService;
+
+#include "gtkdisco.h"
+
+#define XMPP_PLUGIN_ID      "prpl-jabber"
+#define NS_DISCO_INFO       "http://jabber.org/protocol/disco#info"
+#define NS_DISCO_ITEMS      "http://jabber.org/protocol/disco#items"
+#define NS_MUC              "http://jabber.org/protocol/muc"
+#define NS_REGISTER         "jabber:iq:register"
+
+#include "plugin.h"
+extern PurplePlugin *my_plugin;
+
+/**
+ * The types of services.
+ */
+typedef enum
+{
+	XMPP_DISCO_SERVICE_TYPE_UNSET,
+	/**
+	 * A registerable gateway to another protocol. An example would be
+	 * XMPP legacy transports.
+	 */
+	XMPP_DISCO_SERVICE_TYPE_GATEWAY,
+
+	/**
+	 * A directory (e.g. allows the user to search for other users).
+	 */
+	XMPP_DISCO_SERVICE_TYPE_DIRECTORY,
+
+	/**
+	 * A chat (multi-user conversation).
+	 */
+	XMPP_DISCO_SERVICE_TYPE_CHAT,
+
+	/**
+	 * A pubsub collection (contains nodes)
+	 */
+	XMPP_DISCO_SERVICE_TYPE_PUBSUB_COLLECTION,
+
+	/**
+	 * A pubsub leaf (contains stuff, not nodes).
+	 */
+	XMPP_DISCO_SERVICE_TYPE_PUBSUB_LEAF,
+
+	/**
+	 * Something else. Do we need more categories?
+	 */
+	XMPP_DISCO_SERVICE_TYPE_OTHER
+} XmppDiscoServiceType;
+
+/**
+ * The flags of services.
+ */
+typedef enum
+{
+	XMPP_DISCO_NONE          = 0x0000,
+	XMPP_DISCO_ADD           = 0x0001, /**< Supports an 'add' operation */
+	XMPP_DISCO_BROWSE        = 0x0002, /**< Supports browsing */
+	XMPP_DISCO_REGISTER      = 0x0004  /**< Supports a 'register' operation */
+} XmppDiscoServiceFlags;
+
+struct _XmppDiscoService {
+	PidginDiscoList *list;
+	gchar *name;
+	gchar *description;
+
+	gchar *gateway_type;
+	XmppDiscoServiceType type;
+	XmppDiscoServiceFlags flags;
+
+	XmppDiscoService *parent;
+	gchar *jid;
+	gchar *node;
+	gboolean expanded;
+};
+
+void xmpp_disco_start(PidginDiscoList *list);
+
+void xmpp_disco_service_expand(XmppDiscoService *service);
+void xmpp_disco_service_register(XmppDiscoService *service);
+
+#endif /* PIDGIN_XMPP_DISCO_H */
--- a/pidgin/plugins/gevolution/gevolution.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/gevolution/gevolution.c	Sun Jun 28 04:41:07 2009 +0000
@@ -39,6 +39,7 @@
 #include <libedata-book/Evolution-DataServer-Addressbook.h>
 
 #include <libedata-book/e-data-book-factory.h>
+/* TODO: bonobo is going away eventually, we'll need to find an alternative */
 #include <bonobo/bonobo-main.h>
 
 #include <glib.h>
--- a/pidgin/plugins/pidginrc.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/pidginrc.c	Sun Jun 28 04:41:07 2009 +0000
@@ -28,34 +28,31 @@
 static guint pref_callback;
 
 static const gchar *color_prefs[] = {
-	"/plugins/gtk/purplerc/color/GtkWidget::cursor-color",
-	"/plugins/gtk/purplerc/color/GtkWidget::secondary-cursor-color",
 	"/plugins/gtk/purplerc/color/GtkIMHtml::hyperlink-color",
 	"/plugins/gtk/purplerc/color/GtkIMHtml::hyperlink-visited-color",
 	"/plugins/gtk/purplerc/color/GtkIMHtml::send-name-color",
 	"/plugins/gtk/purplerc/color/GtkIMHtml::receive-name-color",
 	"/plugins/gtk/purplerc/color/GtkIMHtml::highlight-name-color",
-	"/plugins/gtk/purplerc/color/GtkIMHtml::action-name-color"
+	"/plugins/gtk/purplerc/color/GtkIMHtml::action-name-color",
+	"/plugins/gtk/purplerc/color/GtkIMHtml::typing-notification-color"
 };
 static const gchar *color_prefs_set[] = {
-	"/plugins/gtk/purplerc/set/color/GtkWidget::cursor-color",
-	"/plugins/gtk/purplerc/set/color/GtkWidget::secondary-cursor-color",
 	"/plugins/gtk/purplerc/set/color/GtkIMHtml::hyperlink-color",
 	"/plugins/gtk/purplerc/set/color/GtkIMHtml::hyperlink-visited-color",
 	"/plugins/gtk/purplerc/set/color/GtkIMHtml::send-name-color",
 	"/plugins/gtk/purplerc/set/color/GtkIMHtml::receive-name-color",
 	"/plugins/gtk/purplerc/set/color/GtkIMHtml::highlight-name-color",
-	"/plugins/gtk/purplerc/set/color/GtkIMHtml::action-name-color"
+	"/plugins/gtk/purplerc/set/color/GtkIMHtml::action-name-color",
+	"/plugins/gtk/purplerc/set/color/GtkIMHtml::typing-notification-color"
 };
 static const gchar *color_names[] = {
-	N_("Cursor Color"),
-	N_("Secondary Cursor Color"),
 	N_("Hyperlink Color"),
 	N_("Visited Hyperlink Color"),
 	N_("Sent Message Name Color"),
 	N_("Received Message Name Color"),
 	N_("Highlighted Message Name Color"),
-	N_("Action Message Name Color")
+	N_("Action Message Name Color"),
+	N_("Typing Notification Color")
 };
 static GtkWidget *color_widgets[G_N_ELEMENTS(color_prefs)];
 
@@ -126,6 +123,10 @@
 
 	g_string_append(style_string, "style \"purplerc_style\"\n{");
 
+	if(purple_prefs_get_bool("/plugins/gtk/purplerc/set/disable-typing-notification")) {
+		g_string_append(style_string, "\tGtkIMHtml::typing-notification-enable = 0\n");
+	}
+
 	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
 		if (purple_prefs_get_bool(color_prefs_set[i])) {
 			const gchar *pref;
@@ -349,103 +350,27 @@
 }
 
 static GtkWidget *
-purplerc_get_config_frame(PurplePlugin *plugin)
+purplerc_make_interface_vbox(void)
 {
-	/* Note: Intentionally not using the size group argument to the
-	 * pidgin_prefs_labeled_* functions they only add the text label to
-	 * the size group not the whole thing, which isn't what I want. */
+	GtkWidget *vbox = NULL, *hbox = NULL, *check = NULL;
+	GtkSizeGroup *labelsg = NULL;
 	gint i;
-	gchar *tmp;
-	GtkWidget *check = NULL, *widget = NULL;
-	GtkWidget *ret = NULL, *hbox = NULL, *frame = NULL;
-	GtkSizeGroup *labelsg = NULL, *widgetsg = NULL, *buttonsg = NULL;
-#ifndef _WIN32
-	const gchar *homepath = "$HOME";
-#else
-	const gchar *homepath = "\%APPDATA\%";
-#endif
-
-	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER);
-
-	labelsg  = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-	widgetsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-	buttonsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
-
-	frame = pidgin_make_frame(ret, _("General"));
-	/* interface font */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-	check = pidgin_prefs_checkbox(_("GTK+ Interface Font"),
-	                              "/plugins/gtk/purplerc/set/gtk-font-name",
-	                              hbox);
-	gtk_size_group_add_widget(labelsg, check);
-
-	widget = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT,
-	                                         PIDGIN_BUTTON_HORIZONTAL);
-	gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(widgetsg, widget);
-	gtk_widget_set_sensitive(widget,
-	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name"));
-	g_signal_connect(G_OBJECT(check), "toggled",
-	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
-	g_signal_connect(G_OBJECT(widget), "clicked",
-	                 G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(-1));
 
-	/* key theme name */
-	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-	gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-	check = pidgin_prefs_checkbox(_("GTK+ Text Shortcut Theme"),
-	                              "/plugins/gtk/purplerc/set/gtk-key-theme-name",
-	                              hbox);
-	gtk_size_group_add_widget(labelsg, check);
-
-	widget = pidgin_prefs_labeled_entry(hbox, "",
-	                                    "/plugins/gtk/purplerc/gtk-key-theme-name",
-	                                    NULL);
-	/*
-	gtk_size_group_add_widget(widgetsg, widget);
-	*/
-	gtk_widget_set_sensitive(widget,
-	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name"));
-	g_signal_connect(G_OBJECT(check), "toggled",
-	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	labelsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 
-	/*
-	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-
-		check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
-		                              widget_bool_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BORDER);
 
-		widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
-		*
-		gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
-		*
-		gtk_widget_set_sensitive(widget_bool_widgets[i],
-		                         purple_prefs_get_bool(widget_bool_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 widget_bool_widgets[i]);
-	}
-	*/
-
-	frame = pidgin_make_frame(ret, _("Interface colors"));
-	/* imhtml stuff */
 	for (i = 0; i < G_N_ELEMENTS(color_prefs); i++) {
 		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
 		check = pidgin_prefs_checkbox(_(color_names[i]),
 		                              color_prefs_set[i], hbox);
 		gtk_size_group_add_widget(labelsg, check);
 
-		color_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_COLOR, PIDGIN_BUTTON_HORIZONTAL);
-		gtk_size_group_add_widget(widgetsg, color_widgets[i]);
+		color_widgets[i] = pidgin_pixbuf_button_from_stock("",
+				GTK_STOCK_SELECT_COLOR, PIDGIN_BUTTON_HORIZONTAL);
 		gtk_box_pack_start(GTK_BOX(hbox), color_widgets[i], FALSE,
 		                   FALSE, 0);
 		gtk_widget_set_sensitive(color_widgets[i],
@@ -458,39 +383,51 @@
 		                 GINT_TO_POINTER(i));
 	}
 
-	frame = pidgin_make_frame(ret, _("Widget Sizes"));
-	/* widget size stuff */
-	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
-		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+	g_object_unref(labelsg);
+
+	return vbox;
+}
 
-		check = pidgin_prefs_checkbox(_(widget_size_names[i]),
-		                              widget_size_prefs_set[i], hbox);
-		gtk_size_group_add_widget(labelsg, check);
+static GtkWidget *
+purplerc_make_fonts_vbox(void)
+{
+	GtkWidget *vbox = NULL, *hbox = NULL, *check = NULL, *widget = NULL;
+	GtkSizeGroup *labelsg = NULL;
+	int i;
+
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	labelsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BORDER);
 
-		widget_size_widgets[i] = pidgin_prefs_labeled_spin_button(hbox, "", widget_size_prefs[i], 0, 50, NULL);
-		/*
-		gtk_size_group_add_widget(widgetsg, widget_size_widgets[i]);
-		*/
-		gtk_widget_set_sensitive(widget_size_widgets[i],
-		                         purple_prefs_get_bool(widget_size_prefs_set[i]));
-		g_signal_connect(G_OBJECT(check), "toggled",
-		                 G_CALLBACK(pidgin_toggle_sensitive),
-		                 widget_size_widgets[i]);
-	}
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+	check = pidgin_prefs_checkbox(_("GTK+ Interface Font"),
+	                              "/plugins/gtk/purplerc/set/gtk-font-name",
+	                              hbox);
+	gtk_size_group_add_widget(labelsg, check);
 
-	frame = pidgin_make_frame(ret, _("Fonts"));
-	/* imhtml font stuff */
+	widget = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT,
+	                                         PIDGIN_BUTTON_HORIZONTAL);
+	gtk_box_pack_start(GTK_BOX(hbox), widget, FALSE, FALSE, 0);
+	gtk_widget_set_sensitive(widget,
+	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-font-name"));
+	g_signal_connect(G_OBJECT(check), "toggled",
+	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
+	g_signal_connect(G_OBJECT(widget), "clicked",
+	                 G_CALLBACK(purplerc_set_font), GINT_TO_POINTER(-1));
+
 	for (i = 0; i < G_N_ELEMENTS(font_prefs); i++) {
 		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-		gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
 
 		check = pidgin_prefs_checkbox(_(font_names[i]),
 		                              font_prefs_set[i], hbox);
 		gtk_size_group_add_widget(labelsg, check);
 
-		font_widgets[i] = pidgin_pixbuf_button_from_stock("", GTK_STOCK_SELECT_FONT, PIDGIN_BUTTON_HORIZONTAL);
-		gtk_size_group_add_widget(widgetsg, font_widgets[i]);
+		font_widgets[i] = pidgin_pixbuf_button_from_stock("",
+				GTK_STOCK_SELECT_FONT, PIDGIN_BUTTON_HORIZONTAL);
 		gtk_box_pack_start(GTK_BOX(hbox), font_widgets[i], FALSE,
 		                   FALSE, 0);
 		gtk_widget_set_sensitive(font_widgets[i],
@@ -503,6 +440,127 @@
 		                 GINT_TO_POINTER(i));
 	}
 
+	g_object_unref(labelsg);
+
+	return vbox;
+}
+
+static GtkWidget *
+purplerc_make_misc_vbox(void)
+{
+	/* Note: Intentionally not using the size group argument to the
+	 * pidgin_prefs_labeled_* functions they only add the text label to
+	 * the size group not the whole thing, which isn't what I want. */
+	GtkWidget *vbox = NULL, *hbox = NULL, *check = NULL, *widget = NULL;
+	GtkSizeGroup *labelsg = NULL;
+	int i;
+
+	vbox = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	labelsg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
+
+	gtk_container_set_border_width(GTK_CONTAINER(vbox), PIDGIN_HIG_BORDER);
+
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+	check = pidgin_prefs_checkbox(_("GTK+ Text Shortcut Theme"),
+	                              "/plugins/gtk/purplerc/set/gtk-key-theme-name",
+	                              hbox);
+	gtk_size_group_add_widget(labelsg, check);
+
+	widget = pidgin_prefs_labeled_entry(hbox, "",
+	                                    "/plugins/gtk/purplerc/gtk-key-theme-name",
+	                                    NULL);
+	gtk_widget_set_sensitive(widget,
+	                         purple_prefs_get_bool("/plugins/gtk/purplerc/set/gtk-key-theme-name"));
+	g_signal_connect(G_OBJECT(check), "toggled",
+	                 G_CALLBACK(pidgin_toggle_sensitive), widget);
+
+	for (i = 0; i < G_N_ELEMENTS(widget_size_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(widget_size_names[i]),
+		                              widget_size_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		widget_size_widgets[i] = pidgin_prefs_labeled_spin_button(hbox, "", widget_size_prefs[i], 0, 50, NULL);
+		gtk_widget_set_sensitive(widget_size_widgets[i],
+		                         purple_prefs_get_bool(widget_size_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 widget_size_widgets[i]);
+	}
+
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+	check = pidgin_prefs_checkbox(_("Disable Typing Notification Text"),
+			"/plugins/gtk/purplerc/set/disable-typing-notification", hbox);
+
+	/* Widget boolean stuff */
+	/*
+	for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+		hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+		gtk_box_pack_start(GTK_BOX(vbox), hbox, FALSE, FALSE, 0);
+
+		check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
+		                              widget_bool_prefs_set[i], hbox);
+		gtk_size_group_add_widget(labelsg, check);
+
+		widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
+
+		gtk_widget_set_sensitive(widget_bool_widgets[i],
+		                         purple_prefs_get_bool(widget_bool_prefs_set[i]));
+		g_signal_connect(G_OBJECT(check), "toggled",
+		                 G_CALLBACK(pidgin_toggle_sensitive),
+		                 widget_bool_widgets[i]);
+	}
+	*/
+
+	g_object_unref(labelsg);
+
+	return vbox;
+}
+
+static GtkWidget *
+purplerc_get_config_frame(PurplePlugin *plugin)
+{
+	gchar *tmp;
+	GtkWidget *check = NULL, *label = NULL;
+	GtkWidget *ret = NULL, *hbox = NULL, *frame = NULL, *note = NULL;
+#ifndef _WIN32
+	const gchar *homepath = "$HOME";
+#else
+	const gchar *homepath = "\%APPDATA\%";
+#endif
+
+	ret = gtk_vbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+	note = gtk_notebook_new();
+	label = gtk_label_new(NULL);
+	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+
+	gtk_container_set_border_width(GTK_CONTAINER(ret), PIDGIN_HIG_BORDER);
+
+	tmp = g_strdup_printf("<span weight=\"bold\">%s</span>", _("GTK+ Theme Control Settings"));
+	gtk_label_set_markup(GTK_LABEL(label), tmp);
+	g_free(tmp);
+
+	gtk_box_pack_start(GTK_BOX(hbox), label, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(ret), hbox, FALSE, FALSE, 0);
+	gtk_box_pack_start(GTK_BOX(ret), note, FALSE, FALSE, 0);
+
+	label = gtk_label_new(_("Colors"));
+	gtk_notebook_insert_page(GTK_NOTEBOOK(note), purplerc_make_interface_vbox(), label, -1);
+
+	label = gtk_label_new(_("Fonts"));
+	gtk_notebook_insert_page(GTK_NOTEBOOK(note), purplerc_make_fonts_vbox(), label, -1);
+
+	label = gtk_label_new(_("Miscellaneous"));
+	gtk_notebook_insert_page(GTK_NOTEBOOK(note), purplerc_make_misc_vbox(), label, -1);
+
+	gtk_box_pack_start(GTK_BOX(ret), gtk_hseparator_new(), TRUE, TRUE, 0);
+
 	frame = pidgin_make_frame(ret, _("Gtkrc File Tools"));
 
 	hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
@@ -512,22 +570,17 @@
 	                      homepath, G_DIR_SEPARATOR_S ".purple" G_DIR_SEPARATOR_S);
 	check = gtk_button_new_with_label(tmp);
 	g_free(tmp);
-	gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(buttonsg, check);
+	gtk_box_pack_start(GTK_BOX(hbox), check, TRUE, TRUE, 0);
 	g_signal_connect(G_OBJECT(check), "clicked",
 	                 G_CALLBACK(purplerc_write), NULL);
 
 	check = gtk_button_new_with_label(_("Re-read gtkrc files"));
-	gtk_box_pack_start(GTK_BOX(hbox), check, FALSE, FALSE, 0);
-	gtk_size_group_add_widget(buttonsg, check);
+	gtk_box_pack_start(GTK_BOX(hbox), check, TRUE, TRUE, 0);
 	g_signal_connect(G_OBJECT(check), "clicked",
 	                 G_CALLBACK(purplerc_reread), NULL);
 
 	gtk_widget_show_all(ret);
 
-	g_object_unref(labelsg);
-	g_object_unref(widgetsg);
-	g_object_unref(buttonsg);
 
 	return ret;
 }
@@ -621,6 +674,15 @@
 		purple_prefs_add_bool(widget_bool_prefs_set[i], FALSE);
 	}
 	*/
+
+	purple_prefs_add_bool("/plugins/gtk/purplerc/disable-typing-notification", FALSE);
+	purple_prefs_add_bool("/plugins/gtk/purplerc/set/disable-typing-notification", FALSE);
+
+	/* remove old cursor color prefs */
+	purple_prefs_remove("/plugins/gtk/purplerc/color/GtkWidget::cursor-color");
+	purple_prefs_remove("/plugins/gtk/purplerc/color/GtkWidget::secondary-cursor-color");
+	purple_prefs_remove("/plugins/gtk/purplerc/set/color/GtkWidget::cursor-color");
+	purple_prefs_remove("/plugins/gtk/purplerc/set/color/GtkWidget::secondary-cursor-color");
 }
 
 PURPLE_INIT_PLUGIN(purplerc, purplerc_init, purplerc_info)
--- a/pidgin/plugins/themeedit-icon.h	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/themeedit-icon.h	Sun Jun 28 04:41:07 2009 +0000
@@ -1,2 +1,28 @@
+/* Pidgin
+ *
+ * Pidgin 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 _THEMEEDIT_ICON_H_
+#define _THEMEEDIT_ICON_H_
+
 void pidgin_icon_theme_edit(PurplePluginAction *);
 
+#endif
+
--- a/pidgin/plugins/xmppconsole.c	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/plugins/xmppconsole.c	Sun Jun 28 04:41:07 2009 +0000
@@ -62,58 +62,62 @@
 
 	g_return_val_if_fail(node != NULL, NULL);
 
-	if(pretty && depth) {
+	if (pretty && depth) {
 		tab = g_strnfill(depth, '\t');
 		text = g_string_append(text, tab);
 	}
 
 	node_name = g_markup_escape_text(node->name, -1);
-	g_string_append_printf(text, "<font color='"
-			       BRACKET_COLOR "'>&lt;</font><font color='"
-			       TAG_COLOR "'><b>%s</b></font>", node_name);
+	g_string_append_printf(text,
+	                       "<font color='" BRACKET_COLOR "'>&lt;</font>"
+	                       "<font color='" TAG_COLOR "'><b>%s</b></font>",
+	                       node_name);
 
 	if (node->xmlns) {
-		if((!node->parent || 
-		    !node->parent->xmlns || 
-		    strcmp(node->xmlns, node->parent->xmlns)) &&
-		   strcmp(node->xmlns, "jabber:client"))
+		if ((!node->parent ||
+		     !node->parent->xmlns ||
+		     strcmp(node->xmlns, node->parent->xmlns)) &&
+		    strcmp(node->xmlns, "jabber:client"))
 		{
 			char *xmlns = g_markup_escape_text(node->xmlns, -1);
-			g_string_append_printf(text, " <font color='"
-					       ATTR_NAME_COLOR "'><b>xmlns</b></font>='<font color='"
-					       XMLNS_COLOR "'><b>%s</b></font>'", xmlns);
+			g_string_append_printf(text,
+			                       " <font color='" ATTR_NAME_COLOR "'><b>xmlns</b></font>="
+			                       "'<font color='" XMLNS_COLOR "'><b>%s</b></font>'",
+			                       xmlns);
 			g_free(xmlns);
 		}
 	}
-	for(c = node->child; c; c = c->next)
+	for (c = node->child; c; c = c->next)
 	{
-		if(c->type == XMLNODE_TYPE_ATTRIB) {
+		if (c->type == XMLNODE_TYPE_ATTRIB) {
 			esc = g_markup_escape_text(c->name, -1);
 			esc2 = g_markup_escape_text(c->data, -1);
-			g_string_append_printf(text, " <font color='"
-					       ATTR_NAME_COLOR "'><b>%s</b></font>='<font color='"
-					       ATTR_VALUE_COLOR "'>%s</font>'", esc, esc2);
+			g_string_append_printf(text,
+			                       " <font color='" ATTR_NAME_COLOR "'><b>%s</b></font>="
+			                       "'<font color='" ATTR_VALUE_COLOR "'>%s</font>'",
+			                       esc, esc2);
 			g_free(esc);
 			g_free(esc2);
-		} else if(c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) {
-			if(c->type == XMLNODE_TYPE_DATA)
+		} else if (c->type == XMLNODE_TYPE_TAG || c->type == XMLNODE_TYPE_DATA) {
+			if (c->type == XMLNODE_TYPE_DATA)
 				pretty = FALSE;
 			need_end = TRUE;
 		}
 	}
 
-	if(need_end) {
-		g_string_append_printf(text, 
-			       "<font color='"BRACKET_COLOR"'>&gt;</font>%s", pretty ? "<br>" : "");
+	if (need_end) {
+		g_string_append_printf(text,
+		                       "<font color='"BRACKET_COLOR"'>&gt;</font>%s",
+		                       pretty ? "<br>" : "");
 
-		for(c = node->child; c; c = c->next)
+		for (c = node->child; c; c = c->next)
 		{
-			if(c->type == XMLNODE_TYPE_TAG) {
+			if (c->type == XMLNODE_TYPE_TAG) {
 				int esc_len;
 				esc = xmlnode_to_pretty_str(c, &esc_len, depth+1);
 				text = g_string_append_len(text, esc, esc_len);
 				g_free(esc);
-			} else if(c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) {
+			} else if (c->type == XMLNODE_TYPE_DATA && c->data_sz > 0) {
 				esc = g_markup_escape_text(c->data, c->data_sz);
 				text = g_string_append(text, esc);
 				g_free(esc);
@@ -122,11 +126,14 @@
 
 		if(tab && pretty)
 			text = g_string_append(text, tab);
-		g_string_append_printf(text, "<font color='"BRACKET_COLOR"'>&lt;</font>/<font color='"
-				       TAG_COLOR"'><b>%s</b></font><font color='"BRACKET_COLOR
-				       "'>&gt;</font><br>", node_name);
+		g_string_append_printf(text,
+		                       "<font color='" BRACKET_COLOR "'>&lt;</font>/"
+		                       "<font color='" TAG_COLOR "'><b>%s</b></font>"
+		                       "<font color='" BRACKET_COLOR "'>&gt;</font><br>",
+		                       node_name);
 	} else {
-		g_string_append_printf(text, "/<font color='"BRACKET_COLOR"'>&gt;</font><br>");
+		g_string_append_printf(text,
+		                       "/<font color='" BRACKET_COLOR "'>&gt;</font><br>");
 	}
 
 	g_free(node_name);
@@ -163,10 +170,10 @@
 	if (!console || console->gc != gc)
 		return;
 	node = xmlnode_from_str(*packet, -1);
-		
+
 	if (!node)
 		return;
-	
+
 	str = xmlnode_to_pretty_str(node, NULL, 0);
 	formatted = g_strdup_printf("<body bgcolor='#dcecc4'><pre>%s</pre></body>", str);
 	gtk_imhtml_append_text(GTK_IMHTML(console->imhtml), formatted, 0);
@@ -204,37 +211,35 @@
 static void entry_changed_cb(GtkTextBuffer *buffer, void *data)
 {
 	char *xmlstr, *str;
-        GtkTextIter iter;
-        int wrapped_lines;
-        int lines;
-        GdkRectangle oneline;
-        int height;
-        int pad_top, pad_inside, pad_bottom;
+	GtkTextIter iter;
+	int wrapped_lines;
+	int lines;
+	GdkRectangle oneline;
+	int height;
+	int pad_top, pad_inside, pad_bottom;
 	GtkTextIter start, end;
 	xmlnode *node;
-	
-        wrapped_lines = 1;
-        gtk_text_buffer_get_start_iter(buffer, &iter);
-        gtk_text_view_get_iter_location(GTK_TEXT_VIEW(console->entry), &iter, &oneline);
-        while (gtk_text_view_forward_display_line(GTK_TEXT_VIEW(console->entry), &iter))
-                wrapped_lines++;
 
-        lines = gtk_text_buffer_get_line_count(buffer);
+	wrapped_lines = 1;
+	gtk_text_buffer_get_start_iter(buffer, &iter);
+	gtk_text_view_get_iter_location(GTK_TEXT_VIEW(console->entry), &iter, &oneline);
+	while (gtk_text_view_forward_display_line(GTK_TEXT_VIEW(console->entry), &iter))
+		wrapped_lines++;
+
+	lines = gtk_text_buffer_get_line_count(buffer);
 
-        /* Show a maximum of 64 lines */
-        lines = MIN(lines, 6);
-        wrapped_lines = MIN(wrapped_lines, 6);
+	/* Show a maximum of 64 lines */
+	lines = MIN(lines, 6);
+	wrapped_lines = MIN(wrapped_lines, 6);
 
-        pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(console->entry));
-        pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(console->entry));
-        pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(console->entry));
+	pad_top = gtk_text_view_get_pixels_above_lines(GTK_TEXT_VIEW(console->entry));
+	pad_bottom = gtk_text_view_get_pixels_below_lines(GTK_TEXT_VIEW(console->entry));
+	pad_inside = gtk_text_view_get_pixels_inside_wrap(GTK_TEXT_VIEW(console->entry));
 
-        height = (oneline.height + pad_top + pad_bottom) * lines;
-        height += (oneline.height + pad_inside) * (wrapped_lines - lines);
+	height = (oneline.height + pad_top + pad_bottom) * lines;
+	height += (oneline.height + pad_inside) * (wrapped_lines - lines);
 
-        gtk_widget_set_size_request(console->sw, -1, height+6);
-
-
+	gtk_widget_set_size_request(console->sw, -1, height + 6);
 
 	gtk_text_buffer_get_start_iter(buffer, &start);
 	gtk_text_buffer_get_end_iter(buffer, &end);
@@ -287,7 +292,7 @@
 	to_entry = gtk_entry_new();
 	gtk_entry_set_activates_default (GTK_ENTRY (to_entry), TRUE);
 	gtk_box_pack_start(GTK_BOX(hbox), to_entry, FALSE, FALSE, 0);
-	
+
 	hbox = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);
 	label = gtk_label_new("Type:");
@@ -302,7 +307,7 @@
 	gtk_combo_box_append_text(GTK_COMBO_BOX(type_combo), "error");
 	gtk_combo_box_set_active(GTK_COMBO_BOX(type_combo), 0);
 	gtk_box_pack_start(GTK_BOX(hbox), type_combo, FALSE, FALSE, 0);
-	
+
 	gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
 
 	result = gtk_dialog_run(GTK_DIALOG(dialog));
@@ -310,16 +315,16 @@
 		gtk_widget_destroy(dialog);
 		return;
 	}
-	
+
 	to = gtk_entry_get_text(GTK_ENTRY(to_entry));
 
-	stanza = g_strdup_printf("<iq %s%s%s id='console%x' type='%s'></iq>", 
+	stanza = g_strdup_printf("<iq %s%s%s id='console%x' type='%s'></iq>",
 				 to && *to ? "to='" : "",
 				 to && *to ? to : "",
 				 to && *to ? "'" : "",
 				 g_random_int(),
 				 gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo)));
-	
+
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));
 	gtk_text_buffer_set_text(buffer, stanza, -1);
 	gtk_text_buffer_get_iter_at_offset(buffer, &iter, strstr(stanza, "</iq>") - stanza);
@@ -328,25 +333,24 @@
 
 	gtk_widget_destroy(dialog);
 	g_object_unref(sg);
-
 }
 
 static void presence_clicked_cb(GtkWidget *w, gpointer nul)
 {
-	GtkWidget *hbox, 
-  		  *to_entry, 
-		  *status_entry,
-		  *priority_entry,
-		  *label,
-   		  *show_combo,
-		  *type_combo;
+	GtkWidget *hbox;
+	GtkWidget *to_entry;
+	GtkWidget *status_entry;
+	GtkWidget *priority_entry;
+	GtkWidget *label;
+	GtkWidget *show_combo;
+	GtkWidget *type_combo;
 	GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 	GtkTextIter iter;
 	GtkTextBuffer *buffer;
 	const char *to, *type, *status, *show, *priority;
 	int result;
 	char *stanza;
-	
+
 	GtkWidget *dialog = gtk_dialog_new_with_buttons("<presence/>",
 							GTK_WINDOW(console->window),
 							GTK_DIALOG_MODAL | GTK_DIALOG_DESTROY_WITH_PARENT,
@@ -370,7 +374,7 @@
 	to_entry = gtk_entry_new();
 	gtk_entry_set_activates_default (GTK_ENTRY (to_entry), TRUE);
 	gtk_box_pack_start(GTK_BOX(hbox), to_entry, FALSE, FALSE, 0);
-	
+
 	hbox = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);
 	label = gtk_label_new("Type:");
@@ -417,7 +421,6 @@
 	gtk_entry_set_activates_default (GTK_ENTRY (status_entry), TRUE);
 	gtk_box_pack_start(GTK_BOX(hbox), status_entry, FALSE, FALSE, 0);
 
-
 	hbox = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);
 
@@ -430,7 +433,6 @@
 	gtk_spin_button_set_value(GTK_SPIN_BUTTON(priority_entry), 0);
 	gtk_box_pack_start(GTK_BOX(hbox), priority_entry, FALSE, FALSE, 0);
 
-	
 	gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
 
 	result = gtk_dialog_run(GTK_DIALOG(dialog));
@@ -438,7 +440,7 @@
 		gtk_widget_destroy(dialog);
 		return;
 	}
-	
+
 	to = gtk_entry_get_text(GTK_ENTRY(to_entry));
 	type = gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo));
 	if (!strcmp(type, "default"))
@@ -451,32 +453,30 @@
 	if (!strcmp(priority, "0"))
 		priority = "";
 
+	stanza = g_strdup_printf("<presence %s%s%s id='console%x' %s%s%s>"
+	                         "%s%s%s%s%s%s%s%s%s"
+	                         "</presence>",
+	                         *to ? "to='" : "",
+	                         *to ? to : "",
+	                         *to ? "'" : "",
+	                         g_random_int(),
 
+	                         *type ? "type='" : "",
+	                         *type ? type : "",
+	                         *type ? "'" : "",
 
-	stanza = g_strdup_printf("<presence %s%s%s id='console%x' %s%s%s>"
-				 "%s%s%s%s%s%s%s%s%s"
-				 "</presence>", 
-				 *to ? "to='" : "",
-				 *to ? to : "",
-				 *to ? "'" : "",
-				 g_random_int(),
-				 
-				 *type ? "type='" : "",
-				 *type ? type : "",
-				 *type ? "'" : "",
-				 
-				 *show ? "<show>" : "",
-				 *show ? show : "",
-				 *show ? "</show>" : "",
+	                         *show ? "<show>" : "",
+	                         *show ? show : "",
+	                         *show ? "</show>" : "",
 
-				 *status ? "<status>" : "",
-				 *status ? status : "",
-				 *status ? "</status>" : "",
-				       
-				 *priority ? "<priority>" : "",
-				 *priority ? priority : "",
-				 *priority ? "</priority>" : "");
-	
+	                         *status ? "<status>" : "",
+	                         *status ? status : "",
+	                         *status ? "</status>" : "",
+
+	                         *priority ? "<priority>" : "",
+	                         *priority ? priority : "",
+	                         *priority ? "</priority>" : "");
+
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));
 	gtk_text_buffer_set_text(buffer, stanza, -1);
 	gtk_text_buffer_get_iter_at_offset(buffer, &iter, strstr(stanza, "</presence>") - stanza);
@@ -489,13 +489,13 @@
 
 static void message_clicked_cb(GtkWidget *w, gpointer nul)
 {
-	GtkWidget *hbox, 
-		  *to_entry, 
-		  *body_entry, 
-   		  *thread_entry,
-		  *subject_entry,
-		  *label, 
-		  *type_combo;
+	GtkWidget *hbox;
+	GtkWidget *to_entry;
+	GtkWidget *body_entry;
+	GtkWidget *thread_entry;
+	GtkWidget *subject_entry;
+	GtkWidget *label;
+	GtkWidget *type_combo;
 	GtkSizeGroup *sg = gtk_size_group_new(GTK_SIZE_GROUP_HORIZONTAL);
 	GtkTextIter iter;
 	GtkTextBuffer *buffer;
@@ -554,7 +554,6 @@
 	gtk_entry_set_activates_default (GTK_ENTRY (body_entry), TRUE);
 	gtk_box_pack_start(GTK_BOX(hbox), body_entry, FALSE, FALSE, 0);
 
-
 	hbox = gtk_hbox_new(FALSE, 3);
 	gtk_box_pack_start(GTK_BOX(GTK_DIALOG(dialog)->vbox), hbox, FALSE, FALSE, 0);
 
@@ -578,7 +577,7 @@
 	thread_entry = gtk_entry_new();
 	gtk_entry_set_activates_default (GTK_ENTRY (thread_entry), TRUE);
 	gtk_box_pack_start(GTK_BOX(hbox), thread_entry, FALSE, FALSE, 0);
-	
+
 	gtk_widget_show_all(GTK_DIALOG(dialog)->vbox);
 
 	result = gtk_dialog_run(GTK_DIALOG(dialog));
@@ -586,34 +585,34 @@
 		gtk_widget_destroy(dialog);
 		return;
 	}
-	
+
 	to = gtk_entry_get_text(GTK_ENTRY(to_entry));
 	body = gtk_entry_get_text(GTK_ENTRY(body_entry));
 	thread = gtk_entry_get_text(GTK_ENTRY(thread_entry));
 	subject = gtk_entry_get_text(GTK_ENTRY(subject_entry));
 
 	stanza = g_strdup_printf("<message %s%s%s id='console%x' type='%s'>"
-				 "%s%s%s%s%s%s%s%s%s"
-				 "</message>",
-				 
-				 *to ? "to='" : "",
-				 *to ? to : "",
-				 *to ? "'" : "",
-				 g_random_int(),
-				 gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo)),
-				 
-				 *body ? "<body>" : "",
-				 *body ? body : "",
-				 *body ? "</body>" : "",
-				 
-				 *subject ? "<subject>" : "",
-				 *subject ? subject : "",
-				 *subject ? "</subject>" : "",
-				 
-				 *thread ? "<thread>" : "",
-				 *thread ? thread : "",
-				 *thread ? "</thread>" : "");
-	
+	                         "%s%s%s%s%s%s%s%s%s"
+	                         "</message>",
+
+	                         *to ? "to='" : "",
+	                         *to ? to : "",
+	                         *to ? "'" : "",
+	                         g_random_int(),
+	                         gtk_combo_box_get_active_text(GTK_COMBO_BOX(type_combo)),
+
+	                         *body ? "<body>" : "",
+	                         *body ? body : "",
+	                         *body ? "</body>" : "",
+
+	                         *subject ? "<subject>" : "",
+	                         *subject ? subject : "",
+	                         *subject ? "</subject>" : "",
+
+	                         *thread ? "<thread>" : "",
+	                         *thread ? thread : "",
+	                         *thread ? "</thread>" : "");
+
 	buffer = gtk_text_view_get_buffer(GTK_TEXT_VIEW(console->entry));
 	gtk_text_buffer_set_text(buffer, stanza, -1);
 	gtk_text_buffer_get_iter_at_offset(buffer, &iter, strstr(stanza, "</message>") - stanza);
@@ -629,11 +628,11 @@
 {
 	if (!console)
 		return;
-	
+
 	gtk_combo_box_append_text(GTK_COMBO_BOX(console->dropdown), purple_account_get_username(gc->account));
 	console->accounts = g_list_append(console->accounts, gc);
 	console->count++;
-	
+
 	if (console->count > 1)
 		gtk_widget_show_all(console->hbox);
 }
@@ -666,7 +665,7 @@
 
 	if (gc == console->gc) {
 		console->gc = NULL;
-		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml), 
+		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml),
 				       _("<font color='#777777'>Logged out.</font>"), 0);
 	}
 }
@@ -689,7 +688,7 @@
 			    plugin, PURPLE_CALLBACK(signed_on_cb), NULL);
 	purple_signal_connect(purple_connections_get_handle(), "signed-off",
 			    plugin, PURPLE_CALLBACK(signed_off_cb), NULL);
-	
+
 	return TRUE;
 }
 
@@ -716,18 +715,18 @@
 
 	if (!console)
 		return;
-	
-	account = purple_accounts_find(gtk_combo_box_get_active_text(GTK_COMBO_BOX(console->dropdown)), 
+
+	account = purple_accounts_find(gtk_combo_box_get_active_text(GTK_COMBO_BOX(console->dropdown)),
 				    "prpl-jabber");
 	if (!account || !account->gc)
 		return;
-	
+
 	console->gc = account->gc;
 	gtk_imhtml_clear(GTK_IMHTML(console->imhtml));
 }
 
-static void 
-create_console(PurplePluginAction *action) 
+static void
+create_console(PurplePluginAction *action)
 {
 	GtkWidget *vbox = gtk_vbox_new(FALSE, 6);
 	GtkWidget *sw = gtk_scrolled_window_new(NULL, NULL);
@@ -743,7 +742,7 @@
 		gtk_window_present(GTK_WINDOW(console->window));
 		return;
 	}
-	
+
 	console = g_new0(XmppConsole, 1);
 
 	console->window = pidgin_create_window(_("XMPP Console"), PIDGIN_HIG_BORDER, NULL, TRUE);
@@ -773,32 +772,32 @@
 	g_signal_connect(G_OBJECT(console->dropdown), "changed", G_CALLBACK(dropdown_changed_cb), NULL);
 
 	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
 				       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
 
 	console->imhtml = gtk_imhtml_new(NULL, NULL);
 	gtk_box_pack_start(GTK_BOX(vbox), sw, TRUE, TRUE, 0);
 	if (console->count == 0)
-		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml), 
+		gtk_imhtml_append_text(GTK_IMHTML(console->imhtml),
 				       _("<font color='#777777'>Not connected to XMPP</font>"), 0);
 	gtk_container_add(GTK_CONTAINER(sw), console->imhtml);
-	
+
 	toolbar = gtk_toolbar_new();
-#if GTK_CHECK_VERSION(2,4,0)	
+#if GTK_CHECK_VERSION(2,4,0)
 	button = gtk_tool_button_new(NULL, "<iq/>");
 	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(iq_clicked_cb), NULL);
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
 #else
-	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<iq/>", 
+	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<iq/>",
 			           _("Insert an <iq/> stanza."), "foo", NULL, GTK_SIGNAL_FUNC(iq_clicked_cb), NULL);
 #endif
 
-#if GTK_CHECK_VERSION(2,4,0)	
+#if GTK_CHECK_VERSION(2,4,0)
 	button = gtk_tool_button_new(NULL, "<presence/>");
 	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(presence_clicked_cb), NULL);
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
 #else
-	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<presence/>", 
+	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<presence/>",
 			           _("Insert a <presence/> stanza."), NULL, gtk_label_new(NULL), GTK_SIGNAL_FUNC(presence_clicked_cb), NULL);
 #endif
 
@@ -807,17 +806,17 @@
 	g_signal_connect(G_OBJECT(button), "clicked", G_CALLBACK(message_clicked_cb), NULL);
 	gtk_container_add(GTK_CONTAINER(toolbar), GTK_WIDGET(button));
 #else
-	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<message/>", 
+	gtk_toolbar_append_item(GTK_TOOLBAR(toolbar), "<message/>",
 			           _("Insert a <message/> stanza."), "foo", gtk_label_new(NULL), GTK_SIGNAL_FUNC(message_clicked_cb), NULL);
 #endif
-	
+
 	gtk_box_pack_start(GTK_BOX(vbox), toolbar, FALSE, FALSE, 0);
-	
+
 	sw = gtk_scrolled_window_new(NULL, NULL);
 	gtk_scrolled_window_set_shadow_type(GTK_SCROLLED_WINDOW(sw), GTK_SHADOW_ETCHED_IN);
-	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw), 
+	gtk_scrolled_window_set_policy(GTK_SCROLLED_WINDOW(sw),
 				       GTK_POLICY_AUTOMATIC, GTK_POLICY_AUTOMATIC);
-	
+
 	console->entry = gtk_imhtml_new(NULL, NULL);
 	gtk_imhtml_set_whole_buffer_formatting_only(GTK_IMHTML(console->entry), TRUE);
 	g_signal_connect(G_OBJECT(console->entry),"message_send", G_CALLBACK(message_send_cb), console);
@@ -843,7 +842,7 @@
 
 	act = purple_plugin_action_new(_("XMPP Console"), create_console);
 	l = g_list_append(l, act);
-	
+
 	return l;
 }
 
@@ -853,28 +852,28 @@
 	PURPLE_PLUGIN_MAGIC,
 	PURPLE_MAJOR_VERSION,
 	PURPLE_MINOR_VERSION,
-	PURPLE_PLUGIN_STANDARD,                             /**< type           */
-	PIDGIN_PLUGIN_TYPE,                             /**< ui_requirement */
-	0,                                                /**< flags          */
-	NULL,                                             /**< dependencies   */
-	PURPLE_PRIORITY_DEFAULT,                            /**< priority       */
+	PURPLE_PLUGIN_STANDARD,                       /**< type           */
+	PIDGIN_PLUGIN_TYPE,                           /**< ui_requirement */
+	0,                                            /**< flags          */
+	NULL,                                         /**< dependencies   */
+	PURPLE_PRIORITY_DEFAULT,                      /**< priority       */
 
-	"gtk-xmpp",                                       /**< id             */
-	N_("XMPP Console"),                                  /**< name           */
-	DISPLAY_VERSION,                                  /**< version        */
-	                                                  /**  summary        */
+	"gtk-xmpp",                                   /**< id             */
+	N_("XMPP Console"),                           /**< name           */
+	DISPLAY_VERSION,                              /**< version        */
+	                                              /**  summary        */
 	N_("Send and receive raw XMPP stanzas."),
-	                                                  /**  description    */
+	                                              /**  description    */
 	N_("This plugin is useful for debbuging XMPP servers or clients."),
-	"Sean Egan <seanegan@gmail.com>",                 /**< author         */
-	PURPLE_WEBSITE,                                     /**< homepage       */
+	"Sean Egan <seanegan@gmail.com>",             /**< author         */
+	PURPLE_WEBSITE,                               /**< homepage       */
 
-	plugin_load,                                      /**< load           */
-	plugin_unload,                                    /**< unload         */
-	NULL,                                             /**< destroy        */
+	plugin_load,                                  /**< load           */
+	plugin_unload,                                /**< unload         */
+	NULL,                                         /**< destroy        */
 
 	NULL,                                         /**< ui_info        */
-	NULL,                                             /**< extra_info     */
+	NULL,                                         /**< extra_info     */
 	NULL,
 	actions,
 
--- a/pidgin/win32/nsis/pidgin-installer.nsi	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/win32/nsis/pidgin-installer.nsi	Sun Jun 28 04:41:07 2009 +0000
@@ -717,6 +717,7 @@
     Delete "$INSTDIR\ca-certs\GTE_CyberTrust_Global_Root.pem"
     Delete "$INSTDIR\ca-certs\Microsoft_Internet_Authority.pem"
     Delete "$INSTDIR\ca-certs\Microsoft_Secure_Server_Authority.pem"
+    Delete "$INSTDIR\ca-certs\StartCom_Certification_Authority.pem"
     Delete "$INSTDIR\ca-certs\StartCom_Free_SSL_CA.pem"
     Delete "$INSTDIR\ca-certs\Verisign_Class3_Primary_CA.pem"
     Delete "$INSTDIR\ca-certs\VeriSign_Class_3_Public_Primary_Certification_Authority_-_G5.pem"
@@ -772,6 +773,7 @@
     Delete "$INSTDIR\plugins\win2ktrans.dll"
     Delete "$INSTDIR\plugins\winprefs.dll"
     Delete "$INSTDIR\plugins\xmppconsole.dll"
+    Delete "$INSTDIR\plugins\xmppdisco.dll"
     RMDir "$INSTDIR\plugins"
     RMDir /r "$INSTDIR\sasl2"
     Delete "$INSTDIR\sounds\purple\alert.wav"
--- a/pidgin/win32/pidgin_dll_rc.rc.in	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/win32/pidgin_dll_rc.rc.in	Sun Jun 28 04:41:07 2009 +0000
@@ -2,8 +2,6 @@
 #include "version.h"
 #include "resource.h"
 
-#define PIXMAPDIR "pixmaps/tray/16/"
-
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0
   PRODUCTVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0
@@ -33,11 +31,11 @@
     END
   END
 
-PIDGIN_TRAY_AVAILABLE_4BIT	ICON PIXMAPDIR "available_4bit.ico"
-PIDGIN_TRAY_AWAY_4BIT		ICON PIXMAPDIR "away_4bit.ico"
-PIDGIN_TRAY_BUSY_4BIT		ICON PIXMAPDIR "busy_4bit.ico"
-PIDGIN_TRAY_XA_4BIT		ICON PIXMAPDIR "extended-away_4bit.ico"
-PIDGIN_TRAY_OFFLINE_4BIT	ICON PIXMAPDIR "offline_4bit.ico"
-PIDGIN_TRAY_CONNECTING_4BIT	ICON PIXMAPDIR "connecting_4bit.ico"
-PIDGIN_TRAY_PENDING_4BIT	ICON PIXMAPDIR "message_4bit.ico"
-PIDGIN_TRAY_INVISIBLE_4BIT	ICON PIXMAPDIR "invisible_4bit.ico"
+PIDGIN_TRAY_AVAILABLE_4BIT	ICON "pixmaps/tray/16/available_4bit.ico"
+PIDGIN_TRAY_AWAY_4BIT		ICON "pixmaps/tray/16/away_4bit.ico"
+PIDGIN_TRAY_BUSY_4BIT		ICON "pixmaps/tray/16/busy_4bit.ico"
+PIDGIN_TRAY_XA_4BIT		ICON "pixmaps/tray/16/extended-away_4bit.ico"
+PIDGIN_TRAY_OFFLINE_4BIT	ICON "pixmaps/tray/16/offline_4bit.ico"
+PIDGIN_TRAY_CONNECTING_4BIT	ICON "pixmaps/tray/16/connecting_4bit.ico"
+PIDGIN_TRAY_PENDING_4BIT	ICON "pixmaps/tray/16/message_4bit.ico"
+PIDGIN_TRAY_INVISIBLE_4BIT	ICON "pixmaps/tray/16/invisible_4bit.ico"
--- a/pidgin/win32/pidgin_exe_rc.rc.in	Sun May 10 06:24:26 2009 +0000
+++ b/pidgin/win32/pidgin_exe_rc.rc.in	Sun Jun 28 04:41:07 2009 +0000
@@ -2,8 +2,6 @@
 #include "resource.h"
 #include "version.h"
 
-#define PIXMAPDIR "pixmaps/"
-
 VS_VERSION_INFO VERSIONINFO
   FILEVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0
   PRODUCTVERSION PURPLE_MAJOR_VERSION,PURPLE_MINOR_VERSION,PURPLE_MICRO_VERSION,0
@@ -33,4 +31,4 @@
     END
   END
 
-PIDGIN_ICON			ICON PIXMAPDIR "pidgin.ico"
+PIDGIN_ICON			ICON "pixmaps/pidgin.ico"
--- a/po/ChangeLog	Sun May 10 06:24:26 2009 +0000
+++ b/po/ChangeLog	Sun Jun 28 04:41:07 2009 +0000
@@ -1,6 +1,19 @@
 Pidgin and Finch: The Pimpin' Penguin IM Clients That're Good for the Soul
 
 version 2.6.0
+	* Armenian translation added (David Avsharyan)
+	* Lao translation updated (Anousak Souphavah)
+	* Slovenian translation updated (Martin Srebotnjak)
+	* Swahili translation added (Paul Msegeya)
+
+version 2.5.8
+	* No changes
+
+version 2.5.7
+	* No changes
+
+version 2.5.6
+	* German translation updated (Björn Vogt)
 
 version 2.5.5
 	* Afrikaans translation updated (Friedel Wolff)
--- a/po/ca.po	Sun May 10 06:24:26 2009 +0000
+++ b/po/ca.po	Sun Jun 28 04:41:07 2009 +0000
@@ -33,8 +33,8 @@
 msgstr ""
 "Project-Id-Version: Pidgin\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-05-06 19:49+0200\n"
-"PO-Revision-Date: 2009-05-06 23:20+0200\n"
+"POT-Creation-Date: 2009-06-25 21:33+0200\n"
+"PO-Revision-Date: 2009-06-25 21:44+0200\n"
 "Last-Translator: Josep Puigdemont i Casamajó <josep.puigdemont@gmail.com>\n"
 "Language-Team: Catalan <tradgnome@softcatala.net>\n"
 "MIME-Version: 1.0\n"
@@ -1595,7 +1595,7 @@
 "Fetching TinyURL..."
 msgstr ""
 "\n"
-"S'està aconseguint una TinyURL..."
+"S'està aconseguint un TinyURL..."
 
 msgid "Only create TinyURL for urls of this length or greater"
 msgstr "Crea TinyURL per a URL així de llargues o més"
@@ -1816,6 +1816,8 @@
 msgid "+++ %s signed off"
 msgstr "+++ %s se n'ha anat"
 
+#. Unknown error
+#. Unknown error!
 msgid "Unknown error"
 msgstr "Error desconegut"
 
@@ -2717,7 +2719,7 @@
 #. *< priority
 #. *< id
 msgid "One Time Password Support"
-msgstr "Contrasenyes d'un sol us"
+msgstr "Contrasenyes d'un sol ús"
 
 #. *< name
 #. *< version
@@ -2731,7 +2733,7 @@
 "are only used in a single successful connection.\n"
 "Note: The account password must not be saved for this to work."
 msgstr ""
-"Us permet forçar que les contrasenyes siguin d'un sol us per a comptes dels "
+"Us permet forçar que les contrasenyes siguin d'un sol ús per a comptes dels "
 "quals no es desin les contrasenyes.\n"
 "Nota: per poder fer servir això, cal que no es desi la contrasenya del "
 "compte."
@@ -3196,6 +3198,10 @@
 msgid "Chat _name:"
 msgstr "_Nom del xat:"
 
+#. should this be a settings error?
+msgid "Unable to resolve server"
+msgstr "No s'ha pogut resoldre el nom del servidor"
+
 msgid "Chat error"
 msgstr "Error en el xat"
 
@@ -3244,6 +3250,9 @@
 msgid "Gadu-Gadu User"
 msgstr "Usuari Gadu-Gadu"
 
+msgid "GG server"
+msgstr "Servidor GG"
+
 #, c-format
 msgid "Unknown command: %s"
 msgstr "Ordre desconeguda: %s"
@@ -3286,8 +3295,9 @@
 msgid "_Password:"
 msgstr "_Contrasenya:"
 
-msgid "IRC nicks may not contain whitespace"
-msgstr "Els sobrenoms d'IRC no poden contenir espais en blanc"
+msgid "IRC nick and server may not contain whitespace"
+msgstr ""
+"Els sobrenoms i els noms de servidor d'IRC no poden contenir espais en blanc"
 
 #. 1. connect to server
 #. connect to the server
@@ -3761,6 +3771,9 @@
 msgid "Server does not use any supported authentication method"
 msgstr "No hi ha cap mètode d'autenticació compatible amb aquest servidor"
 
+msgid "You require encryption, but it is not available on this server."
+msgstr "Requeriu xifratge, però no està disponible en aquest servidor."
+
 msgid "Invalid challenge from server"
 msgstr "Repte del servidor invàlid"
 
@@ -3777,14 +3790,14 @@
 msgstr "Aquesta versió del protocol BOSH no està implementada"
 
 msgid "Unable to establish a connection with the server"
-msgstr "No s'ha pogut establir una connexió amb al servidor"
+msgstr "No s'ha pogut establir una connexió amb el servidor"
 
 #, c-format
 msgid ""
 "Could not establish a connection with the server:\n"
 "%s"
 msgstr ""
-"No s'ha pogut establir una connexió amb al servidor:\n"
+"No s'ha pogut establir una connexió amb el servidor:\n"
 "%s"
 
 msgid "Unable to establish SSL connection"
@@ -4037,6 +4050,13 @@
 msgid "Resource"
 msgstr "Recurs"
 
+#, c-format
+msgid "%s ago"
+msgstr "fa %s"
+
+msgid "Logged off"
+msgstr "Desconnectat"
+
 # Segons la viquipèdia
 msgid "Middle Name"
 msgstr "Nom del mig"
@@ -4214,9 +4234,6 @@
 msgid "Roles:"
 msgstr "Rols:"
 
-msgid "You require encryption, but it is not available on this server."
-msgstr "Requeriu xifratge, però no està disponible en aquest servidor."
-
 msgid "Ping timeout"
 msgstr "Temps d'espera del ping"
 
@@ -4237,8 +4254,9 @@
 msgid "Invalid XMPP ID. Domain must be set."
 msgstr "L'ID de l'XMPP no és vàlid. Cal especificar un domini."
 
-msgid "Malformed BOSH Connect Server"
-msgstr ""
+# FIX
+msgid "Malformed BOSH URL"
+msgstr "L'URL BOSH està malmès"
 
 #, c-format
 msgid "Registration of %s@%s successful"
@@ -4264,9 +4282,6 @@
 msgid "Unregistration Failed"
 msgstr "No s'ha pogut cancel·lar el registre"
 
-msgid "Already Registered"
-msgstr "Ja esteu registrat"
-
 msgid "State"
 msgstr "Estat"
 
@@ -4279,6 +4294,9 @@
 msgid "Date"
 msgstr "Data"
 
+msgid "Already Registered"
+msgstr "Ja esteu registrat"
+
 msgid "Unregister"
 msgstr "Cancel·la el registre"
 
@@ -4306,6 +4324,9 @@
 msgid "Change Registration"
 msgstr "Canvia el registre"
 
+msgid "Malformed BOSH Connect Server"
+msgstr "La connexió al servidor BOSH està malmesa"
+
 msgid "Error unregistering account"
 msgstr "S'ha produït un error en cancel·lar el registre"
 
@@ -4443,7 +4464,7 @@
 
 # FIX
 msgid "Malformed XMPP ID"
-msgstr "l'ID de l'XMPP està malmès"
+msgstr "L'ID de l'XMPP està malmès"
 
 msgid "Not Acceptable"
 msgstr "No és acceptable"
@@ -4750,6 +4771,9 @@
 msgid "File transfer proxies"
 msgstr "Servidors intermediari per a la transferència de fitxers"
 
+msgid "BOSH URL"
+msgstr "URL BOSH"
+
 #. this should probably be part of global smiley theme settings later on,
 #. shared with MSN
 msgid "Show Custom Smileys"
@@ -4812,9 +4836,8 @@
 msgid "Error in chat %s"
 msgstr "S'ha produït un error en el xat %s"
 
-#, fuzzy
 msgid "An error occured on the in-band bytestream transfer\n"
-msgstr "S'ha produït un error en obrir el fitxer."
+msgstr ""
 
 msgid "Transfer was closed."
 msgstr "La transferència s'ha tancat."
@@ -5491,17 +5514,6 @@
 msgstr "Autenticació amb el Windows Live ID: la resposta no és vàlida"
 
 #, c-format
-msgid "%s is not a valid group."
-msgstr "%s no és un nom de grup vàlid"
-
-msgid "Unknown error."
-msgstr "Error desconegut."
-
-#, c-format
-msgid "%s on %s (%s)"
-msgstr "%s a %s (%s)"
-
-#, c-format
 msgid "%s just sent you a Nudge!"
 msgstr "%s us ha donat un cop de colze!"
 
@@ -5519,38 +5531,9 @@
 msgid "The following users are missing from your addressbook"
 msgstr "Manquen aquests usuaris a la vostra llista d'amics"
 
-#, c-format
-msgid "Unable to add user on %s (%s)"
-msgstr "No s'ha pogut afegir l'usuari a %s (%s)"
-
-#, c-format
-msgid "Unable to block user on %s (%s)"
-msgstr "No s'ha pogut blocar l'usuari %s (%s)"
-
-#, c-format
-msgid "Unable to permit user on %s (%s)"
-msgstr "No s'ha pogut permetre l'usuari %s (%s)"
-
-#, c-format
-msgid "%s could not be added because your buddy list is full."
-msgstr "No s'ha pogut afegir %s perquè la llista és plena."
-
-#, c-format
-msgid "%s is not a valid passport account."
-msgstr "%s no és un compte de passaport vàlid."
-
-msgid "Service Temporarily Unavailable."
-msgstr "El servei no està disponible temporalment."
-
 msgid "Mobile message was not sent because it was too long."
 msgstr "No s'ha enviat el missatge al mòbil perquè era massa llarg."
 
-msgid "Unable to rename group"
-msgstr "No s'ha pogut canviar el nom del grup"
-
-msgid "Unable to delete group"
-msgstr "No s'ha pogut suprimir el grup"
-
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -5643,6 +5626,9 @@
 "La llista d'amics MSN està temporalment no disponible. Espereu i proveu-ho "
 "més tard."
 
+msgid "Unknown error."
+msgstr "Error desconegut."
+
 msgid "Handshaking"
 msgstr "S'està comprovant la conformitat de connexió"
 
@@ -5708,14 +5694,6 @@
 msgstr ""
 "No s'ha pogut enviar el missatge perquè s'ha produït un error desconegut:"
 
-#, c-format
-msgid "%s has added you to his or her buddy list."
-msgstr "%s us ha afegit a la seva llista d'amics."
-
-#, c-format
-msgid "%s has removed you from his or her buddy list."
-msgstr "%s us ha suprimit de la seva llista d'amics."
-
 msgid "Delete Buddy from Address Book?"
 msgstr "Voleu suprimir l'amic de la llibreta d'adreces?"
 
@@ -5745,6 +5723,51 @@
 msgstr "Connector per al protocol MSN"
 
 #, c-format
+msgid "%s is not a valid group."
+msgstr "%s no és un nom de grup vàlid"
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr "%s a %s (%s)"
+
+#, c-format
+msgid "Unable to add user on %s (%s)"
+msgstr "No s'ha pogut afegir l'usuari a %s (%s)"
+
+#, c-format
+msgid "Unable to block user on %s (%s)"
+msgstr "No s'ha pogut blocar l'usuari %s (%s)"
+
+#, c-format
+msgid "Unable to permit user on %s (%s)"
+msgstr "No s'ha pogut permetre l'usuari %s (%s)"
+
+#, c-format
+msgid "%s could not be added because your buddy list is full."
+msgstr "No s'ha pogut afegir %s perquè la llista és plena."
+
+#, c-format
+msgid "%s is not a valid passport account."
+msgstr "%s no és un compte de passaport vàlid."
+
+msgid "Service Temporarily Unavailable."
+msgstr "El servei no està disponible temporalment."
+
+msgid "Unable to rename group"
+msgstr "No s'ha pogut canviar el nom del grup"
+
+msgid "Unable to delete group"
+msgstr "No s'ha pogut suprimir el grup"
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr "%s us ha afegit a la seva llista d'amics."
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr "%s us ha suprimit de la seva llista d'amics."
+
+#, c-format
 msgid "No such user: %s"
 msgstr "Aquest usuari no existeix: %s"
 
@@ -5774,6 +5797,8 @@
 msgstr "S'ha perdut la connexió amb el servidor"
 
 #. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
 msgid "New mail messages"
 msgstr "Missatges de correu nous"
 
@@ -5825,14 +5850,16 @@
 
 #, c-format
 msgid ""
-"%s Your password is %d characters, greater than the expected maximum length "
-"of %d for MySpaceIM. Please shorten your password at http://profileedit."
-"myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try "
-"again."
-msgstr ""
-"%s La vostra contrasenya conté %d caràcters, més del màxim de %d que permet "
-"MySpaceIM. Escolliu una contrasenya més curta a http://profileedit.myspace."
-"com/index.cfm?fuseaction=accountSettings.changePassword i proveu-ho de nou."
+"%s Your password is %zu characters, which is longer than the maximum length "
+"of %d.  Please shorten your password at http://profileedit.myspace.com/index."
+"cfm?fuseaction=accountSettings.changePassword and try again."
+msgstr ""
+"%s La vostra contrasenya conté %zu caràcters, més %d que és el màxim permès. "
+"Escolliu una contrasenya més curta a http://profileedit.myspace.com/index."
+"cfm?fuseaction=accountSettings.changePassword i proveu-ho de nou."
+
+msgid "Incorrect username or password"
+msgstr "El sobrenom o la contrasenya no són correctes"
 
 msgid "MySpaceIM Error"
 msgstr "S'ha produït un error en el MySpaceIM"
@@ -5971,15 +5998,15 @@
 #. * connotation, for example, "he was zapped by electricity when
 #. * he put a fork in the toaster."
 msgid "Zap"
-msgstr ""
+msgstr "Enrampar"
 
 #, c-format
 msgid "%s has zapped you!"
-msgstr ""
+msgstr "%s us ha enrampat!"
 
 #, c-format
 msgid "Zapping %s..."
-msgstr ""
+msgstr "S'està enrampant %s..."
 
 #. Whack means "to hit or strike someone with a sharp blow"
 msgid "Whack"
@@ -6156,9 +6183,6 @@
 msgid "Master archive is misconfigured"
 msgstr "L'arxiu mestre està desconfigurat"
 
-msgid "Incorrect username or password"
-msgstr "El sobrenom o la contrasenya no són correctes"
-
 msgid "Could not recognize the host of the username you entered"
 msgstr "No s'ha pogut reconèixer l'ordinador del nom d'usuari que heu entrat"
 
@@ -6689,6 +6713,31 @@
 "començar amb una lletra i contenir només lletres, nombres o espais, o només "
 "nombres."
 
+#, c-format
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+"Pot ser que es desconnecti d'aquí a poc. Si això passés, comproveu si hi ha "
+"actualitzacions a %s."
+
+# FIXME: hash (josep)
+msgid "Unable to get a valid AIM login hash."
+msgstr "No s'ha pogut obtenir un hash d'AIM d'entrada vàlid."
+
+#, c-format
+msgid "You may be disconnected shortly.  Check %s for updates."
+msgstr ""
+"Se us pot desconnectar d'aquí a poc temps. Comproveu si hi ha "
+"actualitzacions a %s."
+
+msgid "Unable to get a valid login hash."
+msgstr "No s'ha pogut obtenir un hash d'entrada vàlid."
+
+msgid "Could Not Connect"
+msgstr "No s'ha pogut connectar"
+
+msgid "Received authorization"
+msgstr "S'ha rebut l'autorització"
+
 #. Unregistered username
 #. uid is not exist
 msgid "Invalid username."
@@ -6707,7 +6756,6 @@
 "El servei de missatges instantanis d'AOL no està disponible temporalment."
 
 #. username connecting too frequently
-#. IP address connecting too frequently
 msgid ""
 "You have been connecting and disconnecting too frequently. Wait ten minutes "
 "and try again. If you continue to try, you will need to wait even longer."
@@ -6720,11 +6768,14 @@
 msgid "The client version you are using is too old. Please upgrade at %s"
 msgstr "La versió del client que useu és massa antiga, actualitzeu-la a %s"
 
-msgid "Could Not Connect"
-msgstr "No s'ha pogut connectar"
-
-msgid "Received authorization"
-msgstr "S'ha rebut l'autorització"
+#. IP address connecting too frequently
+msgid ""
+"You have been connecting and disconnecting too frequently. Wait a minute and "
+"try again. If you continue to try, you will need to wait even longer."
+msgstr ""
+"Heu estat connectant-vos i desconnectat-vos amb massa freqüència. Espereu un "
+"minut i intenteu-ho de nou. Si continueu intentant-ho, haureu d'esperar "
+"encara més temps."
 
 msgid "The SecurID key entered is invalid."
 msgstr "La clau SecurID que heu entrat no és vàlida."
@@ -6741,25 +6792,6 @@
 msgid "_OK"
 msgstr "_D'acord"
 
-#, c-format
-msgid "You may be disconnected shortly.  If so, check %s for updates."
-msgstr ""
-"Pot ser que es desconnecti d'aquí a poc. Si això passés, comproveu si hi ha "
-"actualitzacions a %s."
-
-# FIXME: hash (josep)
-msgid "Unable to get a valid AIM login hash."
-msgstr "No s'ha pogut obtenir un hash d'AIM d'entrada vàlid."
-
-#, c-format
-msgid "You may be disconnected shortly.  Check %s for updates."
-msgstr ""
-"Se us pot desconnectar d'aquí a poc temps. Comproveu si hi ha "
-"actualitzacions a %s."
-
-msgid "Unable to get a valid login hash."
-msgstr "No s'ha pogut obtenir un hash d'entrada vàlid."
-
 msgid "Password sent"
 msgstr "S'ha enviat la contrasenya"
 
@@ -7264,6 +7296,7 @@
 msgid "Set User Info (web)..."
 msgstr "Estableix informació d'usuari (web)..."
 
+#. This only happens when connecting with the old-style BUCP login
 msgid "Change Password (web)"
 msgstr "Canvia la contrasenya (web)"
 
@@ -7293,6 +7326,9 @@
 msgid "Search for Buddy by Information"
 msgstr "Cerca un amic per la informació"
 
+msgid "Use clientLogin"
+msgstr "Empra clientLogin"
+
 msgid ""
 "Always use AIM/ICQ proxy server for\n"
 "file transfers and direct IM (slower,\n"
@@ -9603,6 +9639,38 @@
 msgid "Add buddy rejected"
 msgstr "S'ha rebutjat afegir l'amic"
 
+#. Some error in the received stream
+msgid "Received invalid data"
+msgstr "S'han rebut dades invàlides"
+
+#. Password incorrect
+msgid "Incorrect Password"
+msgstr "La contrasenya no és correcta"
+
+#. security lock from too many failed login attempts
+msgid ""
+"Account locked: Too many failed login attempts.\n"
+"Logging into the Yahoo! website may fix this."
+msgstr ""
+"El compte està blocat perquè s'ha intentat entrar massa cops.\n"
+"Això es pot solucionar entrant al web de Yahoo!"
+
+#. the username does not exist
+msgid "Username does not exist"
+msgstr "L'usuari no existeix"
+
+#. indicates a lock of some description
+msgid ""
+"Account locked: Unknown reason.\n"
+"Logging into the Yahoo! website may fix this."
+msgstr ""
+"El compte està blocat, però no se'n coneix el motiu.\n"
+"Això es pot solucionar entrant al web de Yahoo!"
+
+#. username or password missing
+msgid "Username or password missing"
+msgstr "Manquen el nom d'uruari o la contrasenya"
+
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -10518,8 +10586,8 @@
 msgid "Please update the necessary fields."
 msgstr "Actualitzeu els camps necessaris."
 
-msgid "Room _List"
-msgstr "_Llista de sales"
+msgid "A_ccount"
+msgstr "_Compte"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
@@ -10527,8 +10595,8 @@
 msgstr ""
 "Introduïu la informació necessària sobre el xat al qual vulgueu entrar.\n"
 
-msgid "_Account:"
-msgstr "C_ompte:"
+msgid "Room _List"
+msgstr "_Llista de sales"
 
 msgid "_Block"
 msgstr "_Bloca"
@@ -11464,6 +11532,9 @@
 msgid "Hungarian"
 msgstr "Hongarès"
 
+msgid "Armenian"
+msgstr "Armeni"
+
 msgid "Indonesian"
 msgstr "Indonesi"
 
@@ -11561,6 +11632,9 @@
 msgid "Swedish"
 msgstr "Suec"
 
+msgid "Swahili"
+msgstr " Suahili"
+
 msgid "Tamil"
 msgstr "Tàmil"
 
@@ -12003,11 +12077,9 @@
 msgid "Save Image"
 msgstr "Desa imatge"
 
-#, c-format
 msgid "_Save Image..."
 msgstr "_Desa la imatge..."
 
-#, c-format
 msgid "_Add Custom Smiley..."
 msgstr "_Afegeix una emoticona personalitzada..."
 
@@ -12442,6 +12514,9 @@
 msgid "Pounce on Whom"
 msgstr "Avisa dels Whom"
 
+msgid "_Account:"
+msgstr "C_ompte:"
+
 msgid "_Buddy name:"
 msgstr "_Nom de l'amic:"
 
@@ -12721,7 +12796,7 @@
 
 #. TURN server
 msgid "Relay Server (TURN)"
-msgstr ""
+msgstr "Servidor repetidor (TURN)"
 
 msgid "Proxy Server &amp; Browser"
 msgstr "Servidor intermediari i navegador"
@@ -13118,6 +13193,9 @@
 msgid "Custom Smiley Manager"
 msgstr "Gestor d'emoticones personalitzades"
 
+msgid "Select Buddy Icon"
+msgstr "Seleccioneu una icona per a l'amic"
+
 msgid "Click to change your buddyicon for this account."
 msgstr "Feu clic per canviar la icona d'amic d'aquest compte."
 
@@ -13856,12 +13934,6 @@
 "- escriu a l'inrevés tots els missatges rebuts\n"
 "- envia un missatge a tots els amics immediatament després que es connectin"
 
-msgid "Cursor Color"
-msgstr "Color del cursor"
-
-msgid "Secondary Cursor Color"
-msgstr "Color secundari del cursor"
-
 msgid "Hyperlink Color"
 msgstr "Color dels hiperenllaços"
 
@@ -13871,6 +13943,9 @@
 msgid "Highlighted Message Name Color"
 msgstr "Nom del color per als missatges ressaltats"
 
+msgid "Typing Notification Color"
+msgstr "Color per a les notificacions de quan s'escriu"
+
 msgid "GtkTreeView Horizontal Separation"
 msgstr "Separació horitzontal del GtkTreeView"
 
@@ -13900,35 +13975,21 @@
 msgid "GTK+ Text Shortcut Theme"
 msgstr "Tema de la drecera de text de GTK+"
 
-#.
-#. for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-#. hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-#. gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-#.
-#. check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
-#. widget_bool_prefs_set[i], hbox);
-#. gtk_size_group_add_widget(labelsg, check);
-#.
-#. widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
-#. *
-#. gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
-#. *
-#. gtk_widget_set_sensitive(widget_bool_widgets[i],
-#. purple_prefs_get_bool(widget_bool_prefs_set[i]));
-#. g_signal_connect(G_OBJECT(check), "toggled",
-#. G_CALLBACK(pidgin_toggle_sensitive),
-#. widget_bool_widgets[i]);
-#. }
-#.
-msgid "Interface colors"
-msgstr "Colors de la interfície"
-
-msgid "Widget Sizes"
-msgstr "Mides del giny"
+msgid "Disable Typing Notification Text"
+msgstr "Inhabilita les notificacions de que s'està escrivint"
+
+msgid "GTK+ Theme Control Settings"
+msgstr "Configuració dels temes GTK+"
+
+msgid "Colors"
+msgstr "Colors"
 
 msgid "Fonts"
 msgstr "Tipus de lletra"
 
+msgid "Miscellaneous"
+msgstr "Miscel·lània"
+
 msgid "Gtkrc File Tools"
 msgstr "Eines de fitxer Gtkrc"
 
@@ -14284,6 +14345,24 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr "Aquest connector és útil per a depurar servidors i clients XMPP."
 
+#~ msgid "Account locked: Too many failed login attempts"
+#~ msgstr "S'ha blocat el compte: s'ha intentat entrar massa vegades"
+
+#~ msgid "Account locked: See the debug log"
+#~ msgstr "El compte està blocat: vegeu el registre de depuració"
+
+#~ msgid "Cursor Color"
+#~ msgstr "Color del cursor"
+
+#~ msgid "Secondary Cursor Color"
+#~ msgstr "Color secundari del cursor"
+
+#~ msgid "Interface colors"
+#~ msgstr "Colors de la interfície"
+
+#~ msgid "Widget Sizes"
+#~ msgstr "Mides del giny"
+
 #~ msgid "Invite message"
 #~ msgstr "Missatge d'invitació"
 
@@ -14763,9 +14842,6 @@
 #~ "llista d'amics. Opcionalment podeu entrar un àlies, o sobrenom, per a "
 #~ "l'amic. El sobrenom substituirà el nom d'usuari allà on sigui possible.\n"
 
-#~ msgid "A_ccount:"
-#~ msgstr "_Compte:"
-
 #~ msgid "User has typed something and stopped"
 #~ msgstr "L'usuari ha escrit alguna cosa i s'ha aturat"
 
@@ -16310,9 +16386,6 @@
 #~ msgid "Invisible for friends only"
 #~ msgstr "Només invisible per als amics"
 
-#~ msgid "Unable to resolve hostname."
-#~ msgstr "No s'ha pogut resoldre el nom de l'ordinador."
-
 #~ msgid "Error while writing to socket."
 #~ msgstr "S'ha produït un error en escriure al sòcol."
 
@@ -16522,9 +16595,6 @@
 #~ msgid "/Buddies/Log Out"
 #~ msgstr "/Amics/Desconnecta"
 
-#~ msgid "Miscellaneous error"
-#~ msgstr "Error miscel·lani"
-
 #~ msgid "Unknown error when attempting to authorize with MSN login server."
 #~ msgstr ""
 #~ "S'ha produït un error desconegut en intentar autoritzar amb el servidor "
--- a/po/de.po	Sun May 10 06:24:26 2009 +0000
+++ b/po/de.po	Sun Jun 28 04:41:07 2009 +0000
@@ -11,9 +11,9 @@
 msgstr ""
 "Project-Id-Version: de\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-04-30 10:37-0400\n"
-"PO-Revision-Date: 2009-04-26 12:11+0200\n"
-"Last-Translator: Jochen Kemnade <jochenkemnade@web.de>\n"
+"POT-Creation-Date: 2009-06-11 12:42+0200\n"
+"PO-Revision-Date: 2009-06-11 12:40+0200\n"
+"Last-Translator: Bjoern Voigt <bjoern@cs.tu-berlin.de>\n"
 "Language-Team: Deutsch <de@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -877,7 +877,7 @@
 msgstr "System-Mitschnitt"
 
 msgid "Calling ... "
-msgstr "Anrufen..."
+msgstr "Anrufen ... "
 
 msgid "Hangup"
 msgstr "Auflegen"
@@ -1562,7 +1562,6 @@
 msgid "Lastlog plugin."
 msgstr "Verlauf-Plugin."
 
-#, c-format
 msgid ""
 "\n"
 "Fetching TinyURL..."
@@ -1789,6 +1788,8 @@
 msgid "+++ %s signed off"
 msgstr "+++ %s hat sich abgemeldet"
 
+#. Unknown error
+#. Unknown error!
 msgid "Unknown error"
 msgstr "Unbekannter Fehler"
 
@@ -1890,7 +1891,6 @@
 "Fehler beim Lesen vom Auflösungsprozess:\n"
 "%s"
 
-#, c-format
 msgid "Resolver process exited without answering our request"
 msgstr "Auflösungsprozess hat sich beendet ohne die Anfrage zu beantworten"
 
@@ -3169,6 +3169,10 @@
 msgid "Chat _name:"
 msgstr "Chat_name:"
 
+#. should this be a settings error?
+msgid "Unable to resolve server"
+msgstr "Verbindung zum Server nicht möglich"
+
 msgid "Chat error"
 msgstr "Chatfehler"
 
@@ -3217,6 +3221,10 @@
 msgid "Gadu-Gadu User"
 msgstr "Gadu-Gadu-Benutzer"
 
+#, fuzzy
+msgid "GG server"
+msgstr "Hole server"
+
 #, c-format
 msgid "Unknown command: %s"
 msgstr "Unbekanntes Kommando: %s"
@@ -3259,8 +3267,8 @@
 msgid "_Password:"
 msgstr "_Passwort:"
 
-msgid "IRC nicks may not contain whitespace"
-msgstr "IRC-Nicknamen dürfen keine Leerzeichen enthalten"
+msgid "IRC nick and server may not contain whitespace"
+msgstr "IRC- Server und -Nicknamen dürfen keine Leerzeichen enthalten"
 
 #. 1. connect to server
 #. connect to the server
@@ -3463,7 +3471,7 @@
 #. notify the user that their /nick command didn't go.
 #, c-format
 msgid "The nickname \"%s\" is already being used."
-msgstr "Der Spitzname \"%s\" existiert bereits."
+msgstr "Der Spitzname „%s“ existiert bereits."
 
 #, fuzzy
 msgid "Nickname in use"
@@ -3743,6 +3751,10 @@
 msgid "Server does not use any supported authentication method"
 msgstr "Der Server benutzt keine der unterstützten Authentifizierungsmethoden"
 
+msgid "You require encryption, but it is not available on this server."
+msgstr ""
+"Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar."
+
 msgid "Invalid challenge from server"
 msgstr "Ungültige Challenge vom Server"
 
@@ -3750,21 +3762,16 @@
 msgstr "SASL-Fehler"
 
 msgid "The BOSH connection manager terminated your session."
-msgstr ""
-
-#, fuzzy
+msgstr "Der BOSH-Verbindungsmanager hat Ihre Sitzung beendet."
+
 msgid "No session ID given"
-msgstr "Kein Grund angegeben"
-
-#, fuzzy
+msgstr "Keine Sitzungs-ID angegeben"
+
 msgid "Unsupported version of BOSH protocol"
-msgstr "Nicht-unterstützte Version"
-
-#, fuzzy
+msgstr "Nicht-unterstützte Version des BOSH-Protokolls"
+
 msgid "Unable to establish a connection with the server"
-msgstr ""
-"Die Verbindung mit dem Server konnte nicht hergestellt werden:\n"
-"%s"
+msgstr "Die Verbindung mit dem Server konnte nicht hergestellt werden"
 
 #, c-format
 msgid ""
@@ -3774,9 +3781,8 @@
 "Die Verbindung mit dem Server konnte nicht hergestellt werden:\n"
 "%s"
 
-#, fuzzy
 msgid "Unable to establish SSL connection"
-msgstr "Kann Verbindung nicht erstellen"
+msgstr "Kann SSL-Verbindung nicht erstellen"
 
 msgid "Unable to create socket"
 msgstr "Kann Socket nicht erstellen"
@@ -4012,6 +4018,14 @@
 msgid "Resource"
 msgstr "Ressource"
 
+#, c-format
+msgid "%s ago"
+msgstr "vor %s"
+
+#, fuzzy
+msgid "Logged off"
+msgstr "Abgemeldet"
+
 msgid "Middle Name"
 msgstr "Zweiter Name"
 
@@ -4181,9 +4195,16 @@
 msgid "Find Rooms"
 msgstr "Finde Räume"
 
-msgid "You require encryption, but it is not available on this server."
-msgstr ""
-"Sie fordern Verschlüsselung, aber diese ist auf dem Server nicht verfügbar."
+#, fuzzy
+msgid "Affiliations:"
+msgstr "Alias:"
+
+msgid "No users found"
+msgstr "Keine Benutzer gefunden"
+
+#, fuzzy
+msgid "Roles:"
+msgstr "Funktion"
 
 msgid "Ping timeout"
 msgstr "Ping-Zeitüberschreitung"
@@ -4191,7 +4212,6 @@
 msgid "Read Error"
 msgstr "Fehler beim Lesen"
 
-#, c-format
 msgid ""
 "Could not find alternative XMPP connection methods after failing to connect "
 "directly.\n"
@@ -4203,9 +4223,8 @@
 msgid "Invalid XMPP ID. Domain must be set."
 msgstr "Falsche XMPP-ID. Die Domain muss gesetzt werden."
 
-#, fuzzy
 msgid "Malformed BOSH Connect Server"
-msgstr "Verbindung zum Server nicht möglich."
+msgstr ""
 
 #, c-format
 msgid "Registration of %s@%s successful"
@@ -4231,9 +4250,6 @@
 msgid "Unregistration Failed"
 msgstr "Aufheben der Registrierung gescheitert"
 
-msgid "Already Registered"
-msgstr "Schon registriert"
-
 msgid "State"
 msgstr "Provinz/Bundesland"
 
@@ -4246,6 +4262,9 @@
 msgid "Date"
 msgstr "Datum"
 
+msgid "Already Registered"
+msgstr "Schon registriert"
+
 msgid "Unregister"
 msgstr "Aufheben der Registrierung"
 
@@ -4619,7 +4638,7 @@
 "session."
 msgstr ""
 "Bitte wählen Sie die Ressource von %s, mir der Sie eine Medien-Sitzung "
-"starten möchten"
+"starten möchten."
 
 msgid "Select a Resource"
 msgstr "Wählen Sie eine Ressource"
@@ -4645,16 +4664,18 @@
 msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
 msgstr "ban &lt;Benutzer&gt; [Grund]:  Verbanne einen Benutzer aus dem Raum."
 
-msgid ""
-"affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
-"affiliation with the room."
+#, fuzzy
+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;Benutzer&gt; &lt;owner|admin|member|outcast|none&gt;: Setze "
 "eine Benutzerzugehörigkeit für den Raum."
 
-msgid ""
-"role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
-"role in the room."
+#, fuzzy
+msgid ""
+"role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
+"users with an role or set users' role with the room."
 msgstr ""
 "role &lt;Benutzer&gt; &lt;moderator|participant|visitor|none&gt;: Setze eine "
 "Rolle für den Benutzer im Raum."
@@ -4781,12 +4802,11 @@
 msgid "Error in chat %s"
 msgstr "Fehler im Chat %s"
 
-#, fuzzy
 msgid "An error occured on the in-band bytestream transfer\n"
-msgstr "Beim Öffnen der Datei trat ein Fehler auf."
+msgstr "Beim Übertragen der Datei trat ein Fehler auf\n"
 
 msgid "Transfer was closed."
-msgstr "Übertragung wurde geschlossen"
+msgstr "Übertragung wurde geschlossen."
 
 msgid "Failed to open the file"
 msgstr "Öffnen der Datei fehlgeschlagen"
@@ -4888,219 +4908,166 @@
 "%s ist auf der lokalen Liste, aber nicht auf der Serverliste. Möchten Sie, "
 "dass der Buddy hinzugefügt wird?"
 
-#, c-format
 msgid "Unable to parse message"
 msgstr "Kann die Nachricht nicht parsen"
 
-#, c-format
 msgid "Syntax Error (probably a client bug)"
 msgstr "Syntaxfehler (wahrscheinlich ein Client-Bug)"
 
-#, c-format
 msgid "Invalid email address"
 msgstr "Ungültige E-Mail-Adresse"
 
-#, c-format
 msgid "User does not exist"
 msgstr "Benutzer existiert nicht"
 
-#, c-format
 msgid "Fully qualified domain name missing"
 msgstr "Der Fully Qualified Domain Name fehlt"
 
-#, c-format
 msgid "Already logged in"
 msgstr "Schon angemeldet"
 
-#, c-format
 msgid "Invalid username"
 msgstr "Ungültiger Benutzername"
 
-#, c-format
 msgid "Invalid friendly name"
 msgstr "Ungültiger Freundesname"
 
-#, c-format
 msgid "List full"
 msgstr "Liste voll"
 
-#, c-format
 msgid "Already there"
 msgstr "Schon da"
 
-#, c-format
 msgid "Not on list"
 msgstr "Nicht auf der Liste"
 
-#, c-format
 msgid "User is offline"
 msgstr "Benutzer ist offline"
 
-#, c-format
 msgid "Already in the mode"
 msgstr "Bereits in diesem Modus"
 
-#, c-format
 msgid "Already in opposite list"
 msgstr "Bereits in der „Gegenteil-Liste“"
 
-#, c-format
 msgid "Too many groups"
 msgstr "Zu viele Gruppen"
 
-#, c-format
 msgid "Invalid group"
 msgstr "Ungültige Gruppe"
 
-#, c-format
 msgid "User not in group"
 msgstr "Benutzer ist nicht in der Gruppe"
 
-#, c-format
 msgid "Group name too long"
 msgstr "Name der Gruppe ist zu lang"
 
-#, c-format
 msgid "Cannot remove group zero"
 msgstr "Kann die Gruppe „Null“ nicht entfernen"
 
-#, c-format
 msgid "Tried to add a user to a group that doesn't exist"
 msgstr ""
 "Versuchte einen Benutzer zu einer nichtexistierenden Gruppe hinzuzufügen"
 
-#, c-format
 msgid "Switchboard failed"
 msgstr "Vermittlung gescheitert"
 
-#, c-format
 msgid "Notify transfer failed"
 msgstr "Übertragung der Benachrichtigung gescheitert"
 
-#, c-format
 msgid "Required fields missing"
 msgstr "Notwendige Felder fehlen"
 
-#, c-format
 msgid "Too many hits to a FND"
 msgstr "Zu viele Treffer zu einem FND"
 
-#, c-format
 msgid "Not logged in"
 msgstr "Nicht angemeldet"
 
-#, c-format
 msgid "Service temporarily unavailable"
 msgstr "Dienst momentan nicht verfügbar"
 
-#, c-format
 msgid "Database server error"
 msgstr "Fehler des Datenbank-Servers"
 
-#, c-format
 msgid "Command disabled"
 msgstr "Kommando abgeschaltet"
 
-#, c-format
 msgid "File operation error"
 msgstr "Dateiverarbeitungsfehler"
 
-#, c-format
 msgid "Memory allocation error"
 msgstr "Fehler bei der Speicheranforderung"
 
-#, c-format
 msgid "Wrong CHL value sent to server"
 msgstr "Falscher CHL-Wert zum Server gesendet"
 
-#, c-format
 msgid "Server busy"
 msgstr "Server beschäftigt"
 
-#, c-format
 msgid "Server unavailable"
 msgstr "Server unerreichbar"
 
-#, c-format
 msgid "Peer notification server down"
 msgstr "Peer-Benachrichtigungsserver nicht erreichbar"
 
-#, c-format
 msgid "Database connect error"
 msgstr "Datenbank-Verbindungsfehler"
 
-#, c-format
 msgid "Server is going down (abandon ship)"
 msgstr "Server fährt runter (melden Sie sich ab)"
 
-#, c-format
 msgid "Error creating connection"
 msgstr "Fehler beim Herstellen der Verbindung"
 
-#, c-format
 msgid "CVR parameters are either unknown or not allowed"
 msgstr "CVR-Parameter sind entweder unbekannt oder nicht erlaubt"
 
-#, c-format
 msgid "Unable to write"
 msgstr "Schreiben nicht möglich"
 
-#, c-format
 msgid "Session overload"
 msgstr "Sitzung überlastet"
 
-#, c-format
 msgid "User is too active"
 msgstr "Benutzer ist zu aktiv"
 
-#, c-format
 msgid "Too many sessions"
 msgstr "Zu viele Sitzungen"
 
-#, c-format
 msgid "Passport not verified"
 msgstr "Passport (MSN Benutzerausweis) wurde nicht überprüft"
 
-#, c-format
 msgid "Bad friend file"
 msgstr "Falsche Friends-Datei"
 
-#, c-format
 msgid "Not expected"
 msgstr "Nicht erwartet"
 
-#, c-format
 msgid "Friendly name changes too rapidly"
 msgstr "Benutzernamen werden zu oft geändert"
 
-#, c-format
 msgid "Server too busy"
 msgstr "Server ist zu beschäftigt"
 
-#, c-format
 msgid "Authentication failed"
 msgstr "Authentifizierung fehlgeschlagen"
 
-#, c-format
 msgid "Not allowed when offline"
 msgstr "Nicht erlaubt im Offline-Modus"
 
-#, c-format
 msgid "Not accepting new users"
 msgstr "Akzeptiert keine neuen Benutzer"
 
-#, c-format
 msgid "Kids Passport without parental consent"
 msgstr "Kinder-Passwort ohne die Zustimmung der Eltern"
 
-#, c-format
 msgid "Passport account not yet verified"
 msgstr "Passport-Konto wurde noch nicht überprüft"
 
 msgid "Passport account suspended"
 msgstr "Passport-Konto gesperrt"
 
-#, c-format
 msgid "Bad ticket"
 msgstr "Falsches Ticket"
 
@@ -5463,63 +5430,26 @@
 msgstr "Windows Live ID-Authentifikation:Ungültige Antwort"
 
 #, c-format
-msgid "%s is not a valid group."
-msgstr "%s ist keine gültige Gruppe."
-
-msgid "Unknown error."
-msgstr "Unbekannter Fehler."
-
-#, c-format
-msgid "%s on %s (%s)"
-msgstr "%s auf %s (%s)"
-
-#, c-format
 msgid "%s just sent you a Nudge!"
 msgstr "%s hat Sie gerade angestoßen!"
 
-#. char *adl = g_strndup(payload, len);
+#, c-format
+msgid "Unknown error (%d): %s"
+msgstr "Unbekannter Fehler (%d): %s"
+
+msgid "Unable to add user"
+msgstr "Kann den Benutzer nicht hinzufügen"
+
 #, c-format
 msgid "Unknown error (%d)"
 msgstr "Unbekannter Fehler (%d)"
 
-msgid "Unable to add user"
-msgstr "Kann den Benutzer nicht hinzufügen"
-
 msgid "The following users are missing from your addressbook"
 msgstr "Die folgenden Benutzer fehlen in Ihrem Adressbuch"
 
-#, c-format
-msgid "Unable to add user on %s (%s)"
-msgstr "Kann den Benutzer nicht zu %s (%s) hinzufügen"
-
-#, c-format
-msgid "Unable to block user on %s (%s)"
-msgstr "Kann den Benutzer nicht für %s (%s) blockieren"
-
-#, c-format
-msgid "Unable to permit user on %s (%s)"
-msgstr "Kann den Benutzer nicht für %s (%s) erlauben"
-
-#, c-format
-msgid "%s could not be added because your buddy list is full."
-msgstr "%s konnte nicht hinzugefügt werden, da Ihre Buddy-Liste voll ist."
-
-#, c-format
-msgid "%s is not a valid passport account."
-msgstr "%s ist kein gültiges Passport-Konto."
-
-msgid "Service Temporarily Unavailable."
-msgstr "Dienst momentan nicht verfügbar."
-
 msgid "Mobile message was not sent because it was too long."
 msgstr "Mobile Nachricht wurde nicht gesendet, da sie zu lang war."
 
-msgid "Unable to rename group"
-msgstr "Kann die Gruppe nicht umbenennen"
-
-msgid "Unable to delete group"
-msgstr "Kann die Gruppe nicht löschen"
-
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -5616,6 +5546,9 @@
 "Ihre MSN-Buddy-Liste ist temporär nicht verfügbar. Bitte warten Sie und "
 "versuchen Sie es später nochmal."
 
+msgid "Unknown error."
+msgstr "Unbekannter Fehler."
+
 msgid "Handshaking"
 msgstr "Abgleich"
 
@@ -5683,14 +5616,6 @@
 "Nachricht konnte nicht gesendet werden, da ein unbekannter Fehler "
 "aufgetreten ist:"
 
-#, c-format
-msgid "%s has added you to his or her buddy list."
-msgstr "Der Benutzer %s hat Sie zu seiner Buddy-Liste hinzugefügt."
-
-#, c-format
-msgid "%s has removed you from his or her buddy list."
-msgstr "Der Benutzer %s hat Sie von seiner Buddy-Liste gelöscht."
-
 msgid "Delete Buddy from Address Book?"
 msgstr "Buddy aus dem Adressbuch löschen?"
 
@@ -5720,6 +5645,51 @@
 msgstr "MSN-Protokoll-Plugin"
 
 #, c-format
+msgid "%s is not a valid group."
+msgstr "%s ist keine gültige Gruppe."
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr "%s auf %s (%s)"
+
+#, c-format
+msgid "Unable to add user on %s (%s)"
+msgstr "Kann den Benutzer nicht zu %s (%s) hinzufügen"
+
+#, c-format
+msgid "Unable to block user on %s (%s)"
+msgstr "Kann den Benutzer nicht für %s (%s) blockieren"
+
+#, c-format
+msgid "Unable to permit user on %s (%s)"
+msgstr "Kann den Benutzer nicht für %s (%s) erlauben"
+
+#, c-format
+msgid "%s could not be added because your buddy list is full."
+msgstr "%s konnte nicht hinzugefügt werden, da Ihre Buddy-Liste voll ist."
+
+#, c-format
+msgid "%s is not a valid passport account."
+msgstr "%s ist kein gültiges Passport-Konto."
+
+msgid "Service Temporarily Unavailable."
+msgstr "Dienst momentan nicht verfügbar."
+
+msgid "Unable to rename group"
+msgstr "Kann die Gruppe nicht umbenennen"
+
+msgid "Unable to delete group"
+msgstr "Kann die Gruppe nicht löschen"
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr "Der Benutzer %s hat Sie zu seiner Buddy-Liste hinzugefügt."
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr "Der Benutzer %s hat Sie von seiner Buddy-Liste gelöscht."
+
+#, c-format
 msgid "No such user: %s"
 msgstr "Kein solcher Benutzer: %s"
 
@@ -5749,6 +5719,8 @@
 msgstr "Verbindung zum Server verloren"
 
 #. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
 msgid "New mail messages"
 msgstr "Neue Mail-Nachrichten"
 
@@ -6817,7 +6789,7 @@
 msgstr "Möchten Sie diesen Buddy zu Ihrer Buddy-Liste hinzufügen?"
 
 msgid "_Add"
-msgstr "_Hinzufügen"
+msgstr "Hinzu_fügen"
 
 msgid "_Decline"
 msgstr "_Ablehnen"
@@ -8653,7 +8625,6 @@
 msgid "<br><b>Channel Topic:</b><br>%s"
 msgstr "<br><b>Thema des Kanals:</b><br>%s"
 
-#, c-format
 msgid "<br><b>Channel Modes:</b> "
 msgstr "<br><b>Kanal-Modi:</b> "
 
@@ -8678,7 +8649,6 @@
 msgid "Channel Public Keys List"
 msgstr "Liste der öffentlichen Schlüssel des Kanals"
 
-#, c-format
 msgid ""
 "Channel authentication is used to secure the channel from unauthorized "
 "access. The authentication may be based on passphrase and digital "
@@ -9080,7 +9050,6 @@
 msgid "Your Current Mood"
 msgstr "Ihre momentane Stimmung"
 
-#, c-format
 msgid "Normal"
 msgstr "Normal"
 
@@ -9466,47 +9435,37 @@
 msgid "No server statistics available"
 msgstr "Keine Serverstatistik verfügbar"
 
-#, c-format
 msgid "Failure: Version mismatch, upgrade your client"
 msgstr "Fehler: Unterschiedliche Version, aktualisieren Sie Ihren Client"
 
-#, c-format
 msgid "Failure: Remote does not trust/support your public key"
 msgstr ""
 "Fehler: Die entfernte Seite vertraut Ihrem öffentlichen Schlüssel nicht"
 
-#, c-format
 msgid "Failure: Remote does not support proposed KE group"
 msgstr ""
 "Fehler: Entferntes Programm unterstützt nicht die vorgeschlagen KE-Gruppe"
 
-#, c-format
 msgid "Failure: Remote does not support proposed cipher"
 msgstr ""
 "Fehler: Entferntes Programm unterstützt die vorgeschlagene Cipher nicht"
 
-#, c-format
 msgid "Failure: Remote does not support proposed PKCS"
 msgstr "Fehler: Entferntes Programm unterstützt die vorgeschlagene PKCS nicht"
 
-#, c-format
 msgid "Failure: Remote does not support proposed hash function"
 msgstr ""
 "Fehler: Entferntes Programm unterstützt die vorgeschlagen Hashfunktion nicht"
 
-#, c-format
 msgid "Failure: Remote does not support proposed HMAC"
 msgstr "Fehler: Entferntes Programm unterstützt das vorgeschlagene HMAC nicht"
 
-#, c-format
 msgid "Failure: Incorrect signature"
 msgstr "Fehler: Falsche Signatur"
 
-#, c-format
 msgid "Failure: Invalid cookie"
 msgstr "Fehler: Ungültiger Cookie"
 
-#, c-format
 msgid "Failure: Authentication failed"
 msgstr "Fehler: Authentifizierung fehlgeschlagen"
 
@@ -9606,6 +9565,40 @@
 msgid "Add buddy rejected"
 msgstr "Hinzufügen des Buddys zurückgewiesen"
 
+#. Some error in the received stream
+msgid "Received invalid data"
+msgstr "Ungültige Daten empfangen"
+
+#. Password incorrect
+msgid "Incorrect Password"
+msgstr "Falsches Passwort"
+
+#. security lock from too many failed login attempts
+#, fuzzy
+msgid ""
+"Account locked: Too many failed login attempts.\n"
+"Logging into the Yahoo! website may fix this."
+msgstr ""
+"Unbekannte Fehlernummer %d. Vielleicht kann dies repariert werden, wenn Sie "
+"sich auf der Yahoo! Webseite anmelden."
+
+#. the username does not exist
+msgid "Username does not exist"
+msgstr "Benutzername existiert nicht"
+
+#. indicates a lock of some description
+#, fuzzy
+msgid ""
+"Account locked: Unknown reason.\n"
+"Logging into the Yahoo! website may fix this."
+msgstr ""
+"Unbekannte Fehlernummer %d. Vielleicht kann dies repariert werden, wenn Sie "
+"sich auf der Yahoo! Webseite anmelden."
+
+#. username or password missing
+msgid "Username or password missing"
+msgstr "Benutzername oder Passwort fehlt"
+
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -10322,29 +10315,24 @@
 msgstr " (%s)"
 
 #. 10053
-#, c-format
 msgid "Connection interrupted by other software on your computer."
 msgstr ""
 "Die Verbindung wurde von einer anderen Software auf ihrem Computer "
 "unterbrochen."
 
 #. 10054
-#, c-format
 msgid "Remote host closed connection."
 msgstr "Der entfernte Host hat die Verbindung beendet."
 
 #. 10060
-#, c-format
 msgid "Connection timed out."
 msgstr "Verbindungsabbruch wegen Zeitüberschreitung."
 
 #. 10061
-#, c-format
 msgid "Connection refused."
 msgstr "Verbindung abgelehnt."
 
 #. 10048
-#, c-format
 msgid "Address already in use."
 msgstr "Adresse wird bereits benutzt."
 
@@ -10520,8 +10508,8 @@
 msgid "Please update the necessary fields."
 msgstr "Bitte aktualisieren Sie die erforderlichen Felder."
 
-msgid "Room _List"
-msgstr "Ra_umliste"
+msgid "A_ccount"
+msgstr "K_onto"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
@@ -10530,8 +10518,8 @@
 "Bitte geben Sie geeignete Informationen über den Chat ein, den Sie betreten "
 "wollen.\n"
 
-msgid "_Account:"
-msgstr "_Konto:"
+msgid "Room _List"
+msgstr "Ra_umliste"
 
 msgid "_Block"
 msgstr "_Sperren"
@@ -10651,7 +10639,7 @@
 msgstr "/Buddys/Anzeigen/_Offline-Buddys"
 
 msgid "/Buddies/Show/_Empty Groups"
-msgstr "/Buddys/Anzeigen/_leere Gruppen"
+msgstr "/Buddys/Anzeigen/_Leere Gruppen"
 
 msgid "/Buddies/Show/Buddy _Details"
 msgstr "/Buddys/Anzeigen/Buddy-_Details"
@@ -10892,7 +10880,7 @@
 msgstr "/Buddys/Anzeigen/Offline-Buddys"
 
 msgid "/Buddies/Show/Empty Groups"
-msgstr "/Buddys/Anzeigen/leere Gruppen"
+msgstr "/Buddys/Anzeigen/Leere Gruppen"
 
 msgid "/Buddies/Show/Buddy Details"
 msgstr "/Buddys/Anzeigen/Buddy-Details"
@@ -11465,6 +11453,9 @@
 msgid "Hungarian"
 msgstr "Ungarisch"
 
+msgid "Armenian"
+msgstr "Armenisch"
+
 msgid "Indonesian"
 msgstr "Indonesisch"
 
@@ -11561,6 +11552,9 @@
 msgid "Swedish"
 msgstr "Schwedisch"
 
+msgid "Swahili"
+msgstr "Swahili"
+
 msgid "Tamil"
 msgstr "Tamilisch"
 
@@ -11620,7 +11614,6 @@
 "geschützt.  Die Datei 'COPYRIGHT' enthält die komplette Liste der "
 "Mitwirkenden.  Wir übernehmen keine Haftung für dieses Programm.<BR><BR>"
 
-#, c-format
 msgid ""
 "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
 "\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
@@ -11628,7 +11621,6 @@
 "<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
 "\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
 
-#, c-format
 msgid ""
 "<FONT SIZE=\"4\">Help via e-mail:</FONT> <A HREF=\"mailto:support@pidgin.im"
 "\">support@pidgin.im</A><BR/><BR/>"
@@ -11636,13 +11628,11 @@
 "<FONT SIZE=\"4\">Hilfe per E-Mail:</FONT> <A HREF=\"mailto:support@pidgin.im"
 "\">support@pidgin.im</A><BR/><BR/>"
 
-#, c-format
 msgid ""
 "<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>"
 msgstr ""
 "<FONT SIZE=\"4\">IRC-Kanal:</FONT> #pidgin auf irc.freenode.net<BR><BR>"
 
-#, c-format
 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>"
 
@@ -11671,7 +11661,7 @@
 msgstr "_Name"
 
 msgid "_Account"
-msgstr "_Konto"
+msgstr "K_onto"
 
 msgid "Get User Info"
 msgstr "Benutzer-Info abrufen"
@@ -12001,11 +11991,9 @@
 msgid "Save Image"
 msgstr "Bild speichern"
 
-#, c-format
 msgid "_Save Image..."
 msgstr "Bild _speichern..."
 
-#, c-format
 msgid "_Add Custom Smiley..."
 msgstr "Benutzerdefinierten Smiley _hinzufügen..."
 
@@ -12305,7 +12293,6 @@
 msgid "Pidgin"
 msgstr "Pidgin"
 
-#, c-format
 msgid "Exiting because another libpurple client is already running.\n"
 msgstr "Wird geschlossen, da bereits ein anderer libpurple-Client läuft\n"
 
@@ -12427,17 +12414,20 @@
 msgid "Pounce on Whom"
 msgstr "Bei wem alarmieren"
 
+msgid "_Account:"
+msgstr "K_onto:"
+
 msgid "_Buddy name:"
-msgstr "_Buddy-Name:"
+msgstr "Budd_y-Name:"
 
 msgid "Si_gns on"
-msgstr "_sich anmeldet"
+msgstr "si_ch anmeldet"
 
 msgid "Signs o_ff"
 msgstr "sich abmel_det"
 
 msgid "Goes a_way"
-msgstr "_hinausgeht"
+msgstr "hinausgeh_t"
 
 msgid "Ret_urns from away"
 msgstr "wi_eder anwesend ist"
@@ -12446,22 +12436,22 @@
 msgstr "_untätig wird"
 
 msgid "Is no longer i_dle"
-msgstr "nicht meh_r untätig ist"
+msgstr "nicht _mehr untätig ist"
 
 msgid "Starts _typing"
-msgstr "zu _tippen beginnt"
+msgstr "zu tippen _beginnt"
 
 msgid "P_auses while typing"
-msgstr "beim Tippen an_hält"
+msgstr "beim Tippen anh_ält"
 
 msgid "Stops t_yping"
 msgstr "aufhört _zu tippen"
 
 msgid "Sends a _message"
-msgstr "eine _Nachricht sendet"
+msgstr "eine Nachr_icht sendet"
 
 msgid "Ope_n an IM window"
-msgstr "Gesprächsfenster ö_ffnen"
+msgstr "_Gesprächsfenster öffnen"
 
 msgid "_Pop up a notification"
 msgstr "_Popup-Benachrichtigung"
@@ -12470,22 +12460,22 @@
 msgstr "_Nachricht senden"
 
 msgid "E_xecute a command"
-msgstr "Befeh_l ausführen"
+msgstr "Befehl ausfüh_ren"
 
 msgid "P_lay a sound"
-msgstr "einen _Klang abspielen"
+msgstr "Einen _Klang abspielen"
 
 msgid "Brows_e..."
-msgstr "Aus_wählen..."
+msgstr "Au_swählen..."
 
 msgid "Br_owse..."
-msgstr "Aus_wählen..."
+msgstr "Auswäh_len..."
 
 msgid "Pre_view"
 msgstr "_Vorschau"
 
 msgid "P_ounce only when my status is not Available"
-msgstr "Nur _alarmieren, wenn ich nicht verfügbar bin"
+msgstr "Nur alarmieren, wenn ich nicht ver_fügbar bin"
 
 msgid "_Recurring"
 msgstr "_Wiederkehrend"
@@ -12493,47 +12483,36 @@
 msgid "Pounce Target"
 msgstr "Alarm-Ziel"
 
-#, c-format
 msgid "Started typing"
 msgstr "Beginnt zu tippen"
 
-#, c-format
 msgid "Paused while typing"
 msgstr "Hat beim Tippen angehalten"
 
-#, c-format
 msgid "Signed on"
 msgstr "Hat sich anmeldet"
 
-#, c-format
 msgid "Returned from being idle"
 msgstr "Ist nicht mehr inaktiv"
 
-#, c-format
 msgid "Returned from being away"
 msgstr "Ist wieder anwesend"
 
-#, c-format
 msgid "Stopped typing"
 msgstr "Hat das Tippen gestoppt"
 
-#, c-format
 msgid "Signed off"
 msgstr "Hat sich abmeldet"
 
-#, c-format
 msgid "Became idle"
 msgstr "Wurde untätig"
 
-#, c-format
 msgid "Went away"
 msgstr "Ging hinaus"
 
-#, c-format
 msgid "Sent a message"
 msgstr "Eine Nachricht senden"
 
-#, c-format
 msgid "Unknown.... Please report this!"
 msgstr "Unbekannt.... Bitte berichten Sie dieses Problem!"
 
@@ -12814,27 +12793,21 @@
 msgid "Sound Selection"
 msgstr "Klang-Auswahl"
 
-#, c-format
 msgid "Quietest"
 msgstr "Am leisesten"
 
-#, c-format
 msgid "Quieter"
 msgstr "Leiser"
 
-#, c-format
 msgid "Quiet"
 msgstr "Leise"
 
-#, c-format
 msgid "Loud"
 msgstr "Laut"
 
-#, c-format
 msgid "Louder"
 msgstr "Lauter"
 
-#, c-format
 msgid "Loudest"
 msgstr "Am lautesten"
 
@@ -13104,6 +13077,9 @@
 msgid "Custom Smiley Manager"
 msgstr "Verwaltung für benutzerdefinierte Smileys"
 
+msgid "Select Buddy Icon"
+msgstr "Buddy-Icon auswählen"
+
 msgid "Click to change your buddyicon for this account."
 msgstr "Klicken Sie hier, um Ihr Buddy-Icon für dieses Konto zu ändern."
 
@@ -13841,12 +13817,6 @@
 "- Es sendet eine Nachricht zu Leuten in Ihrer Buddy Liste, direkt wenn Sie "
 "sich angemeldet haben"
 
-msgid "Cursor Color"
-msgstr "Cursor-Farbe"
-
-msgid "Secondary Cursor Color"
-msgstr "Sekundäre Cursor-Farbe"
-
 msgid "Hyperlink Color"
 msgstr "Hyperlink-Farbe"
 
@@ -13856,6 +13826,10 @@
 msgid "Highlighted Message Name Color"
 msgstr "Farbe des Absendernamens für hervorgehobene Nachrichten"
 
+#, fuzzy
+msgid "Typing Notification Color"
+msgstr "Farbe der Tipp-Benachrichtigung"
+
 msgid "GtkTreeView Horizontal Separation"
 msgstr "GtkTreeview horizontaler Abstand"
 
@@ -13871,7 +13845,6 @@
 msgid "Select Color"
 msgstr "Farbe auswählen"
 
-#, c-format
 msgid "Select Interface Font"
 msgstr "Schriftart wählen"
 
@@ -13885,35 +13858,24 @@
 msgid "GTK+ Text Shortcut Theme"
 msgstr "GTK+ Text Shortcut-Thema"
 
-#.
-#. for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
-#. hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
-#. gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
-#.
-#. check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
-#. widget_bool_prefs_set[i], hbox);
-#. gtk_size_group_add_widget(labelsg, check);
-#.
-#. widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
-#. *
-#. gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
-#. *
-#. gtk_widget_set_sensitive(widget_bool_widgets[i],
-#. purple_prefs_get_bool(widget_bool_prefs_set[i]));
-#. g_signal_connect(G_OBJECT(check), "toggled",
-#. G_CALLBACK(pidgin_toggle_sensitive),
-#. widget_bool_widgets[i]);
-#. }
-#.
-msgid "Interface colors"
-msgstr "UI-Farben"
-
-msgid "Widget Sizes"
-msgstr "Widget-Größen"
+#, fuzzy
+msgid "Disable Typing Notification Text"
+msgstr "Tipp-Benachrichtigung aktivieren"
+
+#, fuzzy
+msgid "GTK+ Theme Control Settings"
+msgstr "Pidgin GTK+ Themenkontrolle"
+
+#, fuzzy
+msgid "Colors"
+msgstr "Schließen"
 
 msgid "Fonts"
 msgstr "Schrift"
 
+msgid "Miscellaneous"
+msgstr ""
+
 msgid "Gtkrc File Tools"
 msgstr "Gtkrc-Datei-Werkzeuge"
 
@@ -14096,7 +14058,6 @@
 msgid "Timestamp Format Options"
 msgstr "Zeitstempelformat-Optionen"
 
-#, c-format
 msgid "_Force 24-hour time format"
 msgstr "_Erzwinge 24-Stunden Zeitformat"
 
@@ -14264,16 +14225,3 @@
 msgid "This plugin is useful for debbuging XMPP servers or clients."
 msgstr ""
 "Dieses Plugin ist nützlich zur Fehlersuche in XMPP-Servern oder -Clients."
-
-#~ msgid "Invite message"
-#~ msgstr "Einladungsnachricht"
-
-#~ msgid ""
-#~ "Please enter the name of the user you wish to invite,\n"
-#~ "along with an optional invite message."
-#~ msgstr ""
-#~ "Bitte geben Sie den Benutzernamen der Person ein, die Sie einladen "
-#~ "möchten zusammen mit einer optionalen Einladungsnachricht."
-
-#~ msgid "ST_UN server:"
-#~ msgstr "ST_UN Server:"
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/po/hy.po	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,13365 @@
+# translation of am.po to Armenian
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# 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"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-05-26 20:21-0700\n"
+"PO-Revision-Date: 2009-05-20 17:37+0400\n"
+"Last-Translator: David Avsharyan <avsharyan@gmail.com>\n"
+"Language-Team: \n"
+"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"
+
+#. Translators may want to transliterate the name.
+#. It is not to be translated.
+msgid "Finch"
+msgstr "Սերինոս"
+
+#, c-format
+msgid "%s. Try `%s -h' for more information.\n"
+msgstr "%s. Ավելի շատ ինֆորմացիայի համար հավագեք `%s -h'.\n"
+
+#, c-format
+msgid ""
+"%s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stderr\n"
+"  -h, --help          display this help and exit\n"
+"  -n, --nologin       don't automatically login\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+"%s\n"
+"Կիրառում: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    օգտագործել DIR կոնֆիգուրացիոն ֆայլերի համար\n"
+"  -d, --debug         կարգաբերվող հաղորդագրությունները տպել դեպի ստանդարտ "
+"սխալների հոսք\n"
+"  -h, --help          ցույց տալ այս օգնությունը և դուրս գալ\n"
+"  -n, --nologin       ոչ ինքնաբերաբար մուտք\n"
+"  -v, --version       ցույց տալ ընթացիկ տարբերակը և դուրս գալ\n"
+
+#, c-format
+msgid ""
+"%s encountered errors migrating your settings from %s to %s. Please "
+"investigate and complete the migration by hand. Please report this error at "
+"http://developer.pidgin.im"
+msgstr ""
+
+#, fuzzy
+msgid "Error"
+msgstr "Սխալներզ"
+
+msgid "Account was not added"
+msgstr ""
+
+msgid "Username of an account must be non-empty."
+msgstr "Օգտագործողի անունը  ..."
+
+msgid "New mail notifications"
+msgstr "Նոր նամակի ծանուցումներ"
+
+msgid "Remember password"
+msgstr "Հիշել գաղտնաբառը"
+
+msgid "There are no protocol plugins installed."
+msgstr "Այնտեղ տեղադրված չէ պրոտոկոլի ավելացումներ․"
+
+msgid "(You probably forgot to 'make install'.)"
+msgstr "(Հավանաբար դուք  մոռացել եք անեք 'make install'.)"
+
+msgid "Modify Account"
+msgstr "Ձևափոխել Հաշիվը"
+
+msgid "New Account"
+msgstr "Նոր Հաշիվ"
+
+msgid "Protocol:"
+msgstr "Արձանագրություն։"
+
+msgid "Username:"
+msgstr "Օգտագործողի անունը։"
+
+msgid "Password:"
+msgstr "Գաղտնաբառ։"
+
+msgid "Alias:"
+msgstr "Փոխանուն։"
+
+#. Register checkbox
+msgid "Create this account on the server"
+msgstr "Ստեղծել այս հաշիվը սերվերի վրա"
+
+#. Cancel button
+#. Cancel
+msgid "Cancel"
+msgstr "Չեղյալ համարել"
+
+#. Save button
+#. Save
+msgid "Save"
+msgstr "Պահպանել"
+
+#, c-format
+msgid "Are you sure you want to delete %s?"
+msgstr "Դուք համոզված եք, որ ցանկանում եք ջնջել %s?"
+
+msgid "Delete Account"
+msgstr "Ջնջել Հաշիվը"
+
+#. Delete button
+msgid "Delete"
+msgstr "Ջնջել"
+
+msgid "Accounts"
+msgstr "Հաշիվներ"
+
+msgid "You can enable/disable accounts from the following list."
+msgstr "Դուք կարող եք միացնել/անջատել հաշիվները հետևյալ ցանկից․"
+
+#. Add button
+msgid "Add"
+msgstr "Ավելացնել"
+
+#. Modify button
+msgid "Modify"
+msgstr "Փոփոխել"
+
+#, c-format
+msgid "%s%s%s%s has made %s his or her buddy%s%s"
+msgstr ""
+
+msgid "Add buddy to your list?"
+msgstr ""
+
+#, c-format
+msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
+msgstr ""
+
+msgid "Authorize buddy?"
+msgstr ""
+
+msgid "Authorize"
+msgstr "Լիազորում"
+
+msgid "Deny"
+msgstr "Մերժել"
+
+#, c-format
+msgid ""
+"Online: %d\n"
+"Total: %d"
+msgstr ""
+"Կապի մեջ: %d\n"
+"Ընդհանուր: %d"
+
+#, c-format
+msgid "Account: %s (%s)"
+msgstr "Հաշիվ: %s (%s"
+
+#, c-format
+msgid ""
+"\n"
+"Last Seen: %s ago"
+msgstr ""
+"\n"
+"Last Seen: %s ago"
+
+msgid "Default"
+msgstr ""
+
+msgid "You must provide a username for the buddy."
+msgstr ""
+
+msgid "You must provide a group."
+msgstr ""
+
+msgid "You must select an account."
+msgstr ""
+
+msgid "The selected account is not online."
+msgstr ""
+
+msgid "Error adding buddy"
+msgstr ""
+
+msgid "Username"
+msgstr ""
+
+msgid "Alias (optional)"
+msgstr ""
+
+msgid "Add in group"
+msgstr ""
+
+msgid "Account"
+msgstr ""
+
+msgid "Add Buddy"
+msgstr ""
+
+msgid "Please enter buddy information."
+msgstr ""
+
+msgid "Chats"
+msgstr ""
+
+#. Extract their Name and put it in
+msgid "Name"
+msgstr ""
+
+msgid "Alias"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Auto-join"
+msgstr ""
+
+msgid "Add Chat"
+msgstr ""
+
+msgid "You can edit more information from the context menu later."
+msgstr ""
+
+msgid "Error adding group"
+msgstr ""
+
+msgid "You must give a name for the group to add."
+msgstr ""
+
+msgid "Add Group"
+msgstr ""
+
+msgid "Enter the name of the group"
+msgstr ""
+
+msgid "Edit Chat"
+msgstr ""
+
+msgid "Please Update the necessary fields."
+msgstr ""
+
+msgid "Edit"
+msgstr ""
+
+msgid "Edit Settings"
+msgstr ""
+
+msgid "Information"
+msgstr ""
+
+msgid "Retrieving..."
+msgstr ""
+
+msgid "Get Info"
+msgstr ""
+
+msgid "Add Buddy Pounce"
+msgstr ""
+
+msgid "Send File"
+msgstr ""
+
+msgid "Blocked"
+msgstr ""
+
+msgid "Show when offline"
+msgstr ""
+
+#, c-format
+msgid "Please enter the new name for %s"
+msgstr ""
+
+msgid "Rename"
+msgstr ""
+
+msgid "Set Alias"
+msgstr ""
+
+msgid "Enter empty string to reset the name."
+msgstr ""
+
+msgid "Removing this contact will also remove all the buddies in the contact"
+msgstr ""
+
+msgid "Removing this group will also remove all the buddies in the group"
+msgstr ""
+
+#, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr ""
+
+#. XXX: anything to do with the returned ui-handle?
+msgid "Confirm Remove"
+msgstr ""
+
+msgid "Remove"
+msgstr ""
+
+#. Buddy List
+msgid "Buddy List"
+msgstr ""
+
+msgid "Place tagged"
+msgstr ""
+
+msgid "Toggle Tag"
+msgstr ""
+
+msgid "View Log"
+msgstr ""
+
+#. General
+msgid "Nickname"
+msgstr ""
+
+#. Never know what those translations might end up like...
+#. Idle stuff
+msgid "Idle"
+msgstr ""
+
+msgid "On Mobile"
+msgstr ""
+
+msgid "New..."
+msgstr ""
+
+msgid "Saved..."
+msgstr ""
+
+msgid "Plugins"
+msgstr ""
+
+msgid "Block/Unblock"
+msgstr ""
+
+msgid "Block"
+msgstr ""
+
+msgid "Unblock"
+msgstr ""
+
+msgid ""
+"Please enter the username or alias of the person you would like to Block/"
+"Unblock."
+msgstr ""
+
+#. Not multiline
+#. Not masked?
+#. No hints?
+msgid "OK"
+msgstr "OK"
+
+msgid "New Instant Message"
+msgstr ""
+
+msgid "Please enter the username or alias of the person you would like to IM."
+msgstr ""
+
+msgid "Channel"
+msgstr "Ալիք"
+
+msgid "Join a Chat"
+msgstr "Միանալ զրույցին"
+
+msgid "Please enter the name of the chat you want to join."
+msgstr ""
+
+msgid "Join"
+msgstr "Միանալ"
+
+msgid ""
+"Please enter the username or alias of the person whose log you would like to "
+"view."
+msgstr ""
+
+#. Create the "Options" frame.
+msgid "Options"
+msgstr ""
+
+msgid "Send IM..."
+msgstr ""
+
+msgid "Block/Unblock..."
+msgstr "Փակել/Բացել"
+
+msgid "Join Chat..."
+msgstr "Միանալ զրույցին ... "
+
+msgid "View Log..."
+msgstr "Նայել գրառումները․․․"
+
+msgid "View All Logs"
+msgstr "Նայել մատյանի բոլոր գրառումները"
+
+msgid "Show"
+msgstr "Ցույց տալ"
+
+msgid "Empty groups"
+msgstr "Դատարկ խմբեր"
+
+msgid "Offline buddies"
+msgstr ""
+
+msgid "Sort"
+msgstr "Դասակարգել"
+
+msgid "By Status"
+msgstr "Ըստ "
+
+msgid "Alphabetically"
+msgstr ""
+
+msgid "By Log Size"
+msgstr ""
+
+msgid "Buddy"
+msgstr ""
+
+msgid "Chat"
+msgstr "Զրույց"
+
+msgid "Grouping"
+msgstr ""
+
+msgid "Certificate Import"
+msgstr ""
+
+msgid "Specify a hostname"
+msgstr ""
+
+msgid "Type the host name this certificate is for."
+msgstr ""
+
+#, c-format
+msgid ""
+"File %s could not be imported.\n"
+"Make sure that the file is readable and in PEM format.\n"
+msgstr ""
+
+msgid "Certificate Import Error"
+msgstr ""
+
+msgid "X.509 certificate import failed"
+msgstr ""
+
+msgid "Select a PEM certificate"
+msgstr ""
+
+#, c-format
+msgid ""
+"Export to file %s failed.\n"
+"Check that you have write permission to the target path\n"
+msgstr ""
+
+msgid "Certificate Export Error"
+msgstr ""
+
+msgid "X.509 certificate export failed"
+msgstr ""
+
+msgid "PEM X.509 Certificate Export"
+msgstr ""
+
+#, c-format
+msgid "Certificate for %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Common name: %s\n"
+"\n"
+"SHA1 fingerprint:\n"
+"%s"
+msgstr ""
+
+msgid "SSL Host Certificate"
+msgstr ""
+
+#, c-format
+msgid "Really delete certificate for %s?"
+msgstr ""
+
+msgid "Confirm certificate delete"
+msgstr ""
+
+msgid "Certificate Manager"
+msgstr ""
+
+#. Creating the user splits
+msgid "Hostname"
+msgstr ""
+
+msgid "Info"
+msgstr ""
+
+#. Close button
+msgid "Close"
+msgstr ""
+
+#, c-format
+msgid "%s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s disconnected."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s\n"
+"\n"
+"Finch will not attempt to reconnect the account until you correct the error "
+"and re-enable the account."
+msgstr ""
+
+msgid "Re-enable Account"
+msgstr ""
+
+msgid ""
+"The account has disconnected and you are no longer in this chat. You will be "
+"automatically rejoined in the chat when the account reconnects."
+msgstr ""
+
+msgid "No such command."
+msgstr ""
+
+msgid "Syntax Error:  You typed the wrong number of arguments to that command."
+msgstr ""
+
+msgid "Your command failed for an unknown reason."
+msgstr ""
+
+msgid "That command only works in chats, not IMs."
+msgstr ""
+
+msgid "That command only works in IMs, not chats."
+msgstr ""
+
+msgid "That command doesn't work on this protocol."
+msgstr ""
+
+msgid "Message was not sent, because you are not signed on."
+msgstr ""
+
+#, c-format
+msgid "%s (%s -- %s)"
+msgstr ""
+
+#, c-format
+msgid "%s [%s]"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"%s is typing..."
+msgstr ""
+
+msgid "You have left this chat."
+msgstr ""
+
+msgid "Logging started. Future messages in this conversation will be logged."
+msgstr ""
+
+msgid ""
+"Logging stopped. Future messages in this conversation will not be logged."
+msgstr ""
+
+msgid "Send To"
+msgstr ""
+
+msgid "Conversation"
+msgstr ""
+
+msgid "Clear Scrollback"
+msgstr ""
+
+msgid "Show Timestamps"
+msgstr ""
+
+msgid "Add Buddy Pounce..."
+msgstr ""
+
+msgid "Invite..."
+msgstr ""
+
+msgid "Enable Logging"
+msgstr ""
+
+msgid "Enable Sounds"
+msgstr ""
+
+msgid "<AUTO-REPLY> "
+msgstr ""
+
+#, c-format
+msgid "List of %d user:\n"
+msgid_plural "List of %d users:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Supported debug options are:  version"
+msgstr ""
+
+msgid "No such command (in this context)."
+msgstr ""
+
+msgid ""
+"Use \"/help &lt;command&gt;\" for help on a specific command.\n"
+"The following commands are available in this context:\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s is not a valid message class. See '/help msgcolor' for valid message "
+"classes."
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid color. See '/help msgcolor' for valid colors."
+msgstr ""
+
+msgid ""
+"say &lt;message&gt;:  Send a message normally as if you weren't using a "
+"command."
+msgstr ""
+
+msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
+msgstr ""
+
+msgid ""
+"debug &lt;option&gt;:  Send various debug information to the current "
+"conversation."
+msgstr ""
+
+msgid "clear: Clears the conversation scrollback."
+msgstr ""
+
+msgid "help &lt;command&gt;:  Help on a specific command."
+msgstr ""
+
+msgid "users:  Show the list of users in the chat."
+msgstr ""
+
+msgid "plugins: Show the plugins window."
+msgstr ""
+
+msgid "buddylist: Show the buddylist."
+msgstr ""
+
+msgid "accounts: Show the accounts window."
+msgstr ""
+
+msgid "debugwin: Show the debug window."
+msgstr ""
+
+msgid "prefs: Show the preference window."
+msgstr ""
+
+msgid "statuses: Show the savedstatuses window."
+msgstr ""
+
+msgid ""
+"msgcolor &lt;class&gt; &lt;foreground&gt; &lt;background&gt;: Set the color "
+"for different classes of messages in the conversation window.<br>    &lt;"
+"class&gt;: receive, send, highlight, action, timestamp<br>    &lt;foreground/"
+"background&gt;: black, red, green, blue, white, gray, darkgray, magenta, "
+"cyan, default<br><br>EXAMPLE:<br>    msgcolor send cyan default"
+msgstr ""
+
+msgid "Unable to open file."
+msgstr ""
+
+msgid "Debug Window"
+msgstr ""
+
+#. XXX: Setting the GROW_Y for the following widgets don't make sense. But right now
+#. * it's necessary to make the width of the debug window resizable ... like I said,
+#. * it doesn't make sense. The bug is likely in the packing in gntbox.c.
+#.
+msgid "Clear"
+msgstr ""
+
+msgid "Filter:"
+msgstr ""
+
+msgid "Pause"
+msgstr ""
+
+#, c-format
+msgid "File Transfers - %d%% of %d file"
+msgid_plural "File Transfers - %d%% of %d files"
+msgstr[0] ""
+msgstr[1] ""
+
+#. Create the window.
+msgid "File Transfers"
+msgstr ""
+
+msgid "Progress"
+msgstr ""
+
+msgid "Filename"
+msgstr ""
+
+msgid "Size"
+msgstr ""
+
+msgid "Speed"
+msgstr ""
+
+msgid "Remaining"
+msgstr ""
+
+#. XXX: Use of ggp_str_to_uin() is an ugly hack!
+msgid "Status"
+msgstr ""
+
+msgid "Close this window when all transfers finish"
+msgstr ""
+
+msgid "Clear finished transfers"
+msgstr ""
+
+msgid "Stop"
+msgstr ""
+
+msgid "Waiting for transfer to begin"
+msgstr ""
+
+msgid "Canceled"
+msgstr ""
+
+msgid "Failed"
+msgstr ""
+
+#, c-format
+msgid "%.2f KiB/s"
+msgstr ""
+
+msgid "Sent"
+msgstr ""
+
+msgid "Received"
+msgstr ""
+
+msgid "Finished"
+msgstr ""
+
+#, c-format
+msgid "The file was saved as %s."
+msgstr ""
+
+msgid "Sending"
+msgstr ""
+
+msgid "Receiving"
+msgstr ""
+
+#, c-format
+msgid "Conversation in %s on %s"
+msgstr ""
+
+#, c-format
+msgid "Conversation with %s on %s"
+msgstr ""
+
+msgid "%B %Y"
+msgstr ""
+
+msgid ""
+"System events will only be logged if the \"Log all status changes to system "
+"log\" preference is enabled."
+msgstr ""
+
+msgid ""
+"Instant messages will only be logged if the \"Log all instant messages\" "
+"preference is enabled."
+msgstr ""
+
+msgid ""
+"Chats will only be logged if the \"Log all chats\" preference is enabled."
+msgstr ""
+
+msgid "No logs were found"
+msgstr ""
+
+msgid "Total log size:"
+msgstr ""
+
+#. Search box *********
+msgid "Scroll/Search: "
+msgstr ""
+
+#, c-format
+msgid "Conversations in %s"
+msgstr ""
+
+#, c-format
+msgid "Conversations with %s"
+msgstr ""
+
+msgid "All Conversations"
+msgstr ""
+
+msgid "System Log"
+msgstr ""
+
+msgid "Calling ... "
+msgstr ""
+
+msgid "Hangup"
+msgstr ""
+
+#. Number of actions
+msgid "Accept"
+msgstr ""
+
+msgid "Reject"
+msgstr ""
+
+msgid "Call in progress."
+msgstr ""
+
+msgid "The call has been terminated."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start an audio session with you."
+msgstr ""
+
+#, c-format
+msgid "%s is trying to start an unsupported media session type with you."
+msgstr ""
+
+msgid "You have rejected the call."
+msgstr ""
+
+msgid "call: Make an audio call."
+msgstr ""
+
+msgid "Emails"
+msgstr ""
+
+msgid "You have mail!"
+msgstr ""
+
+msgid "Sender"
+msgstr ""
+
+msgid "Subject"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) has %d new message."
+msgid_plural "%s (%s) has %d new messages."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "New Mail"
+msgstr ""
+
+#, c-format
+msgid "Info for %s"
+msgstr ""
+
+msgid "Buddy Information"
+msgstr ""
+
+msgid "Continue"
+msgstr ""
+
+msgid "IM"
+msgstr ""
+
+msgid "Invite"
+msgstr ""
+
+msgid "(none)"
+msgstr ""
+
+msgid "URI"
+msgstr ""
+
+msgid "ERROR"
+msgstr ""
+
+msgid "loading plugin failed"
+msgstr ""
+
+msgid "unloading plugin failed"
+msgstr ""
+
+#, c-format
+msgid ""
+"Name: %s\n"
+"Version: %s\n"
+"Description: %s\n"
+"Author: %s\n"
+"Website: %s\n"
+"Filename: %s\n"
+msgstr ""
+
+msgid "Plugin need to be loaded before you can configure it."
+msgstr ""
+
+msgid "No configuration options for this plugin."
+msgstr ""
+
+msgid "Error loading plugin"
+msgstr ""
+
+msgid "The selected file is not a valid plugin."
+msgstr ""
+
+msgid ""
+"Please open the debug window and try again to see the exact error message."
+msgstr ""
+
+msgid "Select plugin to install"
+msgstr ""
+
+msgid "You can (un)load plugins from the following list."
+msgstr ""
+
+msgid "Install Plugin..."
+msgstr ""
+
+msgid "Configure Plugin"
+msgstr ""
+
+#. copy the preferences to tmp values...
+#. * I liked "take affect immediately" Oh well :-(
+#. (that should have been "effect," right?)
+#. Back to instant-apply! I win!  BU-HAHAHA!
+#. Create the window
+msgid "Preferences"
+msgstr ""
+
+msgid "Please enter a buddy to pounce."
+msgstr ""
+
+msgid "New Buddy Pounce"
+msgstr ""
+
+msgid "Edit Buddy Pounce"
+msgstr ""
+
+msgid "Pounce Who"
+msgstr ""
+
+#. Account:
+msgid "Account:"
+msgstr ""
+
+msgid "Buddy name:"
+msgstr ""
+
+#. Create the "Pounce When Buddy..." frame.
+msgid "Pounce When Buddy..."
+msgstr ""
+
+msgid "Signs on"
+msgstr ""
+
+msgid "Signs off"
+msgstr ""
+
+msgid "Goes away"
+msgstr ""
+
+msgid "Returns from away"
+msgstr ""
+
+msgid "Becomes idle"
+msgstr ""
+
+msgid "Is no longer idle"
+msgstr ""
+
+msgid "Starts typing"
+msgstr ""
+
+msgid "Pauses while typing"
+msgstr ""
+
+msgid "Stops typing"
+msgstr ""
+
+msgid "Sends a message"
+msgstr ""
+
+#. Create the "Action" frame.
+msgid "Action"
+msgstr ""
+
+msgid "Open an IM window"
+msgstr ""
+
+msgid "Pop up a notification"
+msgstr ""
+
+msgid "Send a message"
+msgstr ""
+
+msgid "Execute a command"
+msgstr ""
+
+msgid "Play a sound"
+msgstr ""
+
+msgid "Pounce only when my status is not Available"
+msgstr ""
+
+msgid "Recurring"
+msgstr ""
+
+msgid "Cannot create pounce"
+msgstr ""
+
+msgid "You do not have any accounts."
+msgstr ""
+
+msgid "You must create an account first before you can create a pounce."
+msgstr ""
+
+#, c-format
+msgid "Are you sure you want to delete the pounce on %s for %s?"
+msgstr ""
+
+msgid "Buddy Pounces"
+msgstr ""
+
+#, c-format
+msgid "%s has started typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has paused while typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has signed on (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has returned from being idle (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has returned from being away (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has stopped typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has signed off (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has become idle (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has gone away. (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has sent you a message. (%s)"
+msgstr ""
+
+msgid "Unknown pounce event. Please report this!"
+msgstr ""
+
+msgid "Based on keyboard use"
+msgstr ""
+
+msgid "From last sent message"
+msgstr ""
+
+msgid "Never"
+msgstr ""
+
+msgid "Show Idle Time"
+msgstr ""
+
+msgid "Show Offline Buddies"
+msgstr ""
+
+msgid "Notify buddies when you are typing"
+msgstr ""
+
+msgid "Log format"
+msgstr ""
+
+msgid "Log IMs"
+msgstr ""
+
+msgid "Log chats"
+msgstr ""
+
+msgid "Log status change events"
+msgstr ""
+
+msgid "Report Idle time"
+msgstr ""
+
+msgid "Change status when idle"
+msgstr ""
+
+msgid "Minutes before changing status"
+msgstr ""
+
+msgid "Change status to"
+msgstr ""
+
+msgid "Conversations"
+msgstr ""
+
+msgid "Logging"
+msgstr ""
+
+msgid "You must fill all the required fields."
+msgstr ""
+
+msgid "The required fields are underlined."
+msgstr ""
+
+msgid "Not implemented yet."
+msgstr ""
+
+msgid "Save File..."
+msgstr ""
+
+msgid "Open File..."
+msgstr ""
+
+msgid "Choose Location..."
+msgstr ""
+
+msgid "Hit 'Enter' to find more rooms of this category."
+msgstr ""
+
+msgid "Get"
+msgstr ""
+
+#. Create the window.
+msgid "Room List"
+msgstr ""
+
+msgid "Buddy logs in"
+msgstr ""
+
+msgid "Buddy logs out"
+msgstr ""
+
+msgid "Message received"
+msgstr ""
+
+msgid "Message received begins conversation"
+msgstr ""
+
+msgid "Message sent"
+msgstr ""
+
+msgid "Person enters chat"
+msgstr ""
+
+msgid "Person leaves chat"
+msgstr ""
+
+msgid "You talk in chat"
+msgstr ""
+
+msgid "Others talk in chat"
+msgstr ""
+
+msgid "Someone says your username in chat"
+msgstr ""
+
+msgid "GStreamer Failure"
+msgstr ""
+
+msgid "GStreamer failed to initialize."
+msgstr ""
+
+msgid "(default)"
+msgstr ""
+
+msgid "Select Sound File ..."
+msgstr ""
+
+msgid "Sound Preferences"
+msgstr ""
+
+msgid "Profiles"
+msgstr ""
+
+msgid "Automatic"
+msgstr ""
+
+msgid "Console Beep"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "No Sound"
+msgstr ""
+
+msgid "Sound Method"
+msgstr ""
+
+msgid "Method: "
+msgstr ""
+
+#, c-format
+msgid ""
+"Sound Command\n"
+"(%s for filename)"
+msgstr ""
+
+#. Sound options
+msgid "Sound Options"
+msgstr ""
+
+msgid "Sounds when conversation has focus"
+msgstr ""
+
+msgid "Always"
+msgstr ""
+
+msgid "Only when available"
+msgstr ""
+
+msgid "Only when not available"
+msgstr ""
+
+msgid "Volume(0-100):"
+msgstr ""
+
+#. Sound events
+msgid "Sound Events"
+msgstr ""
+
+msgid "Event"
+msgstr ""
+
+msgid "File"
+msgstr ""
+
+msgid "Test"
+msgstr ""
+
+msgid "Reset"
+msgstr ""
+
+msgid "Choose..."
+msgstr ""
+
+#, c-format
+msgid "Are you sure you want to delete \"%s\""
+msgstr ""
+
+msgid "Delete Status"
+msgstr ""
+
+msgid "Saved Statuses"
+msgstr ""
+
+msgid "Title"
+msgstr ""
+
+msgid "Type"
+msgstr ""
+
+#. Statuses are almost all the same. Define a macro to reduce code repetition.
+#. PurpleStatusPrimitive
+#. id - use default
+#. name - use default
+#. saveable
+#. user_settable
+#. not independent
+#. Attributes - each status can have a message.
+msgid "Message"
+msgstr ""
+
+#. Use
+msgid "Use"
+msgstr ""
+
+msgid "Invalid title"
+msgstr ""
+
+msgid "Please enter a non-empty title for the status."
+msgstr ""
+
+msgid "Duplicate title"
+msgstr ""
+
+msgid "Please enter a different title for the status."
+msgstr ""
+
+msgid "Substatus"
+msgstr ""
+
+msgid "Status:"
+msgstr ""
+
+msgid "Message:"
+msgstr ""
+
+msgid "Edit Status"
+msgstr ""
+
+msgid "Use different status for following accounts"
+msgstr ""
+
+#. Save & Use
+msgid "Save & Use"
+msgstr ""
+
+msgid "Certificates"
+msgstr ""
+
+msgid "Sounds"
+msgstr ""
+
+msgid "Statuses"
+msgstr ""
+
+msgid "Error loading the plugin."
+msgstr ""
+
+msgid "Couldn't find X display"
+msgstr ""
+
+msgid "Couldn't find window"
+msgstr ""
+
+msgid "This plugin cannot be loaded because it was not built with X11 support."
+msgstr ""
+
+msgid "GntClipboard"
+msgstr ""
+
+msgid "Clipboard plugin"
+msgstr ""
+
+msgid ""
+"When the gnt clipboard contents change, the contents are made available to "
+"X, if possible."
+msgstr ""
+
+#, c-format
+msgid "%s just signed on"
+msgstr ""
+
+#, c-format
+msgid "%s just signed off"
+msgstr ""
+
+#, c-format
+msgid "%s sent you a message"
+msgstr ""
+
+#, c-format
+msgid "%s said your nick in %s"
+msgstr ""
+
+#, c-format
+msgid "%s sent a message in %s"
+msgstr ""
+
+msgid "Buddy signs on/off"
+msgstr ""
+
+msgid "You receive an IM"
+msgstr ""
+
+msgid "Someone speaks in a chat"
+msgstr ""
+
+msgid "Someone says your name in a chat"
+msgstr ""
+
+msgid "Notify with a toaster when"
+msgstr ""
+
+msgid "Beep too!"
+msgstr ""
+
+msgid "Set URGENT for the terminal window."
+msgstr ""
+
+msgid "GntGf"
+msgstr ""
+
+msgid "Toaster plugin"
+msgstr ""
+
+#, c-format
+msgid "<b>Conversation with %s on %s:</b><br>"
+msgstr ""
+
+msgid "History Plugin Requires Logging"
+msgstr ""
+
+msgid ""
+"Logging can be enabled from Tools -> Preferences -> Logging.\n"
+"\n"
+"Enabling logs for instant messages and/or chats will activate history for "
+"the same conversation type(s)."
+msgstr ""
+
+msgid "GntHistory"
+msgstr ""
+
+msgid "Shows recently logged conversations in new conversations."
+msgstr ""
+
+msgid ""
+"When a new conversation is opened this plugin will insert the last "
+"conversation into the current conversation."
+msgstr ""
+
+msgid "Online"
+msgstr ""
+
+msgid "Offline"
+msgstr ""
+
+msgid "Online Buddies"
+msgstr ""
+
+msgid "Offline Buddies"
+msgstr ""
+
+msgid "Online/Offline"
+msgstr ""
+
+msgid "Meebo"
+msgstr ""
+
+msgid "No Grouping"
+msgstr ""
+
+msgid "Nested Subgroup"
+msgstr ""
+
+msgid "Nested Grouping (experimental)"
+msgstr ""
+
+msgid "Provides alternate buddylist grouping options."
+msgstr ""
+
+msgid "Lastlog"
+msgstr ""
+
+#. Translator Note: The "backlog" is the conversation buffer/history.
+msgid "lastlog: Searches for a substring in the backlog."
+msgstr ""
+
+msgid "GntLastlog"
+msgstr ""
+
+msgid "Lastlog plugin."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"Fetching TinyURL..."
+msgstr ""
+
+msgid "Only create TinyURL for urls of this length or greater"
+msgstr ""
+
+msgid "TinyURL (or other) address prefix"
+msgstr ""
+
+msgid "TinyURL"
+msgstr ""
+
+msgid "TinyURL plugin"
+msgstr ""
+
+msgid "When receiving a message with URL(s), TinyURL for easier copying"
+msgstr ""
+
+msgid "accounts"
+msgstr ""
+
+msgid "Password is required to sign on."
+msgstr ""
+
+#, c-format
+msgid "Enter password for %s (%s)"
+msgstr ""
+
+msgid "Enter Password"
+msgstr ""
+
+msgid "Save password"
+msgstr ""
+
+#, c-format
+msgid "Missing protocol plugin for %s"
+msgstr ""
+
+msgid "Connection Error"
+msgstr ""
+
+msgid "New passwords do not match."
+msgstr ""
+
+msgid "Fill out all fields completely."
+msgstr ""
+
+msgid "Original password"
+msgstr ""
+
+msgid "New password"
+msgstr ""
+
+msgid "New password (again)"
+msgstr ""
+
+#, c-format
+msgid "Change password for %s"
+msgstr ""
+
+msgid "Please enter your current password and your new password."
+msgstr ""
+
+#, c-format
+msgid "Change user information for %s"
+msgstr ""
+
+msgid "Set User Info"
+msgstr ""
+
+msgid "Unknown"
+msgstr ""
+
+msgid "Buddies"
+msgstr ""
+
+msgid "buddy list"
+msgstr ""
+
+msgid "(DOES NOT MATCH)"
+msgstr ""
+
+#. Make messages
+#, c-format
+msgid "%s has presented the following certificate for just-this-once use:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Common name: %s %s\n"
+"Fingerprint (SHA1): %s"
+msgstr ""
+
+#. TODO: Find what the handle ought to be
+msgid "Single-use Certificate Verification"
+msgstr ""
+
+#. Scheme name
+#. Pool name
+msgid "Certificate Authorities"
+msgstr ""
+
+#. Scheme name
+#. Pool name
+msgid "SSL Peers Cache"
+msgstr ""
+
+#. Make messages
+#, c-format
+msgid "Accept certificate for %s?"
+msgstr ""
+
+#. TODO: Find what the handle ought to be
+msgid "SSL Certificate Verification"
+msgstr ""
+
+msgid "_View Certificate..."
+msgstr ""
+
+#. Prompt the user to authenticate the certificate
+#. vrq will be completed by user_auth
+#, c-format
+msgid ""
+"The certificate presented by \"%s\" is self-signed. It cannot be "
+"automatically checked."
+msgstr ""
+
+#, c-format
+msgid "The certificate chain presented for %s is not valid."
+msgstr ""
+
+#. TODO: Make this error either block the ensuing SSL
+#. connection error until the user dismisses this one, or
+#. stifle it.
+#. TODO: Probably wrong.
+#. TODO: Probably wrong
+msgid "SSL Certificate Error"
+msgstr ""
+
+msgid "Invalid certificate chain"
+msgstr ""
+
+#. vrq will be completed by user_auth
+msgid ""
+"You have no database of root certificates, so this certificate cannot be "
+"validated."
+msgstr ""
+
+#. vrq will be completed by user_auth
+msgid ""
+"The root certificate this one claims to be issued by is unknown to Pidgin."
+msgstr ""
+
+#, c-format
+msgid ""
+"The certificate chain presented by %s does not have a valid digital "
+"signature from the Certificate Authority from which it claims to have a "
+"signature."
+msgstr ""
+
+msgid "Invalid certificate authority signature"
+msgstr ""
+
+#. Prompt the user to authenticate the certificate
+#. TODO: Provide the user with more guidance about why he is
+#. being prompted
+#. vrq will be completed by user_auth
+#, c-format
+msgid ""
+"The certificate presented by \"%s\" claims to be from \"%s\" instead.  This "
+"could mean that you are not connecting to the service you believe you are."
+msgstr ""
+
+#. Make messages
+#, c-format
+msgid ""
+"Common name: %s\n"
+"\n"
+"Fingerprint (SHA1): %s\n"
+"\n"
+"Activation date: %s\n"
+"Expiration date: %s\n"
+msgstr ""
+
+#. TODO: Find what the handle ought to be
+msgid "Certificate Information"
+msgstr ""
+
+msgid "Registration Error"
+msgstr ""
+
+msgid "Unregistration Error"
+msgstr ""
+
+#, c-format
+msgid "+++ %s signed on"
+msgstr ""
+
+#, c-format
+msgid "+++ %s signed off"
+msgstr ""
+
+#. Unknown error
+#. Unknown error!
+msgid "Unknown error"
+msgstr ""
+
+msgid "Unable to send message: The message is too large."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message to %s."
+msgstr ""
+
+msgid "The message is too large."
+msgstr ""
+
+msgid "Unable to send message."
+msgstr ""
+
+msgid "Send Message"
+msgstr ""
+
+msgid "_Send Message"
+msgstr ""
+
+#, c-format
+msgid "%s entered the room."
+msgstr ""
+
+#, c-format
+msgid "%s [<I>%s</I>] entered the room."
+msgstr ""
+
+#, c-format
+msgid "You are now known as %s"
+msgstr ""
+
+#, c-format
+msgid "%s is now known as %s"
+msgstr ""
+
+#, c-format
+msgid "%s left the room."
+msgstr ""
+
+#, c-format
+msgid "%s left the room (%s)."
+msgstr ""
+
+msgid "Invite to chat"
+msgstr ""
+
+#. Put our happy label in it.
+msgid ""
+"Please enter the name of the user you wish to invite, along with an optional "
+"invite message."
+msgstr ""
+
+#, c-format
+msgid "Failed to get connection: %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to get name: %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to get serv name: %s"
+msgstr ""
+
+msgid "Purple's D-BUS server is not running for the reason listed below"
+msgstr ""
+
+msgid "No name"
+msgstr ""
+
+msgid "Unable to create new resolver process\n"
+msgstr ""
+
+msgid "Unable to send request to resolver process\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error resolving %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Error resolving %s: %d"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reading from resolver process:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Resolver process exited without answering our request"
+msgstr ""
+
+#, c-format
+msgid "Thread creation failure: %s"
+msgstr ""
+
+msgid "Unknown reason"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reading %s: \n"
+"%s.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error writing %s: \n"
+"%s.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error accessing %s: \n"
+"%s.\n"
+msgstr ""
+
+msgid "Directory is not writable."
+msgstr ""
+
+msgid "Cannot send a file of 0 bytes."
+msgstr ""
+
+msgid "Cannot send a directory."
+msgstr ""
+
+#, c-format
+msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
+msgstr ""
+
+#, c-format
+msgid "%s wants to send you %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s wants to send you a file"
+msgstr ""
+
+#, c-format
+msgid "Accept file transfer request from %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"A file is available for download from:\n"
+"Remote host: %s\n"
+"Remote port: %d"
+msgstr ""
+
+#, c-format
+msgid "%s is offering to send file %s"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid filename.\n"
+msgstr ""
+
+#, c-format
+msgid "Offering to send %s to %s"
+msgstr ""
+
+#, c-format
+msgid "Starting transfer of %s from %s"
+msgstr ""
+
+#, c-format
+msgid "Transfer of file %s complete"
+msgstr ""
+
+msgid "File transfer complete"
+msgstr ""
+
+#, c-format
+msgid "You canceled the transfer of %s"
+msgstr ""
+
+msgid "File transfer cancelled"
+msgstr ""
+
+#, c-format
+msgid "%s canceled the transfer of %s"
+msgstr ""
+
+#, c-format
+msgid "%s canceled the file transfer"
+msgstr ""
+
+#, c-format
+msgid "File transfer to %s failed."
+msgstr ""
+
+#, c-format
+msgid "File transfer from %s failed."
+msgstr ""
+
+msgid "Run the command in a terminal"
+msgstr ""
+
+msgid "The command used to handle \"aim\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"gg\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"icq\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"irc\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"msnim\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"sip\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"xmpp\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"ymsgr\" URLs, if enabled."
+msgstr ""
+
+msgid "The handler for \"aim\" URLs"
+msgstr ""
+
+msgid "The handler for \"gg\" URLs"
+msgstr ""
+
+msgid "The handler for \"icq\" URLs"
+msgstr ""
+
+msgid "The handler for \"irc\" URLs"
+msgstr ""
+
+msgid "The handler for \"msnim\" URLs"
+msgstr ""
+
+msgid "The handler for \"sip\" URLs"
+msgstr ""
+
+msgid "The handler for \"xmpp\" URLs"
+msgstr ""
+
+msgid "The handler for \"ymsgr\" URLs"
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"aim\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"gg\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"icq\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"irc\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"msnim\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"sip\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"xmpp\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"ymsgr\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command used to handle this type of URL should be run in a "
+"terminal."
+msgstr ""
+
+msgid "Whether the specified command should handle \"aim\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"gg\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"icq\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"irc\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"msnim\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"sip\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"xmpp\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"ymsgr\" URLs"
+msgstr ""
+
+msgid "<b><font color=\"red\">The logger has no read function</font></b>"
+msgstr ""
+
+msgid "HTML"
+msgstr ""
+
+msgid "Plain text"
+msgstr ""
+
+msgid "Old flat format"
+msgstr ""
+
+msgid "Logging of this conversation failed."
+msgstr ""
+
+msgid "XML"
+msgstr ""
+
+#, c-format
+msgid ""
+"<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
+"REPLY&gt;:</b></font> %s<br/>\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
+"REPLY&gt;:</b></font> %s<br/>\n"
+msgstr ""
+
+msgid "<font color=\"red\"><b>Unable to find log path!</b></font>"
+msgstr ""
+
+#, c-format
+msgid "<font color=\"red\"><b>Could not read file: %s</b></font>"
+msgstr ""
+
+#, c-format
+msgid "(%s) %s <AUTO-REPLY>: %s\n"
+msgstr ""
+
+#, c-format
+msgid "You are using %s, but this plugin requires %s."
+msgstr ""
+
+msgid "This plugin has not defined an ID."
+msgstr ""
+
+#, c-format
+msgid "Plugin magic mismatch %d (need %d)"
+msgstr ""
+
+#, c-format
+msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
+msgstr ""
+
+msgid ""
+"Plugin does not implement all required functions (list_icon, login and close)"
+msgstr ""
+
+#, c-format
+msgid ""
+"The required plugin %s was not found. Please install this plugin and try "
+"again."
+msgstr ""
+
+msgid "Unable to load the plugin"
+msgstr ""
+
+#, c-format
+msgid "The required plugin %s was unable to load."
+msgstr ""
+
+msgid "Unable to load your plugin."
+msgstr ""
+
+#, c-format
+msgid "%s requires %s, but it failed to unload."
+msgstr ""
+
+msgid "Autoaccept"
+msgstr ""
+
+msgid "Auto-accept file transfer requests from selected users."
+msgstr ""
+
+#, c-format
+msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
+msgstr ""
+
+msgid "Autoaccept complete"
+msgstr ""
+
+#, c-format
+msgid "When a file-transfer request arrives from %s"
+msgstr ""
+
+msgid "Set Autoaccept Setting"
+msgstr ""
+
+msgid "_Save"
+msgstr ""
+
+msgid "_Cancel"
+msgstr ""
+
+msgid "Ask"
+msgstr ""
+
+msgid "Auto Accept"
+msgstr ""
+
+msgid "Auto Reject"
+msgstr ""
+
+msgid "Autoaccept File Transfers..."
+msgstr ""
+
+#. XXX: Is there a better way than this? There really should be.
+msgid ""
+"Path to save the files in\n"
+"(Please provide the full path)"
+msgstr ""
+
+msgid "Automatically reject from users not in buddy list"
+msgstr ""
+
+msgid ""
+"Notify with a popup when an autoaccepted file transfer is complete\n"
+"(only when there's no conversation with the sender)"
+msgstr ""
+
+msgid "Create a new directory for each user"
+msgstr ""
+
+msgid "Notes"
+msgstr ""
+
+msgid "Enter your notes below..."
+msgstr ""
+
+msgid "Edit Notes..."
+msgstr ""
+
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy Notes"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Store notes on particular buddies."
+msgstr ""
+
+#. *< summary
+msgid "Adds the option to store notes for buddies on your buddy list."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Cipher Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Tests the ciphers that ship with libpurple."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "DBus Example"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "DBus Plugin Example"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "File Control"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Allows control by entering commands in a file."
+msgstr ""
+
+msgid "Minutes"
+msgstr ""
+
+#. This is a cultural reference.  Dy'er Mak'er is a song by Led Zeppelin.
+#. If that doesn't translate well into your language, drop the 's before translating.
+msgid "I'dle Mak'er"
+msgstr ""
+
+msgid "Set Account Idle Time"
+msgstr ""
+
+msgid "_Set"
+msgstr ""
+
+msgid "None of your accounts are idle."
+msgstr ""
+
+msgid "Unset Account Idle Time"
+msgstr ""
+
+msgid "_Unset"
+msgstr ""
+
+msgid "Set Idle Time for All Accounts"
+msgstr ""
+
+msgid "Unset Idle Time for All Idled Accounts"
+msgstr ""
+
+msgid "Allows you to hand-configure how long you've been idle"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "IPC Test Client"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Test plugin IPC support, as a client."
+msgstr ""
+
+#. *  description
+msgid ""
+"Test plugin IPC support, as a client. This locates the server plugin and "
+"calls the commands registered."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "IPC Test Server"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Test plugin IPC support, as a server."
+msgstr ""
+
+#. *  description
+msgid "Test plugin IPC support, as a server. This registers the IPC commands."
+msgstr ""
+
+msgid "Join/Part Hiding Configuration"
+msgstr ""
+
+msgid "Minimum Room Size"
+msgstr ""
+
+msgid "User Inactivity Timeout (in minutes)"
+msgstr ""
+
+msgid "Apply hiding rules to buddies"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Join/Part Hiding"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Hides extraneous join/part messages."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin hides join/part messages in large rooms, except for those users "
+"actively taking part in a conversation."
+msgstr ""
+
+#. This is used in the place of a timezone abbreviation if the
+#. * offset is way off.  The user should never really see it, but
+#. * it's here just in case.  The parens are to make it clear it's
+#. * not a real timezone.
+msgid "(UTC)"
+msgstr ""
+
+msgid "User is offline."
+msgstr ""
+
+msgid "Auto-response sent:"
+msgstr ""
+
+#, c-format
+msgid "%s has signed off."
+msgstr ""
+
+msgid "One or more messages may have been undeliverable."
+msgstr ""
+
+msgid "You were disconnected from the server."
+msgstr ""
+
+msgid ""
+"You are currently disconnected. Messages will not be received unless you are "
+"logged in."
+msgstr ""
+
+msgid "Message could not be sent because the maximum length was exceeded."
+msgstr ""
+
+msgid "Message could not be sent."
+msgstr ""
+
+#. 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 "Adium"
+msgstr ""
+
+#. 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 "Fire"
+msgstr ""
+
+#. 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 "Messenger Plus!"
+msgstr ""
+
+#. 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 "QIP"
+msgstr ""
+
+#. 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 "MSN Messenger"
+msgstr ""
+
+#. 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 "Trillian"
+msgstr ""
+
+#. 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 ""
+
+#. Add general preferences.
+msgid "General Log Reading Configuration"
+msgstr ""
+
+msgid "Fast size calculations"
+msgstr ""
+
+msgid "Use name heuristics"
+msgstr ""
+
+#. Add Log Directory preferences.
+msgid "Log Directory"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Log Reader"
+msgstr ""
+
+#. *< name
+#. *< version
+#. * summary
+msgid "Includes other IM clients' logs in the log viewer."
+msgstr ""
+
+#. * description
+msgid ""
+"When viewing logs, this plugin will include logs from other IM clients. "
+"Currently, this includes Adium, MSN Messenger, and Trillian.\n"
+"\n"
+"WARNING: This plugin is still alpha code and may crash frequently.  Use it "
+"at your own risk!"
+msgstr ""
+
+msgid "Mono Plugin Loader"
+msgstr ""
+
+msgid "Loads .NET plugins with Mono."
+msgstr ""
+
+msgid "Add new line in IMs"
+msgstr ""
+
+msgid "Add new line in Chats"
+msgstr ""
+
+#. *< magic
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "New Line"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Prepends a newline to displayed message."
+msgstr ""
+
+#. *< summary
+msgid ""
+"Prepends a newline to messages so that the rest of the message appears below "
+"the username in the conversation window."
+msgstr ""
+
+msgid "Offline Message Emulation"
+msgstr ""
+
+msgid "Save messages sent to an offline user as pounce."
+msgstr ""
+
+msgid ""
+"The rest of the messages will be saved as pounce. You can edit/delete the "
+"pounce from the `Buddy Pounce' dialog."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%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?"
+msgstr ""
+
+msgid "Offline Message"
+msgstr ""
+
+msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
+msgstr ""
+
+msgid "Yes"
+msgstr ""
+
+msgid "No"
+msgstr ""
+
+msgid "Save offline messages in pounce"
+msgstr ""
+
+msgid "Do not ask. Always save in pounce."
+msgstr ""
+
+msgid "One Time Password"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "One Time Password Support"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Enforce that passwords are used only once."
+msgstr ""
+
+#. *  description
+msgid ""
+"Allows you to enforce on a per-account basis that passwords not being saved "
+"are only used in a single successful connection.\n"
+"Note: The account password must not be saved for this to work."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Perl Plugin Loader"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *< summary
+msgid "Provides support for loading perl plugins."
+msgstr ""
+
+msgid "Psychic Mode"
+msgstr ""
+
+msgid "Psychic mode for incoming conversation"
+msgstr ""
+
+msgid ""
+"Causes conversation windows to appear as other users begin to message you.  "
+"This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
+msgstr ""
+
+msgid "You feel a disturbance in the force..."
+msgstr ""
+
+msgid "Only enable for users on the buddy list"
+msgstr ""
+
+msgid "Disable when away"
+msgstr ""
+
+msgid "Display notification message in conversations"
+msgstr ""
+
+msgid "Raise psychic conversations"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Signals Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Test to see that all signals are working properly."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Simple Plugin"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Tests to see that most things are working."
+msgstr ""
+
+#. Scheme name
+msgid "X.509 Certificates"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "GNUTLS"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides SSL support through GNUTLS."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "NSS"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides SSL support through Mozilla NSS."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "SSL"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides a wrapper around SSL support libraries."
+msgstr ""
+
+#, c-format
+msgid "%s is no longer away."
+msgstr ""
+
+#, c-format
+msgid "%s has gone away."
+msgstr ""
+
+#, c-format
+msgid "%s has become idle."
+msgstr ""
+
+#, c-format
+msgid "%s is no longer idle."
+msgstr ""
+
+#, c-format
+msgid "%s has signed on."
+msgstr ""
+
+msgid "Notify When"
+msgstr ""
+
+msgid "Buddy Goes _Away"
+msgstr ""
+
+msgid "Buddy Goes _Idle"
+msgstr ""
+
+msgid "Buddy _Signs On/Off"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy State Notification"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid ""
+"Notifies in a conversation window when a buddy goes or returns from away or "
+"idle."
+msgstr ""
+
+msgid "Tcl Plugin Loader"
+msgstr ""
+
+msgid "Provides support for loading Tcl plugins"
+msgstr ""
+
+msgid ""
+"Unable to detect ActiveTCL installation. If you wish to use TCL plugins, "
+"install ActiveTCL from http://www.activestate.com\n"
+msgstr ""
+
+msgid ""
+"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d."
+"pidgin.im/BonjourWindows for more information."
+msgstr ""
+
+msgid "Unable to listen for incoming IM connections\n"
+msgstr ""
+
+msgid ""
+"Unable to establish connection with the local mDNS server.  Is it running?"
+msgstr ""
+
+msgid "First name"
+msgstr ""
+
+msgid "Last name"
+msgstr ""
+
+msgid "Email"
+msgstr ""
+
+msgid "AIM Account"
+msgstr ""
+
+msgid "XMPP Account"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Bonjour Protocol Plugin"
+msgstr ""
+
+msgid "Purple Person"
+msgstr ""
+
+#. Creating the options for the protocol
+msgid "Local Port"
+msgstr ""
+
+msgid "Bonjour"
+msgstr ""
+
+#, c-format
+msgid "%s has closed the conversation."
+msgstr ""
+
+msgid "Unable to send the message, the conversation couldn't be started."
+msgstr ""
+
+msgid "Cannot open socket"
+msgstr ""
+
+msgid "Could not bind socket to port"
+msgstr ""
+
+msgid "Could not listen on socket"
+msgstr ""
+
+msgid "Error communicating with local mDNSResponder."
+msgstr ""
+
+msgid "Invalid proxy settings"
+msgstr ""
+
+msgid ""
+"Either the host name or port number specified for your given proxy type is "
+"invalid."
+msgstr ""
+
+msgid "Token Error"
+msgstr ""
+
+msgid "Unable to fetch the token.\n"
+msgstr ""
+
+msgid "Save Buddylist..."
+msgstr ""
+
+msgid "Your buddylist is empty, nothing was written to the file."
+msgstr ""
+
+msgid "Buddylist saved successfully!"
+msgstr ""
+
+#, c-format
+msgid "Couldn't write buddy list for %s to %s"
+msgstr ""
+
+msgid "Couldn't load buddylist"
+msgstr ""
+
+msgid "Load Buddylist..."
+msgstr ""
+
+msgid "Buddylist loaded successfully!"
+msgstr ""
+
+msgid "Save buddylist..."
+msgstr ""
+
+msgid "Load buddylist from file..."
+msgstr ""
+
+msgid "Fill in the registration fields."
+msgstr ""
+
+msgid "Passwords do not match."
+msgstr ""
+
+msgid "Unable to register new account. Error occurred.\n"
+msgstr ""
+
+msgid "New Gadu-Gadu Account Registered"
+msgstr ""
+
+msgid "Registration completed successfully!"
+msgstr ""
+
+msgid "Password"
+msgstr ""
+
+msgid "Password (retype)"
+msgstr ""
+
+msgid "Enter current token"
+msgstr ""
+
+msgid "Current token"
+msgstr ""
+
+msgid "Register New Gadu-Gadu Account"
+msgstr ""
+
+msgid "Please, fill in the following fields"
+msgstr ""
+
+msgid "City"
+msgstr ""
+
+msgid "Year of birth"
+msgstr ""
+
+msgid "Gender"
+msgstr ""
+
+msgid "Male or female"
+msgstr ""
+
+msgid "Male"
+msgstr ""
+
+msgid "Female"
+msgstr ""
+
+msgid "Only online"
+msgstr ""
+
+msgid "Find buddies"
+msgstr ""
+
+msgid "Please, enter your search criteria below"
+msgstr ""
+
+msgid "Fill in the fields."
+msgstr ""
+
+msgid "Your current password is different from the one that you specified."
+msgstr ""
+
+msgid "Unable to change password. Error occurred.\n"
+msgstr ""
+
+msgid "Change password for the Gadu-Gadu account"
+msgstr ""
+
+msgid "Password was changed successfully!"
+msgstr ""
+
+msgid "Current password"
+msgstr ""
+
+msgid "Please, enter your current password and your new password for UIN: "
+msgstr ""
+
+msgid "Change Gadu-Gadu Password"
+msgstr ""
+
+#, c-format
+msgid "Select a chat for buddy: %s"
+msgstr ""
+
+msgid "Add to chat..."
+msgstr ""
+
+#. Global
+msgid "Available"
+msgstr ""
+
+#. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
+#. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message
+#. Away stuff
+msgid "Away"
+msgstr ""
+
+msgid "UIN"
+msgstr ""
+
+msgid "First Name"
+msgstr ""
+
+msgid "Birth Year"
+msgstr ""
+
+msgid "Unable to display the search results."
+msgstr ""
+
+msgid "Gadu-Gadu Public Directory"
+msgstr ""
+
+msgid "Search results"
+msgstr ""
+
+msgid "No matching users found"
+msgstr ""
+
+msgid "There are no users matching your search criteria."
+msgstr ""
+
+msgid "Unable to read socket"
+msgstr ""
+
+msgid "Buddy list downloaded"
+msgstr ""
+
+msgid "Your buddy list was downloaded from the server."
+msgstr ""
+
+msgid "Buddy list uploaded"
+msgstr ""
+
+msgid "Your buddy list was stored on the server."
+msgstr ""
+
+msgid "Connection failed."
+msgstr ""
+
+msgid "Add to chat"
+msgstr ""
+
+msgid "Chat _name:"
+msgstr ""
+
+msgid "Chat error"
+msgstr ""
+
+msgid "This chat name is already in use"
+msgstr ""
+
+msgid "Not connected to the server."
+msgstr ""
+
+msgid "Find buddies..."
+msgstr ""
+
+msgid "Change password..."
+msgstr ""
+
+msgid "Upload buddylist to Server"
+msgstr ""
+
+msgid "Download buddylist from Server"
+msgstr ""
+
+msgid "Delete buddylist from Server"
+msgstr ""
+
+msgid "Save buddylist to file..."
+msgstr ""
+
+#. magic
+#. major_version
+#. minor_version
+#. plugin type
+#. ui_requirement
+#. flags
+#. dependencies
+#. priority
+#. id
+#. name
+#. version
+msgid "Gadu-Gadu Protocol Plugin"
+msgstr ""
+
+#. summary
+msgid "Polish popular IM"
+msgstr ""
+
+msgid "Gadu-Gadu User"
+msgstr ""
+
+#, c-format
+msgid "Unknown command: %s"
+msgstr ""
+
+#, c-format
+msgid "current topic is: %s"
+msgstr ""
+
+msgid "No topic is set"
+msgstr ""
+
+msgid "File Transfer Failed"
+msgstr ""
+
+msgid "Could not open a listening port."
+msgstr ""
+
+msgid "Error displaying MOTD"
+msgstr ""
+
+msgid "No MOTD available"
+msgstr ""
+
+msgid "There is no MOTD associated with this connection."
+msgstr ""
+
+#, c-format
+msgid "MOTD for %s"
+msgstr ""
+
+msgid "Server has disconnected"
+msgstr ""
+
+msgid "View MOTD"
+msgstr ""
+
+msgid "_Channel:"
+msgstr ""
+
+msgid "_Password:"
+msgstr ""
+
+msgid "IRC nicks may not contain whitespace"
+msgstr ""
+
+#. 1. connect to server
+#. connect to the server
+msgid "Connecting"
+msgstr ""
+
+msgid "SSL support unavailable"
+msgstr ""
+
+msgid "Couldn't create socket"
+msgstr ""
+
+msgid "Couldn't connect to host"
+msgstr ""
+
+msgid "Read error"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Topic"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "IRC Protocol Plugin"
+msgstr ""
+
+#. *  summary
+msgid "The IRC Protocol Plugin that Sucks Less"
+msgstr ""
+
+#. host to connect to
+msgid "Server"
+msgstr ""
+
+#. port to connect to
+msgid "Port"
+msgstr ""
+
+msgid "Encodings"
+msgstr ""
+
+msgid "Auto-detect incoming UTF-8"
+msgstr ""
+
+msgid "Real name"
+msgstr ""
+
+#.
+#. option = purple_account_option_string_new(_("Quit message"), "quitmsg", IRC_DEFAULT_QUIT);
+#. prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+#.
+msgid "Use SSL"
+msgstr ""
+
+msgid "Bad mode"
+msgstr ""
+
+#, c-format
+msgid "Ban on %s by %s, set %s ago"
+msgstr ""
+
+#, c-format
+msgid "Ban on %s"
+msgstr ""
+
+msgid "End of ban list"
+msgstr ""
+
+#, c-format
+msgid "You are banned from %s."
+msgstr ""
+
+msgid "Banned"
+msgstr ""
+
+#, c-format
+msgid "Cannot ban %s: banlist is full"
+msgstr ""
+
+msgid " <i>(ircop)</i>"
+msgstr ""
+
+msgid " <i>(identified)</i>"
+msgstr ""
+
+msgid "Nick"
+msgstr ""
+
+msgid "Currently on"
+msgstr ""
+
+msgid "Idle for"
+msgstr ""
+
+msgid "Online since"
+msgstr ""
+
+msgid "<b>Defining adjective:</b>"
+msgstr ""
+
+msgid "Glorious"
+msgstr ""
+
+#, c-format
+msgid "%s has changed the topic to: %s"
+msgstr ""
+
+#, c-format
+msgid "%s has cleared the topic."
+msgstr ""
+
+#, c-format
+msgid "The topic for %s is: %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown message '%s'"
+msgstr ""
+
+msgid "Unknown message"
+msgstr ""
+
+msgid "The IRC server received a message it did not understand."
+msgstr ""
+
+#, c-format
+msgid "Users on %s: %s"
+msgstr ""
+
+msgid "Time Response"
+msgstr ""
+
+msgid "The IRC server's local time is:"
+msgstr ""
+
+msgid "No such channel"
+msgstr ""
+
+#. does this happen?
+msgid "no such channel"
+msgstr ""
+
+msgid "User is not logged in"
+msgstr ""
+
+msgid "No such nick or channel"
+msgstr ""
+
+msgid "Could not send"
+msgstr ""
+
+#, c-format
+msgid "Joining %s requires an invitation."
+msgstr ""
+
+msgid "Invitation only"
+msgstr ""
+
+#, c-format
+msgid "You have been kicked by %s: (%s)"
+msgstr ""
+
+#. Remove user from channel
+#, c-format
+msgid "Kicked by %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "mode (%s %s) by %s"
+msgstr ""
+
+msgid "Invalid nickname"
+msgstr ""
+
+msgid ""
+"Your selected nickname was rejected by the server.  It probably contains "
+"invalid characters."
+msgstr ""
+
+msgid ""
+"Your selected account name was rejected by the server.  It probably contains "
+"invalid characters."
+msgstr ""
+
+#. We only want to do the following dance if the connection
+#. has not been successfully completed.  If it has, just
+#. notify the user that their /nick command didn't go.
+#, c-format
+msgid "The nickname \"%s\" is already being used."
+msgstr ""
+
+msgid "Nickname in use"
+msgstr ""
+
+msgid "Cannot change nick"
+msgstr ""
+
+msgid "Could not change nick"
+msgstr ""
+
+#, c-format
+msgid "You have parted the channel%s%s"
+msgstr ""
+
+msgid "Error: invalid PONG from server"
+msgstr ""
+
+#, c-format
+msgid "PING reply -- Lag: %lu seconds"
+msgstr ""
+
+#, c-format
+msgid "Cannot join %s: Registration is required."
+msgstr ""
+
+msgid "Cannot join channel"
+msgstr ""
+
+msgid "Nick or channel is temporarily unavailable."
+msgstr ""
+
+#, c-format
+msgid "Wallops from %s"
+msgstr ""
+
+msgid "action &lt;action to perform&gt;:  Perform an action."
+msgstr ""
+
+msgid ""
+"away [message]:  Set an away message, or use no message to return from being "
+"away."
+msgstr ""
+
+msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
+msgstr ""
+
+msgid "chanserv: Send a command to chanserv"
+msgstr ""
+
+msgid ""
+"deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from "
+"someone. You must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"devoice &lt;nick1&gt; [nick2] ...:  Remove channel voice status from "
+"someone, preventing them from speaking if the channel is moderated (+m). You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"invite &lt;nick&gt; [room]:  Invite someone to join you in the specified "
+"channel, or the current channel."
+msgstr ""
+
+msgid ""
+"j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
+"channels, optionally providing a channel key for each if needed."
+msgstr ""
+
+msgid ""
+"join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
+"channels, optionally providing a channel key for each if needed."
+msgstr ""
+
+msgid ""
+"kick &lt;nick&gt; [message]:  Remove someone from a channel. You must be a "
+"channel operator to do this."
+msgstr ""
+
+msgid ""
+"list:  Display a list of chat rooms on the network. <i>Warning, some servers "
+"may disconnect you upon doing this.</i>"
+msgstr ""
+
+msgid "me &lt;action to perform&gt;:  Perform an action."
+msgstr ""
+
+msgid "memoserv: Send a command to memoserv"
+msgstr ""
+
+msgid ""
+"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel "
+"or user mode."
+msgstr ""
+
+msgid ""
+"msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
+"opposed to a channel)."
+msgstr ""
+
+msgid "names [channel]:  List the users currently in a channel."
+msgstr ""
+
+msgid "nick &lt;new nickname&gt;:  Change your nickname."
+msgstr ""
+
+msgid "nickserv: Send a command to nickserv"
+msgstr ""
+
+msgid "notice &lt;target&lt;:  Send a notice to a user or channel."
+msgstr ""
+
+msgid ""
+"op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"operwall &lt;message&gt;:  If you don't know what this is, you probably "
+"can't use it."
+msgstr ""
+
+msgid "operserv: Send a command to operserv"
+msgstr ""
+
+msgid ""
+"part [room] [message]:  Leave the current channel, or a specified channel, "
+"with an optional message."
+msgstr ""
+
+msgid ""
+"ping [nick]:  Asks how much lag a user (or the server if no user specified) "
+"has."
+msgstr ""
+
+msgid ""
+"query &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
+"opposed to a channel)."
+msgstr ""
+
+msgid "quit [message]:  Disconnect from the server, with an optional message."
+msgstr ""
+
+msgid "quote [...]:  Send a raw command to the server."
+msgstr ""
+
+msgid ""
+"remove &lt;nick&gt; [message]:  Remove someone from a room. You must be a "
+"channel operator to do this."
+msgstr ""
+
+msgid "time: Displays the current local time at the IRC server."
+msgstr ""
+
+msgid "topic [new topic]:  View or change the channel topic."
+msgstr ""
+
+msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
+msgstr ""
+
+msgid "version [nick]: send CTCP VERSION request to a user"
+msgstr ""
+
+msgid ""
+"voice &lt;nick1&gt; [nick2] ...:  Grant channel voice status to someone. You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"wallops &lt;message&gt;:  If you don't know what this is, you probably can't "
+"use it."
+msgstr ""
+
+msgid "whois [server] &lt;nick&gt;:  Get information on a user."
+msgstr ""
+
+msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
+msgstr ""
+
+#, c-format
+msgid "Reply time from %s: %lu seconds"
+msgstr ""
+
+msgid "PONG"
+msgstr ""
+
+msgid "CTCP PING reply"
+msgstr ""
+
+msgid "Disconnected."
+msgstr ""
+
+msgid "Unknown Error"
+msgstr ""
+
+msgid "Ad-Hoc Command Failed"
+msgstr ""
+
+msgid "execute"
+msgstr ""
+
+msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
+msgstr ""
+
+msgid "You require encryption, but no TLS/SSL support found."
+msgstr ""
+
+msgid "Server requires plaintext authentication over an unencrypted stream"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s requires plaintext authentication over an unencrypted connection.  Allow "
+"this and continue authentication?"
+msgstr ""
+
+msgid "Plaintext Authentication"
+msgstr ""
+
+msgid "Invalid response from server."
+msgstr ""
+
+msgid "Server does not use any supported authentication method"
+msgstr ""
+
+msgid "You require encryption, but it is not available on this server."
+msgstr ""
+
+msgid "Invalid challenge from server"
+msgstr ""
+
+msgid "SASL error"
+msgstr ""
+
+msgid "The BOSH connection manager terminated your session."
+msgstr ""
+
+msgid "No session ID given"
+msgstr ""
+
+msgid "Unsupported version of BOSH protocol"
+msgstr ""
+
+msgid "Unable to establish a connection with the server"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not establish a connection with the server:\n"
+"%s"
+msgstr ""
+
+msgid "Unable to establish SSL connection"
+msgstr ""
+
+msgid "Unable to create socket"
+msgstr ""
+
+msgid "Write error"
+msgstr ""
+
+msgid "Full Name"
+msgstr ""
+
+msgid "Family Name"
+msgstr ""
+
+msgid "Given Name"
+msgstr ""
+
+msgid "URL"
+msgstr ""
+
+msgid "Street Address"
+msgstr ""
+
+msgid "Extended Address"
+msgstr ""
+
+msgid "Locality"
+msgstr ""
+
+msgid "Region"
+msgstr ""
+
+msgid "Postal Code"
+msgstr ""
+
+msgid "Country"
+msgstr ""
+
+#. lots of clients (including purple) do this, but it's
+#. * out of spec
+msgid "Telephone"
+msgstr ""
+
+msgid "Organization Name"
+msgstr ""
+
+msgid "Organization Unit"
+msgstr ""
+
+msgid "Role"
+msgstr ""
+
+msgid "Birthday"
+msgstr ""
+
+msgid "Description"
+msgstr ""
+
+msgid "Edit XMPP vCard"
+msgstr ""
+
+msgid ""
+"All items below are optional. Enter only the information with which you feel "
+"comfortable."
+msgstr ""
+
+msgid "Client"
+msgstr ""
+
+msgid "Operating System"
+msgstr ""
+
+msgid "Local Time"
+msgstr ""
+
+msgid "Last Activity"
+msgstr ""
+
+msgid "Service Discovery Info"
+msgstr ""
+
+msgid "Service Discovery Items"
+msgstr ""
+
+msgid "Extended Stanza Addressing"
+msgstr ""
+
+msgid "Multi-User Chat"
+msgstr ""
+
+msgid "Multi-User Chat Extended Presence Information"
+msgstr ""
+
+msgid "In-Band Bytestreams"
+msgstr ""
+
+msgid "Ad-Hoc Commands"
+msgstr ""
+
+msgid "PubSub Service"
+msgstr ""
+
+msgid "SOCKS5 Bytestreams"
+msgstr ""
+
+msgid "Out of Band Data"
+msgstr ""
+
+msgid "XHTML-IM"
+msgstr ""
+
+msgid "In-Band Registration"
+msgstr ""
+
+msgid "User Location"
+msgstr ""
+
+msgid "User Avatar"
+msgstr ""
+
+msgid "Chat State Notifications"
+msgstr ""
+
+msgid "Software Version"
+msgstr ""
+
+msgid "Stream Initiation"
+msgstr ""
+
+msgid "File Transfer"
+msgstr ""
+
+msgid "User Mood"
+msgstr ""
+
+msgid "User Activity"
+msgstr ""
+
+msgid "Entity Capabilities"
+msgstr ""
+
+msgid "Encrypted Session Negotiations"
+msgstr ""
+
+msgid "User Tune"
+msgstr ""
+
+msgid "Roster Item Exchange"
+msgstr ""
+
+msgid "Reachability Address"
+msgstr ""
+
+msgid "User Profile"
+msgstr ""
+
+msgid "Jingle"
+msgstr ""
+
+msgid "Jingle Audio"
+msgstr ""
+
+msgid "User Nickname"
+msgstr ""
+
+msgid "Jingle ICE UDP"
+msgstr ""
+
+msgid "Jingle ICE TCP"
+msgstr ""
+
+msgid "Jingle Raw UDP"
+msgstr ""
+
+msgid "Jingle Video"
+msgstr ""
+
+msgid "Jingle DTMF"
+msgstr ""
+
+msgid "Message Receipts"
+msgstr ""
+
+msgid "Public Key Publishing"
+msgstr ""
+
+msgid "User Chatting"
+msgstr ""
+
+msgid "User Browsing"
+msgstr ""
+
+msgid "User Gaming"
+msgstr ""
+
+msgid "User Viewing"
+msgstr ""
+
+msgid "Ping"
+msgstr ""
+
+msgid "Stanza Encryption"
+msgstr ""
+
+msgid "Entity Time"
+msgstr ""
+
+msgid "Delayed Delivery"
+msgstr ""
+
+msgid "Collaborative Data Objects"
+msgstr ""
+
+msgid "File Repository and Sharing"
+msgstr ""
+
+msgid "STUN Service Discovery for Jingle"
+msgstr ""
+
+msgid "Simplified Encrypted Session Negotiation"
+msgstr ""
+
+msgid "Hop Check"
+msgstr ""
+
+msgid "Capabilities"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+msgid "Resource"
+msgstr ""
+
+#, c-format
+msgid "%s ago"
+msgstr ""
+
+msgid "Logged off"
+msgstr ""
+
+msgid "Middle Name"
+msgstr ""
+
+msgid "Address"
+msgstr ""
+
+msgid "P.O. Box"
+msgstr ""
+
+msgid "Photo"
+msgstr ""
+
+msgid "Logo"
+msgstr ""
+
+msgid "Un-hide From"
+msgstr ""
+
+msgid "Temporarily Hide From"
+msgstr ""
+
+#. && NOT ME
+msgid "Cancel Presence Notification"
+msgstr ""
+
+msgid "(Re-)Request authorization"
+msgstr ""
+
+#. if(NOT ME)
+#. shouldn't this just happen automatically when the buddy is
+#. removed?
+msgid "Unsubscribe"
+msgstr ""
+
+msgid "Log In"
+msgstr ""
+
+msgid "Log Out"
+msgstr ""
+
+msgid "Chatty"
+msgstr ""
+
+msgid "Extended Away"
+msgstr ""
+
+msgid "Do Not Disturb"
+msgstr ""
+
+msgid "JID"
+msgstr ""
+
+msgid "Last Name"
+msgstr ""
+
+msgid "The following are the results of your search"
+msgstr ""
+
+#. current comment from Jabber User Directory users.jabber.org
+msgid ""
+"Find a contact by entering the search criteria in the given fields. Note: "
+"Each field supports wild card searches (%)"
+msgstr ""
+
+msgid "Directory Query Failed"
+msgstr ""
+
+msgid "Could not query the directory server."
+msgstr ""
+
+#. Try to translate the message (see static message
+#. list in jabber_user_dir_comments[])
+#, c-format
+msgid "Server Instructions: %s"
+msgstr ""
+
+msgid "Fill in one or more fields to search for any matching XMPP users."
+msgstr ""
+
+msgid "Email Address"
+msgstr ""
+
+msgid "Search for XMPP users"
+msgstr ""
+
+#. "Search"
+msgid "Search"
+msgstr ""
+
+msgid "Invalid Directory"
+msgstr ""
+
+msgid "Enter a User Directory"
+msgstr ""
+
+msgid "Select a user directory to search"
+msgstr ""
+
+msgid "Search Directory"
+msgstr ""
+
+msgid "_Room:"
+msgstr ""
+
+msgid "_Server:"
+msgstr ""
+
+msgid "_Handle:"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid room name"
+msgstr ""
+
+msgid "Invalid Room Name"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid server name"
+msgstr ""
+
+msgid "Invalid Server Name"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid room handle"
+msgstr ""
+
+msgid "Invalid Room Handle"
+msgstr ""
+
+msgid "Configuration error"
+msgstr ""
+
+msgid "Unable to configure"
+msgstr ""
+
+msgid "Room Configuration Error"
+msgstr ""
+
+msgid "This room is not capable of being configured"
+msgstr ""
+
+msgid "Registration error"
+msgstr ""
+
+msgid "Nick changing not supported in non-MUC chatrooms"
+msgstr ""
+
+msgid "Error retrieving room list"
+msgstr ""
+
+msgid "Invalid Server"
+msgstr ""
+
+msgid "Enter a Conference Server"
+msgstr ""
+
+msgid "Select a conference server to query"
+msgstr ""
+
+msgid "Find Rooms"
+msgstr ""
+
+msgid "Affiliations:"
+msgstr ""
+
+msgid "No users found"
+msgstr ""
+
+msgid "Roles:"
+msgstr ""
+
+msgid "Ping timeout"
+msgstr ""
+
+msgid "Read Error"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not find alternative XMPP connection methods after failing to connect "
+"directly.\n"
+msgstr ""
+
+msgid "Invalid XMPP ID"
+msgstr ""
+
+msgid "Invalid XMPP ID. Domain must be set."
+msgstr ""
+
+msgid "Malformed BOSH Connect Server"
+msgstr ""
+
+#, c-format
+msgid "Registration of %s@%s successful"
+msgstr ""
+
+#, c-format
+msgid "Registration to %s successful"
+msgstr ""
+
+msgid "Registration Successful"
+msgstr ""
+
+msgid "Registration Failed"
+msgstr ""
+
+#, c-format
+msgid "Registration from %s successfully removed"
+msgstr ""
+
+msgid "Unregistration Successful"
+msgstr ""
+
+msgid "Unregistration Failed"
+msgstr ""
+
+msgid "Already Registered"
+msgstr ""
+
+msgid "State"
+msgstr ""
+
+msgid "Postal code"
+msgstr ""
+
+msgid "Phone"
+msgstr ""
+
+msgid "Date"
+msgstr ""
+
+msgid "Unregister"
+msgstr ""
+
+msgid ""
+"Please fill out the information below to change your account registration."
+msgstr ""
+
+msgid "Please fill out the information below to register your new account."
+msgstr ""
+
+msgid "Register New XMPP Account"
+msgstr ""
+
+msgid "Register"
+msgstr ""
+
+#, c-format
+msgid "Change Account Registration at %s"
+msgstr ""
+
+#, c-format
+msgid "Register New Account at %s"
+msgstr ""
+
+msgid "Change Registration"
+msgstr ""
+
+msgid "Error unregistering account"
+msgstr ""
+
+msgid "Account successfully unregistered"
+msgstr ""
+
+msgid "Initializing Stream"
+msgstr ""
+
+msgid "Initializing SSL/TLS"
+msgstr ""
+
+msgid "Authenticating"
+msgstr ""
+
+msgid "Re-initializing Stream"
+msgstr ""
+
+msgid "Server doesn't support blocking"
+msgstr ""
+
+msgid "Not Authorized"
+msgstr ""
+
+msgid "Mood"
+msgstr ""
+
+msgid "Now Listening"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From (To pending)"
+msgstr ""
+
+msgid "From"
+msgstr ""
+
+msgid "To"
+msgstr ""
+
+msgid "None (To pending)"
+msgstr ""
+
+msgid "None"
+msgstr ""
+
+msgid "Subscription"
+msgstr ""
+
+msgid "Mood Text"
+msgstr ""
+
+msgid "Allow Buzz"
+msgstr ""
+
+msgid "Tune Artist"
+msgstr ""
+
+msgid "Tune Title"
+msgstr ""
+
+msgid "Tune Album"
+msgstr ""
+
+msgid "Tune Genre"
+msgstr ""
+
+msgid "Tune Comment"
+msgstr ""
+
+msgid "Tune Track"
+msgstr ""
+
+msgid "Tune Time"
+msgstr ""
+
+msgid "Tune Year"
+msgstr ""
+
+msgid "Tune URL"
+msgstr ""
+
+msgid "Password Changed"
+msgstr ""
+
+msgid "Your password has been changed."
+msgstr ""
+
+msgid "Error changing password"
+msgstr ""
+
+msgid "Password (again)"
+msgstr ""
+
+msgid "Change XMPP Password"
+msgstr ""
+
+msgid "Please enter your new password"
+msgstr ""
+
+msgid "Set User Info..."
+msgstr ""
+
+#. if (js->protocol_options & CHANGE_PASSWORD) {
+msgid "Change Password..."
+msgstr ""
+
+#. }
+msgid "Search for Users..."
+msgstr ""
+
+msgid "Bad Request"
+msgstr ""
+
+msgid "Conflict"
+msgstr ""
+
+msgid "Feature Not Implemented"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+msgid "Gone"
+msgstr ""
+
+msgid "Internal Server Error"
+msgstr ""
+
+msgid "Item Not Found"
+msgstr ""
+
+msgid "Malformed XMPP ID"
+msgstr ""
+
+msgid "Not Acceptable"
+msgstr ""
+
+msgid "Not Allowed"
+msgstr ""
+
+msgid "Payment Required"
+msgstr ""
+
+msgid "Recipient Unavailable"
+msgstr ""
+
+msgid "Registration Required"
+msgstr ""
+
+msgid "Remote Server Not Found"
+msgstr ""
+
+msgid "Remote Server Timeout"
+msgstr ""
+
+msgid "Server Overloaded"
+msgstr ""
+
+msgid "Service Unavailable"
+msgstr ""
+
+msgid "Subscription Required"
+msgstr ""
+
+msgid "Unexpected Request"
+msgstr ""
+
+msgid "Authorization Aborted"
+msgstr ""
+
+msgid "Incorrect encoding in authorization"
+msgstr ""
+
+msgid "Invalid authzid"
+msgstr ""
+
+msgid "Invalid Authorization Mechanism"
+msgstr ""
+
+msgid "Authorization mechanism too weak"
+msgstr ""
+
+msgid "Temporary Authentication Failure"
+msgstr ""
+
+msgid "Authentication Failure"
+msgstr ""
+
+msgid "Bad Format"
+msgstr ""
+
+msgid "Bad Namespace Prefix"
+msgstr ""
+
+msgid "Resource Conflict"
+msgstr ""
+
+msgid "Connection Timeout"
+msgstr ""
+
+msgid "Host Gone"
+msgstr ""
+
+msgid "Host Unknown"
+msgstr ""
+
+msgid "Improper Addressing"
+msgstr ""
+
+msgid "Invalid ID"
+msgstr ""
+
+msgid "Invalid Namespace"
+msgstr ""
+
+msgid "Invalid XML"
+msgstr ""
+
+msgid "Non-matching Hosts"
+msgstr ""
+
+msgid "Policy Violation"
+msgstr ""
+
+msgid "Remote Connection Failed"
+msgstr ""
+
+msgid "Resource Constraint"
+msgstr ""
+
+msgid "Restricted XML"
+msgstr ""
+
+msgid "See Other Host"
+msgstr ""
+
+msgid "System Shutdown"
+msgstr ""
+
+msgid "Undefined Condition"
+msgstr ""
+
+msgid "Unsupported Encoding"
+msgstr ""
+
+msgid "Unsupported Stanza Type"
+msgstr ""
+
+msgid "Unsupported Version"
+msgstr ""
+
+msgid "XML Not Well Formed"
+msgstr ""
+
+msgid "Stream Error"
+msgstr ""
+
+#, c-format
+msgid "Unable to ban user %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown affiliation: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unable to affiliate user %s as \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unknown role: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unable to set role \"%s\" for user: %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to kick user %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to ping user %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to buzz, because there is nothing known about %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to buzz, because %s might be offline."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to buzz, because %s does not support it or does not wish to receive "
+"buzzes now."
+msgstr ""
+
+#, c-format
+msgid "Buzzing %s..."
+msgstr ""
+
+#. Yahoo only supports one attention command: the 'buzz'.
+#. This is index number YAHOO_BUZZ.
+msgid "Buzz"
+msgstr ""
+
+#, c-format
+msgid "%s has buzzed you!"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: invalid JID"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: user is not online"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: not subscribed to user presence"
+msgstr ""
+
+msgid "Media Initiation Failed"
+msgstr ""
+
+#, c-format
+msgid ""
+"Please select the resource of %s with which you would like to start a media "
+"session."
+msgstr ""
+
+msgid "Select a Resource"
+msgstr ""
+
+msgid "Initiate Media"
+msgstr ""
+
+msgid "config:  Configure a chat room."
+msgstr ""
+
+msgid "configure:  Configure a chat room."
+msgstr ""
+
+msgid "part [room]:  Leave the room."
+msgstr ""
+
+msgid "register:  Register with a chat room."
+msgstr ""
+
+msgid "topic [new topic]:  View or change the topic."
+msgstr ""
+
+msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
+msgstr ""
+
+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 ""
+
+msgid ""
+"role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
+"users with an role or set users' role with the room."
+msgstr ""
+
+msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
+msgstr ""
+
+msgid "join: &lt;room&gt; [password]:  Join a chat on this server."
+msgstr ""
+
+msgid "kick &lt;user&gt; [reason]:  Kick a user from the room."
+msgstr ""
+
+msgid ""
+"msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
+msgstr ""
+
+msgid "ping &lt;jid&gt;:\tPing a user/component/server."
+msgstr ""
+
+msgid "buzz: Buzz a user to get their attention"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "XMPP Protocol Plugin"
+msgstr ""
+
+#. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im
+msgid "Domain"
+msgstr ""
+
+msgid "Require SSL/TLS"
+msgstr ""
+
+msgid "Force old (port 5223) SSL"
+msgstr ""
+
+msgid "Allow plaintext auth over unencrypted streams"
+msgstr ""
+
+msgid "Connect port"
+msgstr ""
+
+#. TODO: default to automatically try different ports. Make the user be
+#. * able to set the first port to try (like LastConnectedPort in Windows client).
+#. Account options
+msgid "Connect server"
+msgstr ""
+
+msgid "File transfer proxies"
+msgstr ""
+
+#. this should probably be part of global smiley theme settings later on,
+#. shared with MSN
+msgid "Show Custom Smileys"
+msgstr ""
+
+#, c-format
+msgid "%s has left the conversation."
+msgstr ""
+
+#, c-format
+msgid "Message from %s"
+msgstr ""
+
+#, c-format
+msgid "%s has set the topic to: %s"
+msgstr ""
+
+#, c-format
+msgid "The topic is: %s"
+msgstr ""
+
+#, c-format
+msgid "Message delivery to %s failed: %s"
+msgstr ""
+
+msgid "XMPP Message Error"
+msgstr ""
+
+#, c-format
+msgid "(Code %s)"
+msgstr ""
+
+msgid "XML Parse error"
+msgstr ""
+
+msgid "Unknown Error in presence"
+msgstr ""
+
+msgid "Create New Room"
+msgstr ""
+
+msgid ""
+"You are creating a new room.  Would you like to configure it, or accept the "
+"default settings?"
+msgstr ""
+
+msgid "_Configure Room"
+msgstr ""
+
+msgid "_Accept Defaults"
+msgstr ""
+
+#, c-format
+msgid "Error joining chat %s"
+msgstr ""
+
+#, c-format
+msgid "Error in chat %s"
+msgstr ""
+
+msgid "An error occured on the in-band bytestream transfer\n"
+msgstr ""
+
+msgid "Transfer was closed."
+msgstr ""
+
+msgid "Failed to open the file"
+msgstr ""
+
+msgid "Failed to open in-band bytestream"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, user does not support file transfers"
+msgstr ""
+
+msgid "File Send Failed"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, invalid JID"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, user is not online"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, not subscribed to user presence"
+msgstr ""
+
+#, c-format
+msgid "Please select the resource of %s to which you would like to send a file"
+msgstr ""
+
+msgid "Edit User Mood"
+msgstr ""
+
+msgid "Please select your mood from the list."
+msgstr ""
+
+msgid "Set"
+msgstr ""
+
+msgid "Set Mood..."
+msgstr ""
+
+msgid "Set User Nickname"
+msgstr ""
+
+msgid "Please specify a new nickname for you."
+msgstr ""
+
+msgid ""
+"This information is visible to all contacts on your contact list, so choose "
+"something appropriate."
+msgstr ""
+
+msgid "Set Nickname..."
+msgstr ""
+
+msgid "Actions"
+msgstr ""
+
+msgid "Select an action"
+msgstr ""
+
+#. only notify the user about problems adding to the friends list
+#. * maybe we should do something else for other lists, but it probably
+#. * won't cause too many problems if we just ignore it
+#, c-format
+msgid "Unable to add \"%s\"."
+msgstr ""
+
+msgid "Buddy Add error"
+msgstr ""
+
+msgid "The username specified does not exist."
+msgstr ""
+
+#, c-format
+msgid "Buddy list synchronization issue in %s (%s)"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s on the local list is inside the group \"%s\" but not on the server list. "
+"Do you want this buddy to be added?"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s is on the local list but not on the server list. Do you want this buddy "
+"to be added?"
+msgstr ""
+
+#, c-format
+msgid "Unable to parse message"
+msgstr ""
+
+#, c-format
+msgid "Syntax Error (probably a client bug)"
+msgstr ""
+
+#, c-format
+msgid "Invalid email address"
+msgstr ""
+
+#, c-format
+msgid "User does not exist"
+msgstr ""
+
+#, c-format
+msgid "Fully qualified domain name missing"
+msgstr ""
+
+#, c-format
+msgid "Already logged in"
+msgstr ""
+
+#, c-format
+msgid "Invalid username"
+msgstr ""
+
+#, c-format
+msgid "Invalid friendly name"
+msgstr ""
+
+#, c-format
+msgid "List full"
+msgstr ""
+
+#, c-format
+msgid "Already there"
+msgstr ""
+
+#, c-format
+msgid "Not on list"
+msgstr ""
+
+#, c-format
+msgid "User is offline"
+msgstr ""
+
+#, c-format
+msgid "Already in the mode"
+msgstr ""
+
+#, c-format
+msgid "Already in opposite list"
+msgstr ""
+
+#, c-format
+msgid "Too many groups"
+msgstr ""
+
+#, c-format
+msgid "Invalid group"
+msgstr ""
+
+#, c-format
+msgid "User not in group"
+msgstr ""
+
+#, c-format
+msgid "Group name too long"
+msgstr ""
+
+#, c-format
+msgid "Cannot remove group zero"
+msgstr ""
+
+#, c-format
+msgid "Tried to add a user to a group that doesn't exist"
+msgstr ""
+
+#, c-format
+msgid "Switchboard failed"
+msgstr ""
+
+#, c-format
+msgid "Notify transfer failed"
+msgstr ""
+
+#, c-format
+msgid "Required fields missing"
+msgstr ""
+
+#, c-format
+msgid "Too many hits to a FND"
+msgstr ""
+
+#, c-format
+msgid "Not logged in"
+msgstr ""
+
+#, c-format
+msgid "Service temporarily unavailable"
+msgstr ""
+
+#, c-format
+msgid "Database server error"
+msgstr ""
+
+#, c-format
+msgid "Command disabled"
+msgstr ""
+
+#, c-format
+msgid "File operation error"
+msgstr ""
+
+#, c-format
+msgid "Memory allocation error"
+msgstr ""
+
+#, c-format
+msgid "Wrong CHL value sent to server"
+msgstr ""
+
+#, c-format
+msgid "Server busy"
+msgstr ""
+
+#, c-format
+msgid "Server unavailable"
+msgstr ""
+
+#, c-format
+msgid "Peer notification server down"
+msgstr ""
+
+#, c-format
+msgid "Database connect error"
+msgstr ""
+
+#, c-format
+msgid "Server is going down (abandon ship)"
+msgstr ""
+
+#, c-format
+msgid "Error creating connection"
+msgstr ""
+
+#, c-format
+msgid "CVR parameters are either unknown or not allowed"
+msgstr ""
+
+#, c-format
+msgid "Unable to write"
+msgstr ""
+
+#, c-format
+msgid "Session overload"
+msgstr ""
+
+#, c-format
+msgid "User is too active"
+msgstr ""
+
+#, c-format
+msgid "Too many sessions"
+msgstr ""
+
+#, c-format
+msgid "Passport not verified"
+msgstr ""
+
+#, c-format
+msgid "Bad friend file"
+msgstr ""
+
+#, c-format
+msgid "Not expected"
+msgstr ""
+
+#, c-format
+msgid "Friendly name changes too rapidly"
+msgstr ""
+
+#, c-format
+msgid "Server too busy"
+msgstr ""
+
+#, c-format
+msgid "Authentication failed"
+msgstr ""
+
+#, c-format
+msgid "Not allowed when offline"
+msgstr ""
+
+#, c-format
+msgid "Not accepting new users"
+msgstr ""
+
+#, c-format
+msgid "Kids Passport without parental consent"
+msgstr ""
+
+#, c-format
+msgid "Passport account not yet verified"
+msgstr ""
+
+msgid "Passport account suspended"
+msgstr ""
+
+#, c-format
+msgid "Bad ticket"
+msgstr ""
+
+#, c-format
+msgid "Unknown Error Code %d"
+msgstr ""
+
+#, c-format
+msgid "MSN Error: %s\n"
+msgstr ""
+
+msgid "Other Contacts"
+msgstr ""
+
+msgid "Non-IM Contacts"
+msgstr ""
+
+msgid "Nudge"
+msgstr ""
+
+#, c-format
+msgid "%s has nudged you!"
+msgstr ""
+
+#, c-format
+msgid "Nudging %s..."
+msgstr ""
+
+msgid "Email Address..."
+msgstr ""
+
+msgid "Your new MSN friendly name is too long."
+msgstr ""
+
+msgid "Set your friendly name."
+msgstr ""
+
+msgid "This is the name that other MSN buddies will see you as."
+msgstr ""
+
+msgid "Set your home phone number."
+msgstr ""
+
+msgid "Set your work phone number."
+msgstr ""
+
+msgid "Set your mobile phone number."
+msgstr ""
+
+msgid "Allow MSN Mobile pages?"
+msgstr ""
+
+msgid ""
+"Do you want to allow or disallow people on your buddy list to send you MSN "
+"Mobile pages to your cell phone or other mobile device?"
+msgstr ""
+
+msgid "Allow"
+msgstr ""
+
+msgid "Disallow"
+msgstr ""
+
+#, c-format
+msgid "Blocked Text for %s"
+msgstr ""
+
+msgid "No text is blocked for this account."
+msgstr ""
+
+#, c-format
+msgid ""
+"MSN servers are currently blocking the following regular expressions:<br/>%s"
+msgstr ""
+
+msgid "This account does not have email enabled."
+msgstr ""
+
+msgid "Send a mobile message."
+msgstr ""
+
+msgid "Page"
+msgstr ""
+
+msgid "Playing a game"
+msgstr ""
+
+msgid "Working"
+msgstr ""
+
+msgid "Has you"
+msgstr ""
+
+msgid "Home Phone Number"
+msgstr ""
+
+msgid "Work Phone Number"
+msgstr ""
+
+msgid "Mobile Phone Number"
+msgstr ""
+
+msgid "Be Right Back"
+msgstr ""
+
+msgid "Busy"
+msgstr ""
+
+msgid "On the Phone"
+msgstr ""
+
+msgid "Out to Lunch"
+msgstr ""
+
+#. primitive
+#. ID
+#. name - use default
+#. saveable
+#. should be user_settable some day
+#. independent
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+msgid "Game Title"
+msgstr ""
+
+msgid "Office Title"
+msgstr ""
+
+msgid "Set Friendly Name..."
+msgstr ""
+
+msgid "Set Home Phone Number..."
+msgstr ""
+
+msgid "Set Work Phone Number..."
+msgstr ""
+
+msgid "Set Mobile Phone Number..."
+msgstr ""
+
+msgid "Enable/Disable Mobile Devices..."
+msgstr ""
+
+msgid "Allow/Disallow Mobile Pages..."
+msgstr ""
+
+msgid "View Blocked Text..."
+msgstr ""
+
+msgid "Open Hotmail Inbox"
+msgstr ""
+
+msgid "Send to Mobile"
+msgstr ""
+
+msgid "Initiate _Chat"
+msgstr ""
+
+msgid "SSL support is needed for MSN. Please install a supported SSL library."
+msgstr ""
+
+msgid "Failed to connect to server."
+msgstr ""
+
+msgid "Error retrieving profile"
+msgstr ""
+
+msgid "General"
+msgstr ""
+
+msgid "Age"
+msgstr ""
+
+msgid "Occupation"
+msgstr ""
+
+msgid "Location"
+msgstr ""
+
+msgid "Hobbies and Interests"
+msgstr ""
+
+msgid "A Little About Me"
+msgstr ""
+
+msgid "Social"
+msgstr ""
+
+msgid "Marital Status"
+msgstr ""
+
+msgid "Interests"
+msgstr ""
+
+msgid "Pets"
+msgstr ""
+
+msgid "Hometown"
+msgstr ""
+
+msgid "Places Lived"
+msgstr ""
+
+msgid "Fashion"
+msgstr ""
+
+msgid "Humor"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Favorite Quote"
+msgstr ""
+
+msgid "Contact Info"
+msgstr ""
+
+msgid "Personal"
+msgstr ""
+
+msgid "Significant Other"
+msgstr ""
+
+msgid "Home Phone"
+msgstr ""
+
+msgid "Home Phone 2"
+msgstr ""
+
+msgid "Home Address"
+msgstr ""
+
+msgid "Personal Mobile"
+msgstr ""
+
+msgid "Home Fax"
+msgstr ""
+
+msgid "Personal Email"
+msgstr ""
+
+msgid "Personal IM"
+msgstr ""
+
+msgid "Anniversary"
+msgstr ""
+
+#. Business
+msgid "Work"
+msgstr ""
+
+msgid "Job Title"
+msgstr ""
+
+msgid "Company"
+msgstr ""
+
+msgid "Department"
+msgstr ""
+
+msgid "Profession"
+msgstr ""
+
+msgid "Work Phone"
+msgstr ""
+
+msgid "Work Phone 2"
+msgstr ""
+
+msgid "Work Address"
+msgstr ""
+
+msgid "Work Mobile"
+msgstr ""
+
+msgid "Work Pager"
+msgstr ""
+
+msgid "Work Fax"
+msgstr ""
+
+msgid "Work Email"
+msgstr ""
+
+msgid "Work IM"
+msgstr ""
+
+msgid "Start Date"
+msgstr ""
+
+msgid "Favorite Things"
+msgstr ""
+
+msgid "Last Updated"
+msgstr ""
+
+msgid "Homepage"
+msgstr ""
+
+msgid "The user has not created a public profile."
+msgstr ""
+
+msgid ""
+"MSN reported not being able to find the user's profile. This either means "
+"that the user does not exist, or that the user exists but has not created a "
+"public profile."
+msgstr ""
+
+msgid ""
+"Could not find any information in the user's profile. The user most likely "
+"does not exist."
+msgstr ""
+
+msgid "View web profile"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *< summary
+msgid "Windows Live Messenger Protocol Plugin"
+msgstr ""
+
+msgid "Use HTTP Method"
+msgstr ""
+
+msgid "HTTP Method Server"
+msgstr ""
+
+msgid "Show custom smileys"
+msgstr ""
+
+msgid "nudge: nudge a user to get their attention"
+msgstr ""
+
+msgid "Windows Live ID authentication:Unable to connect"
+msgstr ""
+
+msgid "Windows Live ID authentication:Invalid response"
+msgstr ""
+
+#, c-format
+msgid "%s just sent you a Nudge!"
+msgstr ""
+
+#, c-format
+msgid "Unknown error (%d): %s"
+msgstr ""
+
+msgid "Unable to add user"
+msgstr ""
+
+#, c-format
+msgid "Unknown error (%d)"
+msgstr ""
+
+msgid "The following users are missing from your addressbook"
+msgstr ""
+
+#, c-format
+msgid "Unable to add user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Unable to block user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Unable to permit user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s could not be added because your buddy list is full."
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid passport account."
+msgstr ""
+
+msgid "Service Temporarily Unavailable."
+msgstr ""
+
+msgid "Unknown error."
+msgstr ""
+
+msgid "Mobile message was not sent because it was too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"The MSN server will shut down for maintenance in %d minute. You will "
+"automatically be signed out at that time.  Please finish any conversations "
+"in progress.\n"
+"\n"
+"After the maintenance has been completed, you will be able to successfully "
+"sign in."
+msgid_plural ""
+"The MSN server will shut down for maintenance in %d minutes. You will "
+"automatically be signed out at that time.  Please finish any conversations "
+"in progress.\n"
+"\n"
+"After the maintenance has been completed, you will be able to successfully "
+"sign in."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"Message was not sent because the system is unavailable. This normally "
+"happens when the user is blocked or does not exist."
+msgstr ""
+
+msgid "Message was not sent because messages are being sent too quickly."
+msgstr ""
+
+msgid "Message was not sent because an unknown encoding error occurred."
+msgstr ""
+
+msgid "Message was not sent because an unknown error occurred."
+msgstr ""
+
+msgid "Unable to connect"
+msgstr ""
+
+msgid "Writing error"
+msgstr ""
+
+msgid "Reading error"
+msgstr ""
+
+#, c-format
+msgid ""
+"Connection error from %s server:\n"
+"%s"
+msgstr ""
+
+msgid "Our protocol is not supported by the server."
+msgstr ""
+
+msgid "Error parsing HTTP."
+msgstr ""
+
+msgid "You have signed on from another location."
+msgstr ""
+
+msgid "The MSN servers are temporarily unavailable. Please wait and try again."
+msgstr ""
+
+msgid "The MSN servers are going down temporarily."
+msgstr ""
+
+#, c-format
+msgid "Unable to authenticate: %s"
+msgstr ""
+
+msgid ""
+"Your MSN buddy list is temporarily unavailable. Please wait and try again."
+msgstr ""
+
+msgid "Handshaking"
+msgstr ""
+
+msgid "Transferring"
+msgstr ""
+
+msgid "Starting authentication"
+msgstr ""
+
+msgid "Getting cookie"
+msgstr ""
+
+msgid "Sending cookie"
+msgstr ""
+
+msgid "Retrieving buddy list"
+msgstr ""
+
+msgid "Away From Computer"
+msgstr ""
+
+msgid "On The Phone"
+msgstr ""
+
+msgid "Out To Lunch"
+msgstr ""
+
+msgid "Message may have not been sent because a timeout occurred:"
+msgstr ""
+
+msgid "Message could not be sent, not allowed while invisible:"
+msgstr ""
+
+msgid "Message could not be sent because the user is offline:"
+msgstr ""
+
+msgid "Message could not be sent because a connection error occurred:"
+msgstr ""
+
+msgid "Message could not be sent because we are sending too quickly:"
+msgstr ""
+
+msgid ""
+"Message could not be sent because we were unable to establish a session with "
+"the server. This is likely a server problem, try again in a few minutes:"
+msgstr ""
+
+msgid ""
+"Message could not be sent because an error with the switchboard occurred:"
+msgstr ""
+
+msgid "Message may have not been sent because an unknown error occurred:"
+msgstr ""
+
+msgid "Delete Buddy from Address Book?"
+msgstr ""
+
+msgid "Do you want to delete this buddy from your address book as well?"
+msgstr ""
+
+msgid "The username specified is invalid."
+msgstr ""
+
+msgid "This Hotmail account may not be active."
+msgstr ""
+
+msgid "Profile URL"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "MSN Protocol Plugin"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid group."
+msgstr ""
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr ""
+
+msgid "Unable to rename group"
+msgstr ""
+
+msgid "Unable to delete group"
+msgstr ""
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr ""
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr ""
+
+#, c-format
+msgid "No such user: %s"
+msgstr ""
+
+msgid "User lookup"
+msgstr ""
+
+msgid "Reading challenge"
+msgstr ""
+
+msgid "Unexpected challenge length from server"
+msgstr ""
+
+msgid "Logging in"
+msgstr ""
+
+msgid "MySpaceIM - No Username Set"
+msgstr ""
+
+msgid "You appear to have no MySpace username."
+msgstr ""
+
+msgid "Would you like to set one now? (Note: THIS CANNOT BE CHANGED!)"
+msgstr ""
+
+msgid "Lost connection with server"
+msgstr ""
+
+#. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
+msgid "New mail messages"
+msgstr ""
+
+msgid "New blog comments"
+msgstr ""
+
+msgid "New profile comments"
+msgstr ""
+
+msgid "New friend requests!"
+msgstr ""
+
+msgid "New picture comments"
+msgstr ""
+
+msgid "MySpace"
+msgstr ""
+
+msgid "IM Friends"
+msgstr ""
+
+#, c-format
+msgid ""
+"%d buddy was added or updated from the server (including buddies already on "
+"the server-side list)"
+msgid_plural ""
+"%d buddies were added or updated from the server (including buddies already "
+"on the server-side list)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Add contacts from server"
+msgstr ""
+
+#. The session is now set up, ready to be connected. This emits the
+#. * signedOn signal, so clients can now do anything with msimprpl, and
+#. * we're ready for it (session key, userid, username all setup).
+msgid "Connected"
+msgstr ""
+
+#, c-format
+msgid "Protocol error, code %d: %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s Your password is %d characters, greater than the expected maximum length "
+"of %d for MySpaceIM. Please shorten your password at http://profileedit."
+"myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try "
+"again."
+msgstr ""
+
+msgid "MySpaceIM Error"
+msgstr ""
+
+msgid "Invalid input condition"
+msgstr ""
+
+msgid "Read buffer full (2)"
+msgstr ""
+
+msgid "Unparseable message"
+msgstr ""
+
+#, c-format
+msgid "Couldn't connect to host: %s (%d)"
+msgstr ""
+
+msgid "Failed to add buddy"
+msgstr ""
+
+msgid "'addbuddy' command failed."
+msgstr ""
+
+msgid "persist command failed"
+msgstr ""
+
+msgid "Failed to remove buddy"
+msgstr ""
+
+msgid "'delbuddy' command failed"
+msgstr ""
+
+msgid "blocklist command failed"
+msgstr ""
+
+msgid "Missing Cipher"
+msgstr ""
+
+msgid "The RC4 cipher could not be found"
+msgstr ""
+
+msgid ""
+"Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will "
+"not be loaded."
+msgstr ""
+
+msgid "Add friends from MySpace.com"
+msgstr ""
+
+msgid "Importing friends failed"
+msgstr ""
+
+#. TODO: find out how
+msgid "Find people..."
+msgstr ""
+
+msgid "Change IM name..."
+msgstr ""
+
+msgid "myim URL handler"
+msgstr ""
+
+msgid "No suitable MySpaceIM account could be found to open this myim URL."
+msgstr ""
+
+msgid "Enable the proper MySpaceIM account and try again."
+msgstr ""
+
+msgid "Show display name in status text"
+msgstr ""
+
+msgid "Show headline in status text"
+msgstr ""
+
+msgid "Send emoticons"
+msgstr ""
+
+msgid "Screen resolution (dots per inch)"
+msgstr ""
+
+msgid "Base font size (points)"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Headline"
+msgstr ""
+
+msgid "Song"
+msgstr ""
+
+msgid "Total Friends"
+msgstr ""
+
+msgid "Client Version"
+msgstr ""
+
+msgid "MySpaceIM - Username Available"
+msgstr ""
+
+msgid "This username is available. Would you like to set it?"
+msgstr ""
+
+msgid "ONCE SET, THIS CANNOT BE CHANGED!"
+msgstr ""
+
+msgid "MySpaceIM - Please Set a Username"
+msgstr ""
+
+msgid "This username is unavailable."
+msgstr ""
+
+msgid "Please try another username:"
+msgstr ""
+
+#. Protocol won't log in now without a username set.. Disconnect
+msgid "No username set"
+msgstr ""
+
+msgid "Please enter a username to check its availability:"
+msgstr ""
+
+#. TODO: icons for each zap
+#. Lots of comments for translators:
+#. Zap means "to strike suddenly and forcefully as if with a
+#. * projectile or weapon."  This term often has an electrical
+#. * connotation, for example, "he was zapped by electricity when
+#. * he put a fork in the toaster."
+msgid "Zap"
+msgstr ""
+
+#, c-format
+msgid "%s has zapped you!"
+msgstr ""
+
+#, c-format
+msgid "Zapping %s..."
+msgstr ""
+
+#. Whack means "to hit or strike someone with a sharp blow"
+msgid "Whack"
+msgstr ""
+
+#, c-format
+msgid "%s has whacked you!"
+msgstr ""
+
+#, c-format
+msgid "Whacking %s..."
+msgstr ""
+
+#. Torch means "to set on fire."  Don't worry, this doesn't
+#. * make a whole lot of sense in English, either.  Feel free
+#. * to translate it literally.
+msgid "Torch"
+msgstr ""
+
+#, c-format
+msgid "%s has torched you!"
+msgstr ""
+
+#, c-format
+msgid "Torching %s..."
+msgstr ""
+
+#. Smooch means "to kiss someone, often enthusiastically"
+msgid "Smooch"
+msgstr ""
+
+#, c-format
+msgid "%s has smooched you!"
+msgstr ""
+
+#, c-format
+msgid "Smooching %s..."
+msgstr ""
+
+#. A hug is a display of affection; wrapping your arms around someone
+msgid "Hug"
+msgstr ""
+
+#, c-format
+msgid "%s has hugged you!"
+msgstr ""
+
+#, c-format
+msgid "Hugging %s..."
+msgstr ""
+
+#. Slap means "to hit someone with an open/flat hand"
+msgid "Slap"
+msgstr ""
+
+#, c-format
+msgid "%s has slapped you!"
+msgstr ""
+
+#, c-format
+msgid "Slapping %s..."
+msgstr ""
+
+#. Goose means "to pinch someone on their butt"
+msgid "Goose"
+msgstr ""
+
+#, c-format
+msgid "%s has goosed you!"
+msgstr ""
+
+#, c-format
+msgid "Goosing %s..."
+msgstr ""
+
+#. A high-five is when two people's hands slap each other
+#. * in the air above their heads.  It is done to celebrate
+#. * something, often a victory, or to congratulate someone.
+msgid "High-five"
+msgstr ""
+
+#, c-format
+msgid "%s has high-fived you!"
+msgstr ""
+
+#, c-format
+msgid "High-fiving %s..."
+msgstr ""
+
+#. We're not entirely sure what the MySpace people mean by
+#. * this... but we think it's the equivalent of "prank."  Or, for
+#. * someone to perform a mischievous trick or practical joke.
+msgid "Punk"
+msgstr ""
+
+#, c-format
+msgid "%s has punk'd you!"
+msgstr ""
+
+#, c-format
+msgid "Punking %s..."
+msgstr ""
+
+#. Raspberry is a slang term for the vibrating sound made
+#. * when you stick your tongue out of your mouth with your
+#. * lips closed and blow.  It is typically done when
+#. * gloating or bragging.  Nowadays it's a pretty silly
+#. * gesture, so it does not carry a harsh negative
+#. * connotation.  It is generally used in a playful tone
+#. * with friends.
+msgid "Raspberry"
+msgstr ""
+
+#, c-format
+msgid "%s has raspberried you!"
+msgstr ""
+
+#, c-format
+msgid "Raspberrying %s..."
+msgstr ""
+
+msgid "Required parameters not passed in"
+msgstr ""
+
+msgid "Unable to write to network"
+msgstr ""
+
+msgid "Unable to read from network"
+msgstr ""
+
+msgid "Error communicating with server"
+msgstr ""
+
+msgid "Conference not found"
+msgstr ""
+
+msgid "Conference does not exist"
+msgstr ""
+
+msgid "A folder with that name already exists"
+msgstr ""
+
+msgid "Not supported"
+msgstr ""
+
+msgid "Password has expired"
+msgstr ""
+
+msgid "Incorrect password"
+msgstr ""
+
+msgid "User not found"
+msgstr ""
+
+msgid "Account has been disabled"
+msgstr ""
+
+msgid "The server could not access the directory"
+msgstr ""
+
+msgid "Your system administrator has disabled this operation"
+msgstr ""
+
+msgid "The server is unavailable; try again later"
+msgstr ""
+
+msgid "Cannot add a contact to the same folder twice"
+msgstr ""
+
+msgid "Cannot add yourself"
+msgstr ""
+
+msgid "Master archive is misconfigured"
+msgstr ""
+
+msgid "Incorrect username or password"
+msgstr ""
+
+msgid "Could not recognize the host of the username you entered"
+msgstr ""
+
+msgid ""
+"Your account has been disabled because too many incorrect passwords were "
+"entered"
+msgstr ""
+
+msgid "You cannot add the same person twice to a conversation"
+msgstr ""
+
+msgid "You have reached your limit for the number of contacts allowed"
+msgstr ""
+
+msgid "You have entered an incorrect username"
+msgstr ""
+
+msgid "An error occurred while updating the directory"
+msgstr ""
+
+msgid "Incompatible protocol version"
+msgstr ""
+
+msgid "The user has blocked you"
+msgstr ""
+
+msgid ""
+"This evaluation version does not allow more than ten users to log in at one "
+"time"
+msgstr ""
+
+msgid "The user is either offline or you are blocked"
+msgstr ""
+
+#, c-format
+msgid "Unknown error: 0x%X"
+msgstr ""
+
+#, c-format
+msgid "Login failed (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message. Could not get details for user (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to your buddy list (%s)."
+msgstr ""
+
+#. TODO: Improve this! message to who or for what conference?
+#, c-format
+msgid "Unable to send message (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to invite user (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message to %s. Could not create the conference (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message. Could not create the conference (%s)."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to move user %s to folder %s in the server side list. Error while "
+"creating folder (%s)."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to add %s to your buddy list. Error creating folder in server side "
+"list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Could not get details for user %s (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add user to privacy list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to deny list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to permit list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to remove %s from privacy list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to change server side privacy settings (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to create conference (%s)."
+msgstr ""
+
+msgid "Error communicating with server. Closing connection."
+msgstr ""
+
+msgid "Telephone Number"
+msgstr ""
+
+msgid "Personal Title"
+msgstr ""
+
+msgid "Mailstop"
+msgstr ""
+
+msgid "User ID"
+msgstr ""
+
+#. tag = _("DN");
+#. value = nm_user_record_get_dn(user_record);
+#. if (value) {
+#. purple_notify_user_info_add_pair(user_info, tag, value);
+#. }
+#.
+msgid "Full name"
+msgstr ""
+
+#, c-format
+msgid "GroupWise Conference %d"
+msgstr ""
+
+msgid "Authenticating..."
+msgstr ""
+
+msgid "Unable to connect to server."
+msgstr ""
+
+msgid "Waiting for response..."
+msgstr ""
+
+#, c-format
+msgid "%s has been invited to this conversation."
+msgstr ""
+
+msgid "Invitation to Conversation"
+msgstr ""
+
+#, c-format
+msgid ""
+"Invitation from: %s\n"
+"\n"
+"Sent: %s"
+msgstr ""
+
+msgid "Would you like to join the conversation?"
+msgstr ""
+
+msgid "You have been logged out because you logged in at another workstation."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s appears to be offline and did not receive the message that you just sent."
+msgstr ""
+
+msgid ""
+"Unable to connect to server. Please enter the address of the server you wish "
+"to connect to."
+msgstr ""
+
+msgid "Error. SSL support is not installed."
+msgstr ""
+
+msgid "This conference has been closed. No more messages can be sent."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Novell GroupWise Messenger Protocol Plugin"
+msgstr ""
+
+msgid "Server address"
+msgstr ""
+
+msgid "Server port"
+msgstr ""
+
+msgid "Could not join chat room"
+msgstr ""
+
+msgid "Invalid chat room name"
+msgstr ""
+
+msgid "Server closed the connection."
+msgstr ""
+
+#, c-format
+msgid ""
+"Lost connection with server:\n"
+"%s"
+msgstr ""
+
+msgid "Received invalid data on connection with server."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "AIM Protocol Plugin"
+msgstr ""
+
+msgid "ICQ UIN..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "ICQ Protocol Plugin"
+msgstr ""
+
+msgid "Encoding"
+msgstr ""
+
+msgid "The remote user has closed the connection."
+msgstr ""
+
+msgid "The remote user has declined your request."
+msgstr ""
+
+#, c-format
+msgid "Lost connection with the remote user:<br>%s"
+msgstr ""
+
+msgid "Received invalid data on connection with remote user."
+msgstr ""
+
+msgid "Could not establish a connection with the remote user."
+msgstr ""
+
+msgid "Direct IM established"
+msgstr ""
+
+#, c-format
+msgid ""
+"%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 ""
+
+#, c-format
+msgid "File %s is %s, which is larger than the maximum size of %s."
+msgstr ""
+
+msgid "Invalid error"
+msgstr ""
+
+msgid "Invalid SNAC"
+msgstr ""
+
+msgid "Rate to host"
+msgstr ""
+
+msgid "Rate to client"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Service not defined"
+msgstr ""
+
+msgid "Obsolete SNAC"
+msgstr ""
+
+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 ""
+
+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 ""
+
+msgid ""
+"(There was an error receiving this message.  The buddy you are speaking with "
+"is probably using a different encoding than expected.  If you know what "
+"encoding he is using, you can specify it in the advanced account options for "
+"your AIM/ICQ account.)"
+msgstr ""
+
+#, c-format
+msgid ""
+"(There was an error receiving this message.  Either you and %s have "
+"different encodings selected, or %s has a buggy client.)"
+msgstr ""
+
+#. Label
+msgid "Buddy Icon"
+msgstr ""
+
+msgid "Voice"
+msgstr ""
+
+msgid "AIM Direct IM"
+msgstr ""
+
+msgid "Get File"
+msgstr ""
+
+msgid "Games"
+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 ""
+
+msgid "Screen Sharing"
+msgstr ""
+
+msgid "Free For Chat"
+msgstr ""
+
+msgid "Not Available"
+msgstr ""
+
+msgid "Occupied"
+msgstr ""
+
+msgid "Web Aware"
+msgstr ""
+
+msgid "Invisible"
+msgstr ""
+
+msgid "IP Address"
+msgstr ""
+
+msgid "Warning Level"
+msgstr ""
+
+msgid "Buddy Comment"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not connect to authentication server:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not connect to BOS server:\n"
+"%s"
+msgstr ""
+
+msgid "Username sent"
+msgstr ""
+
+msgid "Connection established, cookie sent"
+msgstr ""
+
+#. TODO: Don't call this with ssi
+msgid "Finalizing connection"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to login: Could not sign on as %s because the username is invalid.  "
+"Usernames must be a valid email address, or start with a letter and contain "
+"only letters, numbers and spaces, or contain only numbers."
+msgstr ""
+
+#. Unregistered username
+#. uid is not exist
+msgid "Invalid username."
+msgstr ""
+
+msgid "Incorrect password."
+msgstr ""
+
+#. Suspended account
+msgid "Your account is currently suspended."
+msgstr ""
+
+#. service temporarily unavailable
+msgid "The AOL Instant Messenger service is temporarily unavailable."
+msgstr ""
+
+#. username connecting too frequently
+#. IP address connecting too frequently
+msgid ""
+"You have been connecting and disconnecting too frequently. Wait ten minutes "
+"and try again. If you continue to try, you will need to wait even longer."
+msgstr ""
+
+#, c-format
+msgid "The client version you are using is too old. Please upgrade at %s"
+msgstr ""
+
+msgid "Could Not Connect"
+msgstr ""
+
+msgid "Received authorization"
+msgstr ""
+
+msgid "The SecurID key entered is invalid."
+msgstr ""
+
+msgid "Enter SecurID"
+msgstr ""
+
+msgid "Enter the 6 digit number from the digital display."
+msgstr ""
+
+#. *
+#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#.
+msgid "_OK"
+msgstr ""
+
+#, c-format
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+
+msgid "Unable to get a valid AIM login hash."
+msgstr ""
+
+#, c-format
+msgid "You may be disconnected shortly.  Check %s for updates."
+msgstr ""
+
+msgid "Unable to get a valid login hash."
+msgstr ""
+
+msgid "Password sent"
+msgstr ""
+
+msgid "Unable to initialize connection"
+msgstr ""
+
+msgid "Please authorize me so I can add you to my buddy list."
+msgstr ""
+
+msgid "Authorization Request Message:"
+msgstr ""
+
+msgid "Please authorize me!"
+msgstr ""
+
+msgid "No reason given."
+msgstr ""
+
+msgid "Authorization Denied Message:"
+msgstr ""
+
+#, c-format
+msgid ""
+"The user %u has denied your request to add them to your buddy list for the "
+"following reason:\n"
+"%s"
+msgstr ""
+
+msgid "ICQ authorization denied."
+msgstr ""
+
+#. Someone has granted you authorization
+#, c-format
+msgid "The user %u has granted your request to add them to your buddy list."
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received a special message\n"
+"\n"
+"From: %s [%s]\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received an ICQ page\n"
+"\n"
+"From: %s [%s]\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received an ICQ email from %s [%s]\n"
+"\n"
+"Message is:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "ICQ user %u has sent you a buddy: %s (%s)"
+msgstr ""
+
+msgid "Do you want to add this buddy to your buddy list?"
+msgstr ""
+
+msgid "_Add"
+msgstr ""
+
+msgid "_Decline"
+msgstr ""
+
+#, c-format
+msgid "You missed %hu message from %s because it was invalid."
+msgid_plural "You missed %hu messages from %s because they were invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s because it was too large."
+msgid_plural "You missed %hu messages from %s because they were too large."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid ""
+"You missed %hu message from %s because the rate limit has been exceeded."
+msgid_plural ""
+"You missed %hu messages from %s because the rate limit has been exceeded."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid ""
+"You missed %hu message from %s because his/her warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because his/her warning level is too high."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s because your warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because your warning level is too high."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s for an unknown reason."
+msgid_plural "You missed %hu messages from %s for an unknown reason."
+msgstr[0] ""
+msgstr[1] ""
+
+#. Data is assumed to be the destination bn
+#, c-format
+msgid "Unable to send message: %s"
+msgstr ""
+
+msgid "Unknown reason."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message to %s:"
+msgstr ""
+
+#, c-format
+msgid "User information not available: %s"
+msgstr ""
+
+msgid "Online Since"
+msgstr ""
+
+msgid "Member Since"
+msgstr ""
+
+msgid "Profile"
+msgstr ""
+
+msgid "Your AIM connection may be lost."
+msgstr ""
+
+#. The conversion failed!
+msgid ""
+"[Unable to display a message from this user because it contained invalid "
+"characters.]"
+msgstr ""
+
+msgid ""
+"The last action you attempted could not be performed because you are over "
+"the rate limit. Please wait 10 seconds and try again."
+msgstr ""
+
+#, c-format
+msgid "You have been disconnected from chat room %s."
+msgstr ""
+
+msgid "Mobile Phone"
+msgstr ""
+
+msgid "Personal Web Page"
+msgstr ""
+
+#. aim_userinfo_t
+#. strip_html_tags
+msgid "Additional Information"
+msgstr ""
+
+msgid "Zip Code"
+msgstr ""
+
+msgid "Work Information"
+msgstr ""
+
+msgid "Division"
+msgstr ""
+
+msgid "Position"
+msgstr ""
+
+msgid "Web Page"
+msgstr ""
+
+msgid "Pop-Up Message"
+msgstr ""
+
+#, c-format
+msgid "The following username is associated with %s"
+msgid_plural "The following usernames are associated with %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "No results found for email address %s"
+msgstr ""
+
+#, c-format
+msgid "You should receive an email asking to confirm %s."
+msgstr ""
+
+msgid "Account Confirmation Requested"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to format username because the requested name differs "
+"from the original."
+msgstr ""
+
+#, c-format
+msgid "Error 0x%04x: Unable to format username because it is invalid."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to format username because the requested name is too "
+"long."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because there is already a "
+"request pending for this username."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because the given address has "
+"too many usernames associated with it."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because the given address is "
+"invalid."
+msgstr ""
+
+#, c-format
+msgid "Error 0x%04x: Unknown error."
+msgstr ""
+
+msgid "Error Changing Account Info"
+msgstr ""
+
+#, c-format
+msgid "The email address for %s is %s"
+msgstr ""
+
+msgid "Account Info"
+msgstr ""
+
+msgid ""
+"Your IM Image was not sent. You must be Direct Connected to send IM Images."
+msgstr ""
+
+msgid "Unable to set AIM profile."
+msgstr ""
+
+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 ""
+
+#, c-format
+msgid ""
+"The maximum profile length of %d byte has been exceeded.  It has been "
+"truncated for you."
+msgid_plural ""
+"The maximum profile length of %d bytes has been exceeded.  It has been "
+"truncated for you."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Profile too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"The maximum away message length of %d byte has been exceeded.  It has been "
+"truncated for you."
+msgid_plural ""
+"The maximum away message length of %d bytes has been exceeded.  It has been "
+"truncated for you."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Away message too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not add the buddy %s because the username is invalid.  Usernames must "
+"be a valid email address, or start with a letter and contain only letters, "
+"numbers and spaces, or contain only numbers."
+msgstr ""
+
+msgid "Unable to Add"
+msgstr ""
+
+msgid "Unable to Retrieve Buddy List"
+msgstr ""
+
+msgid ""
+"The AIM servers were temporarily unable to send your buddy list.  Your buddy "
+"list is not lost, and will probably become available in a few minutes."
+msgstr ""
+
+msgid "Orphans"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not add the buddy %s because you have too many buddies in your buddy "
+"list.  Please remove one and try again."
+msgstr ""
+
+msgid "(no name)"
+msgstr ""
+
+#, c-format
+msgid "Could not add the buddy %s for an unknown reason."
+msgstr ""
+
+#, c-format
+msgid ""
+"The user %s has given you permission to add him or her to your buddy list.  "
+"Do you want to add this user?"
+msgstr ""
+
+msgid "Authorization Given"
+msgstr ""
+
+#. Granted
+#, c-format
+msgid "The user %s has granted your request to add them to your buddy list."
+msgstr ""
+
+msgid "Authorization Granted"
+msgstr ""
+
+#. Denied
+#, c-format
+msgid ""
+"The user %s has denied your request to add them to your buddy list for the "
+"following reason:\n"
+"%s"
+msgstr ""
+
+msgid "Authorization Denied"
+msgstr ""
+
+msgid "_Exchange:"
+msgstr ""
+
+msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats."
+msgstr ""
+
+msgid "iTunes Music Store Link"
+msgstr ""
+
+#, c-format
+msgid "Buddy Comment for %s"
+msgstr ""
+
+msgid "Buddy Comment:"
+msgstr ""
+
+#, c-format
+msgid "You have selected to open a Direct IM connection with %s."
+msgstr ""
+
+msgid ""
+"Because this reveals your IP address, it may be considered a security risk.  "
+"Do you wish to continue?"
+msgstr ""
+
+msgid "C_onnect"
+msgstr ""
+
+msgid "Get AIM Info"
+msgstr ""
+
+#. We only do this if the user is in our buddy list
+msgid "Edit Buddy Comment"
+msgstr ""
+
+msgid "Get Status Msg"
+msgstr ""
+
+msgid "Direct IM"
+msgstr ""
+
+msgid "Re-request Authorization"
+msgstr ""
+
+msgid "Require authorization"
+msgstr ""
+
+msgid "Web aware (enabling this will cause you to receive SPAM!)"
+msgstr ""
+
+msgid "ICQ Privacy Options"
+msgstr ""
+
+msgid "The new formatting is invalid."
+msgstr ""
+
+msgid "Username formatting can change only capitalization and whitespace."
+msgstr ""
+
+msgid "Change Address To:"
+msgstr ""
+
+msgid "<i>you are not waiting for authorization</i>"
+msgstr ""
+
+msgid "You are awaiting authorization from the following buddies"
+msgstr ""
+
+msgid ""
+"You can re-request authorization from these buddies by right-clicking on "
+"them and selecting \"Re-request Authorization.\""
+msgstr ""
+
+msgid "Find Buddy by Email"
+msgstr ""
+
+msgid "Search for a buddy by email address"
+msgstr ""
+
+msgid "Type the email address of the buddy you are searching for."
+msgstr ""
+
+msgid "_Search"
+msgstr ""
+
+msgid "Set User Info (web)..."
+msgstr ""
+
+msgid "Change Password (web)"
+msgstr ""
+
+msgid "Configure IM Forwarding (web)"
+msgstr ""
+
+#. ICQ actions
+msgid "Set Privacy Options..."
+msgstr ""
+
+#. AIM actions
+msgid "Confirm Account"
+msgstr ""
+
+msgid "Display Currently Registered Email Address"
+msgstr ""
+
+msgid "Change Currently Registered Email Address..."
+msgstr ""
+
+msgid "Show Buddies Awaiting Authorization"
+msgstr ""
+
+msgid "Search for Buddy by Email Address..."
+msgstr ""
+
+msgid "Search for Buddy by Information"
+msgstr ""
+
+msgid ""
+"Always use AIM/ICQ proxy server for\n"
+"file transfers and direct IM (slower,\n"
+"but does not reveal your IP address)"
+msgstr ""
+
+msgid "Allow multiple simultaneous logins"
+msgstr ""
+
+#, c-format
+msgid "Asking %s to connect to us at %s:%hu for Direct IM."
+msgstr ""
+
+#, c-format
+msgid "Attempting to connect to %s:%hu."
+msgstr ""
+
+msgid "Attempting to connect via proxy server."
+msgstr ""
+
+#, c-format
+msgid "%s has just asked to directly connect to %s"
+msgstr ""
+
+msgid ""
+"This requires a direct connection between the two computers and is necessary "
+"for IM Images.  Because your IP address will be revealed, this may be "
+"considered a privacy risk."
+msgstr ""
+
+msgid "Aquarius"
+msgstr ""
+
+msgid "Pisces"
+msgstr ""
+
+msgid "Aries"
+msgstr ""
+
+msgid "Taurus"
+msgstr ""
+
+msgid "Gemini"
+msgstr ""
+
+msgid "Cancer"
+msgstr ""
+
+msgid "Leo"
+msgstr ""
+
+msgid "Virgo"
+msgstr ""
+
+msgid "Libra"
+msgstr ""
+
+msgid "Scorpio"
+msgstr ""
+
+msgid "Sagittarius"
+msgstr ""
+
+msgid "Capricorn"
+msgstr ""
+
+msgid "Rat"
+msgstr ""
+
+msgid "Ox"
+msgstr ""
+
+msgid "Tiger"
+msgstr ""
+
+msgid "Rabbit"
+msgstr ""
+
+msgid "Dragon"
+msgstr ""
+
+msgid "Snake"
+msgstr ""
+
+msgid "Horse"
+msgstr ""
+
+msgid "Goat"
+msgstr ""
+
+msgid "Monkey"
+msgstr ""
+
+msgid "Rooster"
+msgstr ""
+
+msgid "Dog"
+msgstr ""
+
+msgid "Pig"
+msgstr ""
+
+msgid "Other"
+msgstr ""
+
+msgid "Visible"
+msgstr ""
+
+msgid "Friend Only"
+msgstr ""
+
+msgid "Private"
+msgstr ""
+
+msgid "QQ Number"
+msgstr ""
+
+msgid "Country/Region"
+msgstr ""
+
+msgid "Province/State"
+msgstr ""
+
+msgid "Zipcode"
+msgstr ""
+
+msgid "Phone Number"
+msgstr ""
+
+msgid "Authorize adding"
+msgstr ""
+
+msgid "Cellphone Number"
+msgstr ""
+
+msgid "Personal Introduction"
+msgstr ""
+
+msgid "City/Area"
+msgstr ""
+
+msgid "Publish Mobile"
+msgstr ""
+
+msgid "Publish Contact"
+msgstr ""
+
+msgid "College"
+msgstr ""
+
+msgid "Horoscope"
+msgstr ""
+
+msgid "Zodiac"
+msgstr ""
+
+msgid "Blood"
+msgstr ""
+
+msgid "True"
+msgstr ""
+
+msgid "False"
+msgstr ""
+
+msgid "Modify Contact"
+msgstr ""
+
+msgid "Modify Address"
+msgstr ""
+
+msgid "Modify Extended Information"
+msgstr ""
+
+msgid "Modify Information"
+msgstr ""
+
+msgid "Update"
+msgstr ""
+
+msgid "Could not change buddy information."
+msgstr ""
+
+msgid "Mobile"
+msgstr ""
+
+msgid "Note"
+msgstr ""
+
+#. callback
+msgid "Buddy Memo"
+msgstr ""
+
+msgid "Change his/her memo as you like"
+msgstr ""
+
+msgid "_Modify"
+msgstr ""
+
+msgid "Memo Modify"
+msgstr ""
+
+msgid "Server says:"
+msgstr ""
+
+msgid "Your request was accepted."
+msgstr ""
+
+msgid "Your request was rejected."
+msgstr ""
+
+#, c-format
+msgid "%u requires verification"
+msgstr ""
+
+msgid "Add buddy question"
+msgstr ""
+
+msgid "Enter answer here"
+msgstr ""
+
+msgid "Send"
+msgstr ""
+
+msgid "Invalid answer."
+msgstr ""
+
+msgid "Authorization denied message:"
+msgstr ""
+
+msgid "Sorry, you're not my style."
+msgstr ""
+
+#, c-format
+msgid "%u needs authorization"
+msgstr ""
+
+msgid "Add buddy authorize"
+msgstr ""
+
+msgid "Enter request here"
+msgstr ""
+
+msgid "Would you be my friend?"
+msgstr ""
+
+msgid "QQ Buddy"
+msgstr ""
+
+msgid "Add buddy"
+msgstr ""
+
+msgid "Invalid QQ Number"
+msgstr ""
+
+msgid "Failed sending authorize"
+msgstr ""
+
+#, c-format
+msgid "Failed removing buddy %u"
+msgstr ""
+
+#, c-format
+msgid "Failed removing me from %d's buddy list"
+msgstr ""
+
+msgid "No reason given"
+msgstr ""
+
+#. only need to get value
+#, c-format
+msgid "You have been added by %s"
+msgstr ""
+
+msgid "Would you like to add him?"
+msgstr ""
+
+#, c-format
+msgid "Rejected by %s"
+msgstr ""
+
+#, c-format
+msgid "Message: %s"
+msgstr ""
+
+msgid "ID: "
+msgstr ""
+
+msgid "Group ID"
+msgstr ""
+
+msgid "QQ Qun"
+msgstr ""
+
+msgid "Please enter Qun number"
+msgstr ""
+
+msgid "You can only search for permanent Qun\n"
+msgstr ""
+
+msgid "(Invalid UTF-8 string)"
+msgstr ""
+
+msgid "Not member"
+msgstr ""
+
+msgid "Member"
+msgstr ""
+
+msgid "Requesting"
+msgstr ""
+
+msgid "Admin"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+msgid "Detail"
+msgstr ""
+
+msgid "Creator"
+msgstr ""
+
+msgid "About me"
+msgstr ""
+
+msgid "Category"
+msgstr ""
+
+msgid "The Qun does not allow others to join"
+msgstr ""
+
+msgid "Join QQ Qun"
+msgstr ""
+
+msgid "Input request here"
+msgstr ""
+
+#, c-format
+msgid "Successfully joined Qun %s (%u)"
+msgstr ""
+
+msgid "Successfully joined Qun"
+msgstr ""
+
+#, c-format
+msgid "Qun %u denied from joining"
+msgstr ""
+
+msgid "QQ Qun Operation"
+msgstr ""
+
+msgid "Failed:"
+msgstr ""
+
+msgid "Join Qun, Unknown Reply"
+msgstr ""
+
+msgid "Quit Qun"
+msgstr ""
+
+msgid ""
+"Note, if you are the creator, \n"
+"this operation will eventually remove this Qun."
+msgstr ""
+
+msgid "Sorry, you are not our style"
+msgstr ""
+
+msgid "Successfully changed Qun members"
+msgstr ""
+
+msgid "Successfully changed Qun information"
+msgstr ""
+
+msgid "You have successfully created a Qun"
+msgstr ""
+
+msgid "Would you like to set up detailed information now?"
+msgstr ""
+
+msgid "Setup"
+msgstr ""
+
+#, c-format
+msgid "%u requested to join Qun %u for %s"
+msgstr ""
+
+#, c-format
+msgid "%u request to join Qun %u"
+msgstr ""
+
+#, c-format
+msgid "Failed to join Qun %u, operated by admin %u"
+msgstr ""
+
+#, c-format
+msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
+msgstr ""
+
+#, c-format
+msgid "<b>Removed buddy %u.</b>"
+msgstr ""
+
+#, c-format
+msgid "<b>New buddy %u joined.</b>"
+msgstr ""
+
+#, c-format
+msgid "Unknown-%d"
+msgstr ""
+
+msgid "Level"
+msgstr ""
+
+msgid " VIP"
+msgstr ""
+
+msgid " TCP"
+msgstr ""
+
+msgid " FromMobile"
+msgstr ""
+
+msgid " BindMobile"
+msgstr ""
+
+msgid " Video"
+msgstr ""
+
+msgid " Zone"
+msgstr ""
+
+msgid "Flag"
+msgstr ""
+
+msgid "Ver"
+msgstr ""
+
+msgid "Invalid name"
+msgstr ""
+
+msgid "Select icon..."
+msgstr ""
+
+#, c-format
+msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Total Online Buddies</b>: %d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Server</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Client Tag</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Connection Mode</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>My Internet IP</b>: %s:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Sent</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Resend</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Lost</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Received</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Received Duplicate</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>IP</b>: %s<br>\n"
+msgstr ""
+
+msgid "Login Information"
+msgstr ""
+
+msgid "<p><b>Original Author</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Code Contributors</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Acknowledgement</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Scrupulous Testers</b>:<br>\n"
+msgstr ""
+
+msgid "and more, please let me know... thank you!))"
+msgstr ""
+
+msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
+msgstr ""
+
+msgid "<i>Feel free to join us!</i> :)"
+msgstr ""
+
+#, c-format
+msgid "About OpenQ %s"
+msgstr ""
+
+msgid "Change Icon"
+msgstr ""
+
+msgid "Change Password"
+msgstr ""
+
+msgid "Account Information"
+msgstr ""
+
+msgid "Update all QQ Quns"
+msgstr ""
+
+msgid "About OpenQ"
+msgstr ""
+
+msgid "Modify Buddy Memo"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "QQ Protocol Plugin"
+msgstr ""
+
+msgid "Auto"
+msgstr ""
+
+msgid "Select Server"
+msgstr ""
+
+msgid "QQ2005"
+msgstr ""
+
+msgid "QQ2007"
+msgstr ""
+
+msgid "QQ2008"
+msgstr ""
+
+msgid "Connect by TCP"
+msgstr ""
+
+msgid "Show server notice"
+msgstr ""
+
+msgid "Show server news"
+msgstr ""
+
+msgid "Show chat room when msg comes"
+msgstr ""
+
+msgid "Keep alive interval (seconds)"
+msgstr ""
+
+msgid "Update interval (seconds)"
+msgstr ""
+
+msgid "Cannot decrypt server reply"
+msgstr ""
+
+#, c-format
+msgid "Failed requesting token, 0x%02X"
+msgstr ""
+
+#, c-format
+msgid "Invalid token len, %d"
+msgstr ""
+
+#. extend redirect used in QQ2006
+msgid "Redirect_EX is not currently supported"
+msgstr ""
+
+#. need activation
+#. need activation
+#. need activation
+msgid "Activation required"
+msgstr ""
+
+#, c-format
+msgid "Unknown reply code when logging in (0x%02X)"
+msgstr ""
+
+msgid "Could not decrypt server reply"
+msgstr ""
+
+msgid "Requesting captcha"
+msgstr ""
+
+msgid "Checking captcha"
+msgstr ""
+
+msgid "Failed captcha verification"
+msgstr ""
+
+msgid "Captcha Image"
+msgstr ""
+
+msgid "Enter code"
+msgstr ""
+
+msgid "QQ Captcha Verification"
+msgstr ""
+
+msgid "Enter the text from the image"
+msgstr ""
+
+#, c-format
+msgid "Unknown reply when checking password (0x%02X)"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unknown reply code when logging in (0x%02X):\n"
+"%s"
+msgstr ""
+
+msgid "Unable to connect."
+msgstr ""
+
+msgid "Socket error"
+msgstr ""
+
+msgid "Unable to read from socket"
+msgstr ""
+
+msgid "Write Error"
+msgstr ""
+
+msgid "Connection lost"
+msgstr ""
+
+msgid "Getting server"
+msgstr ""
+
+msgid "Requesting token"
+msgstr ""
+
+msgid "Couldn't resolve host"
+msgstr ""
+
+msgid "Invalid server or port"
+msgstr ""
+
+msgid "Connecting to server"
+msgstr ""
+
+msgid "QQ Error"
+msgstr ""
+
+#, c-format
+msgid ""
+"Server News:\n"
+"%s\n"
+"%s\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "%s:%s"
+msgstr ""
+
+#, c-format
+msgid "From %s:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Server notice From %s: \n"
+"%s"
+msgstr ""
+
+msgid "Unknown SERVER CMD"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reply of %s(0x%02X)\n"
+"Room %u, reply 0x%02X"
+msgstr ""
+
+msgid "QQ Qun Command"
+msgstr ""
+
+msgid "Could not decrypt login reply"
+msgstr ""
+
+msgid "Unknown LOGIN CMD"
+msgstr ""
+
+msgid "Unknown CLIENT CMD"
+msgstr ""
+
+#, c-format
+msgid "%d has declined the file %s"
+msgstr ""
+
+msgid "File Send"
+msgstr ""
+
+#, c-format
+msgid "%d canceled the transfer of %s"
+msgstr ""
+
+msgid "Connection closed (writing)"
+msgstr ""
+
+#, c-format
+msgid "<b>Group Title:</b> %s<br>"
+msgstr ""
+
+#, c-format
+msgid "<b>Notes Group ID:</b> %s<br>"
+msgstr ""
+
+#, c-format
+msgid "Info for Group %s"
+msgstr ""
+
+msgid "Notes Address Book Information"
+msgstr ""
+
+msgid "Invite Group to Conference..."
+msgstr ""
+
+msgid "Get Notes Address Book Info"
+msgstr ""
+
+msgid "Sending Handshake"
+msgstr ""
+
+msgid "Waiting for Handshake Acknowledgement"
+msgstr ""
+
+msgid "Handshake Acknowledged, Sending Login"
+msgstr ""
+
+msgid "Waiting for Login Acknowledgement"
+msgstr ""
+
+msgid "Login Redirected"
+msgstr ""
+
+msgid "Forcing Login"
+msgstr ""
+
+msgid "Login Acknowledged"
+msgstr ""
+
+msgid "Starting Services"
+msgstr ""
+
+#, c-format
+msgid ""
+"A Sametime administrator has issued the following announcement on server %s"
+msgstr ""
+
+msgid "Sametime Administrator Announcement"
+msgstr ""
+
+msgid "Connection reset"
+msgstr ""
+
+#, c-format
+msgid "Error reading from socket: %s"
+msgstr ""
+
+#. this is a regular connect, error out
+msgid "Unable to connect to host"
+msgstr ""
+
+#, c-format
+msgid "Announcement from %s"
+msgstr ""
+
+msgid "Conference Closed"
+msgstr ""
+
+msgid "Unable to send message: "
+msgstr ""
+
+msgid "Place Closed"
+msgstr ""
+
+msgid "Microphone"
+msgstr ""
+
+msgid "Speakers"
+msgstr ""
+
+msgid "Video Camera"
+msgstr ""
+
+msgid "Supports"
+msgstr ""
+
+msgid "External User"
+msgstr ""
+
+msgid "Create conference with user"
+msgstr ""
+
+#, c-format
+msgid ""
+"Please enter a topic for the new conference, and an invitation message to be "
+"sent to %s"
+msgstr ""
+
+msgid "New Conference"
+msgstr ""
+
+msgid "Create"
+msgstr ""
+
+msgid "Available Conferences"
+msgstr ""
+
+msgid "Create New Conference..."
+msgstr ""
+
+msgid "Invite user to a conference"
+msgstr ""
+
+#, c-format
+msgid ""
+"Select a conference from the list below to send an invite to user %s. Select "
+"\"Create New Conference\" if you'd like to create a new conference to invite "
+"this user to."
+msgstr ""
+
+msgid "Invite to Conference"
+msgstr ""
+
+msgid "Invite to Conference..."
+msgstr ""
+
+msgid "Send TEST Announcement"
+msgstr ""
+
+msgid "Topic:"
+msgstr ""
+
+msgid "No Sametime Community Server specified"
+msgstr ""
+
+#, c-format
+msgid ""
+"No host or IP address has been configured for the Meanwhile account %s. "
+"Please enter one below to continue logging in."
+msgstr ""
+
+msgid "Meanwhile Connection Setup"
+msgstr ""
+
+msgid "No Sametime Community Server Specified"
+msgstr ""
+
+msgid "Connect"
+msgstr ""
+
+#, c-format
+msgid "Unknown (0x%04x)<br>"
+msgstr ""
+
+msgid "Last Known Client"
+msgstr ""
+
+msgid "User Name"
+msgstr ""
+
+msgid "Sametime ID"
+msgstr ""
+
+msgid "An ambiguous user ID was entered"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following users. Please "
+"select the correct user from the list below to add them to your buddy list."
+msgstr ""
+
+msgid "Select User"
+msgstr ""
+
+msgid "Unable to add user: user not found"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' did not match any users in your Sametime community. This "
+"entry has been removed from your buddy list."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reading file %s: \n"
+"%s\n"
+msgstr ""
+
+msgid "Remotely Stored Buddy List"
+msgstr ""
+
+msgid "Buddy List Storage Mode"
+msgstr ""
+
+msgid "Local Buddy List Only"
+msgstr ""
+
+msgid "Merge List from Server"
+msgstr ""
+
+msgid "Merge and Save List to Server"
+msgstr ""
+
+msgid "Synchronize List with Server"
+msgstr ""
+
+#, c-format
+msgid "Import Sametime List for Account %s"
+msgstr ""
+
+#, c-format
+msgid "Export Sametime List for Account %s"
+msgstr ""
+
+msgid "Unable to add group: group exists"
+msgstr ""
+
+#, c-format
+msgid "A group named '%s' already exists in your buddy list."
+msgstr ""
+
+msgid "Unable to add group"
+msgstr ""
+
+msgid "Possible Matches"
+msgstr ""
+
+msgid "Notes Address Book group results"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following Notes Address "
+"Book groups. Please select the correct group from the list below to add it "
+"to your buddy list."
+msgstr ""
+
+msgid "Select Notes Address Book"
+msgstr ""
+
+msgid "Unable to add group: group not found"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' did not match any Notes Address Book groups in your "
+"Sametime community."
+msgstr ""
+
+msgid "Notes Address Book Group"
+msgstr ""
+
+msgid ""
+"Enter the name of a Notes Address Book group in the field below to add the "
+"group and its members to your buddy list."
+msgstr ""
+
+#, c-format
+msgid "Search results for '%s'"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following users. You "
+"may add these users to your buddy list or send them messages with the action "
+"buttons below."
+msgstr ""
+
+msgid "Search Results"
+msgstr ""
+
+msgid "No matches"
+msgstr ""
+
+#, c-format
+msgid "The identifier '%s' did not match any users in your Sametime community."
+msgstr ""
+
+msgid "No Matches"
+msgstr ""
+
+msgid "Search for a user"
+msgstr ""
+
+msgid ""
+"Enter a name or partial ID in the field below to search for matching users "
+"in your Sametime community."
+msgstr ""
+
+msgid "User Search"
+msgstr ""
+
+msgid "Import Sametime List..."
+msgstr ""
+
+msgid "Export Sametime List..."
+msgstr ""
+
+msgid "Add Notes Address Book Group..."
+msgstr ""
+
+msgid "User Search..."
+msgstr ""
+
+msgid "Force login (ignore server redirects)"
+msgstr ""
+
+#. pretend to be Sametime Connect
+msgid "Hide client identity"
+msgstr ""
+
+#, c-format
+msgid "User %s is not present in the network"
+msgstr ""
+
+msgid "Key Agreement"
+msgstr ""
+
+msgid "Cannot perform the key agreement"
+msgstr ""
+
+msgid "Error occurred during key agreement"
+msgstr ""
+
+msgid "Key Agreement failed"
+msgstr ""
+
+msgid "Timeout during key agreement"
+msgstr ""
+
+msgid "Key agreement was aborted"
+msgstr ""
+
+msgid "Key agreement is already started"
+msgstr ""
+
+msgid "Key agreement cannot be started with yourself"
+msgstr ""
+
+msgid "The remote user is not present in the network any more"
+msgstr ""
+
+#, c-format
+msgid ""
+"Key agreement request received from %s. Would you like to perform the key "
+"agreement?"
+msgstr ""
+
+#, c-format
+msgid ""
+"The remote user is waiting key agreement on:\n"
+"Remote host: %s\n"
+"Remote port: %d"
+msgstr ""
+
+msgid "Key Agreement Request"
+msgstr ""
+
+msgid "IM With Password"
+msgstr ""
+
+msgid "Cannot set IM key"
+msgstr ""
+
+msgid "Set IM Password"
+msgstr ""
+
+msgid "Get Public Key"
+msgstr ""
+
+msgid "Cannot fetch the public key"
+msgstr ""
+
+msgid "Show Public Key"
+msgstr ""
+
+msgid "Could not load public key"
+msgstr ""
+
+msgid "User Information"
+msgstr ""
+
+msgid "Cannot get user information"
+msgstr ""
+
+#, c-format
+msgid "The %s buddy is not trusted"
+msgstr ""
+
+msgid ""
+"You cannot receive buddy notifications until you import his/her public key.  "
+"You can use the Get Public Key command to get the public key."
+msgstr ""
+
+#. Open file selector to select the public key.
+msgid "Open..."
+msgstr ""
+
+#, c-format
+msgid "The %s buddy is not present in the network"
+msgstr ""
+
+msgid ""
+"To add the buddy you must import his/her public key. Press Import to import "
+"a public key."
+msgstr ""
+
+msgid "_Import..."
+msgstr ""
+
+msgid "Select correct user"
+msgstr ""
+
+msgid ""
+"More than one user was found with the same public key. Select the correct "
+"user from the list to add to the buddy list."
+msgstr ""
+
+msgid ""
+"More than one user was found with the same name. Select the correct user "
+"from the list to add to the buddy list."
+msgstr ""
+
+msgid "Detached"
+msgstr ""
+
+msgid "Indisposed"
+msgstr ""
+
+msgid "Wake Me Up"
+msgstr ""
+
+msgid "Hyper Active"
+msgstr ""
+
+msgid "Robot"
+msgstr ""
+
+msgid "Happy"
+msgstr ""
+
+msgid "Sad"
+msgstr ""
+
+msgid "Angry"
+msgstr ""
+
+msgid "Jealous"
+msgstr ""
+
+msgid "Ashamed"
+msgstr ""
+
+msgid "Invincible"
+msgstr ""
+
+msgid "In Love"
+msgstr ""
+
+msgid "Sleepy"
+msgstr ""
+
+msgid "Bored"
+msgstr ""
+
+msgid "Excited"
+msgstr ""
+
+msgid "Anxious"
+msgstr ""
+
+msgid "User Modes"
+msgstr ""
+
+msgid "Preferred Contact"
+msgstr ""
+
+msgid "Preferred Language"
+msgstr ""
+
+msgid "Device"
+msgstr ""
+
+msgid "Timezone"
+msgstr ""
+
+msgid "Geolocation"
+msgstr ""
+
+msgid "Reset IM Key"
+msgstr ""
+
+msgid "IM with Key Exchange"
+msgstr ""
+
+msgid "IM with Password"
+msgstr ""
+
+msgid "Get Public Key..."
+msgstr ""
+
+msgid "Kill User"
+msgstr ""
+
+msgid "Draw On Whiteboard"
+msgstr ""
+
+msgid "_Passphrase:"
+msgstr ""
+
+#, c-format
+msgid "Channel %s does not exist in the network"
+msgstr ""
+
+msgid "Channel Information"
+msgstr ""
+
+msgid "Cannot get channel information"
+msgstr ""
+
+#, c-format
+msgid "<b>Channel Name:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>User Count:</b> %d"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Founder:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Cipher:</b> %s"
+msgstr ""
+
+#. Definition of HMAC: http://en.wikipedia.org/wiki/HMAC
+#, c-format
+msgid "<br><b>Channel HMAC:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Topic:</b><br>%s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Modes:</b> "
+msgstr ""
+
+#, c-format
+msgid "<br><b>Founder Key Fingerprint:</b><br>%s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Founder Key Babbleprint:</b><br>%s"
+msgstr ""
+
+msgid "Add Channel Public Key"
+msgstr ""
+
+#. Add new public key
+msgid "Open Public Key..."
+msgstr ""
+
+msgid "Channel Passphrase"
+msgstr ""
+
+msgid "Channel Public Keys List"
+msgstr ""
+
+#, c-format
+msgid ""
+"Channel authentication is used to secure the channel from unauthorized "
+"access. The authentication may be based on passphrase and digital "
+"signatures. If passphrase is set, it is required to be able to join. If "
+"channel public keys are set then only users whose public keys are listed are "
+"able to join."
+msgstr ""
+
+msgid "Channel Authentication"
+msgstr ""
+
+msgid "Add / Remove"
+msgstr ""
+
+msgid "Group Name"
+msgstr ""
+
+msgid "Passphrase"
+msgstr ""
+
+#, c-format
+msgid "Please enter the %s channel private group name and passphrase."
+msgstr ""
+
+msgid "Add Channel Private Group"
+msgstr ""
+
+msgid "User Limit"
+msgstr ""
+
+msgid "Set user limit on channel. Set to zero to reset user limit."
+msgstr ""
+
+msgid "Invite List"
+msgstr ""
+
+msgid "Ban List"
+msgstr ""
+
+msgid "Add Private Group"
+msgstr ""
+
+msgid "Reset Permanent"
+msgstr ""
+
+msgid "Set Permanent"
+msgstr ""
+
+msgid "Set User Limit"
+msgstr ""
+
+msgid "Reset Topic Restriction"
+msgstr ""
+
+msgid "Set Topic Restriction"
+msgstr ""
+
+msgid "Reset Private Channel"
+msgstr ""
+
+msgid "Set Private Channel"
+msgstr ""
+
+msgid "Reset Secret Channel"
+msgstr ""
+
+msgid "Set Secret Channel"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have to join the %s channel before you are able to join the private group"
+msgstr ""
+
+msgid "Join Private Group"
+msgstr ""
+
+msgid "Cannot join private group"
+msgstr ""
+
+msgid "Call Command"
+msgstr ""
+
+msgid "Cannot call command"
+msgstr ""
+
+msgid "Unknown command"
+msgstr ""
+
+msgid "Secure File Transfer"
+msgstr ""
+
+msgid "Error during file transfer"
+msgstr ""
+
+msgid "Remote disconnected"
+msgstr ""
+
+msgid "Permission denied"
+msgstr ""
+
+msgid "Key agreement failed"
+msgstr ""
+
+msgid "Connection timed out"
+msgstr ""
+
+msgid "Creating connection failed"
+msgstr ""
+
+msgid "File transfer session does not exist"
+msgstr ""
+
+msgid "No file transfer session active"
+msgstr ""
+
+msgid "File transfer already started"
+msgstr ""
+
+msgid "Could not perform key agreement for file transfer"
+msgstr ""
+
+msgid "Could not start the file transfer"
+msgstr ""
+
+msgid "Cannot send file"
+msgstr ""
+
+msgid "Error occurred"
+msgstr ""
+
+#, c-format
+msgid "%s has changed the topic of <I>%s</I> to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> set channel <I>%s</I> modes to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> removed all channel <I>%s</I> modes"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> set <I>%s's</I> modes to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> removed all <I>%s's</I> modes"
+msgstr ""
+
+#, c-format
+msgid "You have been kicked off <I>%s</I> by <I>%s</I> (%s)"
+msgstr ""
+
+#, c-format
+msgid "You have been killed by %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Killed by %s (%s)"
+msgstr ""
+
+msgid "Server signoff"
+msgstr ""
+
+msgid "Personal Information"
+msgstr ""
+
+msgid "Birth Day"
+msgstr ""
+
+msgid "Job Role"
+msgstr ""
+
+msgid "Organization"
+msgstr ""
+
+msgid "Unit"
+msgstr ""
+
+msgid "Join Chat"
+msgstr ""
+
+#, c-format
+msgid "You are channel founder on <I>%s</I>"
+msgstr ""
+
+#, c-format
+msgid "Channel founder on <I>%s</I> is <I>%s</I>"
+msgstr ""
+
+msgid "Real Name"
+msgstr ""
+
+msgid "Status Text"
+msgstr ""
+
+msgid "Public Key Fingerprint"
+msgstr ""
+
+msgid "Public Key Babbleprint"
+msgstr ""
+
+msgid "_More..."
+msgstr ""
+
+msgid "Detach From Server"
+msgstr ""
+
+msgid "Cannot detach"
+msgstr ""
+
+msgid "Cannot set topic"
+msgstr ""
+
+msgid "Failed to change nickname"
+msgstr ""
+
+msgid "Roomlist"
+msgstr ""
+
+msgid "Cannot get room list"
+msgstr ""
+
+msgid "Network is empty"
+msgstr ""
+
+msgid "No public key was received"
+msgstr ""
+
+msgid "Server Information"
+msgstr ""
+
+msgid "Cannot get server information"
+msgstr ""
+
+msgid "Server Statistics"
+msgstr ""
+
+msgid "Cannot get server statistics"
+msgstr ""
+
+#, c-format
+msgid ""
+"Local server start time: %s\n"
+"Local server uptime: %s\n"
+"Local server clients: %d\n"
+"Local server channels: %d\n"
+"Local server operators: %d\n"
+"Local router operators: %d\n"
+"Local cell clients: %d\n"
+"Local cell channels: %d\n"
+"Local cell servers: %d\n"
+"Total clients: %d\n"
+"Total channels: %d\n"
+"Total servers: %d\n"
+"Total routers: %d\n"
+"Total server operators: %d\n"
+"Total router operators: %d\n"
+msgstr ""
+
+msgid "Network Statistics"
+msgstr ""
+
+msgid "Ping failed"
+msgstr ""
+
+msgid "Ping reply received from server"
+msgstr ""
+
+msgid "Could not kill user"
+msgstr ""
+
+msgid "WATCH"
+msgstr ""
+
+msgid "Cannot watch user"
+msgstr ""
+
+msgid "Resuming session"
+msgstr ""
+
+msgid "Authenticating connection"
+msgstr ""
+
+msgid "Verifying server public key"
+msgstr ""
+
+msgid "Passphrase required"
+msgstr ""
+
+#, c-format
+msgid ""
+"Received %s's public key. Your local copy does not match this key. Would you "
+"still like to accept this public key?"
+msgstr ""
+
+#, c-format
+msgid "Received %s's public key. Would you like to accept this public key?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Fingerprint and babbleprint for the %s key are:\n"
+"\n"
+"%s\n"
+"%s\n"
+msgstr ""
+
+msgid "Verify Public Key"
+msgstr ""
+
+msgid "_View..."
+msgstr ""
+
+msgid "Unsupported public key type"
+msgstr ""
+
+msgid "Disconnected by server"
+msgstr ""
+
+msgid "Error during connecting to SILC Server"
+msgstr ""
+
+msgid "Key Exchange failed"
+msgstr ""
+
+msgid ""
+"Resuming detached session failed. Press Reconnect to create new connection."
+msgstr ""
+
+msgid "Connection failed"
+msgstr ""
+
+msgid "Performing key exchange"
+msgstr ""
+
+msgid "Unable to create connection"
+msgstr ""
+
+msgid "Could not load SILC key pair"
+msgstr ""
+
+#. Progress
+msgid "Connecting to SILC Server"
+msgstr ""
+
+msgid "Out of memory"
+msgstr ""
+
+msgid "Cannot initialize SILC protocol"
+msgstr ""
+
+msgid "Error loading SILC key pair"
+msgstr ""
+
+#, c-format
+msgid "Download %s: %s"
+msgstr ""
+
+msgid "Your Current Mood"
+msgstr ""
+
+#, c-format
+msgid "Normal"
+msgstr ""
+
+msgid "In love"
+msgstr ""
+
+msgid ""
+"\n"
+"Your Preferred Contact Methods"
+msgstr ""
+
+msgid "SMS"
+msgstr ""
+
+msgid "MMS"
+msgstr ""
+
+msgid "Video conferencing"
+msgstr ""
+
+msgid "Your Current Status"
+msgstr ""
+
+msgid "Online Services"
+msgstr ""
+
+msgid "Let others see what services you are using"
+msgstr ""
+
+msgid "Let others see what computer you are using"
+msgstr ""
+
+msgid "Your VCard File"
+msgstr ""
+
+msgid "Timezone (UTC)"
+msgstr ""
+
+msgid "User Online Status Attributes"
+msgstr ""
+
+msgid ""
+"You can let other users see your online status information and your personal "
+"information. Please fill the information you would like other users to see "
+"about yourself."
+msgstr ""
+
+msgid "Message of the Day"
+msgstr ""
+
+msgid "No Message of the Day available"
+msgstr ""
+
+msgid "There is no Message of the Day associated with this connection"
+msgstr ""
+
+msgid "Create New SILC Key Pair"
+msgstr ""
+
+msgid "Passphrases do not match"
+msgstr ""
+
+msgid "Key Pair Generation failed"
+msgstr ""
+
+msgid "Key length"
+msgstr ""
+
+msgid "Public key file"
+msgstr ""
+
+msgid "Private key file"
+msgstr ""
+
+msgid "Passphrase (retype)"
+msgstr ""
+
+msgid "Generate Key Pair"
+msgstr ""
+
+msgid "Online Status"
+msgstr ""
+
+msgid "View Message of the Day"
+msgstr ""
+
+msgid "Create SILC Key Pair..."
+msgstr ""
+
+#, c-format
+msgid "User <I>%s</I> is not present in the network"
+msgstr ""
+
+msgid "Topic too long"
+msgstr ""
+
+msgid "You must specify a nick"
+msgstr ""
+
+#, c-format
+msgid "channel %s not found"
+msgstr ""
+
+#, c-format
+msgid "channel modes for %s: %s"
+msgstr ""
+
+#, c-format
+msgid "no channel modes are set on %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set cmodes for %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown command: %s, (may be a client bug)"
+msgstr ""
+
+msgid "part [channel]:  Leave the chat"
+msgstr ""
+
+msgid "leave [channel]:  Leave the chat"
+msgstr ""
+
+msgid "topic [&lt;new topic&gt;]:  View or change the topic"
+msgstr ""
+
+msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
+msgstr ""
+
+msgid "list:  List channels on this network"
+msgstr ""
+
+msgid "whois &lt;nick&gt;:  View nick's information"
+msgstr ""
+
+msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
+msgstr ""
+
+msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
+msgstr ""
+
+msgid "motd:  View the server's Message Of The Day"
+msgstr ""
+
+msgid "detach:  Detach this session"
+msgstr ""
+
+msgid "quit [message]:  Disconnect from the server, with an optional message"
+msgstr ""
+
+msgid "call &lt;command&gt;:  Call any silc client command"
+msgstr ""
+
+msgid "kill &lt;nick&gt; [-pubkey|&lt;reason&gt;]:  Kill nick"
+msgstr ""
+
+msgid "nick &lt;newnick&gt;:  Change your nickname"
+msgstr ""
+
+msgid "whowas &lt;nick&gt;:  View nick's information"
+msgstr ""
+
+msgid ""
+"cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display "
+"channel modes"
+msgstr ""
+
+msgid ""
+"cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes "
+"on channel"
+msgstr ""
+
+msgid "umode &lt;usermodes&gt;:  Set your modes in the network"
+msgstr ""
+
+msgid "oper &lt;nick&gt; [-pubkey]:  Get server operator privileges"
+msgstr ""
+
+msgid ""
+"invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from "
+"channel invite list"
+msgstr ""
+
+msgid "kick &lt;channel&gt; &lt;nick&gt; [comment]:  Kick client from channel"
+msgstr ""
+
+msgid "info [server]:  View server administrative details"
+msgstr ""
+
+msgid "ban [&lt;channel&gt; +|-&lt;nick&gt;]:  Ban client from channel"
+msgstr ""
+
+msgid "getkey &lt;nick|server&gt;:  Retrieve client's or server's public key"
+msgstr ""
+
+msgid "stats:  View server and network statistics"
+msgstr ""
+
+msgid "ping:  Send PING to the connected server"
+msgstr ""
+
+msgid "users &lt;channel&gt;:  List users in channel"
+msgstr ""
+
+msgid ""
+"names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List "
+"specific users in channel(s)"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+msgid "SILC Protocol Plugin"
+msgstr ""
+
+#. *  description
+msgid "Secure Internet Live Conferencing (SILC) Protocol"
+msgstr ""
+
+msgid "Network"
+msgstr ""
+
+msgid "Public Key file"
+msgstr ""
+
+msgid "Private Key file"
+msgstr ""
+
+msgid "Cipher"
+msgstr ""
+
+msgid "HMAC"
+msgstr ""
+
+msgid "Use Perfect Forward Secrecy"
+msgstr ""
+
+msgid "Public key authentication"
+msgstr ""
+
+msgid "Block IMs without Key Exchange"
+msgstr ""
+
+msgid "Block messages to whiteboard"
+msgstr ""
+
+msgid "Automatically open whiteboard"
+msgstr ""
+
+msgid "Digitally sign and verify all messages"
+msgstr ""
+
+msgid "Creating SILC key pair..."
+msgstr ""
+
+msgid "Cannot create SILC key pair\n"
+msgstr ""
+
+#. Hint for translators: Please check the tabulator width here and in
+#. the next strings (short strings: 2 tabs, longer strings 1 tab,
+#. sum: 3 tabs or 24 characters)
+#, c-format
+msgid "Real Name: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "User Name: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Email: \t\t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Host Name: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Organization: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Country: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Algorithm: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Key Length: \t%d bits\n"
+msgstr ""
+
+#, c-format
+msgid "Version: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Public Key Fingerprint:\n"
+"%s\n"
+"\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Public Key Babbleprint:\n"
+"%s"
+msgstr ""
+
+msgid "Public Key Information"
+msgstr ""
+
+msgid "Paging"
+msgstr ""
+
+msgid "Video Conferencing"
+msgstr ""
+
+msgid "Computer"
+msgstr ""
+
+msgid "PDA"
+msgstr ""
+
+msgid "Terminal"
+msgstr ""
+
+#, c-format
+msgid "%s sent message to whiteboard. Would you like to open the whiteboard?"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s sent message to whiteboard on %s channel. Would you like to open the "
+"whiteboard?"
+msgstr ""
+
+msgid "Whiteboard"
+msgstr ""
+
+msgid "No server statistics available"
+msgstr ""
+
+#, c-format
+msgid "Failure: Version mismatch, upgrade your client"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not trust/support your public key"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed KE group"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed cipher"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed PKCS"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed hash function"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed HMAC"
+msgstr ""
+
+#, c-format
+msgid "Failure: Incorrect signature"
+msgstr ""
+
+#, c-format
+msgid "Failure: Invalid cookie"
+msgstr ""
+
+#, c-format
+msgid "Failure: Authentication failed"
+msgstr ""
+
+msgid "Cannot initialize SILC Client connection"
+msgstr ""
+
+msgid "John Noname"
+msgstr ""
+
+#, c-format
+msgid "Could not load SILC key pair: %s"
+msgstr ""
+
+msgid "Could not write"
+msgstr ""
+
+msgid "Could not connect"
+msgstr ""
+
+msgid "Unknown server response."
+msgstr ""
+
+msgid "Could not create listen socket"
+msgstr ""
+
+msgid "Could not resolve hostname"
+msgstr ""
+
+msgid "SIP usernames may not contain whitespaces or @ symbols"
+msgstr ""
+
+msgid "SIP connect server not specified"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "SIP/SIMPLE Protocol Plugin"
+msgstr ""
+
+#. *  summary
+msgid "The SIP/SIMPLE Protocol Plugin"
+msgstr ""
+
+msgid "Publish status (note: everyone may watch you)"
+msgstr ""
+
+msgid "Use UDP"
+msgstr ""
+
+msgid "Use proxy"
+msgstr ""
+
+msgid "Proxy"
+msgstr ""
+
+msgid "Auth User"
+msgstr ""
+
+msgid "Auth Domain"
+msgstr ""
+
+#, c-format
+msgid "%s has sent you a webcam invite, which is not yet supported."
+msgstr ""
+
+msgid "Your SMS was not delivered"
+msgstr ""
+
+msgid "Your Yahoo! message did not get sent."
+msgstr ""
+
+#, c-format
+msgid "Yahoo! system message for %s:"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s has (retroactively) denied your request to add them to your list for the "
+"following reason: %s."
+msgstr ""
+
+#, c-format
+msgid "%s has (retroactively) denied your request to add them to your list."
+msgstr ""
+
+msgid "Add buddy rejected"
+msgstr ""
+
+#. Some error in the received stream
+msgid "Received invalid data"
+msgstr ""
+
+#. Password incorrect
+msgid "Incorrect Password"
+msgstr ""
+
+#. security lock from too many failed login attempts
+msgid "Account locked: Too many failed login attempts"
+msgstr ""
+
+#. the username does not exist
+msgid "Username does not exist"
+msgstr ""
+
+#. indicates a lock of some description
+msgid "Account locked: See the debug log"
+msgstr ""
+
+#. username or password missing
+msgid "Username or password missing"
+msgstr ""
+
+#, c-format
+msgid ""
+"The Yahoo server has requested the use of an unrecognized authentication "
+"method.  You will probably not be able to successfully sign on to Yahoo.  "
+"Check %s for updates."
+msgstr ""
+
+msgid "Failed Yahoo! Authentication"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have tried to ignore %s, but the user is on your buddy list.  Clicking "
+"\"Yes\" will remove and ignore the buddy."
+msgstr ""
+
+msgid "Ignore buddy?"
+msgstr ""
+
+msgid "Your account is locked, please log in to the Yahoo! website."
+msgstr ""
+
+#, c-format
+msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
+msgstr ""
+
+#, c-format
+msgid "Could not add buddy %s to group %s to the server list on account %s."
+msgstr ""
+
+msgid "Could not add buddy to server list"
+msgstr ""
+
+#, c-format
+msgid "[ Audible %s/%s/%s.swf ] %s"
+msgstr ""
+
+msgid "Received unexpected HTTP response from server."
+msgstr ""
+
+msgid "Connection problem"
+msgstr ""
+
+#, c-format
+msgid ""
+"Lost connection with %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not establish a connection with %s:\n"
+"%s"
+msgstr ""
+
+msgid "Not at Home"
+msgstr ""
+
+msgid "Not at Desk"
+msgstr ""
+
+msgid "Not in Office"
+msgstr ""
+
+msgid "On Vacation"
+msgstr ""
+
+msgid "Stepped Out"
+msgstr ""
+
+msgid "Not on server list"
+msgstr ""
+
+msgid "Appear Online"
+msgstr ""
+
+msgid "Appear Permanently Offline"
+msgstr ""
+
+msgid "Presence"
+msgstr ""
+
+msgid "Appear Offline"
+msgstr ""
+
+msgid "Don't Appear Permanently Offline"
+msgstr ""
+
+msgid "Join in Chat"
+msgstr ""
+
+msgid "Initiate Conference"
+msgstr ""
+
+msgid "Presence Settings"
+msgstr ""
+
+msgid "Start Doodling"
+msgstr ""
+
+msgid "Activate which ID?"
+msgstr ""
+
+msgid "Join whom in chat?"
+msgstr ""
+
+msgid "Activate ID..."
+msgstr ""
+
+msgid "Join User in Chat..."
+msgstr ""
+
+msgid "Open Inbox"
+msgstr ""
+
+msgid "join &lt;room&gt;:  Join a chat room on the Yahoo network"
+msgstr ""
+
+msgid "list: List rooms on the Yahoo network"
+msgstr ""
+
+msgid "doodle: Request user to start a Doodle session"
+msgstr ""
+
+msgid "Yahoo ID..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Yahoo Protocol Plugin"
+msgstr ""
+
+msgid "Yahoo Japan"
+msgstr ""
+
+msgid "Pager server"
+msgstr ""
+
+msgid "Japan Pager server"
+msgstr ""
+
+msgid "Pager port"
+msgstr ""
+
+msgid "File transfer server"
+msgstr ""
+
+msgid "Japan file transfer server"
+msgstr ""
+
+msgid "File transfer port"
+msgstr ""
+
+msgid "Chat room locale"
+msgstr ""
+
+msgid "Ignore conference and chatroom invitations"
+msgstr ""
+
+msgid "Chat room list URL"
+msgstr ""
+
+msgid "Yahoo Chat server"
+msgstr ""
+
+msgid "Yahoo Chat port"
+msgstr ""
+
+#. Write a local message to this conversation showing that a request for a
+#. * Doodle session has been made
+#.
+msgid "Sent Doodle request."
+msgstr ""
+
+msgid "Unable to establish file descriptor."
+msgstr ""
+
+#, c-format
+msgid "%s is trying to send you a group of %d files.\n"
+msgstr ""
+
+msgid "Yahoo! Japan Profile"
+msgstr ""
+
+msgid "Yahoo! Profile"
+msgstr ""
+
+msgid ""
+"Sorry, profiles marked as containing adult content are not supported at this "
+"time."
+msgstr ""
+
+msgid ""
+"If you wish to view this profile, you will need to visit this link in your "
+"web browser:"
+msgstr ""
+
+msgid "Yahoo! ID"
+msgstr ""
+
+msgid "Hobbies"
+msgstr ""
+
+msgid "Latest News"
+msgstr ""
+
+msgid "Home Page"
+msgstr ""
+
+msgid "Cool Link 1"
+msgstr ""
+
+msgid "Cool Link 2"
+msgstr ""
+
+msgid "Cool Link 3"
+msgstr ""
+
+msgid "Last Update"
+msgstr ""
+
+msgid ""
+"This profile is in a language or format that is not supported at this time."
+msgstr ""
+
+msgid ""
+"Could not retrieve the user's profile. This most likely is a temporary "
+"server-side problem. Please try again later."
+msgstr ""
+
+msgid ""
+"Could not retrieve the user's profile. This most likely means that the user "
+"does not exist; however, Yahoo! sometimes does fail to find a user's "
+"profile. If you know that the user exists, please try again later."
+msgstr ""
+
+msgid "The user's profile is empty."
+msgstr ""
+
+#, c-format
+msgid "%s declined your conference invitation to room \"%s\" because \"%s\"."
+msgstr ""
+
+msgid "Invitation Rejected"
+msgstr ""
+
+msgid "Failed to join chat"
+msgstr ""
+
+#. -6
+msgid "Unknown room"
+msgstr ""
+
+#. -15
+msgid "Maybe the room is full"
+msgstr ""
+
+#. -35
+msgid "Not available"
+msgstr ""
+
+msgid ""
+"Unknown error. You may need to logout and wait five minutes before being "
+"able to rejoin a chatroom"
+msgstr ""
+
+#, c-format
+msgid "You are now chatting in %s."
+msgstr ""
+
+msgid "Failed to join buddy in chat"
+msgstr ""
+
+msgid "Maybe they're not in a chat?"
+msgstr ""
+
+msgid "Fetching the room list failed."
+msgstr ""
+
+msgid "Voices"
+msgstr ""
+
+msgid "Webcams"
+msgstr ""
+
+msgid "Unable to fetch room list."
+msgstr ""
+
+msgid "User Rooms"
+msgstr ""
+
+msgid "Connection problem with the YCHT server."
+msgstr ""
+
+#, c-format
+msgid ""
+"Lost connection with server\n"
+"%s"
+msgstr ""
+
+msgid ""
+"(There was an error converting this message.\t Check the 'Encoding' option "
+"in the Account Editor)"
+msgstr ""
+
+#, c-format
+msgid "Unable to send to chat %s,%s,%s"
+msgstr ""
+
+msgid "Hidden or not logged-in"
+msgstr ""
+
+#, c-format
+msgid "<br>At %s since %s"
+msgstr ""
+
+msgid "Anyone"
+msgstr ""
+
+msgid "_Class:"
+msgstr ""
+
+msgid "_Instance:"
+msgstr ""
+
+msgid "_Recipient:"
+msgstr ""
+
+#, c-format
+msgid "Attempt to subscribe to %s,%s,%s failed"
+msgstr ""
+
+msgid "zlocate &lt;nick&gt;: Locate user"
+msgstr ""
+
+msgid "zl &lt;nick&gt;: Locate user"
+msgstr ""
+
+msgid "instance &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
+msgstr ""
+
+msgid ""
+"zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
+msgstr ""
+
+msgid ""
+"zci &lt;class&gt; &lt;instance&gt;: Send a message to &lt;<i>class</i>,"
+"<i>instance</i>,*&gt;"
+msgstr ""
+
+msgid ""
+"zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;"
+"<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
+msgstr ""
+
+msgid ""
+"zir &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;MESSAGE,"
+"<i>instance</i>,<i>recipient</i>&gt;"
+msgstr ""
+
+msgid "zc &lt;class&gt;: Send a message to &lt;<i>class</i>,PERSONAL,*&gt;"
+msgstr ""
+
+msgid "Resubscribe"
+msgstr ""
+
+msgid "Retrieve subscriptions from server"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Zephyr Protocol Plugin"
+msgstr ""
+
+msgid "Use tzc"
+msgstr ""
+
+msgid "tzc command"
+msgstr ""
+
+msgid "Export to .anyone"
+msgstr ""
+
+msgid "Export to .zephyr.subs"
+msgstr ""
+
+msgid "Import from .anyone"
+msgstr ""
+
+msgid "Import from .zephyr.subs"
+msgstr ""
+
+msgid "Realm"
+msgstr ""
+
+msgid "Exposure"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to create socket:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Unable to parse response from HTTP proxy: %s\n"
+msgstr ""
+
+#, c-format
+msgid "HTTP proxy connection error %d"
+msgstr ""
+
+#, c-format
+msgid "Access denied: HTTP proxy server forbids port %d tunneling."
+msgstr ""
+
+#, c-format
+msgid "Error resolving %s"
+msgstr ""
+
+msgid "Could not resolve host name"
+msgstr ""
+
+#, c-format
+msgid "Requesting %s's attention..."
+msgstr ""
+
+#, c-format
+msgid "%s has requested your attention!"
+msgstr ""
+
+#. *
+#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#.
+msgid "_Yes"
+msgstr ""
+
+msgid "_No"
+msgstr ""
+
+#. *
+#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#.
+msgid "_Accept"
+msgstr ""
+
+#. *
+#. * The default message to use when the user becomes auto-away.
+#.
+msgid "I'm not here right now"
+msgstr ""
+
+msgid "saved statuses"
+msgstr ""
+
+#, c-format
+msgid "%s is now known as %s.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s has invited %s to the chat room %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "%s has invited %s to the chat room %s\n"
+msgstr ""
+
+msgid "Accept chat invitation?"
+msgstr ""
+
+#. Shortcut
+msgid "Shortcut"
+msgstr ""
+
+msgid "The text-shortcut for the smiley"
+msgstr ""
+
+#. Stored Image
+msgid "Stored Image"
+msgstr ""
+
+msgid "Stored Image. (that'll have to do for now)"
+msgstr ""
+
+msgid "SSL Connection Failed"
+msgstr ""
+
+msgid "SSL Handshake Failed"
+msgstr ""
+
+msgid "SSL peer presented an invalid certificate"
+msgstr ""
+
+msgid "Unknown SSL error"
+msgstr ""
+
+msgid "Unset"
+msgstr ""
+
+msgid "Do not disturb"
+msgstr ""
+
+msgid "Extended away"
+msgstr ""
+
+msgid "Listening to music"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) changed status from %s to %s"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) is now %s"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) is no longer %s"
+msgstr ""
+
+#, c-format
+msgid "%s became idle"
+msgstr ""
+
+#, c-format
+msgid "%s became unidle"
+msgstr ""
+
+#, c-format
+msgid "+++ %s became idle"
+msgstr ""
+
+#, c-format
+msgid "+++ %s became unidle"
+msgstr ""
+
+#.
+#. * This string determines how some dates are displayed.  The default
+#. * string "%x %X" shows the date then the time.  Translators can
+#. * change this to "%X %x" if they want the time to be shown first,
+#. * followed by the date.
+#.
+#, c-format
+msgid "%x %X"
+msgstr ""
+
+msgid "Calculating..."
+msgstr ""
+
+msgid "Unknown."
+msgstr ""
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%s, %d hour"
+msgid_plural "%s, %d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%s, %d minute"
+msgid_plural "%s, %d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Could not open %s: Redirected too many times"
+msgstr ""
+
+#, c-format
+msgid "Unable to connect to %s"
+msgstr ""
+
+#, c-format
+msgid "Error reading from %s: response too long (%d bytes limit)"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to allocate enough memory to hold the contents from %s.  The web "
+"server may be trying something malicious."
+msgstr ""
+
+#, c-format
+msgid "Error reading from %s: %s"
+msgstr ""
+
+#, c-format
+msgid "Error writing to %s: %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to connect to %s: %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to connect to %s: Server requires TLS/SSL, but no TLS/SSL support was "
+"found."
+msgstr ""
+
+#, c-format
+msgid " - %s"
+msgstr ""
+
+#, c-format
+msgid " (%s)"
+msgstr ""
+
+#. 10053
+#, c-format
+msgid "Connection interrupted by other software on your computer."
+msgstr ""
+
+#. 10054
+#, c-format
+msgid "Remote host closed connection."
+msgstr ""
+
+#. 10060
+#, c-format
+msgid "Connection timed out."
+msgstr ""
+
+#. 10061
+#, c-format
+msgid "Connection refused."
+msgstr ""
+
+#. 10048
+#, c-format
+msgid "Address already in use."
+msgstr ""
+
+#, c-format
+msgid "Error Reading %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"An error was encountered reading your %s.  The file has not been loaded, and "
+"the old file has been renamed to %s~."
+msgstr ""
+
+msgid "Internet Messenger"
+msgstr ""
+
+msgid "Pidgin Internet Messenger"
+msgstr ""
+
+msgid "Send instant messages over multiple protocols"
+msgstr ""
+
+msgid "Orientation"
+msgstr ""
+
+msgid "The orientation of the tray."
+msgstr ""
+
+#. Build the login options frame.
+msgid "Login Options"
+msgstr ""
+
+msgid "Pro_tocol:"
+msgstr ""
+
+msgid "_Username:"
+msgstr ""
+
+msgid "Remember pass_word"
+msgstr ""
+
+#. Build the user options frame.
+msgid "User Options"
+msgstr ""
+
+msgid "_Local alias:"
+msgstr ""
+
+msgid "New _mail notifications"
+msgstr ""
+
+#. Buddy icon
+msgid "Use this buddy _icon for this account:"
+msgstr ""
+
+msgid "_Advanced"
+msgstr ""
+
+msgid "Use GNOME Proxy Settings"
+msgstr ""
+
+msgid "Use Global Proxy Settings"
+msgstr ""
+
+msgid "No Proxy"
+msgstr ""
+
+msgid "HTTP"
+msgstr ""
+
+msgid "SOCKS 4"
+msgstr ""
+
+msgid "SOCKS 5"
+msgstr ""
+
+msgid "Use Environmental Settings"
+msgstr ""
+
+#. This is an easter egg.
+#. It means one of two things, both intended as humourus:
+#. A) your network is really slow and you have nothing better to do than
+#. look at butterflies.
+#. B)You are looking really closely at something that shouldn't matter.
+msgid "If you look real closely"
+msgstr ""
+
+#. This is an easter egg. See the comment on the previous line in the source.
+msgid "you can see the butterflies mating"
+msgstr ""
+
+msgid "Proxy _type:"
+msgstr ""
+
+msgid "_Host:"
+msgstr ""
+
+msgid "_Port:"
+msgstr ""
+
+msgid "Pa_ssword:"
+msgstr ""
+
+msgid "Unable to save new account"
+msgstr ""
+
+msgid "An account already exists with the specified criteria."
+msgstr ""
+
+msgid "Add Account"
+msgstr ""
+
+msgid "_Basic"
+msgstr ""
+
+msgid "Create _this new account on the server"
+msgstr ""
+
+msgid "_Proxy"
+msgstr ""
+
+msgid "Enabled"
+msgstr ""
+
+msgid "Protocol"
+msgstr ""
+
+#, c-format
+msgid ""
+"<span size='larger' weight='bold'>Welcome to %s!</span>\n"
+"\n"
+"You have no IM accounts configured. To start connecting with %s press the "
+"<b>Add...</b> button below and configure your first account. If you want %s "
+"to connect to multiple IM accounts, press <b>Add...</b> again to configure "
+"them all.\n"
+"\n"
+"You can come back to this window to add, edit, or remove accounts from "
+"<b>Accounts->Manage Accounts</b> in the Buddy List window"
+msgstr ""
+
+#, 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] ""
+msgstr[1] ""
+
+msgid ""
+"Merging these contacts will cause them to share a single entry on the buddy "
+"list and use a single conversation window. You can separate them again by "
+"choosing 'Expand' from the contact's context menu"
+msgstr ""
+
+msgid "Please update the necessary fields."
+msgstr ""
+
+msgid "A_ccount"
+msgstr ""
+
+msgid ""
+"Please enter the appropriate information about the chat you would like to "
+"join.\n"
+msgstr ""
+
+msgid "Room _List"
+msgstr ""
+
+msgid "_Block"
+msgstr ""
+
+msgid "Un_block"
+msgstr ""
+
+msgid "Move to"
+msgstr ""
+
+msgid "Get _Info"
+msgstr ""
+
+msgid "I_M"
+msgstr ""
+
+msgid "_Audio Call"
+msgstr ""
+
+msgid "Audio/_Video Call"
+msgstr ""
+
+msgid "_Video Call"
+msgstr ""
+
+msgid "_Send File..."
+msgstr ""
+
+msgid "Add Buddy _Pounce..."
+msgstr ""
+
+msgid "View _Log"
+msgstr ""
+
+msgid "Hide when offline"
+msgstr ""
+
+msgid "_Alias..."
+msgstr ""
+
+msgid "_Remove"
+msgstr ""
+
+msgid "Set Custom Icon"
+msgstr ""
+
+msgid "Remove Custom Icon"
+msgstr ""
+
+msgid "Add _Buddy..."
+msgstr ""
+
+msgid "Add C_hat..."
+msgstr ""
+
+msgid "_Delete Group"
+msgstr ""
+
+msgid "_Rename"
+msgstr ""
+
+#. join button
+msgid "_Join"
+msgstr ""
+
+msgid "Auto-Join"
+msgstr ""
+
+msgid "Persistent"
+msgstr ""
+
+msgid "_Edit Settings..."
+msgstr ""
+
+msgid "_Collapse"
+msgstr ""
+
+msgid "_Expand"
+msgstr ""
+
+msgid "/Tools/Mute Sounds"
+msgstr ""
+
+msgid ""
+"You are not currently signed on with an account that can add that buddy."
+msgstr ""
+
+#. I don't believe this can happen currently, I think
+#. * everything that calls this function checks for one of the
+#. * above node types first.
+msgid "Unknown node type"
+msgstr ""
+
+#. Buddies menu
+msgid "/_Buddies"
+msgstr ""
+
+msgid "/Buddies/New Instant _Message..."
+msgstr ""
+
+msgid "/Buddies/Join a _Chat..."
+msgstr ""
+
+msgid "/Buddies/Get User _Info..."
+msgstr ""
+
+msgid "/Buddies/View User _Log..."
+msgstr ""
+
+msgid "/Buddies/Sh_ow"
+msgstr ""
+
+msgid "/Buddies/Show/_Offline Buddies"
+msgstr ""
+
+msgid "/Buddies/Show/_Empty Groups"
+msgstr ""
+
+msgid "/Buddies/Show/Buddy _Details"
+msgstr ""
+
+msgid "/Buddies/Show/Idle _Times"
+msgstr ""
+
+msgid "/Buddies/Show/_Protocol Icons"
+msgstr ""
+
+msgid "/Buddies/_Sort Buddies"
+msgstr ""
+
+msgid "/Buddies/_Add Buddy..."
+msgstr ""
+
+msgid "/Buddies/Add C_hat..."
+msgstr ""
+
+msgid "/Buddies/Add _Group..."
+msgstr ""
+
+msgid "/Buddies/_Quit"
+msgstr ""
+
+#. Accounts menu
+msgid "/_Accounts"
+msgstr ""
+
+msgid "/Accounts/Manage Accounts"
+msgstr ""
+
+#. Tools
+msgid "/_Tools"
+msgstr ""
+
+msgid "/Tools/Buddy _Pounces"
+msgstr ""
+
+msgid "/Tools/_Certificates"
+msgstr ""
+
+msgid "/Tools/Custom Smile_ys"
+msgstr ""
+
+msgid "/Tools/Plu_gins"
+msgstr ""
+
+msgid "/Tools/Pr_eferences"
+msgstr ""
+
+msgid "/Tools/Pr_ivacy"
+msgstr ""
+
+msgid "/Tools/_File Transfers"
+msgstr ""
+
+msgid "/Tools/R_oom List"
+msgstr ""
+
+msgid "/Tools/System _Log"
+msgstr ""
+
+msgid "/Tools/Mute _Sounds"
+msgstr ""
+
+#. Help
+msgid "/_Help"
+msgstr ""
+
+msgid "/Help/Online _Help"
+msgstr ""
+
+msgid "/Help/_Debug Window"
+msgstr ""
+
+msgid "/Help/_About"
+msgstr ""
+
+#, c-format
+msgid "<b>Account:</b> %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Occupants:</b> %d"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Topic:</b> %s"
+msgstr ""
+
+msgid "(no topic set)"
+msgstr ""
+
+msgid "Buddy Alias"
+msgstr ""
+
+msgid "Logged In"
+msgstr ""
+
+msgid "Last Seen"
+msgstr ""
+
+msgid "Spooky"
+msgstr ""
+
+msgid "Awesome"
+msgstr ""
+
+msgid "Rockin'"
+msgstr ""
+
+msgid "Total Buddies"
+msgstr ""
+
+#, c-format
+msgid "Idle %dd %dh %02dm"
+msgstr ""
+
+#, c-format
+msgid "Idle %dh %02dm"
+msgstr ""
+
+#, c-format
+msgid "Idle %dm"
+msgstr ""
+
+msgid "/Buddies/New Instant Message..."
+msgstr ""
+
+msgid "/Buddies/Join a Chat..."
+msgstr ""
+
+msgid "/Buddies/Get User Info..."
+msgstr ""
+
+msgid "/Buddies/Add Buddy..."
+msgstr ""
+
+msgid "/Buddies/Add Chat..."
+msgstr ""
+
+msgid "/Buddies/Add Group..."
+msgstr ""
+
+msgid "/Tools/Privacy"
+msgstr ""
+
+msgid "/Tools/Room List"
+msgstr ""
+
+#, c-format
+msgid "%d unread message from %s\n"
+msgid_plural "%d unread messages from %s\n"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Manually"
+msgstr ""
+
+msgid "By status"
+msgstr ""
+
+msgid "By recent log activity"
+msgstr ""
+
+#, c-format
+msgid "%s disconnected"
+msgstr ""
+
+#, c-format
+msgid "%s disabled"
+msgstr ""
+
+msgid "Reconnect"
+msgstr ""
+
+msgid "Re-enable"
+msgstr ""
+
+msgid "SSL FAQs"
+msgstr ""
+
+msgid "Welcome back!"
+msgstr ""
+
+#, c-format
+msgid "%d account was disabled because you signed on from another location:"
+msgid_plural ""
+"%d accounts were disabled because you signed on from another location:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "<b>Username:</b>"
+msgstr ""
+
+msgid "<b>Password:</b>"
+msgstr ""
+
+msgid "_Login"
+msgstr ""
+
+msgid "/Accounts"
+msgstr ""
+
+#. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
+#, c-format
+msgid ""
+"<span weight='bold' size='larger'>Welcome to %s!</span>\n"
+"\n"
+"You have no accounts enabled. Enable your IM accounts from the <b>Accounts</"
+"b> window at <b>Accounts->Manage Accounts</b>. Once you enable accounts, "
+"you'll be able to sign on, set your status, and talk to your friends."
+msgstr ""
+
+#. set the Show Offline Buddies option. must be done
+#. * after the treeview or faceprint gets mad. -Robot101
+#.
+msgid "/Buddies/Show/Offline Buddies"
+msgstr ""
+
+msgid "/Buddies/Show/Empty Groups"
+msgstr ""
+
+msgid "/Buddies/Show/Buddy Details"
+msgstr ""
+
+msgid "/Buddies/Show/Idle Times"
+msgstr ""
+
+msgid "/Buddies/Show/Protocol Icons"
+msgstr ""
+
+msgid "Add a buddy.\n"
+msgstr ""
+
+msgid "Buddy's _username:"
+msgstr ""
+
+msgid "(Optional) A_lias:"
+msgstr ""
+
+msgid "Add buddy to _group:"
+msgstr ""
+
+msgid "This protocol does not support chat rooms."
+msgstr ""
+
+msgid ""
+"You are not currently signed on with any protocols that have the ability to "
+"chat."
+msgstr ""
+
+msgid ""
+"Please enter an alias, and the appropriate information about the chat you "
+"would like to add to your buddy list.\n"
+msgstr ""
+
+msgid "A_lias:"
+msgstr ""
+
+msgid "_Group:"
+msgstr ""
+
+msgid "Auto_join when account becomes online."
+msgstr ""
+
+msgid "_Remain in chat after window is closed."
+msgstr ""
+
+msgid "Please enter the name of the group to be added."
+msgstr ""
+
+msgid "Enable Account"
+msgstr ""
+
+msgid "<PurpleMain>/Accounts/Enable Account"
+msgstr ""
+
+msgid "<PurpleMain>/Accounts/"
+msgstr ""
+
+msgid "_Edit Account"
+msgstr ""
+
+msgid "No actions available"
+msgstr ""
+
+msgid "_Disable"
+msgstr ""
+
+msgid "/Tools"
+msgstr ""
+
+msgid "/Buddies/Sort Buddies"
+msgstr ""
+
+#. Widget creation function
+msgid "SSL Servers"
+msgstr ""
+
+msgid "Unknown command."
+msgstr ""
+
+msgid "That buddy is not on the same protocol as this chat."
+msgstr ""
+
+msgid ""
+"You are not currently signed on with an account that can invite that buddy."
+msgstr ""
+
+msgid "Invite Buddy Into Chat Room"
+msgstr ""
+
+msgid "_Buddy:"
+msgstr ""
+
+msgid "_Message:"
+msgstr ""
+
+#, c-format
+msgid "<h1>Conversation with %s</h1>\n"
+msgstr ""
+
+msgid "Save Conversation"
+msgstr ""
+
+msgid "Find"
+msgstr ""
+
+msgid "_Search for:"
+msgstr ""
+
+msgid "Un-Ignore"
+msgstr ""
+
+msgid "Ignore"
+msgstr ""
+
+msgid "Get Away Message"
+msgstr ""
+
+msgid "Last said"
+msgstr ""
+
+msgid "Unable to save icon file to disk."
+msgstr ""
+
+msgid "Save Icon"
+msgstr ""
+
+msgid "Animate"
+msgstr ""
+
+msgid "Hide Icon"
+msgstr ""
+
+msgid "Save Icon As..."
+msgstr ""
+
+msgid "Set Custom Icon..."
+msgstr ""
+
+msgid "Change Size"
+msgstr ""
+
+msgid "Show All"
+msgstr ""
+
+#. Conversation menu
+msgid "/_Conversation"
+msgstr ""
+
+msgid "/Conversation/New Instant _Message..."
+msgstr ""
+
+msgid "/Conversation/_Find..."
+msgstr ""
+
+msgid "/Conversation/View _Log"
+msgstr ""
+
+msgid "/Conversation/_Save As..."
+msgstr ""
+
+msgid "/Conversation/Clea_r Scrollback"
+msgstr ""
+
+msgid "/Conversation/M_edia"
+msgstr ""
+
+msgid "/Conversation/Media/_Audio Call"
+msgstr ""
+
+msgid "/Conversation/Media/_Video Call"
+msgstr ""
+
+msgid "/Conversation/Media/Audio\\/Video _Call"
+msgstr ""
+
+msgid "/Conversation/Se_nd File..."
+msgstr ""
+
+msgid "/Conversation/Add Buddy _Pounce..."
+msgstr ""
+
+msgid "/Conversation/_Get Info"
+msgstr ""
+
+msgid "/Conversation/In_vite..."
+msgstr ""
+
+msgid "/Conversation/M_ore"
+msgstr ""
+
+msgid "/Conversation/Al_ias..."
+msgstr ""
+
+msgid "/Conversation/_Block..."
+msgstr ""
+
+msgid "/Conversation/_Unblock..."
+msgstr ""
+
+msgid "/Conversation/_Add..."
+msgstr ""
+
+msgid "/Conversation/_Remove..."
+msgstr ""
+
+msgid "/Conversation/Insert Lin_k..."
+msgstr ""
+
+msgid "/Conversation/Insert Imag_e..."
+msgstr ""
+
+msgid "/Conversation/_Close"
+msgstr ""
+
+#. Options
+msgid "/_Options"
+msgstr ""
+
+msgid "/Options/Enable _Logging"
+msgstr ""
+
+msgid "/Options/Enable _Sounds"
+msgstr ""
+
+msgid "/Options/Show Formatting _Toolbars"
+msgstr ""
+
+msgid "/Options/Show Ti_mestamps"
+msgstr ""
+
+msgid "/Conversation/More"
+msgstr ""
+
+msgid "/Options"
+msgstr ""
+
+#. The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time
+#. * the 'Conversation' menu pops up.
+#. Make sure the 'Conversation -> More' menuitems are regenerated whenever
+#. * the 'Conversation' menu pops up because the entries can change after the
+#. * conversation is created.
+msgid "/Conversation"
+msgstr ""
+
+msgid "/Conversation/View Log"
+msgstr ""
+
+msgid "/Conversation/Media/Audio Call"
+msgstr ""
+
+msgid "/Conversation/Media/Video Call"
+msgstr ""
+
+msgid "/Conversation/Media/Audio\\/Video Call"
+msgstr ""
+
+msgid "/Conversation/Send File..."
+msgstr ""
+
+msgid "/Conversation/Add Buddy Pounce..."
+msgstr ""
+
+msgid "/Conversation/Get Info"
+msgstr ""
+
+msgid "/Conversation/Invite..."
+msgstr ""
+
+msgid "/Conversation/Alias..."
+msgstr ""
+
+msgid "/Conversation/Block..."
+msgstr ""
+
+msgid "/Conversation/Unblock..."
+msgstr ""
+
+msgid "/Conversation/Add..."
+msgstr ""
+
+msgid "/Conversation/Remove..."
+msgstr ""
+
+msgid "/Conversation/Insert Link..."
+msgstr ""
+
+msgid "/Conversation/Insert Image..."
+msgstr ""
+
+msgid "/Options/Enable Logging"
+msgstr ""
+
+msgid "/Options/Enable Sounds"
+msgstr ""
+
+msgid "/Options/Show Formatting Toolbars"
+msgstr ""
+
+msgid "/Options/Show Timestamps"
+msgstr ""
+
+msgid "User is typing..."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"%s has stopped typing"
+msgstr ""
+
+#. Build the Send To menu
+msgid "S_end To"
+msgstr ""
+
+msgid "_Send"
+msgstr ""
+
+#. Setup the label telling how many people are in the room.
+msgid "0 people in room"
+msgstr ""
+
+#, c-format
+msgid "%d person in room"
+msgid_plural "%d people in room"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Typing"
+msgstr ""
+
+msgid "Stopped Typing"
+msgstr ""
+
+msgid "Nick Said"
+msgstr ""
+
+msgid "Unread Messages"
+msgstr ""
+
+msgid "New Event"
+msgstr ""
+
+msgid "clear: Clears all conversation scrollbacks."
+msgstr ""
+
+msgid "Confirm close"
+msgstr ""
+
+msgid "You have unread messages. Are you sure you want to close the window?"
+msgstr ""
+
+msgid "Close other tabs"
+msgstr ""
+
+msgid "Close all tabs"
+msgstr ""
+
+msgid "Detach this tab"
+msgstr ""
+
+msgid "Close this tab"
+msgstr ""
+
+msgid "Close conversation"
+msgstr ""
+
+msgid "Last created window"
+msgstr ""
+
+msgid "Separate IM and Chat windows"
+msgstr ""
+
+msgid "New window"
+msgstr ""
+
+msgid "By group"
+msgstr ""
+
+msgid "By account"
+msgstr ""
+
+msgid "Save Debug Log"
+msgstr ""
+
+msgid "Invert"
+msgstr ""
+
+msgid "Highlight matches"
+msgstr ""
+
+msgid "_Icon Only"
+msgstr ""
+
+msgid "_Text Only"
+msgstr ""
+
+msgid "_Both Icon & Text"
+msgstr ""
+
+msgid "Filter"
+msgstr ""
+
+msgid "Right click for more options."
+msgstr ""
+
+msgid "Level "
+msgstr ""
+
+msgid "Select the debug filter level."
+msgstr ""
+
+msgid "All"
+msgstr ""
+
+msgid "Misc"
+msgstr ""
+
+msgid "Warning"
+msgstr ""
+
+msgid "Error "
+msgstr ""
+
+msgid "Fatal Error"
+msgstr ""
+
+msgid "bug master"
+msgstr ""
+
+msgid "artist"
+msgstr ""
+
+#. feel free to not translate this
+msgid "Ka-Hing Cheung"
+msgstr ""
+
+msgid "voice and video"
+msgstr ""
+
+msgid "support"
+msgstr ""
+
+msgid "webmaster"
+msgstr ""
+
+msgid "Senior Contributor/QA"
+msgstr ""
+
+msgid "win32 port"
+msgstr ""
+
+msgid "maintainer"
+msgstr ""
+
+msgid "libfaim maintainer"
+msgstr ""
+
+#. If "lazy bum" translates literally into a serious insult, use something else or omit it.
+msgid "hacker and designated driver [lazy bum]"
+msgstr ""
+
+msgid "support/QA"
+msgstr ""
+
+msgid "XMPP"
+msgstr ""
+
+msgid "original author"
+msgstr ""
+
+msgid "lead developer"
+msgstr ""
+
+msgid "Afrikaans"
+msgstr ""
+
+msgid "Arabic"
+msgstr ""
+
+msgid "Belarusian Latin"
+msgstr ""
+
+msgid "Bulgarian"
+msgstr ""
+
+msgid "Bengali"
+msgstr ""
+
+msgid "Bosnian"
+msgstr ""
+
+msgid "Catalan"
+msgstr ""
+
+msgid "Valencian-Catalan"
+msgstr ""
+
+msgid "Czech"
+msgstr ""
+
+msgid "Danish"
+msgstr ""
+
+msgid "German"
+msgstr ""
+
+msgid "Dzongkha"
+msgstr ""
+
+msgid "Greek"
+msgstr ""
+
+msgid "Australian English"
+msgstr ""
+
+msgid "Canadian English"
+msgstr ""
+
+msgid "British English"
+msgstr ""
+
+msgid "Esperanto"
+msgstr ""
+
+msgid "Spanish"
+msgstr ""
+
+msgid "Estonian"
+msgstr ""
+
+msgid "Euskera(Basque)"
+msgstr ""
+
+msgid "Persian"
+msgstr ""
+
+msgid "Finnish"
+msgstr ""
+
+msgid "French"
+msgstr ""
+
+msgid "Irish"
+msgstr ""
+
+msgid "Galician"
+msgstr ""
+
+msgid "Gujarati"
+msgstr ""
+
+msgid "Gujarati Language Team"
+msgstr ""
+
+msgid "Hebrew"
+msgstr ""
+
+msgid "Hindi"
+msgstr ""
+
+msgid "Hungarian"
+msgstr ""
+
+msgid "Armenian"
+msgstr ""
+
+msgid "Indonesian"
+msgstr ""
+
+msgid "Italian"
+msgstr ""
+
+msgid "Japanese"
+msgstr ""
+
+msgid "Georgian"
+msgstr ""
+
+msgid "Ubuntu Georgian Translators"
+msgstr ""
+
+msgid "Khmer"
+msgstr ""
+
+msgid "Kannada"
+msgstr ""
+
+msgid "Kannada Translation team"
+msgstr ""
+
+msgid "Korean"
+msgstr ""
+
+msgid "Kurdish"
+msgstr ""
+
+msgid "Lao"
+msgstr ""
+
+msgid "Lithuanian"
+msgstr ""
+
+msgid "Macedonian"
+msgstr ""
+
+msgid "Mongolian"
+msgstr ""
+
+msgid "Bokmål Norwegian"
+msgstr ""
+
+msgid "Nepali"
+msgstr ""
+
+msgid "Dutch, Flemish"
+msgstr ""
+
+msgid "Norwegian Nynorsk"
+msgstr ""
+
+msgid "Occitan"
+msgstr ""
+
+msgid "Punjabi"
+msgstr ""
+
+msgid "Polish"
+msgstr ""
+
+msgid "Portuguese"
+msgstr ""
+
+msgid "Portuguese-Brazil"
+msgstr ""
+
+msgid "Pashto"
+msgstr ""
+
+msgid "Romanian"
+msgstr ""
+
+msgid "Russian"
+msgstr ""
+
+msgid "Slovak"
+msgstr ""
+
+msgid "Slovenian"
+msgstr ""
+
+msgid "Albanian"
+msgstr ""
+
+msgid "Serbian"
+msgstr ""
+
+msgid "Sinhala"
+msgstr ""
+
+msgid "Swedish"
+msgstr ""
+
+msgid "Swahili"
+msgstr ""
+
+msgid "Tamil"
+msgstr ""
+
+msgid "Telugu"
+msgstr ""
+
+msgid "Thai"
+msgstr ""
+
+msgid "Turkish"
+msgstr ""
+
+msgid "Urdu"
+msgstr ""
+
+msgid "Vietnamese"
+msgstr ""
+
+msgid "T.M.Thanh and the Gnome-Vi Team"
+msgstr ""
+
+msgid "Simplified Chinese"
+msgstr ""
+
+msgid "Hong Kong Chinese"
+msgstr ""
+
+msgid "Traditional Chinese"
+msgstr ""
+
+msgid "Amharic"
+msgstr ""
+
+#, c-format
+msgid "About %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s is a graphical modular messaging client based on libpurple which is "
+"capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
+"Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and "
+"QQ all at once.  It is written using GTK+.<BR><BR>You may modify and "
+"redistribute the program under the terms of the GPL (version 2 or later).  A "
+"copy of the GPL is contained in the 'COPYING' file distributed with %s.  %s "
+"is copyrighted by its contributors.  See the 'COPYRIGHT' file for the "
+"complete list of contributors.  We provide no warranty for this program."
+"<BR><BR>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
+"\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">Help via e-mail:</FONT> <A HREF=\"mailto:support@pidgin.im"
+"\">support@pidgin.im</A><BR/><BR/>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>"
+msgstr ""
+
+#, c-format
+msgid "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
+msgstr ""
+
+msgid "Current Developers"
+msgstr ""
+
+msgid "Crazy Patch Writers"
+msgstr ""
+
+msgid "Retired Developers"
+msgstr ""
+
+msgid "Retired Crazy Patch Writers"
+msgstr ""
+
+msgid "Current Translators"
+msgstr ""
+
+msgid "Past Translators"
+msgstr ""
+
+msgid "Debugging Information"
+msgstr ""
+
+msgid "_Name"
+msgstr ""
+
+msgid "_Account"
+msgstr ""
+
+msgid "Get User Info"
+msgstr ""
+
+msgid ""
+"Please enter the username or alias of the person whose info you would like "
+"to view."
+msgstr ""
+
+msgid "View User Log"
+msgstr ""
+
+msgid "Alias Contact"
+msgstr ""
+
+msgid "Enter an alias for this contact."
+msgstr ""
+
+#, c-format
+msgid "Enter an alias for %s."
+msgstr ""
+
+msgid "Alias Buddy"
+msgstr ""
+
+msgid "Alias Chat"
+msgstr ""
+
+msgid "Enter an alias for this chat."
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove the contact containing %s and %d other buddy from "
+"your buddy list.  Do you want to continue?"
+msgid_plural ""
+"You are about to remove the contact containing %s and %d other buddies from "
+"your buddy list.  Do you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Remove Contact"
+msgstr ""
+
+msgid "_Remove Contact"
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to merge the group called %s into the group called %s. Do you "
+"want to continue?"
+msgstr ""
+
+msgid "Merge Groups"
+msgstr ""
+
+msgid "_Merge Groups"
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove the group %s and all its members from your buddy "
+"list.  Do you want to continue?"
+msgstr ""
+
+msgid "Remove Group"
+msgstr ""
+
+msgid "_Remove Group"
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove %s from your buddy list.  Do you want to continue?"
+msgstr ""
+
+msgid "Remove Buddy"
+msgstr ""
+
+msgid "_Remove Buddy"
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove the chat %s from your buddy list.  Do you want to "
+"continue?"
+msgstr ""
+
+msgid "Remove Chat"
+msgstr ""
+
+msgid "_Remove Chat"
+msgstr ""
+
+msgid "Right-click for more unread messages...\n"
+msgstr ""
+
+msgid "_Change Status"
+msgstr ""
+
+msgid "Show Buddy _List"
+msgstr ""
+
+msgid "_Unread Messages"
+msgstr ""
+
+msgid "New _Message..."
+msgstr ""
+
+msgid "_Accounts"
+msgstr ""
+
+msgid "Plu_gins"
+msgstr ""
+
+msgid "Pr_eferences"
+msgstr ""
+
+msgid "Mute _Sounds"
+msgstr ""
+
+msgid "_Blink on New Message"
+msgstr ""
+
+msgid "_Quit"
+msgstr ""
+
+msgid "Not started"
+msgstr ""
+
+msgid "<b>Receiving As:</b>"
+msgstr ""
+
+msgid "<b>Receiving From:</b>"
+msgstr ""
+
+msgid "<b>Sending To:</b>"
+msgstr ""
+
+msgid "<b>Sending As:</b>"
+msgstr ""
+
+msgid "There is no application configured to open this type of file."
+msgstr ""
+
+msgid "An error occurred while opening the file."
+msgstr ""
+
+#, c-format
+msgid "Error launching %s: %s"
+msgstr ""
+
+#, c-format
+msgid "Error running %s"
+msgstr ""
+
+#, c-format
+msgid "Process returned error code %d"
+msgstr ""
+
+msgid "Filename:"
+msgstr ""
+
+msgid "Local File:"
+msgstr ""
+
+msgid "Speed:"
+msgstr ""
+
+msgid "Time Elapsed:"
+msgstr ""
+
+msgid "Time Remaining:"
+msgstr ""
+
+msgid "Close this window when all transfers _finish"
+msgstr ""
+
+msgid "C_lear finished transfers"
+msgstr ""
+
+#. "Download Details" arrow
+msgid "File transfer _details"
+msgstr ""
+
+#. Pause button
+msgid "_Pause"
+msgstr ""
+
+#. Resume button
+msgid "_Resume"
+msgstr ""
+
+msgid "Paste as Plain _Text"
+msgstr ""
+
+msgid "_Reset formatting"
+msgstr ""
+
+msgid "Disable _smileys in selected text"
+msgstr ""
+
+msgid "Hyperlink color"
+msgstr ""
+
+msgid "Color to draw hyperlinks."
+msgstr ""
+
+msgid "Hyperlink visited color"
+msgstr ""
+
+msgid "Color to draw hyperlinks after it has been visited (or activated)."
+msgstr ""
+
+msgid "Hyperlink prelight color"
+msgstr ""
+
+msgid "Color to draw hyperlinks when mouse is over them."
+msgstr ""
+
+msgid "Sent Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you sent."
+msgstr ""
+
+msgid "Received Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you received."
+msgstr ""
+
+msgid "\"Attention\" Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you received containing your name."
+msgstr ""
+
+msgid "Action Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of an action message."
+msgstr ""
+
+msgid "Action Message Name Color for Whispered Message"
+msgstr ""
+
+msgid "Whisper Message Name Color"
+msgstr ""
+
+msgid "Typing notification color"
+msgstr ""
+
+msgid "The color to use for the typing notification font"
+msgstr ""
+
+msgid "Typing notification font"
+msgstr ""
+
+msgid "The font to use for the typing notification"
+msgstr ""
+
+msgid "Enable typing notification"
+msgstr ""
+
+msgid ""
+"<span size='larger' weight='bold'>Unrecognized file type</span>\n"
+"\n"
+"Defaulting to PNG."
+msgstr ""
+
+msgid ""
+"Unrecognized file type\n"
+"\n"
+"Defaulting to PNG."
+msgstr ""
+
+#, c-format
+msgid ""
+"<span size='larger' weight='bold'>Error saving image</span>\n"
+"\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error saving image\n"
+"\n"
+"%s"
+msgstr ""
+
+msgid "Save Image"
+msgstr ""
+
+msgid "_Save Image..."
+msgstr ""
+
+msgid "_Add Custom Smiley..."
+msgstr ""
+
+msgid "Select Font"
+msgstr ""
+
+msgid "Select Text Color"
+msgstr ""
+
+msgid "Select Background Color"
+msgstr ""
+
+msgid "_URL"
+msgstr ""
+
+msgid "_Description"
+msgstr ""
+
+msgid ""
+"Please enter the URL and description of the link that you want to insert. "
+"The description is optional."
+msgstr ""
+
+msgid "Please enter the URL of the link that you want to insert."
+msgstr ""
+
+msgid "Insert Link"
+msgstr ""
+
+msgid "_Insert"
+msgstr ""
+
+#, c-format
+msgid "Failed to store image: %s\n"
+msgstr ""
+
+msgid "Insert Image"
+msgstr ""
+
+#, c-format
+msgid ""
+"This smiley is disabled because a custom smiley exists for this shortcut:\n"
+" %s"
+msgstr ""
+
+msgid "Smile!"
+msgstr ""
+
+msgid "_Manage custom smileys"
+msgstr ""
+
+msgid "This theme has no available smileys."
+msgstr ""
+
+msgid "_Font"
+msgstr ""
+
+msgid "Group Items"
+msgstr ""
+
+msgid "Ungroup Items"
+msgstr ""
+
+msgid "Bold"
+msgstr ""
+
+msgid "Italic"
+msgstr ""
+
+msgid "Underline"
+msgstr ""
+
+msgid "Strikethrough"
+msgstr ""
+
+msgid "Increase Font Size"
+msgstr ""
+
+msgid "Decrease Font Size"
+msgstr ""
+
+msgid "Font Face"
+msgstr ""
+
+msgid "Background Color"
+msgstr ""
+
+msgid "Foreground Color"
+msgstr ""
+
+msgid "Reset Formatting"
+msgstr ""
+
+msgid "Insert IM Image"
+msgstr ""
+
+msgid "Insert Smiley"
+msgstr ""
+
+msgid "<b>_Bold</b>"
+msgstr ""
+
+msgid "<i>_Italic</i>"
+msgstr ""
+
+msgid "<u>_Underline</u>"
+msgstr ""
+
+msgid "<span strikethrough='true'>Strikethrough</span>"
+msgstr ""
+
+msgid "<span size='larger'>_Larger</span>"
+msgstr ""
+
+msgid "_Normal"
+msgstr ""
+
+msgid "<span size='smaller'>_Smaller</span>"
+msgstr ""
+
+#. If we want to show the formatting for the following items, we would
+#. * need to update them when formatting changes. The above items don't need
+#. * no updating nor nothin'
+msgid "_Font face"
+msgstr ""
+
+msgid "Foreground _color"
+msgstr ""
+
+msgid "Bac_kground color"
+msgstr ""
+
+msgid "_Image"
+msgstr ""
+
+msgid "_Link"
+msgstr ""
+
+msgid "_Horizontal rule"
+msgstr ""
+
+msgid "_Smile!"
+msgstr ""
+
+msgid "Log Deletion Failed"
+msgstr ""
+
+msgid "Check permissions and try again."
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the log of the conversation with "
+"%s which started at %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the log of the conversation in %"
+"s which started at %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the system log which started at %"
+"s?"
+msgstr ""
+
+msgid "Delete Log?"
+msgstr ""
+
+msgid "Delete Log..."
+msgstr ""
+
+#, c-format
+msgid "<span size='larger' weight='bold'>Conversation in %s on %s</span>"
+msgstr ""
+
+#, c-format
+msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>"
+msgstr ""
+
+#. Steal the "HELP" response and use it to trigger browsing to the logs folder
+msgid "_Browse logs folder"
+msgstr ""
+
+#, c-format
+msgid "%s %s. Try `%s -h' for more information.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s %s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stdout\n"
+"  -f, --force-online  force online, regardless of network status\n"
+"  -h, --help          display this help and exit\n"
+"  -m, --multiple      do not ensure single instance\n"
+"  -n, --nologin       don't automatically login\n"
+"  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
+"                      specifies account(s) to use, separated by commas.\n"
+"                      Without this only the first account will be enabled).\n"
+"  --display=DISPLAY   X display to use\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s %s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stdout\n"
+"  -f, --force-online  force online, regardless of network status\n"
+"  -h, --help          display this help and exit\n"
+"  -m, --multiple      do not ensure single instance\n"
+"  -n, --nologin       don't automatically login\n"
+"  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
+"                      specifies account(s) to use, separated by commas.\n"
+"                      Without this only the first account will be enabled).\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s %s has segfaulted and attempted to dump a core file.\n"
+"This is a bug in the software and has happened through\n"
+"no fault of your own.\n"
+"\n"
+"If you can reproduce the crash, please notify the developers\n"
+"by reporting a bug at:\n"
+"%ssimpleticket/\n"
+"\n"
+"Please make sure to specify what you were doing at the time\n"
+"and post the backtrace from the core file.  If you do not know\n"
+"how to get the backtrace, please read the instructions at\n"
+"%swiki/GetABacktrace\n"
+msgstr ""
+
+#. Translators may want to transliterate the name.
+#. It is not to be translated.
+msgid "Pidgin"
+msgstr ""
+
+#, c-format
+msgid "Exiting because another libpurple client is already running.\n"
+msgstr ""
+
+msgid "/_Media"
+msgstr ""
+
+msgid "/Media/_Hangup"
+msgstr ""
+
+msgid "Calling..."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start an audio/video session with you."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start a video session with you."
+msgstr ""
+
+#, c-format
+msgid "%s has %d new message."
+msgid_plural "%s has %d new messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "<b>%d new email.</b>"
+msgid_plural "<b>%d new emails.</b>"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The browser command \"%s\" is invalid."
+msgstr ""
+
+msgid "Unable to open URL"
+msgstr ""
+
+#, c-format
+msgid "Error launching \"%s\": %s"
+msgstr ""
+
+msgid ""
+"The 'Manual' browser command has been chosen, but no command has been set."
+msgstr ""
+
+msgid "Open All Messages"
+msgstr ""
+
+msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
+msgstr ""
+
+msgid "New Pounces"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
+msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
+msgstr ""
+
+msgid "No message"
+msgstr ""
+
+msgid "The following plugins will be unloaded."
+msgstr ""
+
+msgid "Multiple plugins will be unloaded."
+msgstr ""
+
+msgid "Unload Plugins"
+msgstr ""
+
+msgid "Could not unload plugin"
+msgstr ""
+
+msgid ""
+"The plugin could not be unloaded now, but will be disabled at the next "
+"startup."
+msgstr ""
+
+#, c-format
+msgid ""
+"<span foreground=\"red\" weight=\"bold\">Error: %s\n"
+"Check the plugin website for an update.</span>"
+msgstr ""
+
+msgid "Author"
+msgstr ""
+
+msgid "<b>Written by:</b>"
+msgstr ""
+
+msgid "<b>Web site:</b>"
+msgstr ""
+
+msgid "<b>Filename:</b>"
+msgstr ""
+
+msgid "Configure Pl_ugin"
+msgstr ""
+
+msgid "<b>Plugin Details</b>"
+msgstr ""
+
+msgid "Select a file"
+msgstr ""
+
+msgid "Modify Buddy Pounce"
+msgstr ""
+
+#. Create the "Pounce on Whom" frame.
+msgid "Pounce on Whom"
+msgstr ""
+
+msgid "_Account:"
+msgstr ""
+
+msgid "_Buddy name:"
+msgstr ""
+
+msgid "Si_gns on"
+msgstr ""
+
+msgid "Signs o_ff"
+msgstr ""
+
+msgid "Goes a_way"
+msgstr ""
+
+msgid "Ret_urns from away"
+msgstr ""
+
+msgid "Becomes _idle"
+msgstr ""
+
+msgid "Is no longer i_dle"
+msgstr ""
+
+msgid "Starts _typing"
+msgstr ""
+
+msgid "P_auses while typing"
+msgstr ""
+
+msgid "Stops t_yping"
+msgstr ""
+
+msgid "Sends a _message"
+msgstr ""
+
+msgid "Ope_n an IM window"
+msgstr ""
+
+msgid "_Pop up a notification"
+msgstr ""
+
+msgid "Send a _message"
+msgstr ""
+
+msgid "E_xecute a command"
+msgstr ""
+
+msgid "P_lay a sound"
+msgstr ""
+
+msgid "Brows_e..."
+msgstr ""
+
+msgid "Br_owse..."
+msgstr ""
+
+msgid "Pre_view"
+msgstr ""
+
+msgid "P_ounce only when my status is not Available"
+msgstr ""
+
+msgid "_Recurring"
+msgstr ""
+
+msgid "Pounce Target"
+msgstr ""
+
+#, c-format
+msgid "Started typing"
+msgstr ""
+
+#, c-format
+msgid "Paused while typing"
+msgstr ""
+
+#, c-format
+msgid "Signed on"
+msgstr ""
+
+#, c-format
+msgid "Returned from being idle"
+msgstr ""
+
+#, c-format
+msgid "Returned from being away"
+msgstr ""
+
+#, c-format
+msgid "Stopped typing"
+msgstr ""
+
+#, c-format
+msgid "Signed off"
+msgstr ""
+
+#, c-format
+msgid "Became idle"
+msgstr ""
+
+#, c-format
+msgid "Went away"
+msgstr ""
+
+#, c-format
+msgid "Sent a message"
+msgstr ""
+
+#, c-format
+msgid "Unknown.... Please report this!"
+msgstr ""
+
+msgid "Smiley theme failed to unpack."
+msgstr ""
+
+msgid "Install Theme"
+msgstr ""
+
+msgid ""
+"Select a smiley theme that you would like to use from the list below. New "
+"themes can be installed by dragging and dropping them onto the theme list."
+msgstr ""
+
+msgid "Icon"
+msgstr ""
+
+msgid "Keyboard Shortcuts"
+msgstr ""
+
+msgid "Cl_ose conversations with the Escape key"
+msgstr ""
+
+#. Buddy List Themes
+msgid "Buddy List Theme"
+msgstr ""
+
+#. System Tray
+msgid "System Tray Icon"
+msgstr ""
+
+msgid "_Show system tray icon:"
+msgstr ""
+
+msgid "On unread messages"
+msgstr ""
+
+msgid "Conversation Window Hiding"
+msgstr ""
+
+msgid "_Hide new IM conversations:"
+msgstr ""
+
+msgid "When away"
+msgstr ""
+
+#. All the tab options!
+msgid "Tabs"
+msgstr ""
+
+msgid "Show IMs and chats in _tabbed windows"
+msgstr ""
+
+msgid "Show close b_utton on tabs"
+msgstr ""
+
+msgid "_Placement:"
+msgstr ""
+
+msgid "Top"
+msgstr ""
+
+msgid "Bottom"
+msgstr ""
+
+msgid "Left"
+msgstr ""
+
+msgid "Right"
+msgstr ""
+
+msgid "Left Vertical"
+msgstr ""
+
+msgid "Right Vertical"
+msgstr ""
+
+msgid "N_ew conversations:"
+msgstr ""
+
+msgid "Show _formatting on incoming messages"
+msgstr ""
+
+msgid "Close IMs immediately when the tab is closed"
+msgstr ""
+
+msgid "Show _detailed information"
+msgstr ""
+
+msgid "Enable buddy ic_on animation"
+msgstr ""
+
+msgid "_Notify buddies that you are typing to them"
+msgstr ""
+
+msgid "Highlight _misspelled words"
+msgstr ""
+
+msgid "Use smooth-scrolling"
+msgstr ""
+
+msgid "F_lash window when IMs are received"
+msgstr ""
+
+msgid "Minimi_ze new conversation windows"
+msgstr ""
+
+msgid "Minimum input area height in lines:"
+msgstr ""
+
+msgid "Font"
+msgstr ""
+
+msgid "Use document font from _theme"
+msgstr ""
+
+msgid "Use font from _theme"
+msgstr ""
+
+msgid "Conversation _font:"
+msgstr ""
+
+msgid "Default Formatting"
+msgstr ""
+
+msgid ""
+"This is how your outgoing message text will appear when you use protocols "
+"that support formatting."
+msgstr ""
+
+msgid "Cannot start proxy configuration program."
+msgstr ""
+
+msgid "Cannot start browser configuration program."
+msgstr ""
+
+msgid "<span style=\"italic\">Example: stunserver.org</span>"
+msgstr ""
+
+msgid "_Autodetect IP address"
+msgstr ""
+
+msgid "Public _IP:"
+msgstr ""
+
+msgid "Ports"
+msgstr ""
+
+msgid "_Enable automatic router port forwarding"
+msgstr ""
+
+msgid "_Manually specify range of ports to listen on"
+msgstr ""
+
+msgid "_Start port:"
+msgstr ""
+
+msgid "_End port:"
+msgstr ""
+
+#. TURN server
+msgid "Relay Server (TURN)"
+msgstr ""
+
+msgid "Proxy Server &amp; Browser"
+msgstr ""
+
+msgid "<b>Proxy configuration program was not found.</b>"
+msgstr ""
+
+msgid "<b>Browser configuration program was not found.</b>"
+msgstr ""
+
+msgid ""
+"Proxy & Browser preferences are configured\n"
+"in GNOME Preferences"
+msgstr ""
+
+msgid "Configure _Proxy"
+msgstr ""
+
+msgid "Configure _Browser"
+msgstr ""
+
+msgid "Proxy Server"
+msgstr ""
+
+msgid "No proxy"
+msgstr ""
+
+#. This is a global option that affects SOCKS4 usage even with account-specific proxy settings
+msgid "Use remote DNS with SOCKS4 proxies"
+msgstr ""
+
+msgid "_User:"
+msgstr ""
+
+msgid "Seamonkey"
+msgstr ""
+
+msgid "Opera"
+msgstr ""
+
+msgid "Netscape"
+msgstr ""
+
+msgid "Mozilla"
+msgstr ""
+
+msgid "Konqueror"
+msgstr ""
+
+msgid "Desktop Default"
+msgstr ""
+
+msgid "GNOME Default"
+msgstr ""
+
+msgid "Galeon"
+msgstr ""
+
+msgid "Firefox"
+msgstr ""
+
+msgid "Firebird"
+msgstr ""
+
+msgid "Epiphany"
+msgstr ""
+
+msgid "Manual"
+msgstr ""
+
+msgid "Browser Selection"
+msgstr ""
+
+msgid "_Browser:"
+msgstr ""
+
+msgid "_Open link in:"
+msgstr ""
+
+msgid "Browser default"
+msgstr ""
+
+msgid "Existing window"
+msgstr ""
+
+msgid "New tab"
+msgstr ""
+
+#, c-format
+msgid ""
+"_Manual:\n"
+"(%s for URL)"
+msgstr ""
+
+msgid "Log _format:"
+msgstr ""
+
+msgid "Log all _instant messages"
+msgstr ""
+
+msgid "Log all c_hats"
+msgstr ""
+
+msgid "Log all _status changes to system log"
+msgstr ""
+
+msgid "Sound Selection"
+msgstr ""
+
+#, c-format
+msgid "Quietest"
+msgstr ""
+
+#, c-format
+msgid "Quieter"
+msgstr ""
+
+#, c-format
+msgid "Quiet"
+msgstr ""
+
+#, c-format
+msgid "Loud"
+msgstr ""
+
+#, c-format
+msgid "Louder"
+msgstr ""
+
+#, c-format
+msgid "Loudest"
+msgstr ""
+
+msgid "_Method:"
+msgstr ""
+
+msgid "Console beep"
+msgstr ""
+
+msgid "No sounds"
+msgstr ""
+
+#, c-format
+msgid ""
+"Sound c_ommand:\n"
+"(%s for filename)"
+msgstr ""
+
+msgid "M_ute sounds"
+msgstr ""
+
+msgid "Sounds when conversation has _focus"
+msgstr ""
+
+msgid "_Enable sounds:"
+msgstr ""
+
+msgid "V_olume:"
+msgstr ""
+
+msgid "Play"
+msgstr ""
+
+msgid "_Browse..."
+msgstr ""
+
+msgid "_Reset"
+msgstr ""
+
+msgid "_Report idle time:"
+msgstr ""
+
+msgid "Based on keyboard or mouse use"
+msgstr ""
+
+msgid "_Auto-reply:"
+msgstr ""
+
+msgid "When both away and idle"
+msgstr ""
+
+#. Auto-away stuff
+msgid "Auto-away"
+msgstr ""
+
+msgid "_Minutes before becoming idle:"
+msgstr ""
+
+msgid "Change status when _idle"
+msgstr ""
+
+msgid "Change _status to:"
+msgstr ""
+
+#. Signon status stuff
+msgid "Status at Startup"
+msgstr ""
+
+msgid "Use status from last _exit at startup"
+msgstr ""
+
+msgid "Status to a_pply at startup:"
+msgstr ""
+
+msgid "Interface"
+msgstr ""
+
+msgid "Smiley Themes"
+msgstr ""
+
+msgid "Browser"
+msgstr ""
+
+msgid "Status / Idle"
+msgstr ""
+
+msgid "Allow all users to contact me"
+msgstr ""
+
+msgid "Allow only the users on my buddy list"
+msgstr ""
+
+msgid "Allow only the users below"
+msgstr ""
+
+msgid "Block all users"
+msgstr ""
+
+msgid "Block only the users below"
+msgstr ""
+
+msgid "Privacy"
+msgstr ""
+
+msgid "Changes to privacy settings take effect immediately."
+msgstr ""
+
+msgid "Set privacy for:"
+msgstr ""
+
+#. Remove All button
+msgid "Remove Al_l"
+msgstr ""
+
+msgid "Permit User"
+msgstr ""
+
+msgid "Type a user you permit to contact you."
+msgstr ""
+
+msgid "Please enter the name of the user you wish to be able to contact you."
+msgstr ""
+
+msgid "_Permit"
+msgstr ""
+
+#, c-format
+msgid "Allow %s to contact you?"
+msgstr ""
+
+#, c-format
+msgid "Are you sure you wish to allow %s to contact you?"
+msgstr ""
+
+msgid "Block User"
+msgstr ""
+
+msgid "Type a user to block."
+msgstr ""
+
+msgid "Please enter the name of the user you wish to block."
+msgstr ""
+
+#, c-format
+msgid "Block %s?"
+msgstr ""
+
+#, c-format
+msgid "Are you sure you want to block %s?"
+msgstr ""
+
+msgid "Apply"
+msgstr ""
+
+msgid "That file already exists"
+msgstr ""
+
+msgid "Would you like to overwrite it?"
+msgstr ""
+
+msgid "Overwrite"
+msgstr ""
+
+msgid "Choose New Name"
+msgstr ""
+
+msgid "Select Folder..."
+msgstr ""
+
+#. list button
+msgid "_Get List"
+msgstr ""
+
+#. add button
+msgid "_Add Chat"
+msgstr ""
+
+msgid "Are you sure you want to delete the selected saved statuses?"
+msgstr ""
+
+#. Use button
+msgid "_Use"
+msgstr ""
+
+msgid "Title already in use.  You must choose a unique title."
+msgstr ""
+
+msgid "Different"
+msgstr ""
+
+msgid "_Title:"
+msgstr ""
+
+msgid "_Status:"
+msgstr ""
+
+#. Different status message expander
+msgid "Use a _different status for some accounts"
+msgstr ""
+
+#. Save & Use button
+msgid "Sa_ve & Use"
+msgstr ""
+
+#, c-format
+msgid "Status for %s"
+msgstr ""
+
+#.
+#. * TODO: We should enable/disable the add button based on
+#. *       whether the user has entered all required data.  That
+#. *       would eliminate the need for this check and provide a
+#. *       better user experience.
+#.
+msgid "Custom Smiley"
+msgstr ""
+
+msgid "More Data needed"
+msgstr ""
+
+msgid "Please provide a shortcut to associate with the smiley."
+msgstr ""
+
+#, c-format
+msgid ""
+"A custom smiley for '%s' already exists.  Please use a different shortcut."
+msgstr ""
+
+msgid "Duplicate Shortcut"
+msgstr ""
+
+msgid "Please select an image for the smiley."
+msgstr ""
+
+msgid "Edit Smiley"
+msgstr ""
+
+msgid "Add Smiley"
+msgstr ""
+
+msgid "_Image:"
+msgstr ""
+
+#. Shortcut text
+msgid "S_hortcut text:"
+msgstr ""
+
+msgid "Smiley"
+msgstr ""
+
+msgid "Shortcut Text"
+msgstr ""
+
+msgid "Custom Smiley Manager"
+msgstr ""
+
+msgid "Select Buddy Icon"
+msgstr ""
+
+msgid "Click to change your buddyicon for this account."
+msgstr ""
+
+msgid "Click to change your buddyicon for all accounts."
+msgstr ""
+
+msgid "Waiting for network connection"
+msgstr ""
+
+msgid "New status..."
+msgstr ""
+
+msgid "Saved statuses..."
+msgstr ""
+
+msgid "Status Selector"
+msgstr ""
+
+msgid "Google Talk"
+msgstr ""
+
+#, c-format
+msgid "The following error has occurred loading %s: %s"
+msgstr ""
+
+msgid "Failed to load image"
+msgstr ""
+
+#, c-format
+msgid "Cannot send folder %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s cannot transfer a folder. You will need to send the files within "
+"individually."
+msgstr ""
+
+msgid "You have dragged an image"
+msgstr ""
+
+msgid ""
+"You can send this image as a file transfer, embed it into this message, or "
+"use it as the buddy icon for this user."
+msgstr ""
+
+msgid "Set as buddy icon"
+msgstr ""
+
+msgid "Send image file"
+msgstr ""
+
+msgid "Insert in message"
+msgstr ""
+
+msgid "Would you like to set it as the buddy icon for this user?"
+msgstr ""
+
+msgid ""
+"You can send this image as a file transfer, or use it as the buddy icon for "
+"this user."
+msgstr ""
+
+msgid ""
+"You can insert this image into this message, or use it as the buddy icon for "
+"this user"
+msgstr ""
+
+#. I don't know if we really want to do anything here.  Most of the desktop item types are crap like
+#. * "MIME Type" (I have no clue how that would be a desktop item) and "Comment"... nothing we can really
+#. * send.  The only logical one is "Application," but do we really want to send a binary and nothing else?
+#. * Probably not.  I'll just give an error and return.
+#. The original patch sent the icon used by the launcher.  That's probably wrong
+msgid "Cannot send launcher"
+msgstr ""
+
+msgid ""
+"You dragged a desktop launcher. Most likely you wanted to send whatever this "
+"launcher points to instead of this launcher itself."
+msgstr ""
+
+#, c-format
+msgid ""
+"<b>File:</b> %s\n"
+"<b>File size:</b> %s\n"
+"<b>Image size:</b> %dx%d"
+msgstr ""
+
+#, c-format
+msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
+msgstr ""
+
+msgid "Icon Error"
+msgstr ""
+
+msgid "Could not set icon"
+msgstr ""
+
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Failed to load image '%s': reason not known, probably a corrupt image file"
+msgstr ""
+
+msgid "_Open Link"
+msgstr ""
+
+msgid "_Copy Link Location"
+msgstr ""
+
+msgid "_Copy Email Address"
+msgstr ""
+
+msgid "Save File"
+msgstr ""
+
+msgid "Select color"
+msgstr ""
+
+msgid "_Alias"
+msgstr ""
+
+msgid "Close _tabs"
+msgstr ""
+
+msgid "_Get Info"
+msgstr ""
+
+msgid "_Invite"
+msgstr ""
+
+msgid "_Modify..."
+msgstr ""
+
+msgid "_Add..."
+msgstr ""
+
+msgid "_Open Mail"
+msgstr ""
+
+msgid "_Edit"
+msgstr ""
+
+msgid "Pidgin Tooltip"
+msgstr ""
+
+msgid "Pidgin smileys"
+msgstr ""
+
+msgid "Penguin Pimps"
+msgstr ""
+
+msgid "Selecting this disables graphical emoticons."
+msgstr ""
+
+msgid "none"
+msgstr ""
+
+msgid "Small"
+msgstr ""
+
+msgid "Smaller versions of the default smilies"
+msgstr ""
+
+msgid "Response Probability:"
+msgstr ""
+
+msgid "Statistics Configuration"
+msgstr ""
+
+#. msg_difference spinner
+msgid "Maximum response timeout:"
+msgstr ""
+
+msgid "minutes"
+msgstr ""
+
+#. last_seen spinner
+msgid "Maximum last-seen difference:"
+msgstr ""
+
+#. threshold spinner
+msgid "Threshold:"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Contact Availability Prediction"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Contact Availability Prediction plugin."
+msgstr ""
+
+#. *  summary
+msgid "Displays statistical information about your buddies' availability"
+msgstr ""
+
+msgid "Buddy is idle"
+msgstr ""
+
+msgid "Buddy is away"
+msgstr ""
+
+msgid "Buddy is \"extended\" away"
+msgstr ""
+
+#. Not used yet.
+msgid "Buddy is mobile"
+msgstr ""
+
+msgid "Buddy is offline"
+msgstr ""
+
+msgid "Point values to use when..."
+msgstr ""
+
+msgid ""
+"The buddy with the <i>largest score</i> is the buddy who will have priority "
+"in the contact.\n"
+msgstr ""
+
+msgid "Use last buddy when scores are equal"
+msgstr ""
+
+msgid "Point values to use for account..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Contact Priority"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *< summary
+msgid ""
+"Allows for controlling the values associated with different buddy states."
+msgstr ""
+
+#. *< description
+msgid ""
+"Allows for changing the point values of idle/away/offline states for buddies "
+"in contact priority computations."
+msgstr ""
+
+msgid "Conversation Colors"
+msgstr ""
+
+msgid "Customize colors in the conversation window"
+msgstr ""
+
+msgid "Error Messages"
+msgstr ""
+
+msgid "Highlighted Messages"
+msgstr ""
+
+msgid "System Messages"
+msgstr ""
+
+msgid "Sent Messages"
+msgstr ""
+
+msgid "Received Messages"
+msgstr ""
+
+#, c-format
+msgid "Select Color for %s"
+msgstr ""
+
+msgid "Ignore incoming format"
+msgstr ""
+
+msgid "Apply in Chats"
+msgstr ""
+
+msgid "Apply in IMs"
+msgstr ""
+
+msgid "By conversation count"
+msgstr ""
+
+msgid "Conversation Placement"
+msgstr ""
+
+#. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above
+msgid ""
+"Note: The preference for \"New conversations\" must be set to \"By "
+"conversation count\"."
+msgstr ""
+
+msgid "Number of conversations per window"
+msgstr ""
+
+msgid "Separate IM and Chat windows when placing by number"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "ExtPlacement"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Extra conversation placement options."
+msgstr ""
+
+#. *< summary
+#. *  description
+msgid ""
+"Restrict the number of conversations per windows, optionally separating IMs "
+"and Chats"
+msgstr ""
+
+#. Configuration frame
+msgid "Mouse Gestures Configuration"
+msgstr ""
+
+msgid "Middle mouse button"
+msgstr ""
+
+msgid "Right mouse button"
+msgstr ""
+
+#. "Visual gesture display" checkbox
+msgid "_Visual gesture display"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Mouse Gestures"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Provides support for mouse gestures"
+msgstr ""
+
+#. *  description
+msgid ""
+"Allows support for mouse gestures in conversation windows. Drag the middle "
+"mouse button to perform certain actions:\n"
+" • Drag down and then to the right to close a conversation.\n"
+" • Drag up and then to the left to switch to the previous conversation.\n"
+" • Drag up and then to the right to switch to the next conversation."
+msgstr ""
+
+msgid "Instant Messaging"
+msgstr ""
+
+#. Add the label.
+msgid "Select a person from your address book below, or add a new person."
+msgstr ""
+
+msgid "Group:"
+msgstr ""
+
+#. "New Person" button
+msgid "New Person"
+msgstr ""
+
+#. "Select Buddy" button
+msgid "Select Buddy"
+msgstr ""
+
+#. Add the label.
+msgid ""
+"Select a person from your address book to add this buddy to, or create a new "
+"person."
+msgstr ""
+
+#. Add the expander
+msgid "User _details"
+msgstr ""
+
+#. "Associate Buddy" button
+msgid "_Associate Buddy"
+msgstr ""
+
+msgid "Unable to send email"
+msgstr ""
+
+msgid "The evolution executable was not found in the PATH."
+msgstr ""
+
+msgid "An email address was not found for this buddy."
+msgstr ""
+
+msgid "Add to Address Book"
+msgstr ""
+
+msgid "Send Email"
+msgstr ""
+
+#. Configuration frame
+msgid "Evolution Integration Configuration"
+msgstr ""
+
+#. Label
+msgid "Select all accounts that buddies should be auto-added to."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Evolution Integration"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides integration with Evolution."
+msgstr ""
+
+msgid "Please enter the person's information below."
+msgstr ""
+
+msgid "Please enter the buddy's username and account type below."
+msgstr ""
+
+msgid "Account type:"
+msgstr ""
+
+#. Optional Information section
+msgid "Optional information:"
+msgstr ""
+
+msgid "First name:"
+msgstr ""
+
+msgid "Last name:"
+msgstr ""
+
+msgid "Email:"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "GTK Signals Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Test to see that all ui signals are working properly."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Buddy Note</b>: %s"
+msgstr ""
+
+msgid "History"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Iconify on Away"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Iconifies the buddy list and your conversations when you go away."
+msgstr ""
+
+msgid "Mail Checker"
+msgstr ""
+
+msgid "Checks for new local mail."
+msgstr ""
+
+msgid "Adds a small box to the buddy list that shows if you have new mail."
+msgstr ""
+
+msgid "Markerline"
+msgstr ""
+
+msgid "Draw a line to indicate new messages in a conversation."
+msgstr ""
+
+msgid "Jump to markerline"
+msgstr ""
+
+msgid "Draw Markerline in "
+msgstr ""
+
+msgid "_IM windows"
+msgstr ""
+
+msgid "C_hat windows"
+msgstr ""
+
+msgid ""
+"A music messaging session has been requested. Please click the MM icon to "
+"accept."
+msgstr ""
+
+msgid "Music messaging session confirmed."
+msgstr ""
+
+msgid "Music Messaging"
+msgstr ""
+
+msgid "There was a conflict in running the command:"
+msgstr ""
+
+msgid "Error Running Editor"
+msgstr ""
+
+msgid "The following error has occurred:"
+msgstr ""
+
+#. Configuration frame
+msgid "Music Messaging Configuration"
+msgstr ""
+
+msgid "Score Editor Path"
+msgstr ""
+
+msgid "_Apply"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "Music Messaging Plugin for collaborative composition."
+msgstr ""
+
+#. *  summary
+msgid ""
+"The Music Messaging Plugin allows a number of users to simultaneously work "
+"on a piece of music by editting a common score in real-time."
+msgstr ""
+
+#. ---------- "Notify For" ----------
+msgid "Notify For"
+msgstr ""
+
+msgid "\t_Only when someone says your username"
+msgstr ""
+
+msgid "_Focused windows"
+msgstr ""
+
+#. ---------- "Notification Methods" ----------
+msgid "Notification Methods"
+msgstr ""
+
+msgid "Prepend _string into window title:"
+msgstr ""
+
+#. Count method button
+msgid "Insert c_ount of new messages into window title"
+msgstr ""
+
+#. Count xprop method button
+msgid "Insert count of new message into _X property"
+msgstr ""
+
+#. Urgent method button
+msgid "Set window manager \"_URGENT\" hint"
+msgstr ""
+
+msgid "_Flash window"
+msgstr ""
+
+#. Raise window method button
+msgid "R_aise conversation window"
+msgstr ""
+
+#. Present conversation method button
+msgid "_Present conversation window"
+msgstr ""
+
+#. ---------- "Notification Removals" ----------
+msgid "Notification Removal"
+msgstr ""
+
+#. Remove on focus button
+msgid "Remove when conversation window _gains focus"
+msgstr ""
+
+#. Remove on click button
+msgid "Remove when conversation window _receives click"
+msgstr ""
+
+#. Remove on type button
+msgid "Remove when _typing in conversation window"
+msgstr ""
+
+#. Remove on message send button
+msgid "Remove when a _message gets sent"
+msgstr ""
+
+#. Remove on conversation switch button
+msgid "Remove on switch to conversation ta_b"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Message Notification"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides a variety of ways of notifying you of unread messages."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Pidgin Demonstration Plugin"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "An example plugin that does stuff - see the description."
+msgstr ""
+
+#. *  description
+msgid ""
+"This is a really cool plugin that does a lot of stuff:\n"
+"- It tells you who wrote the program when you log in\n"
+"- It reverses all incoming text\n"
+"- It sends a message to people on your list immediately when they sign on"
+msgstr ""
+
+msgid "Cursor Color"
+msgstr ""
+
+msgid "Secondary Cursor Color"
+msgstr ""
+
+msgid "Hyperlink Color"
+msgstr ""
+
+msgid "Visited Hyperlink Color"
+msgstr ""
+
+msgid "Highlighted Message Name Color"
+msgstr ""
+
+msgid "GtkTreeView Horizontal Separation"
+msgstr ""
+
+msgid "Conversation Entry"
+msgstr ""
+
+msgid "Request Dialog"
+msgstr ""
+
+msgid "Notify Dialog"
+msgstr ""
+
+msgid "Select Color"
+msgstr ""
+
+#, c-format
+msgid "Select Interface Font"
+msgstr ""
+
+#, c-format
+msgid "Select Font for %s"
+msgstr ""
+
+msgid "GTK+ Interface Font"
+msgstr ""
+
+msgid "GTK+ Text Shortcut Theme"
+msgstr ""
+
+#.
+#. for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+#. hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+#. gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+#.
+#. check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
+#. widget_bool_prefs_set[i], hbox);
+#. gtk_size_group_add_widget(labelsg, check);
+#.
+#. widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
+#. *
+#. gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
+#. *
+#. gtk_widget_set_sensitive(widget_bool_widgets[i],
+#. purple_prefs_get_bool(widget_bool_prefs_set[i]));
+#. g_signal_connect(G_OBJECT(check), "toggled",
+#. G_CALLBACK(pidgin_toggle_sensitive),
+#. widget_bool_widgets[i]);
+#. }
+#.
+msgid "Interface colors"
+msgstr ""
+
+msgid "Widget Sizes"
+msgstr ""
+
+msgid "Fonts"
+msgstr ""
+
+msgid "Gtkrc File Tools"
+msgstr ""
+
+#, c-format
+msgid "Write settings to %s%sgtkrc-2.0"
+msgstr ""
+
+msgid "Re-read gtkrc files"
+msgstr ""
+
+msgid "Pidgin GTK+ Theme Control"
+msgstr ""
+
+msgid "Provides access to commonly used gtkrc settings."
+msgstr ""
+
+msgid "Raw"
+msgstr ""
+
+msgid "Lets you send raw input to text-based protocols."
+msgstr ""
+
+msgid ""
+"Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit "
+"'Enter' in the entry box to send. Watch the debug window."
+msgstr ""
+
+#, c-format
+msgid "You can upgrade to %s %s today."
+msgstr ""
+
+msgid "New Version Available"
+msgstr ""
+
+msgid "Later"
+msgstr ""
+
+msgid "Download Now"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Release Notification"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Checks periodically for new releases."
+msgstr ""
+
+#. *  description
+msgid ""
+"Checks periodically for new releases and notifies the user with the "
+"ChangeLog."
+msgstr ""
+
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Send Button"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Conversation Window Send Button."
+msgstr ""
+
+#. *< summary
+msgid ""
+"Adds a Send button to the entry area of the conversation window. Intended "
+"for when no physical keyboard is present."
+msgstr ""
+
+msgid "Duplicate Correction"
+msgstr ""
+
+msgid "The specified word already exists in the correction list."
+msgstr ""
+
+msgid "Text Replacements"
+msgstr ""
+
+msgid "You type"
+msgstr ""
+
+msgid "You send"
+msgstr ""
+
+msgid "Whole words only"
+msgstr ""
+
+msgid "Case sensitive"
+msgstr ""
+
+msgid "Add a new text replacement"
+msgstr ""
+
+msgid "You _type:"
+msgstr ""
+
+msgid "You _send:"
+msgstr ""
+
+#. Created here so it can be passed to whole_words_button_toggled.
+msgid "_Exact case match (uncheck for automatic case handling)"
+msgstr ""
+
+msgid "Only replace _whole words"
+msgstr ""
+
+msgid "General Text Replacement Options"
+msgstr ""
+
+msgid "Enable replacement of last word on send"
+msgstr ""
+
+msgid "Text replacement"
+msgstr ""
+
+msgid "Replaces text in outgoing messages according to user-defined rules."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy Ticker"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "A horizontal scrolling version of the buddy list."
+msgstr ""
+
+msgid "Display Timestamps Every"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Timestamp"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Display iChat-style timestamps"
+msgstr ""
+
+#. *  description
+msgid "Display iChat-style timestamps every N minutes."
+msgstr ""
+
+msgid "Timestamp Format Options"
+msgstr ""
+
+#, c-format
+msgid "_Force 24-hour time format"
+msgstr ""
+
+msgid "Show dates in..."
+msgstr ""
+
+msgid "Co_nversations:"
+msgstr ""
+
+msgid "For delayed messages"
+msgstr ""
+
+msgid "For delayed messages and in chats"
+msgstr ""
+
+msgid "_Message Logs:"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Message Timestamp Formats"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Customizes the message timestamp formats."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin allows the user to customize conversation and logging message "
+"timestamp formats."
+msgstr ""
+
+msgid "Opacity:"
+msgstr ""
+
+#. IM Convo trans options
+msgid "IM Conversation Windows"
+msgstr ""
+
+msgid "_IM window transparency"
+msgstr ""
+
+msgid "_Show slider bar in IM window"
+msgstr ""
+
+msgid "Remove IM window transparency on focus"
+msgstr ""
+
+msgid "Always on top"
+msgstr ""
+
+#. Buddy List trans options
+msgid "Buddy List Window"
+msgstr ""
+
+msgid "_Buddy List window transparency"
+msgstr ""
+
+msgid "Remove Buddy List window transparency on focus"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Transparency"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Variable Transparency for the buddy list and conversations."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin enables variable alpha transparency on conversation windows and "
+"the buddy list.\n"
+"\n"
+"* Note: This plugin requires Win2000 or greater."
+msgstr ""
+
+msgid "GTK+ Runtime Version"
+msgstr ""
+
+#. Autostart
+msgid "Startup"
+msgstr ""
+
+#, c-format
+msgid "_Start %s on Windows startup"
+msgstr ""
+
+msgid "_Dockable Buddy List"
+msgstr ""
+
+#. Blist On Top
+msgid "_Keep Buddy List window on top:"
+msgstr ""
+
+#. XXX: Did this ever work?
+msgid "Only when docked"
+msgstr ""
+
+msgid "Windows Pidgin Options"
+msgstr ""
+
+msgid "Options specific to Pidgin for Windows."
+msgstr ""
+
+msgid ""
+"Provides options specific to Pidgin for Windows , such as buddy list docking."
+msgstr ""
+
+msgid "<font color='#777777'>Logged out.</font>"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "XMPP Console"
+msgstr ""
+
+msgid "Account: "
+msgstr ""
+
+msgid "<font color='#777777'>Not connected to XMPP</font>"
+msgstr ""
+
+msgid "Insert an <iq/> stanza."
+msgstr ""
+
+msgid "Insert a <presence/> stanza."
+msgstr ""
+
+msgid "Insert a <message/> stanza."
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Send and receive raw XMPP stanzas."
+msgstr ""
+
+#. *  description
+msgid "This plugin is useful for debbuging XMPP servers or clients."
+msgstr ""
--- a/po/lo.po	Sun May 10 06:24:26 2009 +0000
+++ b/po/lo.po	Sun Jun 28 04:41:07 2009 +0000
@@ -1,25 +1,26 @@
-# SOME DESCRIPTIVE TITLE.
+# translation of lo.po to Lao
 # Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
 # This file is distributed under the same license as the PACKAGE package.
-# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
 #
-msgid ""
-msgstr ""
-"Project-Id-Version: PACKAGE VERSION\n"
+# Anousak Souphavanh <anousak@gmail.com>, 2007, 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: lo\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-04-30 10:39-0400\n"
-"PO-Revision-Date: 2007-09-28 09:52+0700\n"
+"POT-Creation-Date: 2009-05-26 22:29-0700\n"
+"PO-Revision-Date: 2009-04-29 09:28+0700\n"
 "Last-Translator: Anousak Souphavanh <anousak@gmail.com>\n"
-"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language-Team: Lao <lo@li.org>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
 "Content-Transfer-Encoding: 8bit\n"
+"X-Generator: KBabel 1.11.4\n"
 
 # "Plural-Forms: nplurals=INTEGER; plural=EXPRESSION;\n"
 #. Translators may want to transliterate the name.
 #. It is not to be translated.
 msgid "Finch"
-msgstr ""
+msgstr "ຟີນຊ໌"
 
 #, c-format
 msgid "%s. Try `%s -h' for more information.\n"
@@ -48,40 +49,40 @@
 msgstr "ຜິດພາດ"
 
 msgid "Account was not added"
-msgstr ""
+msgstr "ບໍ່ໃດ້ເພີ້ມບັນຊີ "
 
 msgid "Username of an account must be non-empty."
-msgstr ""
+msgstr "ລະຫັດຜູ້ໃຊ້ຕ້ອງໃຫ້ມີຂໍ້ມູນ"
 
 msgid "New mail notifications"
-msgstr ""
+msgstr "ອີເເມວລ໌ໃຫ່ມເຕືອນ"
 
 msgid "Remember password"
-msgstr ""
+msgstr "ຈື່ລະຫັດພານ"
 
 msgid "There are no protocol plugins installed."
 msgstr ""
 
 msgid "(You probably forgot to 'make install'.)"
-msgstr ""
+msgstr "ຄິດວ່າທ່ານລືມຂຽນ 'make install'"
 
 msgid "Modify Account"
-msgstr ""
+msgstr "ປັບບັນຊີ"
 
 msgid "New Account"
-msgstr ""
+msgstr "ບັນຊີໃຫມ່"
 
 msgid "Protocol:"
-msgstr ""
+msgstr "ໂປໂຕໂກນ:"
 
 msgid "Username:"
-msgstr ""
+msgstr "ຊື່ຜູ້ໃຊ້:"
 
 msgid "Password:"
-msgstr ""
+msgstr "ລະຫັດພ່ານ:"
 
 msgid "Alias:"
-msgstr ""
+msgstr "ຊື່ຫລີ້ນ:"
 
 #. Register checkbox
 msgid "Create this account on the server"
@@ -90,37 +91,37 @@
 #. Cancel button
 #. Cancel
 msgid "Cancel"
-msgstr ""
+msgstr "ຍົກເລີອກ"
 
 #. Save button
 #. Save
 msgid "Save"
-msgstr ""
+msgstr "ບັນທຶກ"
 
 #, c-format
 msgid "Are you sure you want to delete %s?"
-msgstr ""
+msgstr "ເເນ່ທີ່ຈະລຶບ %s?"
 
 msgid "Delete Account"
-msgstr ""
+msgstr "ລຶບບັນຊີ"
 
 #. Delete button
 msgid "Delete"
-msgstr ""
+msgstr "ລຶບ"
 
 msgid "Accounts"
-msgstr ""
+msgstr "ບັນຊີທົວໄປ"
 
 msgid "You can enable/disable accounts from the following list."
 msgstr ""
 
 #. Add button
 msgid "Add"
-msgstr ""
+msgstr "ເພີ້ມ"
 
 #. Modify button
 msgid "Modify"
-msgstr ""
+msgstr "ປັບ"
 
 #, c-format
 msgid "%s%s%s%s has made %s his or her buddy%s%s"
@@ -137,20 +138,22 @@
 msgstr ""
 
 msgid "Authorize"
-msgstr ""
+msgstr "ອະນຸມັດ"
 
 msgid "Deny"
-msgstr ""
+msgstr "ປະຕິເສດ"
 
 #, c-format
 msgid ""
 "Online: %d\n"
 "Total: %d"
 msgstr ""
+"ອອນລາຍ: %d\n"
+"ຈໍານວນລວມ: %d"
 
 #, c-format
 msgid "Account: %s (%s)"
-msgstr ""
+msgstr "ບັນຊີ: %s (%s)"
 
 #, c-format
 msgid ""
@@ -1669,6 +1672,8 @@
 msgid "+++ %s signed off"
 msgstr ""
 
+#. Unknown error
+#. Unknown error!
 msgid "Unknown error"
 msgstr ""
 
@@ -3480,6 +3485,9 @@
 msgid "Server does not use any supported authentication method"
 msgstr ""
 
+msgid "You require encryption, but it is not available on this server."
+msgstr ""
+
 msgid "Invalid challenge from server"
 msgstr ""
 
@@ -3739,6 +3747,13 @@
 msgid "Resource"
 msgstr ""
 
+#, c-format
+msgid "%s ago"
+msgstr ""
+
+msgid "Logged off"
+msgstr ""
+
 msgid "Middle Name"
 msgstr ""
 
@@ -3903,7 +3918,14 @@
 msgid "Find Rooms"
 msgstr ""
 
-msgid "You require encryption, but it is not available on this server."
+#, fuzzy
+msgid "Affiliations:"
+msgstr "ຊື່ຫລີ້ນ:"
+
+msgid "No users found"
+msgstr ""
+
+msgid "Roles:"
 msgstr ""
 
 msgid "Ping timeout"
@@ -4354,13 +4376,13 @@
 msgstr ""
 
 msgid ""
-"affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
-"affiliation with the room."
-msgstr ""
-
-msgid ""
-"role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
-"role in the room."
+"affiliate &lt;owner|admin|member|outcast|none&gt; [nick1] [nick2] ...: Get "
+"the users with an affiliation or set users' affiliation with the room."
+msgstr ""
+
+msgid ""
+"role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
+"users with an role or set users' role with the room."
 msgstr ""
 
 msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
@@ -5140,28 +5162,20 @@
 msgstr ""
 
 #, c-format
-msgid "%s is not a valid group."
-msgstr ""
-
-msgid "Unknown error."
-msgstr ""
-
-#, c-format
-msgid "%s on %s (%s)"
-msgstr ""
-
-#, c-format
 msgid "%s just sent you a Nudge!"
 msgstr ""
 
-#. char *adl = g_strndup(payload, len);
-#, c-format
-msgid "Unknown error (%d)"
+#, c-format
+msgid "Unknown error (%d): %s"
 msgstr ""
 
 msgid "Unable to add user"
 msgstr ""
 
+#, c-format
+msgid "Unknown error (%d)"
+msgstr ""
+
 msgid "The following users are missing from your addressbook"
 msgstr ""
 
@@ -5188,15 +5202,12 @@
 msgid "Service Temporarily Unavailable."
 msgstr ""
 
+msgid "Unknown error."
+msgstr ""
+
 msgid "Mobile message was not sent because it was too long."
 msgstr ""
 
-msgid "Unable to rename group"
-msgstr ""
-
-msgid "Unable to delete group"
-msgstr ""
-
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -5321,14 +5332,6 @@
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr ""
 
-#, c-format
-msgid "%s has added you to his or her buddy list."
-msgstr ""
-
-#, c-format
-msgid "%s has removed you from his or her buddy list."
-msgstr ""
-
 msgid "Delete Buddy from Address Book?"
 msgstr ""
 
@@ -5358,6 +5361,28 @@
 msgstr ""
 
 #, c-format
+msgid "%s is not a valid group."
+msgstr ""
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr ""
+
+msgid "Unable to rename group"
+msgstr ""
+
+msgid "Unable to delete group"
+msgstr ""
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr ""
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr ""
+
+#, c-format
 msgid "No such user: %s"
 msgstr ""
 
@@ -5386,6 +5411,8 @@
 msgstr ""
 
 #. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
 msgid "New mail messages"
 msgstr ""
 
@@ -8939,6 +8966,30 @@
 msgid "Add buddy rejected"
 msgstr ""
 
+#. Some error in the received stream
+msgid "Received invalid data"
+msgstr ""
+
+#. Password incorrect
+msgid "Incorrect Password"
+msgstr ""
+
+#. security lock from too many failed login attempts
+msgid "Account locked: Too many failed login attempts"
+msgstr ""
+
+#. the username does not exist
+msgid "Username does not exist"
+msgstr ""
+
+#. indicates a lock of some description
+msgid "Account locked: See the debug log"
+msgstr ""
+
+#. username or password missing
+msgid "Username or password missing"
+msgstr ""
+
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -9776,15 +9827,16 @@
 msgid "Please update the necessary fields."
 msgstr ""
 
-msgid "Room _List"
-msgstr ""
+#, fuzzy
+msgid "A_ccount"
+msgstr "ບັນຊີທົວໄປ"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
 "join.\n"
 msgstr ""
 
-msgid "_Account:"
+msgid "Room _List"
 msgstr ""
 
 msgid "_Block"
@@ -10695,6 +10747,9 @@
 msgid "Hungarian"
 msgstr ""
 
+msgid "Armenian"
+msgstr ""
+
 msgid "Indonesian"
 msgstr ""
 
@@ -10791,6 +10846,9 @@
 msgid "Swedish"
 msgstr ""
 
+msgid "Swahili"
+msgstr ""
+
 msgid "Tamil"
 msgstr ""
 
@@ -11183,11 +11241,9 @@
 msgid "Save Image"
 msgstr ""
 
-#, c-format
 msgid "_Save Image..."
 msgstr ""
 
-#, c-format
 msgid "_Add Custom Smiley..."
 msgstr ""
 
@@ -11551,6 +11607,9 @@
 msgid "Pounce on Whom"
 msgstr ""
 
+msgid "_Account:"
+msgstr ""
+
 msgid "_Buddy name:"
 msgstr ""
 
@@ -12207,6 +12266,9 @@
 msgid "Custom Smiley Manager"
 msgstr ""
 
+msgid "Select Buddy Icon"
+msgstr ""
+
 msgid "Click to change your buddyicon for this account."
 msgstr ""
 
--- a/po/sl.po	Sun May 10 06:24:26 2009 +0000
+++ b/po/sl.po	Sun Jun 28 04:41:07 2009 +0000
@@ -6,11 +6,11 @@
 #
 msgid ""
 msgstr ""
-"Project-Id-Version: Pidgin 2.5.5\n"
+"Project-Id-Version: Pidgin 2.6\n"
 "Report-Msgid-Bugs-To: \n"
-"POT-Creation-Date: 2009-04-30 10:40-0400\n"
-"PO-Revision-Date: 2009-02-22 10:26+0100\n"
-"Last-Translator: Martin Srebotnjak <miles@filmsi.net>\n"
+"POT-Creation-Date: 2009-05-26 22:19-0700\n"
+"PO-Revision-Date: 2009-05-02 16:54+0100\n"
+"Last-Translator: Martin Srebotnjak  <miles@filmsi.net>\n"
 "Language-Team: Martin Srebotnjak <miles@filmsi.net>\n"
 "MIME-Version: 1.0\n"
 "Content-Type: text/plain; charset=UTF-8\n"
@@ -876,12 +876,11 @@
 msgid "System Log"
 msgstr "Sistemski dnevnik"
 
-#, fuzzy
 msgid "Calling ... "
-msgstr "Preračunavanje ..."
+msgstr "Klicanje ..."
 
 msgid "Hangup"
-msgstr ""
+msgstr "Odloži"
 
 #. Number of actions
 msgid "Accept"
@@ -891,25 +890,24 @@
 msgstr "Zavrni"
 
 msgid "Call in progress."
-msgstr ""
+msgstr "Klic je v teku."
 
 msgid "The call has been terminated."
-msgstr ""
+msgstr "Klic je bil končan."
 
 #, c-format
 msgid "%s wishes to start an audio session with you."
-msgstr ""
+msgstr "%s želi z vami začeti zvočno sejo."
 
 #, c-format
 msgid "%s is trying to start an unsupported media session type with you."
-msgstr ""
-
-#, fuzzy
+msgstr "%s poskuša z vami začeti sejo v nepodprtem mediju."
+
 msgid "You have rejected the call."
-msgstr "Zapustili ste kanal%s%s"
+msgstr "Zavrnili ste klic."
 
 msgid "call: Make an audio call."
-msgstr ""
+msgstr "call: Opravite zvočni klic."
 
 msgid "Emails"
 msgstr "E-naslovi"
@@ -1566,22 +1564,23 @@
 "\n"
 "Fetching TinyURL..."
 msgstr ""
+"\n"
+"Pridobivanje TinyURL ..."
 
 msgid "Only create TinyURL for urls of this length or greater"
-msgstr ""
+msgstr "Ustvari TinyURL le za naslove URL te dolžina ali daljše"
 
 msgid "TinyURL (or other) address prefix"
-msgstr ""
-
-#, fuzzy
+msgstr "Predpona naslova TinyURL (ali drugega)"
+
 msgid "TinyURL"
-msgstr "URL skladbe"
+msgstr "TinyURL"
 
 msgid "TinyURL plugin"
-msgstr ""
+msgstr "Vtičnik TinyURL"
 
 msgid "When receiving a message with URL(s), TinyURL for easier copying"
-msgstr ""
+msgstr "Ob prejemu sporočil z URL-ji uporabi TinyURL za enostavnejše kopiranje"
 
 msgid "accounts"
 msgstr "Računi"
@@ -1785,6 +1784,8 @@
 msgid "+++ %s signed off"
 msgstr "+++ %s se je odjavil(a)"
 
+#. Unknown error
+#. Unknown error!
 msgid "Unknown error"
 msgstr "Neznana napaka"
 
@@ -1831,9 +1832,8 @@
 msgid "%s left the room (%s)."
 msgstr "%s nas je zapustil (%s)."
 
-#, fuzzy
 msgid "Invite to chat"
-msgstr "Povabi na konferenčni pogovor"
+msgstr "Povabi na klepet"
 
 #. Put our happy label in it.
 msgid ""
@@ -2697,9 +2697,8 @@
 msgid "Do not ask. Always save in pounce."
 msgstr "Ne sprašuj. Vedno shrani v opozorilo."
 
-#, fuzzy
 msgid "One Time Password"
-msgstr "Vnesi geslo"
+msgstr "Enkratno geslo"
 
 #. *< type
 #. *< ui_requirement
@@ -2708,13 +2707,13 @@
 #. *< priority
 #. *< id
 msgid "One Time Password Support"
-msgstr ""
+msgstr "Podpora za enkratno geslo"
 
 #. *< name
 #. *< version
 #. *  summary
 msgid "Enforce that passwords are used only once."
-msgstr ""
+msgstr "Vsilite, da se gesla uporabijo le enkrat."
 
 #. *  description
 msgid ""
@@ -2722,6 +2721,9 @@
 "are only used in a single successful connection.\n"
 "Note: The account password must not be saved for this to work."
 msgstr ""
+"Omogoča, da vsilite (posebej za vsak račun), da so neshranjena gesla "
+"uporabljena le za posamezno uspešno povezavo.\n"
+"Opomba: Geslo računa ni potrebno shraniti, da bi to delovalo."
 
 #. *< type
 #. *< ui_requirement
@@ -2962,9 +2964,8 @@
 msgstr "Vijolična oseba"
 
 #. Creating the options for the protocol
-#, fuzzy
 msgid "Local Port"
-msgstr "Okraj"
+msgstr "Krajevna vrata"
 
 msgid "Bonjour"
 msgstr "Bonjour"
@@ -3473,13 +3474,12 @@
 #. We only want to do the following dance if the connection
 #. has not been successfully completed.  If it has, just
 #. notify the user that their /nick command didn't go.
-#, fuzzy, c-format
+#, c-format
 msgid "The nickname \"%s\" is already being used."
-msgstr "Ime za pomenek že obstaja"
-
-#, fuzzy
+msgstr "Vzdevek \"%s\" že obstaja."
+
 msgid "Nickname in use"
-msgstr "Vzdevek"
+msgstr "Vzdevek je zaseden"
 
 msgid "Cannot change nick"
 msgstr "Vzdevka ne morem spremeniti"
@@ -3747,6 +3747,9 @@
 msgid "Server does not use any supported authentication method"
 msgstr "Strežnik ne uporablja nobene podprte metode overovitve"
 
+msgid "You require encryption, but it is not available on this server."
+msgstr "Zahtevate šifriranje, vendar to na tem strežniku ni na voljo."
+
 msgid "Invalid challenge from server"
 msgstr "Neveljaven poziv strežnika"
 
@@ -3754,21 +3757,16 @@
 msgstr "Napaka SASL"
 
 msgid "The BOSH connection manager terminated your session."
-msgstr ""
-
-#, fuzzy
+msgstr "Upravitelj povezave BOSH je zaključil vašo sejo."
+
 msgid "No session ID given"
-msgstr "Ni podanega razloga"
-
-#, fuzzy
+msgstr "ID seje ni podan"
+
 msgid "Unsupported version of BOSH protocol"
-msgstr "Nepodprta različica"
-
-#, fuzzy
+msgstr "Nepodprta različica protokola BOSH"
+
 msgid "Unable to establish a connection with the server"
-msgstr ""
-"Povezave s strežnikom ni mogoče vzpostaviti:\n"
-"%s"
+msgstr "Povezave s strežnikom ni mogoče vzpostaviti"
 
 #, c-format
 msgid ""
@@ -3778,9 +3776,8 @@
 "Povezave s strežnikom ni mogoče vzpostaviti:\n"
 "%s"
 
-#, fuzzy
 msgid "Unable to establish SSL connection"
-msgstr "Povezave ni mogoče inicializirati"
+msgstr "Povezave SSL ni mogoče vzpostaviti"
 
 msgid "Unable to create socket"
 msgstr "Ni mogoče ustvariti vtičnice"
@@ -3852,9 +3849,8 @@
 msgid "Operating System"
 msgstr "Operacijski sistem"
 
-#, fuzzy
 msgid "Local Time"
-msgstr "Lokalna datoteka:"
+msgstr "Krajevni čas"
 
 msgid "Last Activity"
 msgstr "Zadnja dejavnost"
@@ -4015,6 +4011,14 @@
 msgid "Resource"
 msgstr "Vir"
 
+#, c-format
+msgid "%s ago"
+msgstr ""
+
+#, fuzzy
+msgid "Logged off"
+msgstr "Prijavljeni"
+
 msgid "Middle Name"
 msgstr "Drugo ime"
 
@@ -4181,8 +4185,17 @@
 msgid "Find Rooms"
 msgstr "Najdi sobe"
 
-msgid "You require encryption, but it is not available on this server."
-msgstr "Zahtevate šifriranje, vendar to na tem strežniku ni na voljo."
+#, fuzzy
+msgid "Affiliations:"
+msgstr "Psevdonim:"
+
+#, fuzzy
+msgid "No users found"
+msgstr "Ni najdenih uporabnikov"
+
+#, fuzzy
+msgid "Roles:"
+msgstr "Funkcija"
 
 msgid "Ping timeout"
 msgstr "Časovna prekoračitev pinga"
@@ -4195,6 +4208,8 @@
 "Could not find alternative XMPP connection methods after failing to connect "
 "directly.\n"
 msgstr ""
+"Po neuspehu neposredne povezave ni bilo mogoče najti drugih povezovalnih "
+"metod XMPP.\n"
 
 msgid "Invalid XMPP ID"
 msgstr "Neveljaven ID za XMPP"
@@ -4202,9 +4217,8 @@
 msgid "Invalid XMPP ID. Domain must be set."
 msgstr "Neveljaven ID za XMPP. Domena mora biti določena."
 
-#, fuzzy
 msgid "Malformed BOSH Connect Server"
-msgstr "Povezava na strežnik neuspešna."
+msgstr "Nepravilno oblikovan povezovalni strežnik BOSH"
 
 #, c-format
 msgid "Registration of %s@%s successful"
@@ -4562,19 +4576,21 @@
 msgid "Unable to ping user %s"
 msgstr "Uporabnika %s ni mogoče pingniti"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to buzz, because there is nothing known about %s."
-msgstr "Ni mogoče stresti, saj o uporabniku %s ni ničesar znanega."
-
-#, fuzzy, c-format
+msgstr "Ni mogoče stresti, saj o osebi %s ni ničesar znanega."
+
+#, c-format
 msgid "Unable to buzz, because %s might be offline."
-msgstr "Ni mogoče stresti, saj je uporabnik %s morda nepovezan."
-
-#, fuzzy, c-format
+msgstr "Ni mogoče stresti, saj je oseba %s morda nepovezana."
+
+#, c-format
 msgid ""
 "Unable to buzz, because %s does not support it or does not wish to receive "
 "buzzes now."
-msgstr "Uporabnika %s ni mogoče stresti, ker tega dejanja ne podpira."
+msgstr ""
+"Osebe %s ni mogoče stresti, ker tega dejanja ne podpira ali zdaj ne želi "
+"prejemati tresenja."
 
 #, c-format
 msgid "Buzzing %s..."
@@ -4589,36 +4605,33 @@
 msgid "%s has buzzed you!"
 msgstr "Uporabnik %s vas je stresel."
 
-#, fuzzy, c-format
+#, c-format
 msgid "Unable to initiate media with %s: invalid JID"
-msgstr "Sporočila k %s ni mogoče poslati, neveljaven JID"
-
-#, fuzzy, c-format
+msgstr "Medija z %s ni mogoče iniciirati: neveljaven JID"
+
+#, c-format
 msgid "Unable to initiate media with %s: user is not online"
-msgstr "Datoteke %s ni mogoče poslati, ker uporabnik ni povezan"
-
-#, fuzzy, c-format
+msgstr "Medija z %s ni mogoče iniciirati: uporabnik ni povezan"
+
+#, c-format
 msgid "Unable to initiate media with %s: not subscribed to user presence"
 msgstr ""
-"Datoteke %s ni mogoče poslati, ker nimate dostopa do stanja uporabnikove "
-"prisotnosti"
-
-#, fuzzy
+"Medija %s ni mogoče iniciirati: niste naročeni na stanja prisotnosti osebe"
+
 msgid "Media Initiation Failed"
-msgstr "Napaka pri registraciji"
-
-#, fuzzy, c-format
+msgstr "Iniciacija medija ni uspela"
+
+#, c-format
 msgid ""
 "Please select the resource of %s with which you would like to start a media "
 "session."
-msgstr "Izberite, kateremu viru %s bi radi poslali datoteko"
+msgstr "Izberite vir %s, s katerim bi radi začeli medijsko sejo."
 
 msgid "Select a Resource"
 msgstr "Izberite vir"
 
-#, fuzzy
 msgid "Initiate Media"
-msgstr "Začni _pogovor"
+msgstr "Iniciiraj medij"
 
 msgid "config:  Configure a chat room."
 msgstr "config:  Nastavi pogovorno sobo."
@@ -4638,16 +4651,18 @@
 msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
 msgstr "ban &lt;uporabnik&gt; [razlog]:  Prepovej uporabnika v sobi."
 
-msgid ""
-"affiliate &lt;user&gt; &lt;owner|admin|member|outcast|none&gt;: Set a user's "
-"affiliation with the room."
+#, fuzzy
+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;uporabnik&gt; &lt;lastnik|skrbnik|član|izločenec|nihče&gt;: "
 "Nastavitev uporabnikovega statusa v sobi."
 
-msgid ""
-"role &lt;user&gt; &lt;moderator|participant|visitor|none&gt;: Set a user's "
-"role in the room."
+#, fuzzy
+msgid ""
+"role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
+"users with an role or set users' role with the room."
 msgstr ""
 "role &lt;uporabnik&gt; &lt;moderator|participant|visitor|none&gt;: "
 "Nastavitev uporabnikove vloge v sobi."
@@ -4773,20 +4788,17 @@
 msgid "Error in chat %s"
 msgstr "Napaka v pomenku %s"
 
-#, fuzzy
 msgid "An error occured on the in-band bytestream transfer\n"
-msgstr "Med odpiranjem datoteke je prišlo do napake."
-
-#, fuzzy
+msgstr "V notranje pasovnem zlogovnem pretoku je prišlo do napake\n"
+
 msgid "Transfer was closed."
-msgstr "Prenos datoteke ni uspel"
-
-#, fuzzy
+msgstr "Prenos je bil zaprt."
+
 msgid "Failed to open the file"
-msgstr "Datoteke '%s' ni mogoče odpreti: %s"
+msgstr "Datoteke ni mogoče odpreti"
 
 msgid "Failed to open in-band bytestream"
-msgstr ""
+msgstr "Znotraj pasovnega zlogovnega pretoka ni uspelo odpreti"
 
 #, c-format
 msgid "Unable to send file to %s, user does not support file transfers"
@@ -5459,28 +5471,20 @@
 msgstr "Overjanje Windows Live ID: Neveljaven odziv"
 
 #, c-format
-msgid "%s is not a valid group."
-msgstr "%s ni veljavna skupina."
-
-msgid "Unknown error."
-msgstr "Neznana napaka."
-
-#, c-format
-msgid "%s on %s (%s)"
-msgstr "%s na %s (%s)"
-
-#, c-format
 msgid "%s just sent you a Nudge!"
 msgstr "Uporabnik %s vam je ravnokar pomežiknil!"
 
-#. char *adl = g_strndup(payload, len);
-#, c-format
-msgid "Unknown error (%d)"
+#, fuzzy, c-format
+msgid "Unknown error (%d): %s"
 msgstr "Neznana napaka (%d)"
 
 msgid "Unable to add user"
 msgstr "Ni mogoče dodati uporabnika"
 
+#, c-format
+msgid "Unknown error (%d)"
+msgstr "Neznana napaka (%d)"
+
 msgid "The following users are missing from your addressbook"
 msgstr "Naslednji uporabniki manjkajo v vašem adresarju"
 
@@ -5507,15 +5511,12 @@
 msgid "Service Temporarily Unavailable."
 msgstr "Storitev je trenutno nedosegljiva."
 
+msgid "Unknown error."
+msgstr "Neznana napaka."
+
 msgid "Mobile message was not sent because it was too long."
 msgstr "Mobilnega sporočila ni mogoče poslati, ker je predolgo."
 
-msgid "Unable to rename group"
-msgstr "Skupine ni mogoče preimenovati"
-
-msgid "Unable to delete group"
-msgstr "Skupine ni mogoče izbrisati"
-
 #, c-format
 msgid ""
 "The MSN server will shut down for maintenance in %d minute. You will "
@@ -5670,14 +5671,6 @@
 msgid "Message may have not been sent because an unknown error occurred:"
 msgstr "Sporočila morda ni bilo poslano, ker je prišlo do neznane napake:"
 
-#, c-format
-msgid "%s has added you to his or her buddy list."
-msgstr "%s vas je dodal(a) na svoj seznam prijateljev."
-
-#, c-format
-msgid "%s has removed you from his or her buddy list."
-msgstr "%s vas je odstranil(a) s svojega seznama prijateljev."
-
 msgid "Delete Buddy from Address Book?"
 msgstr "Želite izbrisati prijatelja iz adresarja?"
 
@@ -5707,6 +5700,28 @@
 msgstr "Vtičnik za protokol MSN"
 
 #, c-format
+msgid "%s is not a valid group."
+msgstr "%s ni veljavna skupina."
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr "%s na %s (%s)"
+
+msgid "Unable to rename group"
+msgstr "Skupine ni mogoče preimenovati"
+
+msgid "Unable to delete group"
+msgstr "Skupine ni mogoče izbrisati"
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr "%s vas je dodal(a) na svoj seznam prijateljev."
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr "%s vas je odstranil(a) s svojega seznama prijateljev."
+
+#, c-format
 msgid "No such user: %s"
 msgstr "Uporabnik ne obstaja: %s"
 
@@ -5735,6 +5750,8 @@
 msgstr "Izgubljena povezava s strežnikom"
 
 #. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
 msgid "New mail messages"
 msgstr "Nova prejeta sporočila"
 
@@ -7467,30 +7484,26 @@
 msgstr "Opomba"
 
 #. callback
-#, fuzzy
 msgid "Buddy Memo"
-msgstr "Ikona prijatelja"
+msgstr "Zapisek prijatelja"
 
 msgid "Change his/her memo as you like"
-msgstr ""
-
-#, fuzzy
+msgstr "Spremenite njegov/njen zapisek, kakor vam je drago"
+
 msgid "_Modify"
-msgstr "Spremeni"
-
-#, fuzzy
+msgstr "_Spremeni"
+
 msgid "Memo Modify"
-msgstr "Spremeni"
-
-#, fuzzy
+msgstr "Spremeni zapisek"
+
 msgid "Server says:"
-msgstr "Strežnik je zaposlen"
+msgstr "Strežnik pravi:"
 
 msgid "Your request was accepted."
-msgstr ""
+msgstr "Vaša zahteva je bila sprejeta."
 
 msgid "Your request was rejected."
-msgstr ""
+msgstr "Vaša zahteva je bila zavrnjena."
 
 #, c-format
 msgid "%u requires verification"
@@ -7798,14 +7811,13 @@
 msgstr "<p><b>Nori razvijalci obližev</b>:<br>\n"
 
 msgid "<p><b>Acknowledgement</b>:<br>\n"
-msgstr "<b>Zahvala</b>:<br>\n"
-
-#, fuzzy
+msgstr "<b>Zahvale</b>:<br>\n"
+
 msgid "<p><b>Scrupulous Testers</b>:<br>\n"
-msgstr "<p><b>Prvotni avtor</b>:<br>\n"
+msgstr "<p><b>Tankovestni preizkuševalci</b>:<br>\n"
 
 msgid "and more, please let me know... thank you!))"
-msgstr ""
+msgstr "in drugi, prosim, javite se ... hvala!))"
 
 msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
 msgstr "<p><i>In vsi fantje iz ozadja ...</i><br>\n"
@@ -7832,9 +7844,8 @@
 msgid "About OpenQ"
 msgstr "O OpenQ"
 
-#, fuzzy
 msgid "Modify Buddy Memo"
-msgstr "Spremeni naslov"
+msgstr "Spremeni zapisek prijatelja"
 
 #. *< type
 #. *< ui_requirement
@@ -9532,7 +9543,7 @@
 msgstr "%s vam je poslal povabilo s spletno kamero, kar še ni podprto."
 
 msgid "Your SMS was not delivered"
-msgstr ""
+msgstr "Vaš SMS ni bil dostavljen"
 
 msgid "Your Yahoo! message did not get sent."
 msgstr "Vaše sporočilo za Yahoo! ni bilo poslano."
@@ -9557,6 +9568,34 @@
 msgid "Add buddy rejected"
 msgstr "Dodajanje prijatelja zavrnjeno"
 
+#. Some error in the received stream
+#, fuzzy
+msgid "Received invalid data"
+msgstr "Na povezavi s strežnikom prejeti neveljavni podatki."
+
+#. Password incorrect
+#, fuzzy
+msgid "Incorrect Password"
+msgstr "Neveljavno geslo"
+
+#. security lock from too many failed login attempts
+msgid "Account locked: Too many failed login attempts"
+msgstr ""
+
+#. the username does not exist
+#, fuzzy
+msgid "Username does not exist"
+msgstr "Uporabnik ne obstaja"
+
+#. indicates a lock of some description
+msgid "Account locked: See the debug log"
+msgstr ""
+
+#. username or password missing
+#, fuzzy
+msgid "Username or password missing"
+msgstr "Neveljavno uporabniško ime ali geslo"
+
 #, c-format
 msgid ""
 "The Yahoo server has requested the use of an unrecognized authentication "
@@ -10265,12 +10304,13 @@
 msgid "Unable to connect to %s: %s"
 msgstr "Napaka pri povezovanju z %s: %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "Unable to connect to %s: Server requires TLS/SSL, but no TLS/SSL support was "
 "found."
 msgstr ""
-"Strežnik zahteva TLS/SSL za prijavo. Podpore za TLS/SSL ni mogoče najti."
+"Povezava z %s ni uspela: strežnik zahteva TLS/SSL za prijavo, vendar podpore "
+"za TLS/SSL ni mogoče najti."
 
 #, c-format
 msgid " - %s"
@@ -10309,13 +10349,13 @@
 msgid "Error Reading %s"
 msgstr "Napaka pri branju %s"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "An error was encountered reading your %s.  The file has not been loaded, and "
 "the old file has been renamed to %s~."
 msgstr ""
-"Pri branju vašega %s je prišlo do napake, zato ni bil naložen. Stara "
-"datoteka se je preimenovala v %s~."
+"Pri branju vašega %s je prišlo do napake. Datoteka ni bial naložena, stara "
+"datoteka pa je bila preimenovana v %s~."
 
 msgid "Internet Messenger"
 msgstr "Spletni sel"
@@ -10422,9 +10462,8 @@
 msgid "Create _this new account on the server"
 msgstr "_Ustvari ta nov račun na strežniku"
 
-#, fuzzy
 msgid "_Proxy"
-msgstr "Posredovalni strežnik"
+msgstr "_Posredovalni strežnik"
 
 msgid "Enabled"
 msgstr "Omogočen"
@@ -10475,16 +10514,17 @@
 msgid "Please update the necessary fields."
 msgstr "Prosimo, posodobite potrebna polja."
 
-msgid "Room _List"
-msgstr "Se_znam sob"
+#, fuzzy
+msgid "A_ccount"
+msgstr "Ra_čun:"
 
 msgid ""
 "Please enter the appropriate information about the chat you would like to "
 "join.\n"
 msgstr "Vnesite ustrezne informacije o pomenku, ki se mu želite pridružiti.\n"
 
-msgid "_Account:"
-msgstr "_Račun:"
+msgid "Room _List"
+msgstr "Se_znam sob"
 
 msgid "_Block"
 msgstr "_Zavrni"
@@ -10501,16 +10541,14 @@
 msgid "I_M"
 msgstr "_Sporoči"
 
-#, fuzzy
 msgid "_Audio Call"
-msgstr "_Dodaj pomenek"
+msgstr "_Zvočni klic"
 
 msgid "Audio/_Video Call"
-msgstr ""
-
-#, fuzzy
+msgstr "Zvočni/_video klic"
+
 msgid "_Video Call"
-msgstr "Video.pomenek"
+msgstr "_Video klic"
 
 msgid "_Send File..."
 msgstr "_Pošlji datoteko ..."
@@ -10647,9 +10685,8 @@
 msgid "/Tools/_Certificates"
 msgstr "/Orodja/_Digitalna potrdila"
 
-#, fuzzy
 msgid "/Tools/Custom Smile_ys"
-msgstr "/Orodja/Smej_ček"
+msgstr "/Orodja/Smejč_ki po meri"
 
 msgid "/Tools/Plu_gins"
 msgstr "/Orodja/Vtični_ki"
@@ -10780,7 +10817,7 @@
 msgstr "po stanju"
 
 msgid "By recent log activity"
-msgstr ""
+msgstr "po zadnji dejavnosti"
 
 #, c-format
 msgid "%s disconnected"
@@ -10797,7 +10834,7 @@
 msgstr "Ponovno omogoči"
 
 msgid "SSL FAQs"
-msgstr ""
+msgstr "Pogosta vprašanja o SSL"
 
 msgid "Welcome back!"
 msgstr "Dobrodošli nazaj!"
@@ -11019,21 +11056,17 @@
 msgid "/Conversation/Clea_r Scrollback"
 msgstr "/Pogovor/Po_čisti pogovor"
 
-#, fuzzy
 msgid "/Conversation/M_edia"
-msgstr "/Pogovor/_Več"
-
-#, fuzzy
+msgstr "/Pogovor/M_ediji"
+
 msgid "/Conversation/Media/_Audio Call"
-msgstr "/Pogovor/_Več"
-
-#, fuzzy
+msgstr "/Pogovor/Mediji/_Zvočni klic"
+
 msgid "/Conversation/Media/_Video Call"
-msgstr "/Pogovor/_Več"
-
-#, fuzzy
+msgstr "/Pogovor/Mediji/_Video klic"
+
 msgid "/Conversation/Media/Audio\\/Video _Call"
-msgstr "/Pogovor/Pokaži _dnevnik ..."
+msgstr "/Pogovor/Mediji/Zvočni\\/Video _klic"
 
 msgid "/Conversation/Se_nd File..."
 msgstr "/Pogovor/_Pošlji datoteko ..."
@@ -11107,17 +11140,14 @@
 msgid "/Conversation/View Log"
 msgstr "/Pogovor/Pokaži dnevnik"
 
-#, fuzzy
 msgid "/Conversation/Media/Audio Call"
-msgstr "/Pogovor/Več"
-
-#, fuzzy
+msgstr "/Pogovor/Mediji/Zvočni klic"
+
 msgid "/Conversation/Media/Video Call"
-msgstr "/Pogovor/Pokaži dnevnik"
-
-#, fuzzy
+msgstr "/Pogovor/Mediji/Video klic"
+
 msgid "/Conversation/Media/Audio\\/Video Call"
-msgstr "/Pogovor/Več"
+msgstr "/Pogovor/Mediji/Zvočni\\/Video klic"
 
 msgid "/Conversation/Send File..."
 msgstr "/Pogovor/Pošlji datoteko ..."
@@ -11304,7 +11334,7 @@
 msgstr "Ka-Hing Čung"
 
 msgid "voice and video"
-msgstr ""
+msgstr "glas in video"
 
 msgid "support"
 msgstr "podpora"
@@ -11445,9 +11475,8 @@
 msgid "Ubuntu Georgian Translators"
 msgstr "gruzijski prevajalci za Ubuntu"
 
-#, fuzzy
 msgid "Khmer"
-msgstr "Drugo"
+msgstr "kmersko"
 
 msgid "Kannada"
 msgstr "kannadsko"
@@ -11959,11 +11988,9 @@
 msgid "Save Image"
 msgstr "Shrani sliko"
 
-#, c-format
 msgid "_Save Image..."
 msgstr "_Shrani sliko ..."
 
-#, c-format
 msgid "_Add Custom Smiley..."
 msgstr "_Dodaj smejčka po meri ..."
 
@@ -12163,7 +12190,7 @@
 msgid "%s %s. Try `%s -h' for more information.\n"
 msgstr "%s %s. Poskusite `%s -h' za več informacij.\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s %s\n"
 "Usage: %s [OPTION]...\n"
@@ -12185,6 +12212,7 @@
 "\n"
 "  -c, --config=DIR    uporabi DIR za nastavitvene datoteke\n"
 "  -d, --debug         izpiši sporočila za razhroščevanje na stdout\n"
+"  -f, --force-online  vsili povezanost ne glede na stanje omrežja\n"
 "  -h, --help          izpiši to pomoč in končaj program\n"
 "  -m, --multiple      ne dovoljuj le enega zagnanega programa\n"
 "  -n, --nologin       brez samodejne prijave\n"
@@ -12194,7 +12222,7 @@
 "  --display=DISPLAY   zaslon X, ki naj bo uporabljen\n"
 "  -v, --version       izpiši trenutno različico in zapri program\n"
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "%s %s\n"
 "Usage: %s [OPTION]...\n"
@@ -12215,6 +12243,7 @@
 "\n"
 "  -c, --config=DIR    uporabi DIR za nastavitvene datoteke\n"
 "  -d, --debug         izpiši sporočila za razhroščevanje na stdout\n"
+"  -f, --force-online  vsili povezanost ne glede na stanje omrežja\n"
 "  -h, --help          izpiši to pomoč in končaj program\n"
 "  -m, --multiple      ne dovoljuj le enega zagnanega programa\n"
 "  -n, --nologin       brez samodejne prijave\n"
@@ -12260,22 +12289,21 @@
 msgstr "Program se bo zaprl, ker je že zagnan drug odjemalec libpurple.\n"
 
 msgid "/_Media"
-msgstr ""
+msgstr "/_Mediji"
 
 msgid "/Media/_Hangup"
-msgstr ""
-
-#, fuzzy
+msgstr "/Mediji/_Odloži"
+
 msgid "Calling..."
-msgstr "Preračunavanje ..."
+msgstr "Klicanje ..."
 
 #, c-format
 msgid "%s wishes to start an audio/video session with you."
-msgstr ""
+msgstr "%s želi z vami začeti zvočno/video sejo."
 
 #, c-format
 msgid "%s wishes to start a video session with you."
-msgstr ""
+msgstr "%s želi z vami začeti video sejo."
 
 #, c-format
 msgid "%s has %d new message."
@@ -12316,20 +12344,18 @@
 msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
 msgstr "<span weight=\"bold\" size=\"larger\">Dobili ste pošto!</span>"
 
-#, fuzzy
 msgid "New Pounces"
-msgstr "Novo opozorilo prijatelja"
+msgstr "Nova opozorila prijatelja"
 
 msgid "Dismiss"
-msgstr ""
-
-#, fuzzy
+msgstr "Opusti"
+
 msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
-msgstr "<span weight=\"bold\" size=\"larger\">Dobili ste pošto!</span>"
-
-#, fuzzy
+msgstr ""
+"<span weight=\"bold\" size=\"larger\">Dobili ste opozorilo prijatelja!</span>"
+
 msgid "No message"
-msgstr "Neznano sporočilo"
+msgstr "Ni sporočil"
 
 msgid "The following plugins will be unloaded."
 msgstr "Odloženi bodo naslednji vtičniki."
@@ -12379,14 +12405,16 @@
 msgid "Select a file"
 msgstr "Izberi datoteko"
 
-#, fuzzy
 msgid "Modify Buddy Pounce"
-msgstr "Uredi opozorilo prijatelja"
+msgstr "Spremeni opozorilo prijatelja"
 
 #. Create the "Pounce on Whom" frame.
 msgid "Pounce on Whom"
 msgstr "Opozori koga"
 
+msgid "_Account:"
+msgstr "_Račun:"
+
 msgid "_Buddy name:"
 msgstr "_Ime prijatelja:"
 
@@ -12453,49 +12481,49 @@
 msgid "Pounce Target"
 msgstr "Tarča opozorila"
 
-#, fuzzy, c-format
+#, c-format
 msgid "Started typing"
-msgstr "začne tipkati"
-
-#, fuzzy, c-format
+msgstr "Začel je tipkati"
+
+#, c-format
 msgid "Paused while typing"
-msgstr "postane med tipkanjem"
-
-#, fuzzy, c-format
+msgstr "Postal je med tipkanjem"
+
+#, c-format
 msgid "Signed on"
-msgstr "se prijavi"
-
-#, fuzzy, c-format
+msgstr "Prijavil se je"
+
+#, c-format
 msgid "Returned from being idle"
-msgstr "%s je spet dejaven (%s)"
-
-#, fuzzy, c-format
+msgstr "Postal je spet dejaven"
+
+#, c-format
 msgid "Returned from being away"
-msgstr "se vrne iz odsotnosti"
-
-#, fuzzy, c-format
+msgstr "Vrnil se je iz odsotnosti"
+
+#, c-format
 msgid "Stopped typing"
-msgstr "Prenehal tipkati"
-
-#, fuzzy, c-format
+msgstr "Prenehal je tipkati"
+
+#, c-format
 msgid "Signed off"
-msgstr "se odjavi"
-
-#, fuzzy, c-format
+msgstr "Odjavil se je"
+
+#, c-format
 msgid "Became idle"
-msgstr "postane nedejaven"
-
-#, fuzzy, c-format
+msgstr "Postal je nedejaven"
+
+#, c-format
 msgid "Went away"
-msgstr "ob odsotnosti"
-
-#, fuzzy, c-format
+msgstr "Odšel je"
+
+#, c-format
 msgid "Sent a message"
-msgstr "Pošlji sporočilo"
-
-#, fuzzy, c-format
+msgstr "Poslal je sporočilo"
+
+#, c-format
 msgid "Unknown.... Please report this!"
-msgstr "Neznan dogodek opozorila. Poročajte o tem!"
+msgstr "Neznano ... Poročajte o tem!"
 
 msgid "Smiley theme failed to unpack."
 msgstr "Teme smejčkov ni mogoče razpakirati."
@@ -12520,9 +12548,8 @@
 msgstr "_Zapri pomenke s tipko Esc"
 
 #. Buddy List Themes
-#, fuzzy
 msgid "Buddy List Theme"
-msgstr "Seznam prijateljev"
+msgstr "Tema seznama prijateljev"
 
 #. System Tray
 msgid "System Tray Icon"
@@ -12661,7 +12688,7 @@
 
 #. TURN server
 msgid "Relay Server (TURN)"
-msgstr ""
+msgstr "Relejski strežnik (TURN)"
 
 msgid "Proxy Server &amp; Browser"
 msgstr "Posredovalni strežnik in brskalnik"
@@ -13023,12 +13050,10 @@
 msgid "Please provide a shortcut to associate with the smiley."
 msgstr "Podajte tipke za bližnjico, ki bodo povezane s smejčkom."
 
-#, fuzzy, c-format
+#, c-format
 msgid ""
 "A custom smiley for '%s' already exists.  Please use a different shortcut."
-msgstr ""
-"Smejček po meri za izbrano kombinacijo tipk že obstaja. Navedite druge tipke "
-"za bližnjico."
+msgstr "Smejček po meri za '%s' že obstaja. Navedite druge tipke za bližnjico."
 
 msgid "Duplicate Shortcut"
 msgstr "Podvojena tipka za bližnjico"
@@ -13042,25 +13067,26 @@
 msgid "Add Smiley"
 msgstr "Dodaj smejčka"
 
-#, fuzzy
 msgid "_Image:"
-msgstr "Sl_ika"
+msgstr "Sl_ika:"
 
 #. Shortcut text
-#, fuzzy
 msgid "S_hortcut text:"
-msgstr "Tipke za bližnjico"
+msgstr "_Besedilo za bližnjico:"
 
 msgid "Smiley"
 msgstr "Smejček"
 
-#, fuzzy
 msgid "Shortcut Text"
-msgstr "Tipke za bližnjico"
+msgstr "Besedilo za bližnjico"
 
 msgid "Custom Smiley Manager"
 msgstr "Upravitelj smejčkov po meri"
 
+#, fuzzy
+msgid "Select Buddy Icon"
+msgstr "Izberi prijatelja"
+
 msgid "Click to change your buddyicon for this account."
 msgstr "Kliknite, če želite za ta račun spremeniti ikono prijatelja."
 
@@ -13181,9 +13207,8 @@
 msgstr ""
 "Sliko '%s' ni mogoče naložiti: razlog ni znan, najbrž je datoteka okvarjena"
 
-#, fuzzy
 msgid "_Open Link"
-msgstr "_Odpri povezavo v:"
+msgstr "_Odpri povezavo"
 
 msgid "_Copy Link Location"
 msgstr "_Kopiraj lokacijo povezave"
@@ -14832,9 +14857,6 @@
 #~ "prijateljev. Vnesete lahko tudi psevdonim ali vzdevek prijatelja. Kjer bo "
 #~ "izvedljivo, bo namesto pojavnega imena prikazan vzdevek.\n"
 
-#~ msgid "A_ccount:"
-#~ msgstr "Ra_čun:"
-
 #~ msgid "Pounce only when my status is not available"
 #~ msgstr "Opozori le tedaj, ko moje stanje ni na voljo"
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/po/sw.po	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,13972 @@
+# Copyright (C) 2009
+# This file is distributed under the same license as the Pidgin package.
+# , 2009.
+msgid ""
+msgstr ""
+"Project-Id-Version: pidgin\n"
+"Report-Msgid-Bugs-To: \n"
+"POT-Creation-Date: 2009-05-26 19:54-0700\n"
+"PO-Revision-Date: 2009-04-16 22:24+0300\n"
+"Last-Translator: \n"
+"Language-Team: American English <kde-i18n-doc@lists.kde.org>\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"
+"X-Generator: Lokalize 0.2\n"
+
+#. Translators may want to transliterate the name.
+#. It is not to be translated.
+#, fuzzy
+msgid "Finch"
+msgstr "Maliza"
+
+#, fuzzy, c-format
+msgid "%s. Try `%s -h' for more information.\n"
+msgstr "\n"
+
+#, c-format
+msgid ""
+"%s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stderr\n"
+"  -h, --help          display this help and exit\n"
+"  -n, --nologin       don't automatically login\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s encountered errors migrating your settings from %s to %s. Please "
+"investigate and complete the migration by hand. Please report this error at "
+"http://developer.pidgin.im"
+msgstr ""
+
+msgid "Error"
+msgstr "Hitikafu "
+
+msgid "Account was not added"
+msgstr ""
+
+msgid "Username of an account must be non-empty."
+msgstr "Jina la mtumiaji haliwezi kuwa wazi "
+
+#, fuzzy
+msgid "New mail notifications"
+msgstr "Arifisho la Jumla"
+
+#, fuzzy
+msgid "Remember password"
+msgstr "Ingiza tena nywila:"
+
+msgid "There are no protocol plugins installed."
+msgstr ""
+
+msgid "(You probably forgot to 'make install'.)"
+msgstr ""
+
+msgid "Modify Account"
+msgstr ""
+
+msgid "New Account"
+msgstr ""
+
+#, fuzzy
+msgid "Protocol:"
+msgstr "Itifaki"
+
+#, fuzzy
+msgid "Username:"
+msgstr "Jina la mtumiaji"
+
+msgid "Password:"
+msgstr "Nywila:"
+
+msgid "Alias:"
+msgstr ""
+
+#. Register checkbox
+msgid "Create this account on the server"
+msgstr ""
+
+#. Cancel button
+#. Cancel
+msgid "Cancel"
+msgstr "Ghairi"
+
+#. Save button
+#. Save
+msgid "Save"
+msgstr "Hifadhi"
+
+#, fuzzy, c-format
+msgid "Are you sure you want to delete %s?"
+msgstr "Una uhakika unataka kufuta ithibati yako?"
+
+#, fuzzy
+msgid "Delete Account"
+msgstr "Futa mwenyeji"
+
+#. Delete button
+#, fuzzy
+msgid "Delete"
+msgstr "&Futa"
+
+msgid "Accounts"
+msgstr ""
+
+msgid "You can enable/disable accounts from the following list."
+msgstr ""
+
+#. Add button
+msgid "Add"
+msgstr "Ongeza"
+
+#. Modify button
+#, fuzzy
+msgid "Modify"
+msgstr "R&ekebisha"
+
+#, c-format
+msgid "%s%s%s%s has made %s his or her buddy%s%s"
+msgstr ""
+
+msgid "Add buddy to your list?"
+msgstr ""
+
+#, c-format
+msgid "%s%s%s%s wants to add %s to his or her buddy list%s%s"
+msgstr ""
+
+msgid "Authorize buddy?"
+msgstr ""
+
+#, fuzzy
+msgid "Authorize"
+msgstr "Mamlaka"
+
+msgid "Deny"
+msgstr "Kataa"
+
+#, c-format
+msgid ""
+"Online: %d\n"
+"Total: %d"
+msgstr ""
+
+#, c-format
+msgid "Account: %s (%s)"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"Last Seen: %s ago"
+msgstr ""
+
+#, fuzzy
+msgid "Default"
+msgstr "chaguo-msingi"
+
+msgid "You must provide a username for the buddy."
+msgstr ""
+
+msgid "You must provide a group."
+msgstr ""
+
+msgid "You must select an account."
+msgstr ""
+
+msgid "The selected account is not online."
+msgstr ""
+
+msgid "Error adding buddy"
+msgstr ""
+
+msgid "Username"
+msgstr "Jina la mtumiaji"
+
+#, fuzzy
+msgid "Alias (optional)"
+msgstr "&Barua pepe (Uchaguzi):"
+
+msgid "Add in group"
+msgstr ""
+
+msgid "Account"
+msgstr ""
+
+msgid "Add Buddy"
+msgstr ""
+
+msgid "Please enter buddy information."
+msgstr ""
+
+#, fuzzy
+msgid "Chats"
+msgstr "Chad"
+
+#. Extract their Name and put it in
+msgid "Name"
+msgstr "Jina"
+
+msgid "Alias"
+msgstr ""
+
+msgid "Group"
+msgstr ""
+
+msgid "Auto-join"
+msgstr ""
+
+msgid "Add Chat"
+msgstr ""
+
+msgid "You can edit more information from the context menu later."
+msgstr ""
+
+#, fuzzy
+msgid "Error adding group"
+msgstr "Hitilafu katika Kutuma Taarifa"
+
+msgid "You must give a name for the group to add."
+msgstr ""
+
+msgid "Add Group"
+msgstr ""
+
+msgid "Enter the name of the group"
+msgstr ""
+
+msgid "Edit Chat"
+msgstr ""
+
+msgid "Please Update the necessary fields."
+msgstr ""
+
+#, fuzzy
+msgid "Edit"
+msgstr "&Hariri"
+
+#, fuzzy
+msgid "Edit Settings"
+msgstr "Vipimo"
+
+#, fuzzy
+msgid "Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Retrieving..."
+msgstr ""
+
+msgid "Get Info"
+msgstr ""
+
+msgid "Add Buddy Pounce"
+msgstr ""
+
+#, fuzzy
+msgid "Send File"
+msgstr "Tuma Kwa:"
+
+msgid "Blocked"
+msgstr "Imezuiliwa"
+
+msgid "Show when offline"
+msgstr ""
+
+#, c-format
+msgid "Please enter the new name for %s"
+msgstr ""
+
+#, fuzzy
+msgid "Rename"
+msgstr "&Badili jina"
+
+msgid "Set Alias"
+msgstr ""
+
+msgid "Enter empty string to reset the name."
+msgstr ""
+
+msgid "Removing this contact will also remove all the buddies in the contact"
+msgstr ""
+
+msgid "Removing this group will also remove all the buddies in the group"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Are you sure you want to remove %s?"
+msgstr "Una uhakika unataka kuondoa nywila zote?"
+
+#. XXX: anything to do with the returned ui-handle?
+#, fuzzy
+msgid "Confirm Remove"
+msgstr "Thibitisha kufunga"
+
+msgid "Remove"
+msgstr "Ondoa"
+
+#. Buddy List
+msgid "Buddy List"
+msgstr ""
+
+msgid "Place tagged"
+msgstr ""
+
+msgid "Toggle Tag"
+msgstr ""
+
+msgid "View Log"
+msgstr ""
+
+#. General
+msgid "Nickname"
+msgstr ""
+
+#. Never know what those translations might end up like...
+#. Idle stuff
+msgid "Idle"
+msgstr ""
+
+msgid "On Mobile"
+msgstr ""
+
+msgid "New..."
+msgstr ""
+
+msgid "Saved..."
+msgstr ""
+
+msgid "Plugins"
+msgstr "Programu tumizi"
+
+msgid "Block/Unblock"
+msgstr ""
+
+msgid "Block"
+msgstr "Zuia"
+
+msgid "Unblock"
+msgstr ""
+
+msgid ""
+"Please enter the username or alias of the person you would like to Block/"
+"Unblock."
+msgstr ""
+
+#. Not multiline
+#. Not masked?
+#. No hints?
+msgid "OK"
+msgstr "Sawa"
+
+msgid "New Instant Message"
+msgstr ""
+
+msgid "Please enter the username or alias of the person you would like to IM."
+msgstr ""
+
+#, fuzzy
+msgid "Channel"
+msgstr "Ghairi"
+
+msgid "Join a Chat"
+msgstr ""
+
+msgid "Please enter the name of the chat you want to join."
+msgstr ""
+
+msgid "Join"
+msgstr ""
+
+msgid ""
+"Please enter the username or alias of the person whose log you would like to "
+"view."
+msgstr ""
+
+#. Create the "Options" frame.
+msgid "Options"
+msgstr "Machaguo"
+
+msgid "Send IM..."
+msgstr ""
+
+msgid "Block/Unblock..."
+msgstr ""
+
+msgid "Join Chat..."
+msgstr ""
+
+msgid "View Log..."
+msgstr ""
+
+msgid "View All Logs"
+msgstr ""
+
+#, fuzzy
+msgid "Show"
+msgstr "Onyesha:"
+
+msgid "Empty groups"
+msgstr ""
+
+#, fuzzy
+msgid "Offline buddies"
+msgstr "Namna ya Nje ya mkondo"
+
+#, fuzzy
+msgid "Sort"
+msgstr "&Panga"
+
+#, fuzzy
+msgid "By Status"
+msgstr "Hali"
+
+msgid "Alphabetically"
+msgstr ""
+
+msgid "By Log Size"
+msgstr ""
+
+msgid "Buddy"
+msgstr ""
+
+#, fuzzy
+msgid "Chat"
+msgstr "Chad"
+
+#, fuzzy
+msgid "Grouping"
+msgstr "Hakuna Mpangilio"
+
+#, fuzzy
+msgid "Certificate Import"
+msgstr "Hati ina"
+
+msgid "Specify a hostname"
+msgstr ""
+
+msgid "Type the host name this certificate is for."
+msgstr ""
+
+#, c-format
+msgid ""
+"File %s could not be imported.\n"
+"Make sure that the file is readable and in PEM format.\n"
+msgstr ""
+
+msgid "Certificate Import Error"
+msgstr ""
+
+msgid "X.509 certificate import failed"
+msgstr ""
+
+#, fuzzy
+msgid "Select a PEM certificate"
+msgstr "Teua Ithibati"
+
+#, c-format
+msgid ""
+"Export to file %s failed.\n"
+"Check that you have write permission to the target path\n"
+msgstr ""
+
+#, fuzzy
+msgid "Certificate Export Error"
+msgstr "Ithibati Ipo"
+
+msgid "X.509 certificate export failed"
+msgstr ""
+
+#, fuzzy
+msgid "PEM X.509 Certificate Export"
+msgstr "X.509 Ithibati (PEM)"
+
+#, fuzzy, c-format
+msgid "Certificate for %s"
+msgstr "Hati ina"
+
+#, c-format
+msgid ""
+"Common name: %s\n"
+"\n"
+"SHA1 fingerprint:\n"
+"%s"
+msgstr ""
+
+#, fuzzy
+msgid "SSL Host Certificate"
+msgstr "Ithibati SSL ya Mteja"
+
+#, c-format
+msgid "Really delete certificate for %s?"
+msgstr ""
+
+msgid "Confirm certificate delete"
+msgstr ""
+
+msgid "Certificate Manager"
+msgstr "Meneja Ithibati"
+
+#. Creating the user splits
+msgid "Hostname"
+msgstr ""
+
+#, fuzzy
+msgid "Info"
+msgstr "Taarifa:"
+
+#. Close button
+msgid "Close"
+msgstr "Funga"
+
+#, fuzzy, c-format
+msgid "%s (%s)"
+msgstr "%S (%S)"
+
+#, c-format
+msgid "%s disconnected."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s\n"
+"\n"
+"Finch will not attempt to reconnect the account until you correct the error "
+"and re-enable the account."
+msgstr ""
+
+msgid "Re-enable Account"
+msgstr ""
+
+msgid ""
+"The account has disconnected and you are no longer in this chat. You will be "
+"automatically rejoined in the chat when the account reconnects."
+msgstr ""
+
+msgid "No such command."
+msgstr ""
+
+msgid "Syntax Error:  You typed the wrong number of arguments to that command."
+msgstr ""
+
+msgid "Your command failed for an unknown reason."
+msgstr ""
+
+msgid "That command only works in chats, not IMs."
+msgstr ""
+
+msgid "That command only works in IMs, not chats."
+msgstr ""
+
+msgid "That command doesn't work on this protocol."
+msgstr ""
+
+msgid "Message was not sent, because you are not signed on."
+msgstr ""
+
+#, c-format
+msgid "%s (%s -- %s)"
+msgstr ""
+
+#, c-format
+msgid "%s [%s]"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"%s is typing..."
+msgstr ""
+
+msgid "You have left this chat."
+msgstr ""
+
+msgid "Logging started. Future messages in this conversation will be logged."
+msgstr ""
+
+msgid ""
+"Logging stopped. Future messages in this conversation will not be logged."
+msgstr ""
+
+#, fuzzy
+msgid "Send To"
+msgstr "Tuma kwa:"
+
+#, fuzzy
+msgid "Conversation"
+msgstr "Unganisho"
+
+msgid "Clear Scrollback"
+msgstr ""
+
+#, fuzzy
+msgid "Show Timestamps"
+msgstr "Onyesha Ufafanuzi"
+
+msgid "Add Buddy Pounce..."
+msgstr ""
+
+msgid "Invite..."
+msgstr ""
+
+msgid "Enable Logging"
+msgstr ""
+
+msgid "Enable Sounds"
+msgstr ""
+
+msgid "<AUTO-REPLY> "
+msgstr ""
+
+#, c-format
+msgid "List of %d user:\n"
+msgid_plural "List of %d users:\n"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Supported debug options are:  version"
+msgstr ""
+
+msgid "No such command (in this context)."
+msgstr ""
+
+msgid ""
+"Use \"/help &lt;command&gt;\" for help on a specific command.\n"
+"The following commands are available in this context:\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s is not a valid message class. See '/help msgcolor' for valid message "
+"classes."
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid color. See '/help msgcolor' for valid colors."
+msgstr ""
+
+msgid ""
+"say &lt;message&gt;:  Send a message normally as if you weren't using a "
+"command."
+msgstr ""
+
+msgid "me &lt;action&gt;:  Send an IRC style action to a buddy or chat."
+msgstr ""
+
+msgid ""
+"debug &lt;option&gt;:  Send various debug information to the current "
+"conversation."
+msgstr ""
+
+msgid "clear: Clears the conversation scrollback."
+msgstr ""
+
+msgid "help &lt;command&gt;:  Help on a specific command."
+msgstr ""
+
+msgid "users:  Show the list of users in the chat."
+msgstr ""
+
+msgid "plugins: Show the plugins window."
+msgstr ""
+
+msgid "buddylist: Show the buddylist."
+msgstr ""
+
+msgid "accounts: Show the accounts window."
+msgstr ""
+
+msgid "debugwin: Show the debug window."
+msgstr ""
+
+msgid "prefs: Show the preference window."
+msgstr ""
+
+msgid "statuses: Show the savedstatuses window."
+msgstr ""
+
+msgid ""
+"msgcolor &lt;class&gt; &lt;foreground&gt; &lt;background&gt;: Set the color "
+"for different classes of messages in the conversation window.<br>    &lt;"
+"class&gt;: receive, send, highlight, action, timestamp<br>    &lt;foreground/"
+"background&gt;: black, red, green, blue, white, gray, darkgray, magenta, "
+"cyan, default<br><br>EXAMPLE:<br>    msgcolor send cyan default"
+msgstr ""
+
+#, fuzzy
+msgid "Unable to open file."
+msgstr "Nimeshindwa Kusasisha"
+
+#, fuzzy
+msgid "Debug Window"
+msgstr "Dirisha Jipya"
+
+#. XXX: Setting the GROW_Y for the following widgets don't make sense. But right now
+#. * it's necessary to make the width of the debug window resizable ... like I said,
+#. * it doesn't make sense. The bug is likely in the packing in gntbox.c.
+#.
+#, fuzzy
+msgid "Clear"
+msgstr "&Safisha"
+
+#, fuzzy
+msgid "Filter:"
+msgstr "Ch&uja:"
+
+msgid "Pause"
+msgstr "Simamisha"
+
+#, c-format
+msgid "File Transfers - %d%% of %d file"
+msgid_plural "File Transfers - %d%% of %d files"
+msgstr[0] ""
+msgstr[1] ""
+
+#. Create the window.
+msgid "File Transfers"
+msgstr ""
+
+#, fuzzy
+msgid "Progress"
+msgstr "Hatua:"
+
+#, fuzzy
+msgid "Filename"
+msgstr "Jina la faili:"
+
+msgid "Size"
+msgstr "Saizi"
+
+#, fuzzy
+msgid "Speed"
+msgstr "Kilishi mkono"
+
+#, fuzzy
+msgid "Remaining"
+msgstr "#1 imebakia"
+
+#. XXX: Use of ggp_str_to_uin() is an ugly hack!
+msgid "Status"
+msgstr "Hali"
+
+msgid "Close this window when all transfers finish"
+msgstr ""
+
+msgid "Clear finished transfers"
+msgstr ""
+
+#, fuzzy
+msgid "Stop"
+msgstr "&Simama"
+
+msgid "Waiting for transfer to begin"
+msgstr ""
+
+msgid "Canceled"
+msgstr "Imeghairishwa"
+
+msgid "Failed"
+msgstr "Imeshindwa"
+
+#, c-format
+msgid "%.2f KiB/s"
+msgstr ""
+
+msgid "Sent"
+msgstr ""
+
+msgid "Received"
+msgstr ""
+
+msgid "Finished"
+msgstr "Imemaliza"
+
+#, c-format
+msgid "The file was saved as %s."
+msgstr ""
+
+#, fuzzy
+msgid "Sending"
+msgstr "kuumbia"
+
+#, fuzzy
+msgid "Receiving"
+msgstr "teremua"
+
+#, c-format
+msgid "Conversation in %s on %s"
+msgstr ""
+
+#, c-format
+msgid "Conversation with %s on %s"
+msgstr ""
+
+#, fuzzy
+msgid "%B %Y"
+msgstr "%S %S"
+
+msgid ""
+"System events will only be logged if the \"Log all status changes to system "
+"log\" preference is enabled."
+msgstr ""
+
+msgid ""
+"Instant messages will only be logged if the \"Log all instant messages\" "
+"preference is enabled."
+msgstr ""
+
+msgid ""
+"Chats will only be logged if the \"Log all chats\" preference is enabled."
+msgstr ""
+
+#, fuzzy
+msgid "No logs were found"
+msgstr "Hakuna masasisho yaliyopatikana."
+
+msgid "Total log size:"
+msgstr ""
+
+#. Search box *********
+msgid "Scroll/Search: "
+msgstr ""
+
+#, c-format
+msgid "Conversations in %s"
+msgstr ""
+
+#, c-format
+msgid "Conversations with %s"
+msgstr ""
+
+msgid "All Conversations"
+msgstr ""
+
+msgid "System Log"
+msgstr ""
+
+msgid "Calling ... "
+msgstr ""
+
+msgid "Hangup"
+msgstr ""
+
+#. Number of actions
+msgid "Accept"
+msgstr ""
+
+#, fuzzy
+msgid "Reject"
+msgstr "Seti upya"
+
+msgid "Call in progress."
+msgstr ""
+
+msgid "The call has been terminated."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start an audio session with you."
+msgstr ""
+
+#, c-format
+msgid "%s is trying to start an unsupported media session type with you."
+msgstr ""
+
+msgid "You have rejected the call."
+msgstr ""
+
+msgid "call: Make an audio call."
+msgstr ""
+
+#, fuzzy
+msgid "Emails"
+msgstr "Barua pepe"
+
+msgid "You have mail!"
+msgstr ""
+
+#, fuzzy
+msgid "Sender"
+msgstr "Seva"
+
+msgid "Subject"
+msgstr "Mhusika"
+
+#, c-format
+msgid "%s (%s) has %d new message."
+msgid_plural "%s (%s) has %d new messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "New Mail"
+msgstr "Tabo mpya"
+
+#, c-format
+msgid "Info for %s"
+msgstr ""
+
+#, fuzzy
+msgid "Buddy Information"
+msgstr "Fic&ha Taarifa"
+
+msgid "Continue"
+msgstr "Endelea"
+
+msgid "IM"
+msgstr ""
+
+msgid "Invite"
+msgstr ""
+
+msgid "(none)"
+msgstr ""
+
+msgid "URI"
+msgstr "URI"
+
+msgid "ERROR"
+msgstr "HITILAFU"
+
+msgid "loading plugin failed"
+msgstr ""
+
+msgid "unloading plugin failed"
+msgstr ""
+
+#, c-format
+msgid ""
+"Name: %s\n"
+"Version: %s\n"
+"Description: %s\n"
+"Author: %s\n"
+"Website: %s\n"
+"Filename: %s\n"
+msgstr ""
+
+msgid "Plugin need to be loaded before you can configure it."
+msgstr ""
+
+msgid "No configuration options for this plugin."
+msgstr ""
+
+msgid "Error loading plugin"
+msgstr ""
+
+msgid "The selected file is not a valid plugin."
+msgstr ""
+
+msgid ""
+"Please open the debug window and try again to see the exact error message."
+msgstr ""
+
+#, fuzzy
+msgid "Select plugin to install"
+msgstr "Chagua mandhari kusakinisha"
+
+msgid "You can (un)load plugins from the following list."
+msgstr ""
+
+#, fuzzy
+msgid "Install Plugin..."
+msgstr "Usakinishaji Programu-jalizi"
+
+msgid "Configure Plugin"
+msgstr ""
+
+#. copy the preferences to tmp values...
+#. * I liked "take affect immediately" Oh well :-(
+#. (that should have been "effect," right?)
+#. Back to instant-apply! I win!  BU-HAHAHA!
+#. Create the window
+msgid "Preferences"
+msgstr "Mapendekezo"
+
+msgid "Please enter a buddy to pounce."
+msgstr ""
+
+msgid "New Buddy Pounce"
+msgstr ""
+
+msgid "Edit Buddy Pounce"
+msgstr ""
+
+msgid "Pounce Who"
+msgstr ""
+
+#. Account:
+msgid "Account:"
+msgstr ""
+
+msgid "Buddy name:"
+msgstr ""
+
+#. Create the "Pounce When Buddy..." frame.
+msgid "Pounce When Buddy..."
+msgstr ""
+
+msgid "Signs on"
+msgstr ""
+
+msgid "Signs off"
+msgstr ""
+
+msgid "Goes away"
+msgstr ""
+
+msgid "Returns from away"
+msgstr ""
+
+msgid "Becomes idle"
+msgstr ""
+
+msgid "Is no longer idle"
+msgstr ""
+
+msgid "Starts typing"
+msgstr ""
+
+msgid "Pauses while typing"
+msgstr ""
+
+msgid "Stops typing"
+msgstr ""
+
+msgid "Sends a message"
+msgstr ""
+
+#. Create the "Action" frame.
+#, fuzzy
+msgid "Action"
+msgstr "&Tendo"
+
+#, fuzzy
+msgid "Open an IM window"
+msgstr "Fungua dirisha jipya"
+
+msgid "Pop up a notification"
+msgstr ""
+
+msgid "Send a message"
+msgstr ""
+
+msgid "Execute a command"
+msgstr ""
+
+msgid "Play a sound"
+msgstr ""
+
+msgid "Pounce only when my status is not Available"
+msgstr ""
+
+msgid "Recurring"
+msgstr ""
+
+msgid "Cannot create pounce"
+msgstr ""
+
+msgid "You do not have any accounts."
+msgstr ""
+
+msgid "You must create an account first before you can create a pounce."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Are you sure you want to delete the pounce on %s for %s?"
+msgstr "Je una uhakika uantaka kufuta ithibati hizi?"
+
+msgid "Buddy Pounces"
+msgstr ""
+
+#, c-format
+msgid "%s has started typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has paused while typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has signed on (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has returned from being idle (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has returned from being away (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has stopped typing to you (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has signed off (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has become idle (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has gone away. (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s has sent you a message. (%s)"
+msgstr ""
+
+msgid "Unknown pounce event. Please report this!"
+msgstr ""
+
+msgid "Based on keyboard use"
+msgstr ""
+
+msgid "From last sent message"
+msgstr ""
+
+#, fuzzy
+msgid "Never"
+msgstr "Seva"
+
+msgid "Show Idle Time"
+msgstr ""
+
+msgid "Show Offline Buddies"
+msgstr ""
+
+msgid "Notify buddies when you are typing"
+msgstr ""
+
+msgid "Log format"
+msgstr ""
+
+#, fuzzy
+msgid "Log IMs"
+msgstr "I&ngia"
+
+msgid "Log chats"
+msgstr ""
+
+msgid "Log status change events"
+msgstr ""
+
+msgid "Report Idle time"
+msgstr ""
+
+#, fuzzy
+msgid "Change status when idle"
+msgstr "&Badili matini ya ufito hali"
+
+msgid "Minutes before changing status"
+msgstr ""
+
+#, fuzzy
+msgid "Change status to"
+msgstr "&Badili matini ya ufito hali"
+
+#, fuzzy
+msgid "Conversations"
+msgstr "Unganisho"
+
+#, fuzzy
+msgid "Logging"
+msgstr "Inapakia"
+
+msgid "You must fill all the required fields."
+msgstr ""
+
+msgid "The required fields are underlined."
+msgstr ""
+
+msgid "Not implemented yet."
+msgstr ""
+
+#, fuzzy
+msgid "Save File..."
+msgstr "&Hifadhi faili"
+
+#, fuzzy
+msgid "Open File..."
+msgstr "Fungua Faili"
+
+msgid "Choose Location..."
+msgstr ""
+
+msgid "Hit 'Enter' to find more rooms of this category."
+msgstr ""
+
+msgid "Get"
+msgstr ""
+
+#. Create the window.
+msgid "Room List"
+msgstr ""
+
+msgid "Buddy logs in"
+msgstr ""
+
+msgid "Buddy logs out"
+msgstr ""
+
+msgid "Message received"
+msgstr ""
+
+msgid "Message received begins conversation"
+msgstr ""
+
+#, fuzzy
+msgid "Message sent"
+msgstr "Ujumbe haujaenda."
+
+msgid "Person enters chat"
+msgstr ""
+
+msgid "Person leaves chat"
+msgstr ""
+
+msgid "You talk in chat"
+msgstr ""
+
+msgid "Others talk in chat"
+msgstr ""
+
+msgid "Someone says your username in chat"
+msgstr ""
+
+msgid "GStreamer Failure"
+msgstr ""
+
+msgid "GStreamer failed to initialize."
+msgstr ""
+
+#, fuzzy
+msgid "(default)"
+msgstr "chaguo-msingi"
+
+msgid "Select Sound File ..."
+msgstr ""
+
+#, fuzzy
+msgid "Sound Preferences"
+msgstr "&Mapendekezo ya Tovuti"
+
+#, fuzzy
+msgid "Profiles"
+msgstr "Mafaili_%S"
+
+msgid "Automatic"
+msgstr ""
+
+msgid "Console Beep"
+msgstr ""
+
+msgid "Command"
+msgstr ""
+
+msgid "No Sound"
+msgstr ""
+
+msgid "Sound Method"
+msgstr ""
+
+msgid "Method: "
+msgstr ""
+
+#, c-format
+msgid ""
+"Sound Command\n"
+"(%s for filename)"
+msgstr ""
+
+#. Sound options
+msgid "Sound Options"
+msgstr ""
+
+msgid "Sounds when conversation has focus"
+msgstr ""
+
+#, fuzzy
+msgid "Always"
+msgstr "Uliza daima"
+
+msgid "Only when available"
+msgstr ""
+
+msgid "Only when not available"
+msgstr ""
+
+msgid "Volume(0-100):"
+msgstr ""
+
+#. Sound events
+msgid "Sound Events"
+msgstr ""
+
+msgid "Event"
+msgstr ""
+
+#, fuzzy
+msgid "File"
+msgstr "Faili:"
+
+#, fuzzy
+msgid "Test"
+msgstr "Matini"
+
+msgid "Reset"
+msgstr "Seti upya"
+
+#, fuzzy
+msgid "Choose..."
+msgstr "Chagua…"
+
+#, fuzzy, c-format
+msgid "Are you sure you want to delete \"%s\""
+msgstr "Una uhakika unataka kufuta ithibati yako?"
+
+#, fuzzy
+msgid "Delete Status"
+msgstr "Futa mwenyeji"
+
+msgid "Saved Statuses"
+msgstr ""
+
+msgid "Title"
+msgstr "Jina"
+
+msgid "Type"
+msgstr "Aina"
+
+#. Statuses are almost all the same. Define a macro to reduce code repetition.
+#. PurpleStatusPrimitive
+#. id - use default
+#. name - use default
+#. saveable
+#. user_settable
+#. not independent
+#. Attributes - each status can have a message.
+msgid "Message"
+msgstr "Ujumbe"
+
+#. Use
+msgid "Use"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid title"
+msgstr "Kizuizi batili"
+
+msgid "Please enter a non-empty title for the status."
+msgstr ""
+
+#, fuzzy
+msgid "Duplicate title"
+msgstr "sifa rudufu"
+
+msgid "Please enter a different title for the status."
+msgstr ""
+
+#, fuzzy
+msgid "Substatus"
+msgstr "Hali"
+
+msgid "Status:"
+msgstr "Hali:"
+
+#, fuzzy
+msgid "Message:"
+msgstr "Ujumbe"
+
+#, fuzzy
+msgid "Edit Status"
+msgstr "Marekani"
+
+msgid "Use different status for following accounts"
+msgstr ""
+
+#. Save & Use
+#, fuzzy
+msgid "Save & Use"
+msgstr "Hifadhi Kama"
+
+msgid "Certificates"
+msgstr "Hati"
+
+msgid "Sounds"
+msgstr ""
+
+#, fuzzy
+msgid "Statuses"
+msgstr "Hali"
+
+msgid "Error loading the plugin."
+msgstr ""
+
+msgid "Couldn't find X display"
+msgstr ""
+
+msgid "Couldn't find window"
+msgstr ""
+
+msgid "This plugin cannot be loaded because it was not built with X11 support."
+msgstr ""
+
+msgid "GntClipboard"
+msgstr ""
+
+msgid "Clipboard plugin"
+msgstr ""
+
+msgid ""
+"When the gnt clipboard contents change, the contents are made available to "
+"X, if possible."
+msgstr ""
+
+#, c-format
+msgid "%s just signed on"
+msgstr ""
+
+#, c-format
+msgid "%s just signed off"
+msgstr ""
+
+#, c-format
+msgid "%s sent you a message"
+msgstr ""
+
+#, c-format
+msgid "%s said your nick in %s"
+msgstr ""
+
+#, c-format
+msgid "%s sent a message in %s"
+msgstr ""
+
+msgid "Buddy signs on/off"
+msgstr ""
+
+msgid "You receive an IM"
+msgstr ""
+
+msgid "Someone speaks in a chat"
+msgstr ""
+
+msgid "Someone says your name in a chat"
+msgstr ""
+
+msgid "Notify with a toaster when"
+msgstr ""
+
+msgid "Beep too!"
+msgstr ""
+
+msgid "Set URGENT for the terminal window."
+msgstr ""
+
+msgid "GntGf"
+msgstr ""
+
+msgid "Toaster plugin"
+msgstr ""
+
+#, c-format
+msgid "<b>Conversation with %s on %s:</b><br>"
+msgstr ""
+
+msgid "History Plugin Requires Logging"
+msgstr ""
+
+msgid ""
+"Logging can be enabled from Tools -> Preferences -> Logging.\n"
+"\n"
+"Enabling logs for instant messages and/or chats will activate history for "
+"the same conversation type(s)."
+msgstr ""
+
+#, fuzzy
+msgid "GntHistory"
+msgstr "Historia"
+
+msgid "Shows recently logged conversations in new conversations."
+msgstr ""
+
+msgid ""
+"When a new conversation is opened this plugin will insert the last "
+"conversation into the current conversation."
+msgstr ""
+
+#, fuzzy
+msgid "Online"
+msgstr "Nenda mkondoni"
+
+msgid "Offline"
+msgstr ""
+
+msgid "Online Buddies"
+msgstr ""
+
+#, fuzzy
+msgid "Offline Buddies"
+msgstr "Namna ya Nje ya mkondo"
+
+msgid "Online/Offline"
+msgstr ""
+
+msgid "Meebo"
+msgstr ""
+
+msgid "No Grouping"
+msgstr "Hakuna Mpangilio"
+
+msgid "Nested Subgroup"
+msgstr ""
+
+msgid "Nested Grouping (experimental)"
+msgstr ""
+
+msgid "Provides alternate buddylist grouping options."
+msgstr ""
+
+msgid "Lastlog"
+msgstr ""
+
+#. Translator Note: The "backlog" is the conversation buffer/history.
+msgid "lastlog: Searches for a substring in the backlog."
+msgstr ""
+
+msgid "GntLastlog"
+msgstr ""
+
+msgid "Lastlog plugin."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"Fetching TinyURL..."
+msgstr ""
+
+msgid "Only create TinyURL for urls of this length or greater"
+msgstr ""
+
+msgid "TinyURL (or other) address prefix"
+msgstr ""
+
+msgid "TinyURL"
+msgstr ""
+
+msgid "TinyURL plugin"
+msgstr ""
+
+msgid "When receiving a message with URL(s), TinyURL for easier copying"
+msgstr ""
+
+msgid "accounts"
+msgstr ""
+
+msgid "Password is required to sign on."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Enter password for %s (%s)"
+msgstr "Ingiza nywila kwa ajili ya %1$S kwenye %2$S"
+
+#, fuzzy
+msgid "Enter Password"
+msgstr "Ingiza nywila mpya:"
+
+#, fuzzy
+msgid "Save password"
+msgstr "Nywila Zilizohifadhiwa"
+
+#, c-format
+msgid "Missing protocol plugin for %s"
+msgstr ""
+
+#, fuzzy
+msgid "Connection Error"
+msgstr "Hitilafu ya Sanidi"
+
+msgid "New passwords do not match."
+msgstr ""
+
+msgid "Fill out all fields completely."
+msgstr ""
+
+msgid "Original password"
+msgstr ""
+
+#, fuzzy
+msgid "New password"
+msgstr "Nyilwa mpya:"
+
+#, fuzzy
+msgid "New password (again)"
+msgstr "Nywila mpya (tena):"
+
+#, c-format
+msgid "Change password for %s"
+msgstr ""
+
+msgid "Please enter your current password and your new password."
+msgstr ""
+
+#, c-format
+msgid "Change user information for %s"
+msgstr ""
+
+msgid "Set User Info"
+msgstr ""
+
+msgid "Unknown"
+msgstr "Isiyojulikana"
+
+msgid "Buddies"
+msgstr ""
+
+msgid "buddy list"
+msgstr ""
+
+msgid "(DOES NOT MATCH)"
+msgstr ""
+
+#. Make messages
+#, c-format
+msgid "%s has presented the following certificate for just-this-once use:"
+msgstr ""
+
+#, c-format
+msgid ""
+"Common name: %s %s\n"
+"Fingerprint (SHA1): %s"
+msgstr ""
+
+#. TODO: Find what the handle ought to be
+msgid "Single-use Certificate Verification"
+msgstr ""
+
+#. Scheme name
+#. Pool name
+#, fuzzy
+msgid "Certificate Authorities"
+msgstr "Hatifisha Sera"
+
+#. Scheme name
+#. Pool name
+msgid "SSL Peers Cache"
+msgstr ""
+
+#. Make messages
+#, fuzzy, c-format
+msgid "Accept certificate for %s?"
+msgstr "Rekebisha cheli au ithibati ya uaminifu"
+
+#. TODO: Find what the handle ought to be
+#, fuzzy
+msgid "SSL Certificate Verification"
+msgstr "Kagua Uhalisia wa Hati"
+
+#, fuzzy
+msgid "_View Certificate..."
+msgstr "Angalia Hati"
+
+#. Prompt the user to authenticate the certificate
+#. vrq will be completed by user_auth
+#, c-format
+msgid ""
+"The certificate presented by \"%s\" is self-signed. It cannot be "
+"automatically checked."
+msgstr ""
+
+#, c-format
+msgid "The certificate chain presented for %s is not valid."
+msgstr ""
+
+#. TODO: Make this error either block the ensuing SSL
+#. connection error until the user dismisses this one, or
+#. stifle it.
+#. TODO: Probably wrong.
+#. TODO: Probably wrong
+#, fuzzy
+msgid "SSL Certificate Error"
+msgstr "Mamlaka ya Ithibati SSL"
+
+#, fuzzy
+msgid "Invalid certificate chain"
+msgstr "Hati Thibati"
+
+#. vrq will be completed by user_auth
+msgid ""
+"You have no database of root certificates, so this certificate cannot be "
+"validated."
+msgstr ""
+
+#. vrq will be completed by user_auth
+msgid ""
+"The root certificate this one claims to be issued by is unknown to Pidgin."
+msgstr ""
+
+#, c-format
+msgid ""
+"The certificate chain presented by %s does not have a valid digital "
+"signature from the Certificate Authority from which it claims to have a "
+"signature."
+msgstr ""
+
+msgid "Invalid certificate authority signature"
+msgstr ""
+
+#. Prompt the user to authenticate the certificate
+#. TODO: Provide the user with more guidance about why he is
+#. being prompted
+#. vrq will be completed by user_auth
+#, c-format
+msgid ""
+"The certificate presented by \"%s\" claims to be from \"%s\" instead.  This "
+"could mean that you are not connecting to the service you believe you are."
+msgstr ""
+
+#. Make messages
+#, c-format
+msgid ""
+"Common name: %s\n"
+"\n"
+"Fingerprint (SHA1): %s\n"
+"\n"
+"Activation date: %s\n"
+"Expiration date: %s\n"
+msgstr ""
+
+#. TODO: Find what the handle ought to be
+#, fuzzy
+msgid "Certificate Information"
+msgstr "Kagua Uhalisia wa Hati"
+
+#, fuzzy
+msgid "Registration Error"
+msgstr "Hitilafu ya Sanidi"
+
+#, fuzzy
+msgid "Unregistration Error"
+msgstr "Hitilafu ya Sanidi"
+
+#, c-format
+msgid "+++ %s signed on"
+msgstr ""
+
+#, c-format
+msgid "+++ %s signed off"
+msgstr ""
+
+#. Unknown error
+#. Unknown error!
+msgid "Unknown error"
+msgstr "Hitilafu isiyojulikana"
+
+msgid "Unable to send message: The message is too large."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message to %s."
+msgstr ""
+
+msgid "The message is too large."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to send message."
+msgstr "Haiwezi kuongeza moduli"
+
+msgid "Send Message"
+msgstr ""
+
+msgid "_Send Message"
+msgstr ""
+
+#, c-format
+msgid "%s entered the room."
+msgstr ""
+
+#, c-format
+msgid "%s [<I>%s</I>] entered the room."
+msgstr ""
+
+#, c-format
+msgid "You are now known as %s"
+msgstr ""
+
+#, c-format
+msgid "%s is now known as %s"
+msgstr ""
+
+#, c-format
+msgid "%s left the room."
+msgstr ""
+
+#, c-format
+msgid "%s left the room (%s)."
+msgstr ""
+
+msgid "Invite to chat"
+msgstr ""
+
+#. Put our happy label in it.
+msgid ""
+"Please enter the name of the user you wish to invite, along with an optional "
+"invite message."
+msgstr ""
+
+#, c-format
+msgid "Failed to get connection: %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to get name: %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to get serv name: %s"
+msgstr ""
+
+msgid "Purple's D-BUS server is not running for the reason listed below"
+msgstr ""
+
+#, fuzzy
+msgid "No name"
+msgstr "Jina la DNS"
+
+msgid "Unable to create new resolver process\n"
+msgstr ""
+
+msgid "Unable to send request to resolver process\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error resolving %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Error resolving %s: %d"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reading from resolver process:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Resolver process exited without answering our request"
+msgstr ""
+
+#, c-format
+msgid "Thread creation failure: %s"
+msgstr ""
+
+#, fuzzy
+msgid "Unknown reason"
+msgstr "Hitilafu isiyojulikana"
+
+#, c-format
+msgid ""
+"Error reading %s: \n"
+"%s.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error writing %s: \n"
+"%s.\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid ""
+"Error accessing %s: \n"
+"%s.\n"
+msgstr "Hitilafu katika kufikia %S"
+
+#, fuzzy
+msgid "Directory is not writable."
+msgstr "Faili %S haliandikiki."
+
+msgid "Cannot send a file of 0 bytes."
+msgstr ""
+
+msgid "Cannot send a directory."
+msgstr ""
+
+#, c-format
+msgid "%s is not a regular file. Cowardly refusing to overwrite it.\n"
+msgstr ""
+
+#, c-format
+msgid "%s wants to send you %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s wants to send you a file"
+msgstr ""
+
+#, c-format
+msgid "Accept file transfer request from %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"A file is available for download from:\n"
+"Remote host: %s\n"
+"Remote port: %d"
+msgstr ""
+
+#, c-format
+msgid "%s is offering to send file %s"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid filename.\n"
+msgstr ""
+
+#, c-format
+msgid "Offering to send %s to %s"
+msgstr ""
+
+#, c-format
+msgid "Starting transfer of %s from %s"
+msgstr ""
+
+#, c-format
+msgid "Transfer of file %s complete"
+msgstr ""
+
+msgid "File transfer complete"
+msgstr ""
+
+#, c-format
+msgid "You canceled the transfer of %s"
+msgstr ""
+
+msgid "File transfer cancelled"
+msgstr ""
+
+#, c-format
+msgid "%s canceled the transfer of %s"
+msgstr ""
+
+#, c-format
+msgid "%s canceled the file transfer"
+msgstr ""
+
+#, c-format
+msgid "File transfer to %s failed."
+msgstr ""
+
+#, c-format
+msgid "File transfer from %s failed."
+msgstr ""
+
+msgid "Run the command in a terminal"
+msgstr ""
+
+msgid "The command used to handle \"aim\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"gg\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"icq\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"irc\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"msnim\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"sip\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"xmpp\" URLs, if enabled."
+msgstr ""
+
+msgid "The command used to handle \"ymsgr\" URLs, if enabled."
+msgstr ""
+
+msgid "The handler for \"aim\" URLs"
+msgstr ""
+
+msgid "The handler for \"gg\" URLs"
+msgstr ""
+
+msgid "The handler for \"icq\" URLs"
+msgstr ""
+
+msgid "The handler for \"irc\" URLs"
+msgstr ""
+
+msgid "The handler for \"msnim\" URLs"
+msgstr ""
+
+msgid "The handler for \"sip\" URLs"
+msgstr ""
+
+msgid "The handler for \"xmpp\" URLs"
+msgstr ""
+
+msgid "The handler for \"ymsgr\" URLs"
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"aim\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"gg\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"icq\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"irc\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"msnim\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"sip\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"xmpp\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command specified in the \"command\" key should handle \"ymsgr\" "
+"URLs."
+msgstr ""
+
+msgid ""
+"True if the command used to handle this type of URL should be run in a "
+"terminal."
+msgstr ""
+
+msgid "Whether the specified command should handle \"aim\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"gg\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"icq\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"irc\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"msnim\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"sip\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"xmpp\" URLs"
+msgstr ""
+
+msgid "Whether the specified command should handle \"ymsgr\" URLs"
+msgstr ""
+
+msgid "<b><font color=\"red\">The logger has no read function</font></b>"
+msgstr ""
+
+msgid "HTML"
+msgstr ""
+
+msgid "Plain text"
+msgstr ""
+
+msgid "Old flat format"
+msgstr ""
+
+msgid "Logging of this conversation failed."
+msgstr ""
+
+msgid "XML"
+msgstr "XML"
+
+#, c-format
+msgid ""
+"<font color=\"#16569E\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
+"REPLY&gt;:</b></font> %s<br/>\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"<font color=\"#A82F2F\"><font size=\"2\">(%s)</font> <b>%s &lt;AUTO-"
+"REPLY&gt;:</b></font> %s<br/>\n"
+msgstr ""
+
+msgid "<font color=\"red\"><b>Unable to find log path!</b></font>"
+msgstr ""
+
+#, c-format
+msgid "<font color=\"red\"><b>Could not read file: %s</b></font>"
+msgstr ""
+
+#, c-format
+msgid "(%s) %s <AUTO-REPLY>: %s\n"
+msgstr ""
+
+#, c-format
+msgid "You are using %s, but this plugin requires %s."
+msgstr ""
+
+msgid "This plugin has not defined an ID."
+msgstr ""
+
+#, c-format
+msgid "Plugin magic mismatch %d (need %d)"
+msgstr ""
+
+#, c-format
+msgid "ABI version mismatch %d.%d.x (need %d.%d.x)"
+msgstr ""
+
+msgid ""
+"Plugin does not implement all required functions (list_icon, login and close)"
+msgstr ""
+
+#, c-format
+msgid ""
+"The required plugin %s was not found. Please install this plugin and try "
+"again."
+msgstr ""
+
+msgid "Unable to load the plugin"
+msgstr ""
+
+#, c-format
+msgid "The required plugin %s was unable to load."
+msgstr ""
+
+msgid "Unable to load your plugin."
+msgstr ""
+
+#, c-format
+msgid "%s requires %s, but it failed to unload."
+msgstr ""
+
+msgid "Autoaccept"
+msgstr ""
+
+msgid "Auto-accept file transfer requests from selected users."
+msgstr ""
+
+#, c-format
+msgid "Autoaccepted file transfer of \"%s\" from \"%s\" completed."
+msgstr ""
+
+msgid "Autoaccept complete"
+msgstr ""
+
+#, c-format
+msgid "When a file-transfer request arrives from %s"
+msgstr ""
+
+msgid "Set Autoaccept Setting"
+msgstr ""
+
+#, fuzzy
+msgid "_Save"
+msgstr "Hifadhi"
+
+#, fuzzy
+msgid "_Cancel"
+msgstr "Ghairi"
+
+msgid "Ask"
+msgstr ""
+
+msgid "Auto Accept"
+msgstr ""
+
+#, fuzzy
+msgid "Auto Reject"
+msgstr "Gungu&a Kiotomati"
+
+msgid "Autoaccept File Transfers..."
+msgstr ""
+
+#. XXX: Is there a better way than this? There really should be.
+msgid ""
+"Path to save the files in\n"
+"(Please provide the full path)"
+msgstr ""
+
+msgid "Automatically reject from users not in buddy list"
+msgstr ""
+
+msgid ""
+"Notify with a popup when an autoaccepted file transfer is complete\n"
+"(only when there's no conversation with the sender)"
+msgstr ""
+
+msgid "Create a new directory for each user"
+msgstr ""
+
+#, fuzzy
+msgid "Notes"
+msgstr "Hakuna vitu"
+
+msgid "Enter your notes below..."
+msgstr ""
+
+msgid "Edit Notes..."
+msgstr ""
+
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy Notes"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Store notes on particular buddies."
+msgstr ""
+
+#. *< summary
+msgid "Adds the option to store notes for buddies on your buddy list."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Cipher Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Tests the ciphers that ship with libpurple."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "DBus Example"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "DBus Plugin Example"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "File Control"
+msgstr "Fi&cha Visisimamizi"
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Allows control by entering commands in a file."
+msgstr ""
+
+msgid "Minutes"
+msgstr ""
+
+#. This is a cultural reference.  Dy'er Mak'er is a song by Led Zeppelin.
+#. If that doesn't translate well into your language, drop the 's before translating.
+msgid "I'dle Mak'er"
+msgstr ""
+
+msgid "Set Account Idle Time"
+msgstr ""
+
+msgid "_Set"
+msgstr ""
+
+msgid "None of your accounts are idle."
+msgstr ""
+
+msgid "Unset Account Idle Time"
+msgstr ""
+
+msgid "_Unset"
+msgstr ""
+
+msgid "Set Idle Time for All Accounts"
+msgstr ""
+
+msgid "Unset Idle Time for All Idled Accounts"
+msgstr ""
+
+msgid "Allows you to hand-configure how long you've been idle"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "IPC Test Client"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Test plugin IPC support, as a client."
+msgstr ""
+
+#. *  description
+msgid ""
+"Test plugin IPC support, as a client. This locates the server plugin and "
+"calls the commands registered."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "IPC Test Server"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Test plugin IPC support, as a server."
+msgstr ""
+
+#. *  description
+msgid "Test plugin IPC support, as a server. This registers the IPC commands."
+msgstr ""
+
+msgid "Join/Part Hiding Configuration"
+msgstr ""
+
+#, fuzzy
+msgid "Minimum Room Size"
+msgstr "Upe&ochini wa fonti size:"
+
+msgid "User Inactivity Timeout (in minutes)"
+msgstr ""
+
+msgid "Apply hiding rules to buddies"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Join/Part Hiding"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Hides extraneous join/part messages."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin hides join/part messages in large rooms, except for those users "
+"actively taking part in a conversation."
+msgstr ""
+
+#. This is used in the place of a timezone abbreviation if the
+#. * offset is way off.  The user should never really see it, but
+#. * it's here just in case.  The parens are to make it clear it's
+#. * not a real timezone.
+msgid "(UTC)"
+msgstr ""
+
+msgid "User is offline."
+msgstr ""
+
+msgid "Auto-response sent:"
+msgstr ""
+
+#, c-format
+msgid "%s has signed off."
+msgstr ""
+
+msgid "One or more messages may have been undeliverable."
+msgstr ""
+
+msgid "You were disconnected from the server."
+msgstr ""
+
+msgid ""
+"You are currently disconnected. Messages will not be received unless you are "
+"logged in."
+msgstr ""
+
+msgid "Message could not be sent because the maximum length was exceeded."
+msgstr ""
+
+#, fuzzy
+msgid "Message could not be sent."
+msgstr "Ujumbe haujaenda."
+
+#. 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 "Adium"
+msgstr ""
+
+#. 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.
+#, fuzzy
+msgid "Fire"
+msgstr "Faili:"
+
+#. 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 "Messenger Plus!"
+msgstr ""
+
+#. 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 "QIP"
+msgstr ""
+
+#. 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 "MSN Messenger"
+msgstr ""
+
+#. 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.
+#, fuzzy
+msgid "Trillian"
+msgstr "Kifriul"
+
+#. 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 ""
+
+#. Add general preferences.
+msgid "General Log Reading Configuration"
+msgstr ""
+
+msgid "Fast size calculations"
+msgstr ""
+
+msgid "Use name heuristics"
+msgstr ""
+
+#. Add Log Directory preferences.
+msgid "Log Directory"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "Log Reader"
+msgstr "Kichwa cha kushoto"
+
+#. *< name
+#. *< version
+#. * summary
+msgid "Includes other IM clients' logs in the log viewer."
+msgstr ""
+
+#. * description
+msgid ""
+"When viewing logs, this plugin will include logs from other IM clients. "
+"Currently, this includes Adium, MSN Messenger, and Trillian.\n"
+"\n"
+"WARNING: This plugin is still alpha code and may crash frequently.  Use it "
+"at your own risk!"
+msgstr ""
+
+msgid "Mono Plugin Loader"
+msgstr ""
+
+msgid "Loads .NET plugins with Mono."
+msgstr ""
+
+msgid "Add new line in IMs"
+msgstr ""
+
+msgid "Add new line in Chats"
+msgstr ""
+
+#. *< magic
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "New Line"
+msgstr "Dirisha jipya"
+
+#. *< name
+#. *< version
+msgid "Prepends a newline to displayed message."
+msgstr ""
+
+#. *< summary
+msgid ""
+"Prepends a newline to messages so that the rest of the message appears below "
+"the username in the conversation window."
+msgstr ""
+
+msgid "Offline Message Emulation"
+msgstr ""
+
+msgid "Save messages sent to an offline user as pounce."
+msgstr ""
+
+msgid ""
+"The rest of the messages will be saved as pounce. You can edit/delete the "
+"pounce from the `Buddy Pounce' dialog."
+msgstr ""
+
+#, c-format
+msgid ""
+"\"%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?"
+msgstr ""
+
+#, fuzzy
+msgid "Offline Message"
+msgstr "Hifadhi ya nje ya Mkondo"
+
+msgid "You can edit/delete the pounce from the `Buddy Pounces' dialog"
+msgstr ""
+
+msgid "Yes"
+msgstr "Ndiyo"
+
+msgid "No"
+msgstr "Hapana"
+
+msgid "Save offline messages in pounce"
+msgstr ""
+
+msgid "Do not ask. Always save in pounce."
+msgstr ""
+
+#, fuzzy
+msgid "One Time Password"
+msgstr "Ingiza Nywila Kuu"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "One Time Password Support"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Enforce that passwords are used only once."
+msgstr ""
+
+#. *  description
+msgid ""
+"Allows you to enforce on a per-account basis that passwords not being saved "
+"are only used in a single successful connection.\n"
+"Note: The account password must not be saved for this to work."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Perl Plugin Loader"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *< summary
+msgid "Provides support for loading perl plugins."
+msgstr ""
+
+msgid "Psychic Mode"
+msgstr ""
+
+msgid "Psychic mode for incoming conversation"
+msgstr ""
+
+msgid ""
+"Causes conversation windows to appear as other users begin to message you.  "
+"This works for AIM, ICQ, XMPP, Sametime, and Yahoo!"
+msgstr ""
+
+msgid "You feel a disturbance in the force..."
+msgstr ""
+
+msgid "Only enable for users on the buddy list"
+msgstr ""
+
+msgid "Disable when away"
+msgstr ""
+
+msgid "Display notification message in conversations"
+msgstr ""
+
+msgid "Raise psychic conversations"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Signals Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Test to see that all signals are working properly."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Simple Plugin"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Tests to see that most things are working."
+msgstr ""
+
+#. Scheme name
+#, fuzzy
+msgid "X.509 Certificates"
+msgstr "X.509 Ithibati (PEM)"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "GNUTLS"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides SSL support through GNUTLS."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "NSS"
+msgstr "RSS"
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides SSL support through Mozilla NSS."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "SSL"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides a wrapper around SSL support libraries."
+msgstr ""
+
+#, c-format
+msgid "%s is no longer away."
+msgstr ""
+
+#, c-format
+msgid "%s has gone away."
+msgstr ""
+
+#, c-format
+msgid "%s has become idle."
+msgstr ""
+
+#, c-format
+msgid "%s is no longer idle."
+msgstr ""
+
+#, c-format
+msgid "%s has signed on."
+msgstr ""
+
+msgid "Notify When"
+msgstr ""
+
+msgid "Buddy Goes _Away"
+msgstr ""
+
+msgid "Buddy Goes _Idle"
+msgstr ""
+
+msgid "Buddy _Signs On/Off"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy State Notification"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid ""
+"Notifies in a conversation window when a buddy goes or returns from away or "
+"idle."
+msgstr ""
+
+msgid "Tcl Plugin Loader"
+msgstr ""
+
+msgid "Provides support for loading Tcl plugins"
+msgstr ""
+
+msgid ""
+"Unable to detect ActiveTCL installation. If you wish to use TCL plugins, "
+"install ActiveTCL from http://www.activestate.com\n"
+msgstr ""
+
+msgid ""
+"The Apple Bonjour For Windows toolkit wasn't found, see the FAQ at: http://d."
+"pidgin.im/BonjourWindows for more information."
+msgstr ""
+
+msgid "Unable to listen for incoming IM connections\n"
+msgstr ""
+
+msgid ""
+"Unable to establish connection with the local mDNS server.  Is it running?"
+msgstr ""
+
+#, fuzzy
+msgid "First name"
+msgstr "Ukurasa wa kwanza"
+
+#, fuzzy
+msgid "Last name"
+msgstr "Ukurasa wa mwisho"
+
+msgid "Email"
+msgstr "Barua pepe"
+
+msgid "AIM Account"
+msgstr ""
+
+msgid "XMPP Account"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Bonjour Protocol Plugin"
+msgstr ""
+
+msgid "Purple Person"
+msgstr ""
+
+#. Creating the options for the protocol
+msgid "Local Port"
+msgstr ""
+
+msgid "Bonjour"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "%s has closed the conversation."
+msgstr "Mwenzi SSL imefunga uunganisho huu"
+
+msgid "Unable to send the message, the conversation couldn't be started."
+msgstr ""
+
+#, fuzzy
+msgid "Cannot open socket"
+msgstr "Haiwezi kufungua %S"
+
+msgid "Could not bind socket to port"
+msgstr ""
+
+msgid "Could not listen on socket"
+msgstr ""
+
+msgid "Error communicating with local mDNSResponder."
+msgstr ""
+
+msgid "Invalid proxy settings"
+msgstr ""
+
+msgid ""
+"Either the host name or port number specified for your given proxy type is "
+"invalid."
+msgstr ""
+
+#, fuzzy
+msgid "Token Error"
+msgstr "Hitilafu ya Faili"
+
+msgid "Unable to fetch the token.\n"
+msgstr ""
+
+msgid "Save Buddylist..."
+msgstr ""
+
+msgid "Your buddylist is empty, nothing was written to the file."
+msgstr ""
+
+msgid "Buddylist saved successfully!"
+msgstr ""
+
+#, c-format
+msgid "Couldn't write buddy list for %s to %s"
+msgstr ""
+
+msgid "Couldn't load buddylist"
+msgstr ""
+
+msgid "Load Buddylist..."
+msgstr ""
+
+msgid "Buddylist loaded successfully!"
+msgstr ""
+
+msgid "Save buddylist..."
+msgstr ""
+
+msgid "Load buddylist from file..."
+msgstr ""
+
+msgid "Fill in the registration fields."
+msgstr ""
+
+msgid "Passwords do not match."
+msgstr ""
+
+msgid "Unable to register new account. Error occurred.\n"
+msgstr ""
+
+msgid "New Gadu-Gadu Account Registered"
+msgstr ""
+
+#, fuzzy
+msgid "Registration completed successfully!"
+msgstr "Sakinisho limemaliza kikamilifu"
+
+msgid "Password"
+msgstr "Nywila"
+
+msgid "Password (retype)"
+msgstr ""
+
+msgid "Enter current token"
+msgstr ""
+
+msgid "Current token"
+msgstr ""
+
+msgid "Register New Gadu-Gadu Account"
+msgstr ""
+
+msgid "Please, fill in the following fields"
+msgstr ""
+
+msgid "City"
+msgstr ""
+
+msgid "Year of birth"
+msgstr ""
+
+#, fuzzy
+msgid "Gender"
+msgstr "Katikati"
+
+msgid "Male or female"
+msgstr ""
+
+#, fuzzy
+msgid "Male"
+msgstr "Mali"
+
+msgid "Female"
+msgstr ""
+
+#, fuzzy
+msgid "Only online"
+msgstr "Baki Mkondoni"
+
+#, fuzzy
+msgid "Find buddies"
+msgstr "Ta&futa Masasisho"
+
+msgid "Please, enter your search criteria below"
+msgstr ""
+
+msgid "Fill in the fields."
+msgstr ""
+
+msgid "Your current password is different from the one that you specified."
+msgstr ""
+
+msgid "Unable to change password. Error occurred.\n"
+msgstr ""
+
+msgid "Change password for the Gadu-Gadu account"
+msgstr ""
+
+msgid "Password was changed successfully!"
+msgstr ""
+
+#, fuzzy
+msgid "Current password"
+msgstr "Nywila ya sasa hivi:"
+
+msgid "Please, enter your current password and your new password for UIN: "
+msgstr ""
+
+#, fuzzy
+msgid "Change Gadu-Gadu Password"
+msgstr "Badilisha Nywila Kuu"
+
+#, c-format
+msgid "Select a chat for buddy: %s"
+msgstr ""
+
+msgid "Add to chat..."
+msgstr ""
+
+#. Global
+#, fuzzy
+msgid "Available"
+msgstr "Haipatikani"
+
+#. get_yahoo_status_from_purple_status() returns YAHOO_STATUS_CUSTOM for
+#. * the generic away state (YAHOO_STATUS_TYPE_AWAY) with no message
+#. Away stuff
+msgid "Away"
+msgstr ""
+
+#, fuzzy
+msgid "UIN"
+msgstr "UID"
+
+#, fuzzy
+msgid "First Name"
+msgstr "Ukurasa wa kwanza"
+
+msgid "Birth Year"
+msgstr ""
+
+msgid "Unable to display the search results."
+msgstr ""
+
+msgid "Gadu-Gadu Public Directory"
+msgstr ""
+
+msgid "Search results"
+msgstr "Tafuta matokeo"
+
+#, fuzzy
+msgid "No matching users found"
+msgstr "Hamna uwiyano sawa na CRL uliopatikana."
+
+msgid "There are no users matching your search criteria."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to read socket"
+msgstr "Haiwezi kuongeza moduli"
+
+msgid "Buddy list downloaded"
+msgstr ""
+
+msgid "Your buddy list was downloaded from the server."
+msgstr ""
+
+msgid "Buddy list uploaded"
+msgstr ""
+
+msgid "Your buddy list was stored on the server."
+msgstr ""
+
+#, fuzzy
+msgid "Connection failed."
+msgstr "Unganisho Limeshindikana"
+
+msgid "Add to chat"
+msgstr ""
+
+msgid "Chat _name:"
+msgstr ""
+
+#, fuzzy
+msgid "Chat error"
+msgstr "Kichamorro"
+
+msgid "This chat name is already in use"
+msgstr ""
+
+msgid "Not connected to the server."
+msgstr ""
+
+msgid "Find buddies..."
+msgstr ""
+
+#, fuzzy
+msgid "Change password..."
+msgstr "Badil &Nywila"
+
+msgid "Upload buddylist to Server"
+msgstr ""
+
+msgid "Download buddylist from Server"
+msgstr ""
+
+msgid "Delete buddylist from Server"
+msgstr ""
+
+msgid "Save buddylist to file..."
+msgstr ""
+
+#. magic
+#. major_version
+#. minor_version
+#. plugin type
+#. ui_requirement
+#. flags
+#. dependencies
+#. priority
+#. id
+#. name
+#. version
+msgid "Gadu-Gadu Protocol Plugin"
+msgstr ""
+
+#. summary
+msgid "Polish popular IM"
+msgstr ""
+
+msgid "Gadu-Gadu User"
+msgstr ""
+
+#, c-format
+msgid "Unknown command: %s"
+msgstr ""
+
+#, c-format
+msgid "current topic is: %s"
+msgstr ""
+
+#, fuzzy
+msgid "No topic is set"
+msgstr "Hakuna sifa zilizowekwa."
+
+msgid "File Transfer Failed"
+msgstr ""
+
+msgid "Could not open a listening port."
+msgstr ""
+
+msgid "Error displaying MOTD"
+msgstr ""
+
+#, fuzzy
+msgid "No MOTD available"
+msgstr "Haipatikani"
+
+msgid "There is no MOTD associated with this connection."
+msgstr ""
+
+#, c-format
+msgid "MOTD for %s"
+msgstr ""
+
+msgid "Server has disconnected"
+msgstr ""
+
+msgid "View MOTD"
+msgstr ""
+
+msgid "_Channel:"
+msgstr ""
+
+#, fuzzy
+msgid "_Password:"
+msgstr "Nywila:"
+
+msgid "IRC nicks may not contain whitespace"
+msgstr ""
+
+#. 1. connect to server
+#. connect to the server
+#, fuzzy
+msgid "Connecting"
+msgstr "Inaunganisha…"
+
+msgid "SSL support unavailable"
+msgstr ""
+
+msgid "Couldn't create socket"
+msgstr ""
+
+msgid "Couldn't connect to host"
+msgstr ""
+
+msgid "Read error"
+msgstr ""
+
+msgid "Users"
+msgstr ""
+
+msgid "Topic"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "IRC Protocol Plugin"
+msgstr ""
+
+#. *  summary
+msgid "The IRC Protocol Plugin that Sucks Less"
+msgstr ""
+
+#. host to connect to
+msgid "Server"
+msgstr "Seva"
+
+#. port to connect to
+#, fuzzy
+msgid "Port"
+msgstr "Lango:"
+
+#, fuzzy
+msgid "Encodings"
+msgstr "Kisimba:"
+
+msgid "Auto-detect incoming UTF-8"
+msgstr ""
+
+#, fuzzy
+msgid "Real name"
+msgstr "class name"
+
+#.
+#. option = purple_account_option_string_new(_("Quit message"), "quitmsg", IRC_DEFAULT_QUIT);
+#. prpl_info.protocol_options = g_list_append(prpl_info.protocol_options, option);
+#.
+#, fuzzy
+msgid "Use SSL"
+msgstr "Tumia %S"
+
+msgid "Bad mode"
+msgstr ""
+
+#, c-format
+msgid "Ban on %s by %s, set %s ago"
+msgstr ""
+
+#, c-format
+msgid "Ban on %s"
+msgstr ""
+
+msgid "End of ban list"
+msgstr ""
+
+#, c-format
+msgid "You are banned from %s."
+msgstr ""
+
+msgid "Banned"
+msgstr ""
+
+#, c-format
+msgid "Cannot ban %s: banlist is full"
+msgstr ""
+
+msgid " <i>(ircop)</i>"
+msgstr ""
+
+msgid " <i>(identified)</i>"
+msgstr ""
+
+#, fuzzy
+msgid "Nick"
+msgstr "Bofya"
+
+msgid "Currently on"
+msgstr ""
+
+msgid "Idle for"
+msgstr ""
+
+msgid "Online since"
+msgstr ""
+
+msgid "<b>Defining adjective:</b>"
+msgstr ""
+
+msgid "Glorious"
+msgstr ""
+
+#, c-format
+msgid "%s has changed the topic to: %s"
+msgstr ""
+
+#, c-format
+msgid "%s has cleared the topic."
+msgstr ""
+
+#, c-format
+msgid "The topic for %s is: %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown message '%s'"
+msgstr ""
+
+#, fuzzy
+msgid "Unknown message"
+msgstr "Ukubwa usiojulikana"
+
+msgid "The IRC server received a message it did not understand."
+msgstr ""
+
+#, c-format
+msgid "Users on %s: %s"
+msgstr ""
+
+msgid "Time Response"
+msgstr ""
+
+msgid "The IRC server's local time is:"
+msgstr ""
+
+msgid "No such channel"
+msgstr ""
+
+#. does this happen?
+msgid "no such channel"
+msgstr ""
+
+msgid "User is not logged in"
+msgstr ""
+
+msgid "No such nick or channel"
+msgstr ""
+
+#, fuzzy
+msgid "Could not send"
+msgstr "\"Haikuweza kupakia: \""
+
+#, c-format
+msgid "Joining %s requires an invitation."
+msgstr ""
+
+msgid "Invitation only"
+msgstr ""
+
+#, c-format
+msgid "You have been kicked by %s: (%s)"
+msgstr ""
+
+#. Remove user from channel
+#, c-format
+msgid "Kicked by %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "mode (%s %s) by %s"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid nickname"
+msgstr "Jina la profaili ni batili"
+
+msgid ""
+"Your selected nickname was rejected by the server.  It probably contains "
+"invalid characters."
+msgstr ""
+
+msgid ""
+"Your selected account name was rejected by the server.  It probably contains "
+"invalid characters."
+msgstr ""
+
+#. We only want to do the following dance if the connection
+#. has not been successfully completed.  If it has, just
+#. notify the user that their /nick command didn't go.
+#, c-format
+msgid "The nickname \"%s\" is already being used."
+msgstr ""
+
+msgid "Nickname in use"
+msgstr ""
+
+msgid "Cannot change nick"
+msgstr ""
+
+msgid "Could not change nick"
+msgstr ""
+
+#, c-format
+msgid "You have parted the channel%s%s"
+msgstr ""
+
+msgid "Error: invalid PONG from server"
+msgstr ""
+
+#, c-format
+msgid "PING reply -- Lag: %lu seconds"
+msgstr ""
+
+#, c-format
+msgid "Cannot join %s: Registration is required."
+msgstr ""
+
+msgid "Cannot join channel"
+msgstr ""
+
+msgid "Nick or channel is temporarily unavailable."
+msgstr ""
+
+#, c-format
+msgid "Wallops from %s"
+msgstr ""
+
+msgid "action &lt;action to perform&gt;:  Perform an action."
+msgstr ""
+
+msgid ""
+"away [message]:  Set an away message, or use no message to return from being "
+"away."
+msgstr ""
+
+msgid "ctcp <nick> <msg>: sends ctcp msg to nick."
+msgstr ""
+
+msgid "chanserv: Send a command to chanserv"
+msgstr ""
+
+msgid ""
+"deop &lt;nick1&gt; [nick2] ...:  Remove channel operator status from "
+"someone. You must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"devoice &lt;nick1&gt; [nick2] ...:  Remove channel voice status from "
+"someone, preventing them from speaking if the channel is moderated (+m). You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"invite &lt;nick&gt; [room]:  Invite someone to join you in the specified "
+"channel, or the current channel."
+msgstr ""
+
+msgid ""
+"j &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
+"channels, optionally providing a channel key for each if needed."
+msgstr ""
+
+msgid ""
+"join &lt;room1&gt;[,room2][,...] [key1[,key2][,...]]:  Enter one or more "
+"channels, optionally providing a channel key for each if needed."
+msgstr ""
+
+msgid ""
+"kick &lt;nick&gt; [message]:  Remove someone from a channel. You must be a "
+"channel operator to do this."
+msgstr ""
+
+msgid ""
+"list:  Display a list of chat rooms on the network. <i>Warning, some servers "
+"may disconnect you upon doing this.</i>"
+msgstr ""
+
+msgid "me &lt;action to perform&gt;:  Perform an action."
+msgstr ""
+
+msgid "memoserv: Send a command to memoserv"
+msgstr ""
+
+msgid ""
+"mode &lt;+|-&gt;&lt;A-Za-z&gt; &lt;nick|channel&gt;:  Set or unset a channel "
+"or user mode."
+msgstr ""
+
+msgid ""
+"msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
+"opposed to a channel)."
+msgstr ""
+
+msgid "names [channel]:  List the users currently in a channel."
+msgstr ""
+
+msgid "nick &lt;new nickname&gt;:  Change your nickname."
+msgstr ""
+
+msgid "nickserv: Send a command to nickserv"
+msgstr ""
+
+msgid "notice &lt;target&lt;:  Send a notice to a user or channel."
+msgstr ""
+
+msgid ""
+"op &lt;nick1&gt; [nick2] ...:  Grant channel operator status to someone. You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"operwall &lt;message&gt;:  If you don't know what this is, you probably "
+"can't use it."
+msgstr ""
+
+msgid "operserv: Send a command to operserv"
+msgstr ""
+
+msgid ""
+"part [room] [message]:  Leave the current channel, or a specified channel, "
+"with an optional message."
+msgstr ""
+
+msgid ""
+"ping [nick]:  Asks how much lag a user (or the server if no user specified) "
+"has."
+msgstr ""
+
+msgid ""
+"query &lt;nick&gt; &lt;message&gt;:  Send a private message to a user (as "
+"opposed to a channel)."
+msgstr ""
+
+msgid "quit [message]:  Disconnect from the server, with an optional message."
+msgstr ""
+
+msgid "quote [...]:  Send a raw command to the server."
+msgstr ""
+
+msgid ""
+"remove &lt;nick&gt; [message]:  Remove someone from a room. You must be a "
+"channel operator to do this."
+msgstr ""
+
+msgid "time: Displays the current local time at the IRC server."
+msgstr ""
+
+msgid "topic [new topic]:  View or change the channel topic."
+msgstr ""
+
+msgid "umode &lt;+|-&gt;&lt;A-Za-z&gt;:  Set or unset a user mode."
+msgstr ""
+
+msgid "version [nick]: send CTCP VERSION request to a user"
+msgstr ""
+
+msgid ""
+"voice &lt;nick1&gt; [nick2] ...:  Grant channel voice status to someone. You "
+"must be a channel operator to do this."
+msgstr ""
+
+msgid ""
+"wallops &lt;message&gt;:  If you don't know what this is, you probably can't "
+"use it."
+msgstr ""
+
+msgid "whois [server] &lt;nick&gt;:  Get information on a user."
+msgstr ""
+
+msgid "whowas &lt;nick&gt;: Get information on a user that has logged off."
+msgstr ""
+
+#, c-format
+msgid "Reply time from %s: %lu seconds"
+msgstr ""
+
+msgid "PONG"
+msgstr ""
+
+msgid "CTCP PING reply"
+msgstr ""
+
+msgid "Disconnected."
+msgstr ""
+
+msgid "Unknown Error"
+msgstr "Hitilafu isiyojulikana"
+
+msgid "Ad-Hoc Command Failed"
+msgstr ""
+
+msgid "execute"
+msgstr ""
+
+msgid "Server requires TLS/SSL for login.  No TLS/SSL support found."
+msgstr ""
+
+msgid "You require encryption, but no TLS/SSL support found."
+msgstr ""
+
+msgid "Server requires plaintext authentication over an unencrypted stream"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s requires plaintext authentication over an unencrypted connection.  Allow "
+"this and continue authentication?"
+msgstr ""
+
+#, fuzzy
+msgid "Plaintext Authentication"
+msgstr "Ishara ya Uthibitisho Inayoulindwa"
+
+#, fuzzy
+msgid "Invalid response from server."
+msgstr "Mwitiko wa bila kutegemea kutoka kwa seva"
+
+msgid "Server does not use any supported authentication method"
+msgstr ""
+
+msgid "You require encryption, but it is not available on this server."
+msgstr ""
+
+msgid "Invalid challenge from server"
+msgstr ""
+
+#, fuzzy
+msgid "SASL error"
+msgstr "SSL Seva"
+
+msgid "The BOSH connection manager terminated your session."
+msgstr ""
+
+msgid "No session ID given"
+msgstr ""
+
+#, fuzzy
+msgid "Unsupported version of BOSH protocol"
+msgstr "Kivunge kisichokubaliwa"
+
+#, fuzzy
+msgid "Unable to establish a connection with the server"
+msgstr "Firefox haiwezi kuzindua unganisho katika seva ya %S."
+
+#, fuzzy, c-format
+msgid ""
+"Could not establish a connection with the server:\n"
+"%s"
+msgstr "Firefox haiwezi kuzindua unganisho katika seva ya %S."
+
+#, fuzzy
+msgid "Unable to establish SSL connection"
+msgstr "Haikuweza kuunganishwa"
+
+#, fuzzy
+msgid "Unable to create socket"
+msgstr "Haikuweza kuunganishwa"
+
+#, fuzzy
+msgid "Write error"
+msgstr "Hitilafu ya Printa"
+
+#, fuzzy
+msgid "Full Name"
+msgstr "Jina la faili:"
+
+msgid "Family Name"
+msgstr ""
+
+msgid "Given Name"
+msgstr ""
+
+msgid "URL"
+msgstr "URL"
+
+msgid "Street Address"
+msgstr ""
+
+msgid "Extended Address"
+msgstr ""
+
+#, fuzzy
+msgid "Locality"
+msgstr "Mahali"
+
+#, fuzzy
+msgid "Region"
+msgstr "Reunion"
+
+msgid "Postal Code"
+msgstr ""
+
+#, fuzzy
+msgid "Country"
+msgstr "Hesabu"
+
+#. lots of clients (including purple) do this, but it's
+#. * out of spec
+msgid "Telephone"
+msgstr ""
+
+#, fuzzy
+msgid "Organization Name"
+msgstr "Jumuiya(J)"
+
+#, fuzzy
+msgid "Organization Unit"
+msgstr "Jumuiya(J)"
+
+msgid "Role"
+msgstr ""
+
+msgid "Birthday"
+msgstr ""
+
+msgid "Description"
+msgstr "Maelezo"
+
+msgid "Edit XMPP vCard"
+msgstr ""
+
+msgid ""
+"All items below are optional. Enter only the information with which you feel "
+"comfortable."
+msgstr ""
+
+msgid "Client"
+msgstr "Mteja"
+
+msgid "Operating System"
+msgstr ""
+
+#, fuzzy
+msgid "Local Time"
+msgstr "faili la kikweti"
+
+msgid "Last Activity"
+msgstr ""
+
+msgid "Service Discovery Info"
+msgstr ""
+
+msgid "Service Discovery Items"
+msgstr ""
+
+msgid "Extended Stanza Addressing"
+msgstr ""
+
+msgid "Multi-User Chat"
+msgstr ""
+
+msgid "Multi-User Chat Extended Presence Information"
+msgstr ""
+
+msgid "In-Band Bytestreams"
+msgstr ""
+
+msgid "Ad-Hoc Commands"
+msgstr ""
+
+msgid "PubSub Service"
+msgstr ""
+
+msgid "SOCKS5 Bytestreams"
+msgstr ""
+
+msgid "Out of Band Data"
+msgstr ""
+
+msgid "XHTML-IM"
+msgstr ""
+
+msgid "In-Band Registration"
+msgstr ""
+
+#, fuzzy
+msgid "User Location"
+msgstr "Mapali pa &Tawanyiko:"
+
+msgid "User Avatar"
+msgstr ""
+
+msgid "Chat State Notifications"
+msgstr ""
+
+msgid "Software Version"
+msgstr ""
+
+msgid "Stream Initiation"
+msgstr ""
+
+msgid "File Transfer"
+msgstr ""
+
+msgid "User Mood"
+msgstr ""
+
+msgid "User Activity"
+msgstr ""
+
+msgid "Entity Capabilities"
+msgstr ""
+
+msgid "Encrypted Session Negotiations"
+msgstr ""
+
+#, fuzzy
+msgid "User Tune"
+msgstr "Jina la Mtumiaji:"
+
+msgid "Roster Item Exchange"
+msgstr ""
+
+msgid "Reachability Address"
+msgstr ""
+
+#, fuzzy
+msgid "User Profile"
+msgstr "Notisi za Mtumiaji"
+
+msgid "Jingle"
+msgstr ""
+
+msgid "Jingle Audio"
+msgstr ""
+
+#, fuzzy
+msgid "User Nickname"
+msgstr "Jina la mtumiaji"
+
+msgid "Jingle ICE UDP"
+msgstr ""
+
+msgid "Jingle ICE TCP"
+msgstr ""
+
+msgid "Jingle Raw UDP"
+msgstr ""
+
+msgid "Jingle Video"
+msgstr ""
+
+msgid "Jingle DTMF"
+msgstr ""
+
+msgid "Message Receipts"
+msgstr ""
+
+msgid "Public Key Publishing"
+msgstr ""
+
+msgid "User Chatting"
+msgstr ""
+
+#, fuzzy
+msgid "User Browsing"
+msgstr "Kuvinjari kwa kareti"
+
+#, fuzzy
+msgid "User Gaming"
+msgstr "Jina la Mtumiaji:"
+
+msgid "User Viewing"
+msgstr ""
+
+#, fuzzy
+msgid "Ping"
+msgstr "Chapisha"
+
+msgid "Stanza Encryption"
+msgstr ""
+
+msgid "Entity Time"
+msgstr ""
+
+msgid "Delayed Delivery"
+msgstr ""
+
+msgid "Collaborative Data Objects"
+msgstr ""
+
+msgid "File Repository and Sharing"
+msgstr ""
+
+msgid "STUN Service Discovery for Jingle"
+msgstr ""
+
+msgid "Simplified Encrypted Session Negotiation"
+msgstr ""
+
+#, fuzzy
+msgid "Hop Check"
+msgstr "Usikague"
+
+msgid "Capabilities"
+msgstr ""
+
+msgid "Priority"
+msgstr ""
+
+#, fuzzy
+msgid "Resource"
+msgstr "#1 rasilimali"
+
+#, c-format
+msgid "%s ago"
+msgstr ""
+
+#, fuzzy
+msgid "Logged off"
+msgstr "Ingia"
+
+#, fuzzy
+msgid "Middle Name"
+msgstr "Jina la Moduli:"
+
+msgid "Address"
+msgstr "Anuani"
+
+msgid "P.O. Box"
+msgstr ""
+
+msgid "Photo"
+msgstr ""
+
+#, fuzzy
+msgid "Logo"
+msgstr "Togo"
+
+msgid "Un-hide From"
+msgstr ""
+
+msgid "Temporarily Hide From"
+msgstr ""
+
+#. && NOT ME
+msgid "Cancel Presence Notification"
+msgstr ""
+
+msgid "(Re-)Request authorization"
+msgstr ""
+
+#. if(NOT ME)
+#. shouldn't this just happen automatically when the buddy is
+#. removed?
+#, fuzzy
+msgid "Unsubscribe"
+msgstr "Jiunge"
+
+#, fuzzy
+msgid "Log In"
+msgstr "I&ngia"
+
+#, fuzzy
+msgid "Log Out"
+msgstr "O&ndoka"
+
+msgid "Chatty"
+msgstr ""
+
+msgid "Extended Away"
+msgstr ""
+
+msgid "Do Not Disturb"
+msgstr ""
+
+#, fuzzy
+msgid "JID"
+msgstr "UID"
+
+#, fuzzy
+msgid "Last Name"
+msgstr "Ukurasa wa mwisho"
+
+#, fuzzy
+msgid "The following are the results of your search"
+msgstr "Kuki zifuatazo zinalingana na unazotafuta:"
+
+#. current comment from Jabber User Directory users.jabber.org
+msgid ""
+"Find a contact by entering the search criteria in the given fields. Note: "
+"Each field supports wild card searches (%)"
+msgstr ""
+
+msgid "Directory Query Failed"
+msgstr ""
+
+msgid "Could not query the directory server."
+msgstr ""
+
+#. Try to translate the message (see static message
+#. list in jabber_user_dir_comments[])
+#, c-format
+msgid "Server Instructions: %s"
+msgstr ""
+
+msgid "Fill in one or more fields to search for any matching XMPP users."
+msgstr ""
+
+msgid "Email Address"
+msgstr "Anwani ya Barua pepe"
+
+msgid "Search for XMPP users"
+msgstr ""
+
+#. "Search"
+msgid "Search"
+msgstr "Tafuta"
+
+msgid "Invalid Directory"
+msgstr ""
+
+msgid "Enter a User Directory"
+msgstr ""
+
+msgid "Select a user directory to search"
+msgstr ""
+
+#, fuzzy
+msgid "Search Directory"
+msgstr "Tafuta historia"
+
+msgid "_Room:"
+msgstr ""
+
+#, fuzzy
+msgid "_Server:"
+msgstr "Seva"
+
+msgid "_Handle:"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid room name"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid Room Name"
+msgstr "Jina batili la moduli."
+
+#, c-format
+msgid "%s is not a valid server name"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid Server Name"
+msgstr "Jina batili la moduli."
+
+#, c-format
+msgid "%s is not a valid room handle"
+msgstr ""
+
+msgid "Invalid Room Handle"
+msgstr ""
+
+#, fuzzy
+msgid "Configuration error"
+msgstr "Hitilafu ya Sanidi"
+
+#, fuzzy
+msgid "Unable to configure"
+msgstr "Haikuweza kuunganishwa"
+
+#, fuzzy
+msgid "Room Configuration Error"
+msgstr "Hitilafu ya Sanidi"
+
+msgid "This room is not capable of being configured"
+msgstr ""
+
+#, fuzzy
+msgid "Registration error"
+msgstr "Hitilafu ya Sanidi"
+
+msgid "Nick changing not supported in non-MUC chatrooms"
+msgstr ""
+
+msgid "Error retrieving room list"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid Server"
+msgstr "Anuani batili"
+
+msgid "Enter a Conference Server"
+msgstr ""
+
+msgid "Select a conference server to query"
+msgstr ""
+
+msgid "Find Rooms"
+msgstr ""
+
+#, fuzzy
+msgid "Affiliations:"
+msgstr "Machaguo"
+
+#, fuzzy
+msgid "No users found"
+msgstr "Hamna uwiyano sawa na CRL uliopatikana."
+
+msgid "Roles:"
+msgstr ""
+
+msgid "Ping timeout"
+msgstr ""
+
+#, fuzzy
+msgid "Read Error"
+msgstr "Hitilafu ya Faili"
+
+#, c-format
+msgid ""
+"Could not find alternative XMPP connection methods after failing to connect "
+"directly.\n"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid XMPP ID"
+msgstr "Kizuizi batili"
+
+msgid "Invalid XMPP ID. Domain must be set."
+msgstr ""
+
+msgid "Malformed BOSH Connect Server"
+msgstr ""
+
+#, c-format
+msgid "Registration of %s@%s successful"
+msgstr ""
+
+#, c-format
+msgid "Registration to %s successful"
+msgstr ""
+
+msgid "Registration Successful"
+msgstr ""
+
+#, fuzzy
+msgid "Registration Failed"
+msgstr "Usajili wa Chrome Umeshindikana"
+
+#, c-format
+msgid "Registration from %s successfully removed"
+msgstr ""
+
+msgid "Unregistration Successful"
+msgstr ""
+
+#, fuzzy
+msgid "Unregistration Failed"
+msgstr "Usajili wa Chrome Umeshindikana"
+
+#, fuzzy
+msgid "Already Registered"
+msgstr "Ipo"
+
+msgid "State"
+msgstr "Hali"
+
+msgid "Postal code"
+msgstr ""
+
+#, fuzzy
+msgid "Phone"
+msgstr "Bila"
+
+#, fuzzy
+msgid "Date"
+msgstr "Tarehe:"
+
+msgid "Unregister"
+msgstr ""
+
+msgid ""
+"Please fill out the information below to change your account registration."
+msgstr ""
+
+msgid "Please fill out the information below to register your new account."
+msgstr ""
+
+msgid "Register New XMPP Account"
+msgstr ""
+
+#, fuzzy
+msgid "Register"
+msgstr "Mwandishi wa habari"
+
+#, c-format
+msgid "Change Account Registration at %s"
+msgstr ""
+
+#, c-format
+msgid "Register New Account at %s"
+msgstr ""
+
+#, fuzzy
+msgid "Change Registration"
+msgstr "Usajili wa Chrome Umeshindikana"
+
+#, fuzzy
+msgid "Error unregistering account"
+msgstr "Hitilafu katika kusajili DLL"
+
+msgid "Account successfully unregistered"
+msgstr ""
+
+msgid "Initializing Stream"
+msgstr ""
+
+msgid "Initializing SSL/TLS"
+msgstr ""
+
+msgid "Authenticating"
+msgstr ""
+
+msgid "Re-initializing Stream"
+msgstr ""
+
+msgid "Server doesn't support blocking"
+msgstr ""
+
+msgid "Not Authorized"
+msgstr ""
+
+msgid "Mood"
+msgstr ""
+
+msgid "Now Listening"
+msgstr ""
+
+msgid "Both"
+msgstr ""
+
+msgid "From (To pending)"
+msgstr ""
+
+#, fuzzy
+msgid "From"
+msgstr "kutoka"
+
+#, fuzzy
+msgid "To"
+msgstr "Kwa:"
+
+msgid "None (To pending)"
+msgstr ""
+
+msgid "None"
+msgstr "Bila"
+
+#, fuzzy
+msgid "Subscription"
+msgstr "Maelezo"
+
+msgid "Mood Text"
+msgstr ""
+
+msgid "Allow Buzz"
+msgstr ""
+
+msgid "Tune Artist"
+msgstr ""
+
+#, fuzzy
+msgid "Tune Title"
+msgstr "Mada Fupi"
+
+msgid "Tune Album"
+msgstr ""
+
+msgid "Tune Genre"
+msgstr ""
+
+msgid "Tune Comment"
+msgstr ""
+
+msgid "Tune Track"
+msgstr ""
+
+msgid "Tune Time"
+msgstr ""
+
+msgid "Tune Year"
+msgstr ""
+
+msgid "Tune URL"
+msgstr ""
+
+#, fuzzy
+msgid "Password Changed"
+msgstr "Badilisho la Nywila limeshindikana"
+
+#, fuzzy
+msgid "Your password has been changed."
+msgstr "Nywila yako imesetiwa upya."
+
+msgid "Error changing password"
+msgstr ""
+
+#, fuzzy
+msgid "Password (again)"
+msgstr "Nywila mpya (tena):"
+
+#, fuzzy
+msgid "Change XMPP Password"
+msgstr "Badil &Nywila"
+
+msgid "Please enter your new password"
+msgstr ""
+
+msgid "Set User Info..."
+msgstr ""
+
+#. if (js->protocol_options & CHANGE_PASSWORD) {
+#, fuzzy
+msgid "Change Password..."
+msgstr "Badil &Nywila"
+
+#. }
+msgid "Search for Users..."
+msgstr ""
+
+msgid "Bad Request"
+msgstr ""
+
+#, fuzzy
+msgid "Conflict"
+msgstr "Thibitisha"
+
+msgid "Feature Not Implemented"
+msgstr ""
+
+msgid "Forbidden"
+msgstr ""
+
+#, fuzzy
+msgid "Gone"
+msgstr "Bila"
+
+#, fuzzy
+msgid "Internal Server Error"
+msgstr "Hitilafu ya ndani ya seva (500)"
+
+#, fuzzy
+msgid "Item Not Found"
+msgstr "Faili halipatikani"
+
+msgid "Malformed XMPP ID"
+msgstr ""
+
+#, fuzzy
+msgid "Not Acceptable"
+msgstr "Haipatikani"
+
+msgid "Not Allowed"
+msgstr ""
+
+#, fuzzy
+msgid "Payment Required"
+msgstr "Nywila inatakiwa"
+
+msgid "Recipient Unavailable"
+msgstr ""
+
+#, fuzzy
+msgid "Registration Required"
+msgstr "Uthibitisho unatakiwa"
+
+#, fuzzy
+msgid "Remote Server Not Found"
+msgstr "Wakala kompyuta tumishi hapatikani"
+
+msgid "Remote Server Timeout"
+msgstr ""
+
+msgid "Server Overloaded"
+msgstr ""
+
+msgid "Service Unavailable"
+msgstr ""
+
+#, fuzzy
+msgid "Subscription Required"
+msgstr "Uthibitisho unatakiwa"
+
+msgid "Unexpected Request"
+msgstr ""
+
+#, fuzzy
+msgid "Authorization Aborted"
+msgstr "Sainisho limetibuliwa"
+
+msgid "Incorrect encoding in authorization"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid authzid"
+msgstr "Njia batili"
+
+msgid "Invalid Authorization Mechanism"
+msgstr ""
+
+msgid "Authorization mechanism too weak"
+msgstr ""
+
+msgid "Temporary Authentication Failure"
+msgstr ""
+
+#, fuzzy
+msgid "Authentication Failure"
+msgstr "Uthibitisho unatakiwa"
+
+#, fuzzy
+msgid "Bad Format"
+msgstr "Fomati"
+
+msgid "Bad Namespace Prefix"
+msgstr ""
+
+msgid "Resource Conflict"
+msgstr ""
+
+#, fuzzy
+msgid "Connection Timeout"
+msgstr "Muunganiko umepita muda"
+
+msgid "Host Gone"
+msgstr ""
+
+msgid "Host Unknown"
+msgstr ""
+
+msgid "Improper Addressing"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid ID"
+msgstr "Kizuizi batili"
+
+msgid "Invalid Namespace"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid XML"
+msgstr "Kizuizi batili"
+
+msgid "Non-matching Hosts"
+msgstr ""
+
+msgid "Policy Violation"
+msgstr ""
+
+#, fuzzy
+msgid "Remote Connection Failed"
+msgstr "Muunganiko salama umeshindikana"
+
+msgid "Resource Constraint"
+msgstr ""
+
+msgid "Restricted XML"
+msgstr ""
+
+msgid "See Other Host"
+msgstr ""
+
+msgid "System Shutdown"
+msgstr ""
+
+#, fuzzy
+msgid "Undefined Condition"
+msgstr "kitu ambacho hakijafafanuliwa"
+
+#, fuzzy
+msgid "Unsupported Encoding"
+msgstr "Kivunge kisichokubaliwa"
+
+#, fuzzy
+msgid "Unsupported Stanza Type"
+msgstr "Kivunge kisichokubaliwa"
+
+#, fuzzy
+msgid "Unsupported Version"
+msgstr "Kivunge kisichokubaliwa"
+
+msgid "XML Not Well Formed"
+msgstr ""
+
+msgid "Stream Error"
+msgstr ""
+
+#, c-format
+msgid "Unable to ban user %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown affiliation: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unable to affiliate user %s as \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unknown role: \"%s\""
+msgstr ""
+
+#, c-format
+msgid "Unable to set role \"%s\" for user: %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to kick user %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to ping user %s"
+msgstr ""
+
+#, c-format
+msgid "Unable to buzz, because there is nothing known about %s."
+msgstr ""
+
+#, c-format
+msgid "Unable to buzz, because %s might be offline."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to buzz, because %s does not support it or does not wish to receive "
+"buzzes now."
+msgstr ""
+
+#, c-format
+msgid "Buzzing %s..."
+msgstr ""
+
+#. Yahoo only supports one attention command: the 'buzz'.
+#. This is index number YAHOO_BUZZ.
+msgid "Buzz"
+msgstr ""
+
+#, c-format
+msgid "%s has buzzed you!"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: invalid JID"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: user is not online"
+msgstr ""
+
+#, c-format
+msgid "Unable to initiate media with %s: not subscribed to user presence"
+msgstr ""
+
+msgid "Media Initiation Failed"
+msgstr ""
+
+#, c-format
+msgid ""
+"Please select the resource of %s with which you would like to start a media "
+"session."
+msgstr ""
+
+msgid "Select a Resource"
+msgstr ""
+
+msgid "Initiate Media"
+msgstr ""
+
+msgid "config:  Configure a chat room."
+msgstr ""
+
+msgid "configure:  Configure a chat room."
+msgstr ""
+
+msgid "part [room]:  Leave the room."
+msgstr ""
+
+msgid "register:  Register with a chat room."
+msgstr ""
+
+msgid "topic [new topic]:  View or change the topic."
+msgstr ""
+
+msgid "ban &lt;user&gt; [reason]:  Ban a user from the room."
+msgstr ""
+
+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 ""
+
+msgid ""
+"role &lt;moderator|participant|visitor|none&gt; [nick1] [nick2] ...: Get the "
+"users with an role or set users' role with the room."
+msgstr ""
+
+msgid "invite &lt;user&gt; [message]:  Invite a user to the room."
+msgstr ""
+
+msgid "join: &lt;room&gt; [password]:  Join a chat on this server."
+msgstr ""
+
+msgid "kick &lt;user&gt; [reason]:  Kick a user from the room."
+msgstr ""
+
+msgid ""
+"msg &lt;user&gt; &lt;message&gt;:  Send a private message to another user."
+msgstr ""
+
+msgid "ping &lt;jid&gt;:\tPing a user/component/server."
+msgstr ""
+
+msgid "buzz: Buzz a user to get their attention"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "XMPP Protocol Plugin"
+msgstr ""
+
+#. Translators: 'domain' is used here in the context of Internet domains, e.g. pidgin.im
+#, fuzzy
+msgid "Domain"
+msgstr "Kikoa:"
+
+msgid "Require SSL/TLS"
+msgstr ""
+
+msgid "Force old (port 5223) SSL"
+msgstr ""
+
+msgid "Allow plaintext auth over unencrypted streams"
+msgstr ""
+
+#, fuzzy
+msgid "Connect port"
+msgstr "Unganisho"
+
+#. TODO: default to automatically try different ports. Make the user be
+#. * able to set the first port to try (like LastConnectedPort in Windows client).
+#. Account options
+msgid "Connect server"
+msgstr ""
+
+msgid "File transfer proxies"
+msgstr ""
+
+#. this should probably be part of global smiley theme settings later on,
+#. shared with MSN
+msgid "Show Custom Smileys"
+msgstr ""
+
+#, c-format
+msgid "%s has left the conversation."
+msgstr ""
+
+#, c-format
+msgid "Message from %s"
+msgstr ""
+
+#, c-format
+msgid "%s has set the topic to: %s"
+msgstr ""
+
+#, c-format
+msgid "The topic is: %s"
+msgstr ""
+
+#, c-format
+msgid "Message delivery to %s failed: %s"
+msgstr ""
+
+msgid "XMPP Message Error"
+msgstr ""
+
+#, c-format
+msgid "(Code %s)"
+msgstr ""
+
+msgid "XML Parse error"
+msgstr ""
+
+msgid "Unknown Error in presence"
+msgstr ""
+
+msgid "Create New Room"
+msgstr ""
+
+msgid ""
+"You are creating a new room.  Would you like to configure it, or accept the "
+"default settings?"
+msgstr ""
+
+msgid "_Configure Room"
+msgstr ""
+
+#, fuzzy
+msgid "_Accept Defaults"
+msgstr "Misingi ya mfumo"
+
+#, c-format
+msgid "Error joining chat %s"
+msgstr ""
+
+#, c-format
+msgid "Error in chat %s"
+msgstr ""
+
+msgid "An error occured on the in-band bytestream transfer\n"
+msgstr ""
+
+msgid "Transfer was closed."
+msgstr ""
+
+msgid "Failed to open the file"
+msgstr ""
+
+msgid "Failed to open in-band bytestream"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, user does not support file transfers"
+msgstr ""
+
+msgid "File Send Failed"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, invalid JID"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, user is not online"
+msgstr ""
+
+#, c-format
+msgid "Unable to send file to %s, not subscribed to user presence"
+msgstr ""
+
+#, c-format
+msgid "Please select the resource of %s to which you would like to send a file"
+msgstr ""
+
+msgid "Edit User Mood"
+msgstr ""
+
+msgid "Please select your mood from the list."
+msgstr ""
+
+#, fuzzy
+msgid "Set"
+msgstr "Sep"
+
+msgid "Set Mood..."
+msgstr ""
+
+msgid "Set User Nickname"
+msgstr ""
+
+msgid "Please specify a new nickname for you."
+msgstr ""
+
+msgid ""
+"This information is visible to all contacts on your contact list, so choose "
+"something appropriate."
+msgstr ""
+
+msgid "Set Nickname..."
+msgstr ""
+
+#, fuzzy
+msgid "Actions"
+msgstr "Machaguo"
+
+msgid "Select an action"
+msgstr ""
+
+#. only notify the user about problems adding to the friends list
+#. * maybe we should do something else for other lists, but it probably
+#. * won't cause too many problems if we just ignore it
+#, fuzzy, c-format
+msgid "Unable to add \"%s\"."
+msgstr "Haiwezi kuongeza moduli"
+
+msgid "Buddy Add error"
+msgstr ""
+
+msgid "The username specified does not exist."
+msgstr ""
+
+#, c-format
+msgid "Buddy list synchronization issue in %s (%s)"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s on the local list is inside the group \"%s\" but not on the server list. "
+"Do you want this buddy to be added?"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s is on the local list but not on the server list. Do you want this buddy "
+"to be added?"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unable to parse message"
+msgstr "Haiwezi kuongeza moduli"
+
+#, c-format
+msgid "Syntax Error (probably a client bug)"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Invalid email address"
+msgstr "Anuani batili"
+
+#, fuzzy, c-format
+msgid "User does not exist"
+msgstr "Faili %S halipo"
+
+#, c-format
+msgid "Fully qualified domain name missing"
+msgstr ""
+
+#, c-format
+msgid "Already logged in"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Invalid username"
+msgstr "Jina batili la moduli."
+
+#, fuzzy, c-format
+msgid "Invalid friendly name"
+msgstr "Jina la profaili ni batili"
+
+#, c-format
+msgid "List full"
+msgstr ""
+
+#, c-format
+msgid "Already there"
+msgstr ""
+
+#, c-format
+msgid "Not on list"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "User is offline"
+msgstr "Fanya &kazi nje ya mkondo"
+
+#, c-format
+msgid "Already in the mode"
+msgstr ""
+
+#, c-format
+msgid "Already in opposite list"
+msgstr ""
+
+#, c-format
+msgid "Too many groups"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Invalid group"
+msgstr "Ingizo batili"
+
+#, c-format
+msgid "User not in group"
+msgstr ""
+
+#, c-format
+msgid "Group name too long"
+msgstr ""
+
+#, c-format
+msgid "Cannot remove group zero"
+msgstr ""
+
+#, c-format
+msgid "Tried to add a user to a group that doesn't exist"
+msgstr ""
+
+#, c-format
+msgid "Switchboard failed"
+msgstr ""
+
+#, c-format
+msgid "Notify transfer failed"
+msgstr ""
+
+#, c-format
+msgid "Required fields missing"
+msgstr ""
+
+#, c-format
+msgid "Too many hits to a FND"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Not logged in"
+msgstr "Hajaingia"
+
+#, c-format
+msgid "Service temporarily unavailable"
+msgstr ""
+
+#, c-format
+msgid "Database server error"
+msgstr ""
+
+#, c-format
+msgid "Command disabled"
+msgstr ""
+
+#, c-format
+msgid "File operation error"
+msgstr ""
+
+#, c-format
+msgid "Memory allocation error"
+msgstr ""
+
+#, c-format
+msgid "Wrong CHL value sent to server"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Server busy"
+msgstr "Seva"
+
+#, c-format
+msgid "Server unavailable"
+msgstr ""
+
+#, c-format
+msgid "Peer notification server down"
+msgstr ""
+
+#, c-format
+msgid "Database connect error"
+msgstr ""
+
+#, c-format
+msgid "Server is going down (abandon ship)"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error creating connection"
+msgstr "Hitilafu kwenye utengenezaji wa saraka:"
+
+#, c-format
+msgid "CVR parameters are either unknown or not allowed"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unable to write"
+msgstr "Nimeshindwa Kusasisha"
+
+#, c-format
+msgid "Session overload"
+msgstr ""
+
+#, c-format
+msgid "User is too active"
+msgstr ""
+
+#, c-format
+msgid "Too many sessions"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Passport not verified"
+msgstr "(Mwandishi hajathibitishwa)"
+
+#, c-format
+msgid "Bad friend file"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Not expected"
+msgstr "Hakuna iliyochaguliwa"
+
+#, c-format
+msgid "Friendly name changes too rapidly"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Server too busy"
+msgstr "Seva haipatikani"
+
+#, fuzzy, c-format
+msgid "Authentication failed"
+msgstr "Uthibitisho unatakiwa"
+
+#, c-format
+msgid "Not allowed when offline"
+msgstr ""
+
+#, c-format
+msgid "Not accepting new users"
+msgstr ""
+
+#, c-format
+msgid "Kids Passport without parental consent"
+msgstr ""
+
+#, c-format
+msgid "Passport account not yet verified"
+msgstr ""
+
+msgid "Passport account suspended"
+msgstr ""
+
+#, c-format
+msgid "Bad ticket"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unknown Error Code %d"
+msgstr "Hitilafu isiyojulikana"
+
+#, c-format
+msgid "MSN Error: %s\n"
+msgstr ""
+
+#, fuzzy
+msgid "Other Contacts"
+msgstr "Lugha nyinginezo"
+
+msgid "Non-IM Contacts"
+msgstr ""
+
+msgid "Nudge"
+msgstr ""
+
+#, c-format
+msgid "%s has nudged you!"
+msgstr ""
+
+#, c-format
+msgid "Nudging %s..."
+msgstr ""
+
+#, fuzzy
+msgid "Email Address..."
+msgstr "Anwani ya Barua pepe"
+
+msgid "Your new MSN friendly name is too long."
+msgstr ""
+
+msgid "Set your friendly name."
+msgstr ""
+
+msgid "This is the name that other MSN buddies will see you as."
+msgstr ""
+
+msgid "Set your home phone number."
+msgstr ""
+
+msgid "Set your work phone number."
+msgstr ""
+
+msgid "Set your mobile phone number."
+msgstr ""
+
+msgid "Allow MSN Mobile pages?"
+msgstr ""
+
+msgid ""
+"Do you want to allow or disallow people on your buddy list to send you MSN "
+"Mobile pages to your cell phone or other mobile device?"
+msgstr ""
+
+msgid "Allow"
+msgstr "Ruhusu"
+
+#, fuzzy
+msgid "Disallow"
+msgstr "Lemaza"
+
+#, c-format
+msgid "Blocked Text for %s"
+msgstr ""
+
+msgid "No text is blocked for this account."
+msgstr ""
+
+#, c-format
+msgid ""
+"MSN servers are currently blocking the following regular expressions:<br/>%s"
+msgstr ""
+
+msgid "This account does not have email enabled."
+msgstr ""
+
+msgid "Send a mobile message."
+msgstr ""
+
+#, fuzzy
+msgid "Page"
+msgstr "Ukurasa wa #"
+
+msgid "Playing a game"
+msgstr ""
+
+#, fuzzy
+msgid "Working"
+msgstr "Tahadhari:"
+
+msgid "Has you"
+msgstr ""
+
+msgid "Home Phone Number"
+msgstr ""
+
+msgid "Work Phone Number"
+msgstr ""
+
+msgid "Mobile Phone Number"
+msgstr ""
+
+msgid "Be Right Back"
+msgstr ""
+
+msgid "Busy"
+msgstr ""
+
+msgid "On the Phone"
+msgstr ""
+
+msgid "Out to Lunch"
+msgstr ""
+
+#. primitive
+#. ID
+#. name - use default
+#. saveable
+#. should be user_settable some day
+#. independent
+msgid "Artist"
+msgstr ""
+
+msgid "Album"
+msgstr ""
+
+#, fuzzy
+msgid "Game Title"
+msgstr "Mada Fupi"
+
+msgid "Office Title"
+msgstr ""
+
+msgid "Set Friendly Name..."
+msgstr ""
+
+msgid "Set Home Phone Number..."
+msgstr ""
+
+msgid "Set Work Phone Number..."
+msgstr ""
+
+msgid "Set Mobile Phone Number..."
+msgstr ""
+
+msgid "Enable/Disable Mobile Devices..."
+msgstr ""
+
+msgid "Allow/Disallow Mobile Pages..."
+msgstr ""
+
+msgid "View Blocked Text..."
+msgstr ""
+
+msgid "Open Hotmail Inbox"
+msgstr ""
+
+msgid "Send to Mobile"
+msgstr ""
+
+msgid "Initiate _Chat"
+msgstr ""
+
+msgid "SSL support is needed for MSN. Please install a supported SSL library."
+msgstr ""
+
+msgid "Failed to connect to server."
+msgstr ""
+
+msgid "Error retrieving profile"
+msgstr ""
+
+msgid "General"
+msgstr "Ujumla"
+
+msgid "Age"
+msgstr ""
+
+#, fuzzy
+msgid "Occupation"
+msgstr "Mahali"
+
+msgid "Location"
+msgstr "Mahali"
+
+msgid "Hobbies and Interests"
+msgstr ""
+
+msgid "A Little About Me"
+msgstr ""
+
+msgid "Social"
+msgstr ""
+
+msgid "Marital Status"
+msgstr ""
+
+msgid "Interests"
+msgstr ""
+
+#, fuzzy
+msgid "Pets"
+msgstr "Bonyeza"
+
+msgid "Hometown"
+msgstr ""
+
+msgid "Places Lived"
+msgstr ""
+
+msgid "Fashion"
+msgstr ""
+
+msgid "Humor"
+msgstr ""
+
+msgid "Music"
+msgstr ""
+
+msgid "Favorite Quote"
+msgstr ""
+
+msgid "Contact Info"
+msgstr ""
+
+#, fuzzy
+msgid "Personal"
+msgstr "Kipersia"
+
+msgid "Significant Other"
+msgstr ""
+
+msgid "Home Phone"
+msgstr ""
+
+msgid "Home Phone 2"
+msgstr ""
+
+#, fuzzy
+msgid "Home Address"
+msgstr "Anwani-IP"
+
+msgid "Personal Mobile"
+msgstr ""
+
+msgid "Home Fax"
+msgstr ""
+
+msgid "Personal Email"
+msgstr ""
+
+msgid "Personal IM"
+msgstr ""
+
+#, fuzzy
+msgid "Anniversary"
+msgstr "Universal"
+
+#. Business
+msgid "Work"
+msgstr ""
+
+#, fuzzy
+msgid "Job Title"
+msgstr "Cheo cha &kazi:"
+
+msgid "Company"
+msgstr ""
+
+msgid "Department"
+msgstr ""
+
+msgid "Profession"
+msgstr ""
+
+msgid "Work Phone"
+msgstr ""
+
+msgid "Work Phone 2"
+msgstr ""
+
+#, fuzzy
+msgid "Work Address"
+msgstr "Anwani-IP"
+
+msgid "Work Mobile"
+msgstr ""
+
+msgid "Work Pager"
+msgstr ""
+
+msgid "Work Fax"
+msgstr ""
+
+msgid "Work Email"
+msgstr ""
+
+msgid "Work IM"
+msgstr ""
+
+#, fuzzy
+msgid "Start Date"
+msgstr "Anzisha Upya Baadae"
+
+#, fuzzy
+msgid "Favorite Things"
+msgstr "Vibwedo"
+
+#, fuzzy
+msgid "Last Updated"
+msgstr "Sasisho la mara ya mwisho"
+
+#, fuzzy
+msgid "Homepage"
+msgstr "Ukurasa wa &Nyumbani:"
+
+msgid "The user has not created a public profile."
+msgstr ""
+
+msgid ""
+"MSN reported not being able to find the user's profile. This either means "
+"that the user does not exist, or that the user exists but has not created a "
+"public profile."
+msgstr ""
+
+msgid ""
+"Could not find any information in the user's profile. The user most likely "
+"does not exist."
+msgstr ""
+
+msgid "View web profile"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *< summary
+msgid "Windows Live Messenger Protocol Plugin"
+msgstr ""
+
+msgid "Use HTTP Method"
+msgstr ""
+
+msgid "HTTP Method Server"
+msgstr ""
+
+msgid "Show custom smileys"
+msgstr ""
+
+msgid "nudge: nudge a user to get their attention"
+msgstr ""
+
+msgid "Windows Live ID authentication:Unable to connect"
+msgstr ""
+
+msgid "Windows Live ID authentication:Invalid response"
+msgstr ""
+
+#, c-format
+msgid "%s just sent you a Nudge!"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unknown error (%d): %s"
+msgstr "Hitilafu isiyojulikana"
+
+#, fuzzy
+msgid "Unable to add user"
+msgstr "Haiwezi kuongeza moduli"
+
+#, fuzzy, c-format
+msgid "Unknown error (%d)"
+msgstr "Hitilafu isiyojulikana"
+
+msgid "The following users are missing from your addressbook"
+msgstr ""
+
+#, c-format
+msgid "Unable to add user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Unable to block user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Unable to permit user on %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "%s could not be added because your buddy list is full."
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid passport account."
+msgstr ""
+
+msgid "Service Temporarily Unavailable."
+msgstr ""
+
+#, fuzzy
+msgid "Unknown error."
+msgstr "Hitilafu isiyojulikana"
+
+msgid "Mobile message was not sent because it was too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"The MSN server will shut down for maintenance in %d minute. You will "
+"automatically be signed out at that time.  Please finish any conversations "
+"in progress.\n"
+"\n"
+"After the maintenance has been completed, you will be able to successfully "
+"sign in."
+msgid_plural ""
+"The MSN server will shut down for maintenance in %d minutes. You will "
+"automatically be signed out at that time.  Please finish any conversations "
+"in progress.\n"
+"\n"
+"After the maintenance has been completed, you will be able to successfully "
+"sign in."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid ""
+"Message was not sent because the system is unavailable. This normally "
+"happens when the user is blocked or does not exist."
+msgstr ""
+
+msgid "Message was not sent because messages are being sent too quickly."
+msgstr ""
+
+msgid "Message was not sent because an unknown encoding error occurred."
+msgstr ""
+
+msgid "Message was not sent because an unknown error occurred."
+msgstr ""
+
+msgid "Unable to connect"
+msgstr "Haikuweza kuunganishwa"
+
+msgid "Writing error"
+msgstr ""
+
+msgid "Reading error"
+msgstr ""
+
+#, c-format
+msgid ""
+"Connection error from %s server:\n"
+"%s"
+msgstr ""
+
+msgid "Our protocol is not supported by the server."
+msgstr ""
+
+msgid "Error parsing HTTP."
+msgstr ""
+
+msgid "You have signed on from another location."
+msgstr ""
+
+msgid "The MSN servers are temporarily unavailable. Please wait and try again."
+msgstr ""
+
+msgid "The MSN servers are going down temporarily."
+msgstr ""
+
+#, c-format
+msgid "Unable to authenticate: %s"
+msgstr ""
+
+msgid ""
+"Your MSN buddy list is temporarily unavailable. Please wait and try again."
+msgstr ""
+
+msgid "Handshaking"
+msgstr ""
+
+msgid "Transferring"
+msgstr ""
+
+msgid "Starting authentication"
+msgstr ""
+
+#, fuzzy
+msgid "Getting cookie"
+msgstr "Anza"
+
+#, fuzzy
+msgid "Sending cookie"
+msgstr "Tuma Habari…"
+
+msgid "Retrieving buddy list"
+msgstr ""
+
+msgid "Away From Computer"
+msgstr ""
+
+msgid "On The Phone"
+msgstr ""
+
+msgid "Out To Lunch"
+msgstr ""
+
+msgid "Message may have not been sent because a timeout occurred:"
+msgstr ""
+
+msgid "Message could not be sent, not allowed while invisible:"
+msgstr ""
+
+msgid "Message could not be sent because the user is offline:"
+msgstr ""
+
+msgid "Message could not be sent because a connection error occurred:"
+msgstr ""
+
+msgid "Message could not be sent because we are sending too quickly:"
+msgstr ""
+
+msgid ""
+"Message could not be sent because we were unable to establish a session with "
+"the server. This is likely a server problem, try again in a few minutes:"
+msgstr ""
+
+msgid ""
+"Message could not be sent because an error with the switchboard occurred:"
+msgstr ""
+
+msgid "Message may have not been sent because an unknown error occurred:"
+msgstr ""
+
+msgid "Delete Buddy from Address Book?"
+msgstr ""
+
+msgid "Do you want to delete this buddy from your address book as well?"
+msgstr ""
+
+#, fuzzy
+msgid "The username specified is invalid."
+msgstr "Nambari mstari iliyoingizwa ni batili."
+
+msgid "This Hotmail account may not be active."
+msgstr ""
+
+#, fuzzy
+msgid "Profile URL"
+msgstr "Profile Linatumika"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "MSN Protocol Plugin"
+msgstr ""
+
+#, c-format
+msgid "%s is not a valid group."
+msgstr ""
+
+#, c-format
+msgid "%s on %s (%s)"
+msgstr ""
+
+#, fuzzy
+msgid "Unable to rename group"
+msgstr "Haiwezi kufuta moduli"
+
+#, fuzzy
+msgid "Unable to delete group"
+msgstr "Haiwezi kufuta moduli"
+
+#, c-format
+msgid "%s has added you to his or her buddy list."
+msgstr ""
+
+#, c-format
+msgid "%s has removed you from his or her buddy list."
+msgstr ""
+
+#, c-format
+msgid "No such user: %s"
+msgstr ""
+
+msgid "User lookup"
+msgstr ""
+
+msgid "Reading challenge"
+msgstr ""
+
+#, fuzzy
+msgid "Unexpected challenge length from server"
+msgstr "Mwitiko wa bila kutegemea kutoka kwa seva"
+
+#, fuzzy
+msgid "Logging in"
+msgstr "Ingia"
+
+msgid "MySpaceIM - No Username Set"
+msgstr ""
+
+msgid "You appear to have no MySpace username."
+msgstr ""
+
+msgid "Would you like to set one now? (Note: THIS CANNOT BE CHANGED!)"
+msgstr ""
+
+msgid "Lost connection with server"
+msgstr ""
+
+#. Can't write _()'d strings in array initializers. Workaround.
+#. khc: then use N_() in the array initializer and use _() when they are
+#. used
+msgid "New mail messages"
+msgstr ""
+
+msgid "New blog comments"
+msgstr ""
+
+msgid "New profile comments"
+msgstr ""
+
+msgid "New friend requests!"
+msgstr ""
+
+msgid "New picture comments"
+msgstr ""
+
+#, fuzzy
+msgid "MySpace"
+msgstr "Nafasi"
+
+msgid "IM Friends"
+msgstr ""
+
+#, c-format
+msgid ""
+"%d buddy was added or updated from the server (including buddies already on "
+"the server-side list)"
+msgid_plural ""
+"%d buddies were added or updated from the server (including buddies already "
+"on the server-side list)"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Add contacts from server"
+msgstr ""
+
+#. The session is now set up, ready to be connected. This emits the
+#. * signedOn signal, so clients can now do anything with msimprpl, and
+#. * we're ready for it (session key, userid, username all setup).
+#, fuzzy
+msgid "Connected"
+msgstr "Unganisho"
+
+#, c-format
+msgid "Protocol error, code %d: %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s Your password is %d characters, greater than the expected maximum length "
+"of %d for MySpaceIM. Please shorten your password at http://profileedit."
+"myspace.com/index.cfm?fuseaction=accountSettings.changePassword and try "
+"again."
+msgstr ""
+
+msgid "MySpaceIM Error"
+msgstr ""
+
+msgid "Invalid input condition"
+msgstr ""
+
+msgid "Read buffer full (2)"
+msgstr ""
+
+msgid "Unparseable message"
+msgstr ""
+
+#, c-format
+msgid "Couldn't connect to host: %s (%d)"
+msgstr ""
+
+msgid "Failed to add buddy"
+msgstr ""
+
+msgid "'addbuddy' command failed."
+msgstr ""
+
+msgid "persist command failed"
+msgstr ""
+
+msgid "Failed to remove buddy"
+msgstr ""
+
+msgid "'delbuddy' command failed"
+msgstr ""
+
+msgid "blocklist command failed"
+msgstr ""
+
+#, fuzzy
+msgid "Missing Cipher"
+msgstr "Faili linalokosekana"
+
+msgid "The RC4 cipher could not be found"
+msgstr ""
+
+msgid ""
+"Upgrade to a libpurple with RC4 support (>= 2.0.1). MySpaceIM plugin will "
+"not be loaded."
+msgstr ""
+
+msgid "Add friends from MySpace.com"
+msgstr ""
+
+msgid "Importing friends failed"
+msgstr ""
+
+#. TODO: find out how
+msgid "Find people..."
+msgstr ""
+
+msgid "Change IM name..."
+msgstr ""
+
+msgid "myim URL handler"
+msgstr ""
+
+msgid "No suitable MySpaceIM account could be found to open this myim URL."
+msgstr ""
+
+msgid "Enable the proper MySpaceIM account and try again."
+msgstr ""
+
+msgid "Show display name in status text"
+msgstr ""
+
+msgid "Show headline in status text"
+msgstr ""
+
+msgid "Send emoticons"
+msgstr ""
+
+msgid "Screen resolution (dots per inch)"
+msgstr ""
+
+msgid "Base font size (points)"
+msgstr ""
+
+msgid "User"
+msgstr ""
+
+msgid "Headline"
+msgstr ""
+
+#, fuzzy
+msgid "Song"
+msgstr "Kitonga"
+
+msgid "Total Friends"
+msgstr ""
+
+#, fuzzy
+msgid "Client Version"
+msgstr "Toleo Jipya"
+
+msgid "MySpaceIM - Username Available"
+msgstr ""
+
+msgid "This username is available. Would you like to set it?"
+msgstr ""
+
+msgid "ONCE SET, THIS CANNOT BE CHANGED!"
+msgstr ""
+
+msgid "MySpaceIM - Please Set a Username"
+msgstr ""
+
+msgid "This username is unavailable."
+msgstr ""
+
+msgid "Please try another username:"
+msgstr ""
+
+#. Protocol won't log in now without a username set.. Disconnect
+msgid "No username set"
+msgstr ""
+
+msgid "Please enter a username to check its availability:"
+msgstr ""
+
+#. TODO: icons for each zap
+#. Lots of comments for translators:
+#. Zap means "to strike suddenly and forcefully as if with a
+#. * projectile or weapon."  This term often has an electrical
+#. * connotation, for example, "he was zapped by electricity when
+#. * he put a fork in the toaster."
+msgid "Zap"
+msgstr ""
+
+#, c-format
+msgid "%s has zapped you!"
+msgstr ""
+
+#, c-format
+msgid "Zapping %s..."
+msgstr ""
+
+#. Whack means "to hit or strike someone with a sharp blow"
+#, fuzzy
+msgid "Whack"
+msgstr "Nyuma"
+
+#, c-format
+msgid "%s has whacked you!"
+msgstr ""
+
+#, c-format
+msgid "Whacking %s..."
+msgstr ""
+
+#. Torch means "to set on fire."  Don't worry, this doesn't
+#. * make a whole lot of sense in English, either.  Feel free
+#. * to translate it literally.
+#, fuzzy
+msgid "Torch"
+msgstr "Machi"
+
+#, c-format
+msgid "%s has torched you!"
+msgstr ""
+
+#, c-format
+msgid "Torching %s..."
+msgstr ""
+
+#. Smooch means "to kiss someone, often enthusiastically"
+msgid "Smooch"
+msgstr ""
+
+#, c-format
+msgid "%s has smooched you!"
+msgstr ""
+
+#, c-format
+msgid "Smooching %s..."
+msgstr ""
+
+#. A hug is a display of affection; wrapping your arms around someone
+#, fuzzy
+msgid "Hug"
+msgstr "Ago"
+
+#, c-format
+msgid "%s has hugged you!"
+msgstr ""
+
+#, c-format
+msgid "Hugging %s..."
+msgstr ""
+
+#. Slap means "to hit someone with an open/flat hand"
+msgid "Slap"
+msgstr ""
+
+#, c-format
+msgid "%s has slapped you!"
+msgstr ""
+
+#, c-format
+msgid "Slapping %s..."
+msgstr ""
+
+#. Goose means "to pinch someone on their butt"
+#, fuzzy
+msgid "Goose"
+msgstr "Google"
+
+#, c-format
+msgid "%s has goosed you!"
+msgstr ""
+
+#, c-format
+msgid "Goosing %s..."
+msgstr ""
+
+#. A high-five is when two people's hands slap each other
+#. * in the air above their heads.  It is done to celebrate
+#. * something, often a victory, or to congratulate someone.
+msgid "High-five"
+msgstr ""
+
+#, c-format
+msgid "%s has high-fived you!"
+msgstr ""
+
+#, c-format
+msgid "High-fiving %s..."
+msgstr ""
+
+#. We're not entirely sure what the MySpace people mean by
+#. * this... but we think it's the equivalent of "prank."  Or, for
+#. * someone to perform a mischievous trick or practical joke.
+msgid "Punk"
+msgstr ""
+
+#, c-format
+msgid "%s has punk'd you!"
+msgstr ""
+
+#, c-format
+msgid "Punking %s..."
+msgstr ""
+
+#. Raspberry is a slang term for the vibrating sound made
+#. * when you stick your tongue out of your mouth with your
+#. * lips closed and blow.  It is typically done when
+#. * gloating or bragging.  Nowadays it's a pretty silly
+#. * gesture, so it does not carry a harsh negative
+#. * connotation.  It is generally used in a playful tone
+#. * with friends.
+msgid "Raspberry"
+msgstr ""
+
+#, c-format
+msgid "%s has raspberried you!"
+msgstr ""
+
+#, c-format
+msgid "Raspberrying %s..."
+msgstr ""
+
+msgid "Required parameters not passed in"
+msgstr ""
+
+msgid "Unable to write to network"
+msgstr ""
+
+msgid "Unable to read from network"
+msgstr ""
+
+msgid "Error communicating with server"
+msgstr ""
+
+#, fuzzy
+msgid "Conference not found"
+msgstr "Mstari haujapatikana"
+
+#, fuzzy
+msgid "Conference does not exist"
+msgstr "Faili lililohitajiwa halipo"
+
+#, fuzzy
+msgid "A folder with that name already exists"
+msgstr "Ufunguo wenye lakabu kama hii tayari upo."
+
+#, fuzzy
+msgid "Not supported"
+msgstr "Haujaanza"
+
+#, fuzzy
+msgid "Password has expired"
+msgstr "Nywila inatakiwa"
+
+#, fuzzy
+msgid "Incorrect password"
+msgstr "Nywila ya sasa hivi:"
+
+#, fuzzy
+msgid "User not found"
+msgstr "Seva haipatikani"
+
+msgid "Account has been disabled"
+msgstr ""
+
+msgid "The server could not access the directory"
+msgstr ""
+
+msgid "Your system administrator has disabled this operation"
+msgstr ""
+
+msgid "The server is unavailable; try again later"
+msgstr ""
+
+msgid "Cannot add a contact to the same folder twice"
+msgstr ""
+
+msgid "Cannot add yourself"
+msgstr ""
+
+msgid "Master archive is misconfigured"
+msgstr ""
+
+msgid "Incorrect username or password"
+msgstr ""
+
+msgid "Could not recognize the host of the username you entered"
+msgstr ""
+
+msgid ""
+"Your account has been disabled because too many incorrect passwords were "
+"entered"
+msgstr ""
+
+msgid "You cannot add the same person twice to a conversation"
+msgstr ""
+
+msgid "You have reached your limit for the number of contacts allowed"
+msgstr ""
+
+msgid "You have entered an incorrect username"
+msgstr ""
+
+msgid "An error occurred while updating the directory"
+msgstr ""
+
+msgid "Incompatible protocol version"
+msgstr ""
+
+msgid "The user has blocked you"
+msgstr ""
+
+msgid ""
+"This evaluation version does not allow more than ten users to log in at one "
+"time"
+msgstr ""
+
+msgid "The user is either offline or you are blocked"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unknown error: 0x%X"
+msgstr "Hitilafu isiyojulikana"
+
+#, c-format
+msgid "Login failed (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message. Could not get details for user (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to your buddy list (%s)."
+msgstr ""
+
+#. TODO: Improve this! message to who or for what conference?
+#, c-format
+msgid "Unable to send message (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to invite user (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message to %s. Could not create the conference (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to send message. Could not create the conference (%s)."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to move user %s to folder %s in the server side list. Error while "
+"creating folder (%s)."
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to add %s to your buddy list. Error creating folder in server side "
+"list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Could not get details for user %s (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add user to privacy list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to deny list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to add %s to permit list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to remove %s from privacy list (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to change server side privacy settings (%s)."
+msgstr ""
+
+#, c-format
+msgid "Unable to create conference (%s)."
+msgstr ""
+
+msgid "Error communicating with server. Closing connection."
+msgstr ""
+
+msgid "Telephone Number"
+msgstr ""
+
+msgid "Personal Title"
+msgstr ""
+
+msgid "Mailstop"
+msgstr ""
+
+msgid "User ID"
+msgstr ""
+
+#. tag = _("DN");
+#. value = nm_user_record_get_dn(user_record);
+#. if (value) {
+#. purple_notify_user_info_add_pair(user_info, tag, value);
+#. }
+#.
+#, fuzzy
+msgid "Full name"
+msgstr "Jina la faili:"
+
+#, c-format
+msgid "GroupWise Conference %d"
+msgstr ""
+
+msgid "Authenticating..."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to connect to server."
+msgstr "Imeshindwa kuipata seva wakala"
+
+msgid "Waiting for response..."
+msgstr ""
+
+#, c-format
+msgid "%s has been invited to this conversation."
+msgstr ""
+
+msgid "Invitation to Conversation"
+msgstr ""
+
+#, c-format
+msgid ""
+"Invitation from: %s\n"
+"\n"
+"Sent: %s"
+msgstr ""
+
+#, fuzzy
+msgid "Would you like to join the conversation?"
+msgstr "Ungependa kuhifadhi faili hili?"
+
+msgid "You have been logged out because you logged in at another workstation."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s appears to be offline and did not receive the message that you just sent."
+msgstr ""
+
+msgid ""
+"Unable to connect to server. Please enter the address of the server you wish "
+"to connect to."
+msgstr ""
+
+msgid "Error. SSL support is not installed."
+msgstr ""
+
+msgid "This conference has been closed. No more messages can be sent."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Novell GroupWise Messenger Protocol Plugin"
+msgstr ""
+
+msgid "Server address"
+msgstr ""
+
+msgid "Server port"
+msgstr ""
+
+msgid "Could not join chat room"
+msgstr ""
+
+msgid "Invalid chat room name"
+msgstr ""
+
+#, fuzzy
+msgid "Server closed the connection."
+msgstr "Mwenzi SSL imefunga uunganisho huu"
+
+#, c-format
+msgid ""
+"Lost connection with server:\n"
+"%s"
+msgstr ""
+
+msgid "Received invalid data on connection with server."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "AIM Protocol Plugin"
+msgstr ""
+
+msgid "ICQ UIN..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "ICQ Protocol Plugin"
+msgstr ""
+
+#, fuzzy
+msgid "Encoding"
+msgstr "Kisimba:"
+
+#, fuzzy
+msgid "The remote user has closed the connection."
+msgstr "Mwenzi SSL imefunga uunganisho huu"
+
+msgid "The remote user has declined your request."
+msgstr ""
+
+#, c-format
+msgid "Lost connection with the remote user:<br>%s"
+msgstr ""
+
+msgid "Received invalid data on connection with remote user."
+msgstr ""
+
+msgid "Could not establish a connection with the remote user."
+msgstr ""
+
+msgid "Direct IM established"
+msgstr ""
+
+#, c-format
+msgid ""
+"%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 ""
+
+#, c-format
+msgid "File %s is %s, which is larger than the maximum size of %s."
+msgstr ""
+
+#, fuzzy
+msgid "Invalid error"
+msgstr "Kizuizi batili"
+
+#, fuzzy
+msgid "Invalid SNAC"
+msgstr "Kizuizi batili"
+
+msgid "Rate to host"
+msgstr ""
+
+msgid "Rate to client"
+msgstr ""
+
+msgid "Service unavailable"
+msgstr ""
+
+msgid "Service not defined"
+msgstr ""
+
+msgid "Obsolete SNAC"
+msgstr ""
+
+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 ""
+
+#, fuzzy
+msgid "Request denied"
+msgstr "Ufikio umekataliwa"
+
+msgid "Busted SNAC payload"
+msgstr ""
+
+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 ""
+
+#, fuzzy
+msgid "No match"
+msgstr "%S oanisho"
+
+msgid "List overflow"
+msgstr ""
+
+msgid "Request ambiguous"
+msgstr ""
+
+msgid "Queue full"
+msgstr ""
+
+msgid "Not while on AOL"
+msgstr ""
+
+msgid ""
+"(There was an error receiving this message.  The buddy you are speaking with "
+"is probably using a different encoding than expected.  If you know what "
+"encoding he is using, you can specify it in the advanced account options for "
+"your AIM/ICQ account.)"
+msgstr ""
+
+#, c-format
+msgid ""
+"(There was an error receiving this message.  Either you and %s have "
+"different encodings selected, or %s has a buggy client.)"
+msgstr ""
+
+#. Label
+msgid "Buddy Icon"
+msgstr ""
+
+msgid "Voice"
+msgstr ""
+
+msgid "AIM Direct IM"
+msgstr ""
+
+#, fuzzy
+msgid "Get File"
+msgstr "Mafaili ya Matini"
+
+#, fuzzy
+msgid "Games"
+msgstr "Jina"
+
+#, fuzzy
+msgid "Add-Ins"
+msgstr "Nyongeza"
+
+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 ""
+
+#, fuzzy
+msgid "Security Enabled"
+msgstr "Levo ya Usalama"
+
+#, fuzzy
+msgid "Video Chat"
+msgstr "Podikasti Video"
+
+msgid "iChat AV"
+msgstr ""
+
+#, fuzzy
+msgid "Live Video"
+msgstr "Hifadhi video"
+
+#, fuzzy
+msgid "Camera"
+msgstr "Cameroon"
+
+msgid "Screen Sharing"
+msgstr ""
+
+msgid "Free For Chat"
+msgstr ""
+
+msgid "Not Available"
+msgstr "Haipatikani"
+
+msgid "Occupied"
+msgstr ""
+
+msgid "Web Aware"
+msgstr ""
+
+msgid "Invisible"
+msgstr ""
+
+msgid "IP Address"
+msgstr "Anwani-IP"
+
+#, fuzzy
+msgid "Warning Level"
+msgstr "Jumbe za tahadhari"
+
+msgid "Buddy Comment"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not connect to authentication server:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not connect to BOS server:\n"
+"%s"
+msgstr ""
+
+#, fuzzy
+msgid "Username sent"
+msgstr "Jina la mtumiaji"
+
+msgid "Connection established, cookie sent"
+msgstr ""
+
+#. TODO: Don't call this with ssi
+msgid "Finalizing connection"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to login: Could not sign on as %s because the username is invalid.  "
+"Usernames must be a valid email address, or start with a letter and contain "
+"only letters, numbers and spaces, or contain only numbers."
+msgstr ""
+
+#. Unregistered username
+#. uid is not exist
+#, fuzzy
+msgid "Invalid username."
+msgstr "Jina batili la moduli."
+
+#, fuzzy
+msgid "Incorrect password."
+msgstr "Nywila ya sasa hivi:"
+
+#. Suspended account
+msgid "Your account is currently suspended."
+msgstr ""
+
+#. service temporarily unavailable
+msgid "The AOL Instant Messenger service is temporarily unavailable."
+msgstr ""
+
+#. username connecting too frequently
+#. IP address connecting too frequently
+msgid ""
+"You have been connecting and disconnecting too frequently. Wait ten minutes "
+"and try again. If you continue to try, you will need to wait even longer."
+msgstr ""
+
+#, c-format
+msgid "The client version you are using is too old. Please upgrade at %s"
+msgstr ""
+
+#, fuzzy
+msgid "Could Not Connect"
+msgstr "Imeshindwa kuunganisha"
+
+msgid "Received authorization"
+msgstr ""
+
+#, fuzzy
+msgid "The SecurID key entered is invalid."
+msgstr "Nambari mstari iliyoingizwa ni batili."
+
+msgid "Enter SecurID"
+msgstr ""
+
+msgid "Enter the 6 digit number from the digital display."
+msgstr ""
+
+#. *
+#. * A wrapper for purple_request_action() that uses @c OK and @c Cancel buttons.
+#.
+#, fuzzy
+msgid "_OK"
+msgstr "Sawa"
+
+#, c-format
+msgid "You may be disconnected shortly.  If so, check %s for updates."
+msgstr ""
+
+msgid "Unable to get a valid AIM login hash."
+msgstr ""
+
+#, c-format
+msgid "You may be disconnected shortly.  Check %s for updates."
+msgstr ""
+
+msgid "Unable to get a valid login hash."
+msgstr ""
+
+#, fuzzy
+msgid "Password sent"
+msgstr "Nywila"
+
+msgid "Unable to initialize connection"
+msgstr ""
+
+msgid "Please authorize me so I can add you to my buddy list."
+msgstr ""
+
+msgid "Authorization Request Message:"
+msgstr ""
+
+msgid "Please authorize me!"
+msgstr ""
+
+msgid "No reason given."
+msgstr ""
+
+msgid "Authorization Denied Message:"
+msgstr ""
+
+#, c-format
+msgid ""
+"The user %u has denied your request to add them to your buddy list for the "
+"following reason:\n"
+"%s"
+msgstr ""
+
+msgid "ICQ authorization denied."
+msgstr ""
+
+#. Someone has granted you authorization
+#, c-format
+msgid "The user %u has granted your request to add them to your buddy list."
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received a special message\n"
+"\n"
+"From: %s [%s]\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received an ICQ page\n"
+"\n"
+"From: %s [%s]\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have received an ICQ email from %s [%s]\n"
+"\n"
+"Message is:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "ICQ user %u has sent you a buddy: %s (%s)"
+msgstr ""
+
+msgid "Do you want to add this buddy to your buddy list?"
+msgstr ""
+
+#, fuzzy
+msgid "_Add"
+msgstr "Ongeza"
+
+msgid "_Decline"
+msgstr ""
+
+#, c-format
+msgid "You missed %hu message from %s because it was invalid."
+msgid_plural "You missed %hu messages from %s because they were invalid."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s because it was too large."
+msgid_plural "You missed %hu messages from %s because they were too large."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid ""
+"You missed %hu message from %s because the rate limit has been exceeded."
+msgid_plural ""
+"You missed %hu messages from %s because the rate limit has been exceeded."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid ""
+"You missed %hu message from %s because his/her warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because his/her warning level is too high."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s because your warning level is too high."
+msgid_plural ""
+"You missed %hu messages from %s because your warning level is too high."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "You missed %hu message from %s for an unknown reason."
+msgid_plural "You missed %hu messages from %s for an unknown reason."
+msgstr[0] ""
+msgstr[1] ""
+
+#. Data is assumed to be the destination bn
+#, c-format
+msgid "Unable to send message: %s"
+msgstr ""
+
+#, fuzzy
+msgid "Unknown reason."
+msgstr "Hitilafu isiyojulikana"
+
+#, c-format
+msgid "Unable to send message to %s:"
+msgstr ""
+
+#, c-format
+msgid "User information not available: %s"
+msgstr ""
+
+msgid "Online Since"
+msgstr ""
+
+msgid "Member Since"
+msgstr ""
+
+msgid "Profile"
+msgstr ""
+
+msgid "Your AIM connection may be lost."
+msgstr ""
+
+#. The conversion failed!
+msgid ""
+"[Unable to display a message from this user because it contained invalid "
+"characters.]"
+msgstr ""
+
+msgid ""
+"The last action you attempted could not be performed because you are over "
+"the rate limit. Please wait 10 seconds and try again."
+msgstr ""
+
+#, c-format
+msgid "You have been disconnected from chat room %s."
+msgstr ""
+
+msgid "Mobile Phone"
+msgstr ""
+
+msgid "Personal Web Page"
+msgstr ""
+
+#. aim_userinfo_t
+#. strip_html_tags
+#, fuzzy
+msgid "Additional Information"
+msgstr "Inachunguza taarifa"
+
+msgid "Zip Code"
+msgstr ""
+
+#, fuzzy
+msgid "Work Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Division"
+msgstr ""
+
+#, fuzzy
+msgid "Position"
+msgstr "Nafasi:"
+
+msgid "Web Page"
+msgstr ""
+
+msgid "Pop-Up Message"
+msgstr ""
+
+#, c-format
+msgid "The following username is associated with %s"
+msgid_plural "The following usernames are associated with %s"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "No results found for email address %s"
+msgstr ""
+
+#, c-format
+msgid "You should receive an email asking to confirm %s."
+msgstr ""
+
+msgid "Account Confirmation Requested"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to format username because the requested name differs "
+"from the original."
+msgstr ""
+
+#, c-format
+msgid "Error 0x%04x: Unable to format username because it is invalid."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to format username because the requested name is too "
+"long."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because there is already a "
+"request pending for this username."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because the given address has "
+"too many usernames associated with it."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error 0x%04x: Unable to change email address because the given address is "
+"invalid."
+msgstr ""
+
+#, c-format
+msgid "Error 0x%04x: Unknown error."
+msgstr ""
+
+msgid "Error Changing Account Info"
+msgstr ""
+
+#, c-format
+msgid "The email address for %s is %s"
+msgstr ""
+
+msgid "Account Info"
+msgstr ""
+
+msgid ""
+"Your IM Image was not sent. You must be Direct Connected to send IM Images."
+msgstr ""
+
+msgid "Unable to set AIM profile."
+msgstr ""
+
+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 ""
+
+#, c-format
+msgid ""
+"The maximum profile length of %d byte has been exceeded.  It has been "
+"truncated for you."
+msgid_plural ""
+"The maximum profile length of %d bytes has been exceeded.  It has been "
+"truncated for you."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Profile too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"The maximum away message length of %d byte has been exceeded.  It has been "
+"truncated for you."
+msgid_plural ""
+"The maximum away message length of %d bytes has been exceeded.  It has been "
+"truncated for you."
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Away message too long."
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not add the buddy %s because the username is invalid.  Usernames must "
+"be a valid email address, or start with a letter and contain only letters, "
+"numbers and spaces, or contain only numbers."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to Add"
+msgstr "Nimeshindwa Kusasisha"
+
+msgid "Unable to Retrieve Buddy List"
+msgstr ""
+
+msgid ""
+"The AIM servers were temporarily unable to send your buddy list.  Your buddy "
+"list is not lost, and will probably become available in a few minutes."
+msgstr ""
+
+msgid "Orphans"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not add the buddy %s because you have too many buddies in your buddy "
+"list.  Please remove one and try again."
+msgstr ""
+
+#, fuzzy
+msgid "(no name)"
+msgstr "(hakuna lakabu)"
+
+#, c-format
+msgid "Could not add the buddy %s for an unknown reason."
+msgstr ""
+
+#, c-format
+msgid ""
+"The user %s has given you permission to add him or her to your buddy list.  "
+"Do you want to add this user?"
+msgstr ""
+
+msgid "Authorization Given"
+msgstr ""
+
+#. Granted
+#, c-format
+msgid "The user %s has granted your request to add them to your buddy list."
+msgstr ""
+
+msgid "Authorization Granted"
+msgstr ""
+
+#. Denied
+#, c-format
+msgid ""
+"The user %s has denied your request to add them to your buddy list for the "
+"following reason:\n"
+"%s"
+msgstr ""
+
+#, fuzzy
+msgid "Authorization Denied"
+msgstr "Uthibitisho unatakiwa"
+
+msgid "_Exchange:"
+msgstr ""
+
+msgid "Your IM Image was not sent. You cannot send IM Images in AIM chats."
+msgstr ""
+
+msgid "iTunes Music Store Link"
+msgstr ""
+
+#, c-format
+msgid "Buddy Comment for %s"
+msgstr ""
+
+msgid "Buddy Comment:"
+msgstr ""
+
+#, c-format
+msgid "You have selected to open a Direct IM connection with %s."
+msgstr ""
+
+msgid ""
+"Because this reveals your IP address, it may be considered a security risk.  "
+"Do you wish to continue?"
+msgstr ""
+
+#, fuzzy
+msgid "C_onnect"
+msgstr "Yaliyomo"
+
+msgid "Get AIM Info"
+msgstr ""
+
+#. We only do this if the user is in our buddy list
+msgid "Edit Buddy Comment"
+msgstr ""
+
+msgid "Get Status Msg"
+msgstr ""
+
+#, fuzzy
+msgid "Direct IM"
+msgstr "Mwelekeo"
+
+msgid "Re-request Authorization"
+msgstr ""
+
+msgid "Require authorization"
+msgstr ""
+
+msgid "Web aware (enabling this will cause you to receive SPAM!)"
+msgstr ""
+
+msgid "ICQ Privacy Options"
+msgstr ""
+
+msgid "The new formatting is invalid."
+msgstr ""
+
+msgid "Username formatting can change only capitalization and whitespace."
+msgstr ""
+
+msgid "Change Address To:"
+msgstr ""
+
+msgid "<i>you are not waiting for authorization</i>"
+msgstr ""
+
+msgid "You are awaiting authorization from the following buddies"
+msgstr ""
+
+msgid ""
+"You can re-request authorization from these buddies by right-clicking on "
+"them and selecting \"Re-request Authorization.\""
+msgstr ""
+
+msgid "Find Buddy by Email"
+msgstr ""
+
+msgid "Search for a buddy by email address"
+msgstr ""
+
+msgid "Type the email address of the buddy you are searching for."
+msgstr ""
+
+#, fuzzy
+msgid "_Search"
+msgstr "Tafuta"
+
+msgid "Set User Info (web)..."
+msgstr ""
+
+#, fuzzy
+msgid "Change Password (web)"
+msgstr "Badil &Nywila"
+
+msgid "Configure IM Forwarding (web)"
+msgstr ""
+
+#. ICQ actions
+msgid "Set Privacy Options..."
+msgstr ""
+
+#. AIM actions
+#, fuzzy
+msgid "Confirm Account"
+msgstr "Thibitisha kufunga"
+
+msgid "Display Currently Registered Email Address"
+msgstr ""
+
+msgid "Change Currently Registered Email Address..."
+msgstr ""
+
+msgid "Show Buddies Awaiting Authorization"
+msgstr ""
+
+msgid "Search for Buddy by Email Address..."
+msgstr ""
+
+msgid "Search for Buddy by Information"
+msgstr ""
+
+msgid ""
+"Always use AIM/ICQ proxy server for\n"
+"file transfers and direct IM (slower,\n"
+"but does not reveal your IP address)"
+msgstr ""
+
+msgid "Allow multiple simultaneous logins"
+msgstr ""
+
+#, c-format
+msgid "Asking %s to connect to us at %s:%hu for Direct IM."
+msgstr ""
+
+#, c-format
+msgid "Attempting to connect to %s:%hu."
+msgstr ""
+
+msgid "Attempting to connect via proxy server."
+msgstr ""
+
+#, c-format
+msgid "%s has just asked to directly connect to %s"
+msgstr ""
+
+msgid ""
+"This requires a direct connection between the two computers and is necessary "
+"for IM Images.  Because your IP address will be revealed, this may be "
+"considered a privacy risk."
+msgstr ""
+
+msgid "Aquarius"
+msgstr ""
+
+msgid "Pisces"
+msgstr ""
+
+msgid "Aries"
+msgstr ""
+
+#, fuzzy
+msgid "Taurus"
+msgstr "Kinauru"
+
+msgid "Gemini"
+msgstr ""
+
+#, fuzzy
+msgid "Cancer"
+msgstr "Ghairi"
+
+#, fuzzy
+msgid "Leo"
+msgstr "Lao"
+
+msgid "Virgo"
+msgstr ""
+
+#, fuzzy
+msgid "Libra"
+msgstr "Libya"
+
+msgid "Scorpio"
+msgstr ""
+
+msgid "Sagittarius"
+msgstr ""
+
+msgid "Capricorn"
+msgstr ""
+
+#, fuzzy
+msgid "Rat"
+msgstr "Jmosi"
+
+msgid "Ox"
+msgstr ""
+
+#, fuzzy
+msgid "Tiger"
+msgstr "Niger"
+
+#, fuzzy
+msgid "Rabbit"
+msgstr "Mibbit"
+
+msgid "Dragon"
+msgstr ""
+
+#, fuzzy
+msgid "Snake"
+msgstr "Hifadhi"
+
+#, fuzzy
+msgid "Horse"
+msgstr "Nyumbani"
+
+msgid "Goat"
+msgstr ""
+
+#, fuzzy
+msgid "Monkey"
+msgstr "Jumatatu"
+
+#, fuzzy
+msgid "Rooster"
+msgstr "Mwandishi wa habari"
+
+msgid "Dog"
+msgstr ""
+
+msgid "Pig"
+msgstr ""
+
+#, fuzzy
+msgid "Other"
+msgstr "Wengine"
+
+#, fuzzy
+msgid "Visible"
+msgstr "Lemaza"
+
+msgid "Friend Only"
+msgstr ""
+
+#, fuzzy
+msgid "Private"
+msgstr "Faragha"
+
+msgid "QQ Number"
+msgstr ""
+
+msgid "Country/Region"
+msgstr ""
+
+msgid "Province/State"
+msgstr ""
+
+#, fuzzy
+msgid "Zipcode"
+msgstr "Folda la Zipu"
+
+msgid "Phone Number"
+msgstr ""
+
+msgid "Authorize adding"
+msgstr ""
+
+msgid "Cellphone Number"
+msgstr ""
+
+msgid "Personal Introduction"
+msgstr ""
+
+msgid "City/Area"
+msgstr ""
+
+msgid "Publish Mobile"
+msgstr ""
+
+msgid "Publish Contact"
+msgstr ""
+
+#, fuzzy
+msgid "College"
+msgstr "Kunja"
+
+msgid "Horoscope"
+msgstr ""
+
+msgid "Zodiac"
+msgstr ""
+
+#, fuzzy
+msgid "Blood"
+msgstr "Zuia"
+
+#, fuzzy
+msgid "True"
+msgstr "Jnne"
+
+#, fuzzy
+msgid "False"
+msgstr "si kweli"
+
+msgid "Modify Contact"
+msgstr ""
+
+#, fuzzy
+msgid "Modify Address"
+msgstr "Anwani ya Barua pepe"
+
+msgid "Modify Extended Information"
+msgstr ""
+
+#, fuzzy
+msgid "Modify Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Update"
+msgstr "Sasisha"
+
+msgid "Could not change buddy information."
+msgstr ""
+
+#, fuzzy
+msgid "Mobile"
+msgstr "Moduli"
+
+#, fuzzy
+msgid "Note"
+msgstr "Bila"
+
+#. callback
+msgid "Buddy Memo"
+msgstr ""
+
+msgid "Change his/her memo as you like"
+msgstr ""
+
+#, fuzzy
+msgid "_Modify"
+msgstr "R&ekebisha"
+
+msgid "Memo Modify"
+msgstr ""
+
+msgid "Server says:"
+msgstr ""
+
+msgid "Your request was accepted."
+msgstr ""
+
+msgid "Your request was rejected."
+msgstr ""
+
+#, c-format
+msgid "%u requires verification"
+msgstr ""
+
+msgid "Add buddy question"
+msgstr ""
+
+#, fuzzy
+msgid "Enter answer here"
+msgstr "Ingiza neno tafuti:"
+
+#, fuzzy
+msgid "Send"
+msgstr "Kivenda"
+
+#, fuzzy
+msgid "Invalid answer."
+msgstr "Agumenti batili"
+
+msgid "Authorization denied message:"
+msgstr ""
+
+msgid "Sorry, you're not my style."
+msgstr ""
+
+#, c-format
+msgid "%u needs authorization"
+msgstr ""
+
+msgid "Add buddy authorize"
+msgstr ""
+
+msgid "Enter request here"
+msgstr ""
+
+msgid "Would you be my friend?"
+msgstr ""
+
+msgid "QQ Buddy"
+msgstr ""
+
+msgid "Add buddy"
+msgstr ""
+
+msgid "Invalid QQ Number"
+msgstr ""
+
+msgid "Failed sending authorize"
+msgstr ""
+
+#, c-format
+msgid "Failed removing buddy %u"
+msgstr ""
+
+#, c-format
+msgid "Failed removing me from %d's buddy list"
+msgstr ""
+
+msgid "No reason given"
+msgstr ""
+
+#. only need to get value
+#, c-format
+msgid "You have been added by %s"
+msgstr ""
+
+#, fuzzy
+msgid "Would you like to add him?"
+msgstr "Ungependa kuhifadhi faili hili?"
+
+#, c-format
+msgid "Rejected by %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Message: %s"
+msgstr "Ujumbe"
+
+msgid "ID: "
+msgstr ""
+
+#, fuzzy
+msgid "Group ID"
+msgstr "Kusanya kwa:"
+
+msgid "QQ Qun"
+msgstr ""
+
+msgid "Please enter Qun number"
+msgstr ""
+
+msgid "You can only search for permanent Qun\n"
+msgstr ""
+
+msgid "(Invalid UTF-8 string)"
+msgstr ""
+
+#, fuzzy
+msgid "Not member"
+msgstr "Novemba"
+
+#, fuzzy
+msgid "Member"
+msgstr "Novemba"
+
+msgid "Requesting"
+msgstr ""
+
+msgid "Admin"
+msgstr ""
+
+msgid "Notice"
+msgstr ""
+
+#, fuzzy
+msgid "Detail"
+msgstr "Ufafanuzi"
+
+msgid "Creator"
+msgstr ""
+
+#, fuzzy
+msgid "About me"
+msgstr "Kuhusu %S"
+
+msgid "Category"
+msgstr ""
+
+msgid "The Qun does not allow others to join"
+msgstr ""
+
+msgid "Join QQ Qun"
+msgstr ""
+
+msgid "Input request here"
+msgstr ""
+
+#, c-format
+msgid "Successfully joined Qun %s (%u)"
+msgstr ""
+
+#, fuzzy
+msgid "Successfully joined Qun"
+msgstr "Imesakinishwa kimafanikio %S."
+
+#, c-format
+msgid "Qun %u denied from joining"
+msgstr ""
+
+msgid "QQ Qun Operation"
+msgstr ""
+
+#, fuzzy
+msgid "Failed:"
+msgstr "Imeshindwa"
+
+msgid "Join Qun, Unknown Reply"
+msgstr ""
+
+#, fuzzy
+msgid "Quit Qun"
+msgstr "Funga %s"
+
+msgid ""
+"Note, if you are the creator, \n"
+"this operation will eventually remove this Qun."
+msgstr ""
+
+msgid "Sorry, you are not our style"
+msgstr ""
+
+msgid "Successfully changed Qun members"
+msgstr ""
+
+msgid "Successfully changed Qun information"
+msgstr ""
+
+msgid "You have successfully created a Qun"
+msgstr ""
+
+msgid "Would you like to set up detailed information now?"
+msgstr ""
+
+#, fuzzy
+msgid "Setup"
+msgstr "Sep"
+
+#, c-format
+msgid "%u requested to join Qun %u for %s"
+msgstr ""
+
+#, c-format
+msgid "%u request to join Qun %u"
+msgstr ""
+
+#, c-format
+msgid "Failed to join Qun %u, operated by admin %u"
+msgstr ""
+
+#, c-format
+msgid "<b>Joining Qun %u is approved by admin %u for %s</b>"
+msgstr ""
+
+#, c-format
+msgid "<b>Removed buddy %u.</b>"
+msgstr ""
+
+#, c-format
+msgid "<b>New buddy %u joined.</b>"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unknown-%d"
+msgstr "Isiyojulikana: %S"
+
+#, fuzzy
+msgid "Level"
+msgstr "Lebo"
+
+msgid " VIP"
+msgstr ""
+
+msgid " TCP"
+msgstr ""
+
+msgid " FromMobile"
+msgstr ""
+
+msgid " BindMobile"
+msgstr ""
+
+#, fuzzy
+msgid " Video"
+msgstr "Hifadhi video"
+
+#, fuzzy
+msgid " Zone"
+msgstr "Bila"
+
+#, fuzzy
+msgid "Flag"
+msgstr "Kifulah"
+
+msgid "Ver"
+msgstr ""
+
+#, fuzzy
+msgid "Invalid name"
+msgstr "Njia batili"
+
+msgid "Select icon..."
+msgstr ""
+
+#, c-format
+msgid "<b>Login time</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Total Online Buddies</b>: %d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Last Refresh</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Server</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Client Tag</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Connection Mode</b>: %s<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>My Internet IP</b>: %s:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Sent</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Resend</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Lost</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Received</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Received Duplicate</b>: %lu<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>Time</b>: %d-%d-%d, %d:%d:%d<br>\n"
+msgstr ""
+
+#, c-format
+msgid "<b>IP</b>: %s<br>\n"
+msgstr ""
+
+#, fuzzy
+msgid "Login Information"
+msgstr "Taarifa Zaidi"
+
+msgid "<p><b>Original Author</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Code Contributors</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Lovely Patch Writers</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Acknowledgement</b>:<br>\n"
+msgstr ""
+
+msgid "<p><b>Scrupulous Testers</b>:<br>\n"
+msgstr ""
+
+msgid "and more, please let me know... thank you!))"
+msgstr ""
+
+msgid "<p><i>And, all the boys in the backroom...</i><br>\n"
+msgstr ""
+
+msgid "<i>Feel free to join us!</i> :)"
+msgstr ""
+
+#, c-format
+msgid "About OpenQ %s"
+msgstr ""
+
+msgid "Change Icon"
+msgstr ""
+
+#, fuzzy
+msgid "Change Password"
+msgstr "Badil &Nywila"
+
+#, fuzzy
+msgid "Account Information"
+msgstr "Inachunguza taarifa"
+
+msgid "Update all QQ Quns"
+msgstr ""
+
+msgid "About OpenQ"
+msgstr ""
+
+msgid "Modify Buddy Memo"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "QQ Protocol Plugin"
+msgstr ""
+
+msgid "Auto"
+msgstr ""
+
+#, fuzzy
+msgid "Select Server"
+msgstr "SSL Seva"
+
+msgid "QQ2005"
+msgstr ""
+
+msgid "QQ2007"
+msgstr ""
+
+msgid "QQ2008"
+msgstr ""
+
+msgid "Connect by TCP"
+msgstr ""
+
+msgid "Show server notice"
+msgstr ""
+
+msgid "Show server news"
+msgstr ""
+
+msgid "Show chat room when msg comes"
+msgstr ""
+
+msgid "Keep alive interval (seconds)"
+msgstr ""
+
+msgid "Update interval (seconds)"
+msgstr ""
+
+msgid "Cannot decrypt server reply"
+msgstr ""
+
+#, c-format
+msgid "Failed requesting token, 0x%02X"
+msgstr ""
+
+#, c-format
+msgid "Invalid token len, %d"
+msgstr ""
+
+#. extend redirect used in QQ2006
+msgid "Redirect_EX is not currently supported"
+msgstr ""
+
+#. need activation
+#. need activation
+#. need activation
+#, fuzzy
+msgid "Activation required"
+msgstr "Uthibitisho unatakiwa"
+
+#, c-format
+msgid "Unknown reply code when logging in (0x%02X)"
+msgstr ""
+
+msgid "Could not decrypt server reply"
+msgstr ""
+
+msgid "Requesting captcha"
+msgstr ""
+
+msgid "Checking captcha"
+msgstr ""
+
+msgid "Failed captcha verification"
+msgstr ""
+
+#, fuzzy
+msgid "Captcha Image"
+msgstr "Naki&li Picha"
+
+msgid "Enter code"
+msgstr ""
+
+msgid "QQ Captcha Verification"
+msgstr ""
+
+msgid "Enter the text from the image"
+msgstr ""
+
+#, c-format
+msgid "Unknown reply when checking password (0x%02X)"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unknown reply code when logging in (0x%02X):\n"
+"%s"
+msgstr ""
+
+#, fuzzy
+msgid "Unable to connect."
+msgstr "Haikuweza kuunganishwa"
+
+#, fuzzy
+msgid "Socket error"
+msgstr "Hitilafu ya hati"
+
+msgid "Unable to read from socket"
+msgstr ""
+
+#, fuzzy
+msgid "Write Error"
+msgstr "Hitilafu ya Printa"
+
+#, fuzzy
+msgid "Connection lost"
+msgstr "Unganisho"
+
+#, fuzzy
+msgid "Getting server"
+msgstr "Anza"
+
+msgid "Requesting token"
+msgstr ""
+
+msgid "Couldn't resolve host"
+msgstr ""
+
+msgid "Invalid server or port"
+msgstr ""
+
+#, fuzzy
+msgid "Connecting to server"
+msgstr "Naunganisha na %1$S…"
+
+#, fuzzy
+msgid "QQ Error"
+msgstr "Hitikafu "
+
+#, c-format
+msgid ""
+"Server News:\n"
+"%s\n"
+"%s\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "%s:%s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "From %s:"
+msgstr "Kutoka %S"
+
+#, c-format
+msgid ""
+"Server notice From %s: \n"
+"%s"
+msgstr ""
+
+msgid "Unknown SERVER CMD"
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reply of %s(0x%02X)\n"
+"Room %u, reply 0x%02X"
+msgstr ""
+
+msgid "QQ Qun Command"
+msgstr ""
+
+msgid "Could not decrypt login reply"
+msgstr ""
+
+msgid "Unknown LOGIN CMD"
+msgstr ""
+
+msgid "Unknown CLIENT CMD"
+msgstr ""
+
+#, c-format
+msgid "%d has declined the file %s"
+msgstr ""
+
+msgid "File Send"
+msgstr ""
+
+#, c-format
+msgid "%d canceled the transfer of %s"
+msgstr ""
+
+msgid "Connection closed (writing)"
+msgstr ""
+
+#, c-format
+msgid "<b>Group Title:</b> %s<br>"
+msgstr ""
+
+#, c-format
+msgid "<b>Notes Group ID:</b> %s<br>"
+msgstr ""
+
+#, c-format
+msgid "Info for Group %s"
+msgstr ""
+
+msgid "Notes Address Book Information"
+msgstr ""
+
+msgid "Invite Group to Conference..."
+msgstr ""
+
+msgid "Get Notes Address Book Info"
+msgstr ""
+
+msgid "Sending Handshake"
+msgstr ""
+
+msgid "Waiting for Handshake Acknowledgement"
+msgstr ""
+
+msgid "Handshake Acknowledged, Sending Login"
+msgstr ""
+
+msgid "Waiting for Login Acknowledgement"
+msgstr ""
+
+msgid "Login Redirected"
+msgstr ""
+
+msgid "Forcing Login"
+msgstr ""
+
+msgid "Login Acknowledged"
+msgstr ""
+
+msgid "Starting Services"
+msgstr ""
+
+#, c-format
+msgid ""
+"A Sametime administrator has issued the following announcement on server %s"
+msgstr ""
+
+msgid "Sametime Administrator Announcement"
+msgstr ""
+
+#, fuzzy
+msgid "Connection reset"
+msgstr "Muunganisho ulikataliwa"
+
+#, fuzzy, c-format
+msgid "Error reading from socket: %s"
+msgstr "Hitilafu ya upakiaji lahamtindo: %S"
+
+#. this is a regular connect, error out
+#, fuzzy
+msgid "Unable to connect to host"
+msgstr "Haikuweza kuunganishwa"
+
+#, c-format
+msgid "Announcement from %s"
+msgstr ""
+
+msgid "Conference Closed"
+msgstr ""
+
+msgid "Unable to send message: "
+msgstr ""
+
+msgid "Place Closed"
+msgstr ""
+
+msgid "Microphone"
+msgstr ""
+
+#, fuzzy
+msgid "Speakers"
+msgstr "Seva"
+
+#, fuzzy
+msgid "Video Camera"
+msgstr "Kicheza Video"
+
+msgid "Supports"
+msgstr ""
+
+msgid "External User"
+msgstr ""
+
+msgid "Create conference with user"
+msgstr ""
+
+#, c-format
+msgid ""
+"Please enter a topic for the new conference, and an invitation message to be "
+"sent to %s"
+msgstr ""
+
+msgid "New Conference"
+msgstr ""
+
+#, fuzzy
+msgid "Create"
+msgstr "Kicree"
+
+#, fuzzy
+msgid "Available Conferences"
+msgstr "Profaili Zipatikanazo"
+
+msgid "Create New Conference..."
+msgstr ""
+
+msgid "Invite user to a conference"
+msgstr ""
+
+#, c-format
+msgid ""
+"Select a conference from the list below to send an invite to user %s. Select "
+"\"Create New Conference\" if you'd like to create a new conference to invite "
+"this user to."
+msgstr ""
+
+msgid "Invite to Conference"
+msgstr ""
+
+msgid "Invite to Conference..."
+msgstr ""
+
+msgid "Send TEST Announcement"
+msgstr ""
+
+msgid "Topic:"
+msgstr ""
+
+msgid "No Sametime Community Server specified"
+msgstr ""
+
+#, c-format
+msgid ""
+"No host or IP address has been configured for the Meanwhile account %s. "
+"Please enter one below to continue logging in."
+msgstr ""
+
+msgid "Meanwhile Connection Setup"
+msgstr ""
+
+msgid "No Sametime Community Server Specified"
+msgstr ""
+
+#, fuzzy
+msgid "Connect"
+msgstr "Yaliyomo"
+
+#, c-format
+msgid "Unknown (0x%04x)<br>"
+msgstr ""
+
+msgid "Last Known Client"
+msgstr ""
+
+#, fuzzy
+msgid "User Name"
+msgstr "Jina la Mtumiaji:"
+
+msgid "Sametime ID"
+msgstr ""
+
+msgid "An ambiguous user ID was entered"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following users. Please "
+"select the correct user from the list below to add them to your buddy list."
+msgstr ""
+
+#, fuzzy
+msgid "Select User"
+msgstr "Chagua &Yote"
+
+msgid "Unable to add user: user not found"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' did not match any users in your Sametime community. This "
+"entry has been removed from your buddy list."
+msgstr ""
+
+#, c-format
+msgid ""
+"Error reading file %s: \n"
+"%s\n"
+msgstr ""
+
+msgid "Remotely Stored Buddy List"
+msgstr ""
+
+msgid "Buddy List Storage Mode"
+msgstr ""
+
+msgid "Local Buddy List Only"
+msgstr ""
+
+msgid "Merge List from Server"
+msgstr ""
+
+msgid "Merge and Save List to Server"
+msgstr ""
+
+msgid "Synchronize List with Server"
+msgstr ""
+
+#, c-format
+msgid "Import Sametime List for Account %s"
+msgstr ""
+
+#, c-format
+msgid "Export Sametime List for Account %s"
+msgstr ""
+
+msgid "Unable to add group: group exists"
+msgstr ""
+
+#, c-format
+msgid "A group named '%s' already exists in your buddy list."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to add group"
+msgstr "Haiwezi kuongeza moduli"
+
+msgid "Possible Matches"
+msgstr ""
+
+msgid "Notes Address Book group results"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following Notes Address "
+"Book groups. Please select the correct group from the list below to add it "
+"to your buddy list."
+msgstr ""
+
+msgid "Select Notes Address Book"
+msgstr ""
+
+msgid "Unable to add group: group not found"
+msgstr ""
+
+#, c-format
+msgid ""
+"The identifier '%s' did not match any Notes Address Book groups in your "
+"Sametime community."
+msgstr ""
+
+msgid "Notes Address Book Group"
+msgstr ""
+
+msgid ""
+"Enter the name of a Notes Address Book group in the field below to add the "
+"group and its members to your buddy list."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Search results for '%s'"
+msgstr "Majibu ya kutafutwa kwa"
+
+#, c-format
+msgid ""
+"The identifier '%s' may possibly refer to any of the following users. You "
+"may add these users to your buddy list or send them messages with the action "
+"buttons below."
+msgstr ""
+
+#, fuzzy
+msgid "Search Results"
+msgstr "Tafuta matokeo"
+
+#, fuzzy
+msgid "No matches"
+msgstr "%S maoanisho"
+
+#, c-format
+msgid "The identifier '%s' did not match any users in your Sametime community."
+msgstr ""
+
+#, fuzzy
+msgid "No Matches"
+msgstr "%S maoanisho"
+
+msgid "Search for a user"
+msgstr ""
+
+msgid ""
+"Enter a name or partial ID in the field below to search for matching users "
+"in your Sametime community."
+msgstr ""
+
+#, fuzzy
+msgid "User Search"
+msgstr "Tafuti Mpya"
+
+msgid "Import Sametime List..."
+msgstr ""
+
+msgid "Export Sametime List..."
+msgstr ""
+
+msgid "Add Notes Address Book Group..."
+msgstr ""
+
+msgid "User Search..."
+msgstr ""
+
+msgid "Force login (ignore server redirects)"
+msgstr ""
+
+#. pretend to be Sametime Connect
+msgid "Hide client identity"
+msgstr ""
+
+#, c-format
+msgid "User %s is not present in the network"
+msgstr ""
+
+msgid "Key Agreement"
+msgstr "Makubaliano Muhimu"
+
+msgid "Cannot perform the key agreement"
+msgstr ""
+
+msgid "Error occurred during key agreement"
+msgstr ""
+
+#, fuzzy
+msgid "Key Agreement failed"
+msgstr "Makubaliano Muhimu"
+
+msgid "Timeout during key agreement"
+msgstr ""
+
+msgid "Key agreement was aborted"
+msgstr ""
+
+msgid "Key agreement is already started"
+msgstr ""
+
+msgid "Key agreement cannot be started with yourself"
+msgstr ""
+
+msgid "The remote user is not present in the network any more"
+msgstr ""
+
+#, c-format
+msgid ""
+"Key agreement request received from %s. Would you like to perform the key "
+"agreement?"
+msgstr ""
+
+#, c-format
+msgid ""
+"The remote user is waiting key agreement on:\n"
+"Remote host: %s\n"
+"Remote port: %d"
+msgstr ""
+
+#, fuzzy
+msgid "Key Agreement Request"
+msgstr "Makubaliano Muhimu"
+
+msgid "IM With Password"
+msgstr ""
+
+msgid "Cannot set IM key"
+msgstr ""
+
+#, fuzzy
+msgid "Set IM Password"
+msgstr "Onyesha Nywila"
+
+#, fuzzy
+msgid "Get Public Key"
+msgstr "Ufunguo Huria wa Muhusika"
+
+msgid "Cannot fetch the public key"
+msgstr ""
+
+#, fuzzy
+msgid "Show Public Key"
+msgstr "Ufunguo Huria wa Muhusika"
+
+msgid "Could not load public key"
+msgstr ""
+
+#, fuzzy
+msgid "User Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Cannot get user information"
+msgstr ""
+
+#, c-format
+msgid "The %s buddy is not trusted"
+msgstr ""
+
+msgid ""
+"You cannot receive buddy notifications until you import his/her public key.  "
+"You can use the Get Public Key command to get the public key."
+msgstr ""
+
+#. Open file selector to select the public key.
+msgid "Open..."
+msgstr ""
+
+#, c-format
+msgid "The %s buddy is not present in the network"
+msgstr ""
+
+msgid ""
+"To add the buddy you must import his/her public key. Press Import to import "
+"a public key."
+msgstr ""
+
+#, fuzzy
+msgid "_Import..."
+msgstr "&Leta…"
+
+msgid "Select correct user"
+msgstr ""
+
+msgid ""
+"More than one user was found with the same public key. Select the correct "
+"user from the list to add to the buddy list."
+msgstr ""
+
+msgid ""
+"More than one user was found with the same name. Select the correct user "
+"from the list to add to the buddy list."
+msgstr ""
+
+#, fuzzy
+msgid "Detached"
+msgstr "Haijakechiwa"
+
+msgid "Indisposed"
+msgstr ""
+
+msgid "Wake Me Up"
+msgstr ""
+
+msgid "Hyper Active"
+msgstr ""
+
+msgid "Robot"
+msgstr ""
+
+msgid "Happy"
+msgstr ""
+
+#, fuzzy
+msgid "Sad"
+msgstr "Jm"
+
+msgid "Angry"
+msgstr ""
+
+msgid "Jealous"
+msgstr ""
+
+#, fuzzy
+msgid "Ashamed"
+msgstr "Kiassame"
+
+msgid "Invincible"
+msgstr ""
+
+msgid "In Love"
+msgstr ""
+
+msgid "Sleepy"
+msgstr ""
+
+msgid "Bored"
+msgstr ""
+
+msgid "Excited"
+msgstr ""
+
+msgid "Anxious"
+msgstr ""
+
+#, fuzzy
+msgid "User Modes"
+msgstr "Jina la Mtumiaji:"
+
+msgid "Preferred Contact"
+msgstr ""
+
+msgid "Preferred Language"
+msgstr ""
+
+#, fuzzy
+msgid "Device"
+msgstr "Huduma"
+
+msgid "Timezone"
+msgstr ""
+
+#, fuzzy
+msgid "Geolocation"
+msgstr "Mahali"
+
+msgid "Reset IM Key"
+msgstr ""
+
+msgid "IM with Key Exchange"
+msgstr ""
+
+msgid "IM with Password"
+msgstr ""
+
+msgid "Get Public Key..."
+msgstr ""
+
+msgid "Kill User"
+msgstr ""
+
+msgid "Draw On Whiteboard"
+msgstr ""
+
+msgid "_Passphrase:"
+msgstr ""
+
+#, c-format
+msgid "Channel %s does not exist in the network"
+msgstr ""
+
+#, fuzzy
+msgid "Channel Information"
+msgstr "Inachunguza taarifa"
+
+msgid "Cannot get channel information"
+msgstr ""
+
+#, c-format
+msgid "<b>Channel Name:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>User Count:</b> %d"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Founder:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Cipher:</b> %s"
+msgstr ""
+
+#. Definition of HMAC: http://en.wikipedia.org/wiki/HMAC
+#, c-format
+msgid "<br><b>Channel HMAC:</b> %s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Topic:</b><br>%s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Channel Modes:</b> "
+msgstr ""
+
+#, c-format
+msgid "<br><b>Founder Key Fingerprint:</b><br>%s"
+msgstr ""
+
+#, c-format
+msgid "<br><b>Founder Key Babbleprint:</b><br>%s"
+msgstr ""
+
+msgid "Add Channel Public Key"
+msgstr ""
+
+#. Add new public key
+msgid "Open Public Key..."
+msgstr ""
+
+msgid "Channel Passphrase"
+msgstr ""
+
+msgid "Channel Public Keys List"
+msgstr ""
+
+#, c-format
+msgid ""
+"Channel authentication is used to secure the channel from unauthorized "
+"access. The authentication may be based on passphrase and digital "
+"signatures. If passphrase is set, it is required to be able to join. If "
+"channel public keys are set then only users whose public keys are listed are "
+"able to join."
+msgstr ""
+
+msgid "Channel Authentication"
+msgstr ""
+
+msgid "Add / Remove"
+msgstr ""
+
+#, fuzzy
+msgid "Group Name"
+msgstr "Kusanya kwa:"
+
+#, fuzzy
+msgid "Passphrase"
+msgstr "Nywila"
+
+#, c-format
+msgid "Please enter the %s channel private group name and passphrase."
+msgstr ""
+
+msgid "Add Channel Private Group"
+msgstr ""
+
+#, fuzzy
+msgid "User Limit"
+msgstr "Jina la Mtumiaji:"
+
+msgid "Set user limit on channel. Set to zero to reset user limit."
+msgstr ""
+
+msgid "Invite List"
+msgstr ""
+
+msgid "Ban List"
+msgstr ""
+
+msgid "Add Private Group"
+msgstr ""
+
+#, fuzzy
+msgid "Reset Permanent"
+msgstr "Kudumu"
+
+#, fuzzy
+msgid "Set Permanent"
+msgstr "Kudumu"
+
+msgid "Set User Limit"
+msgstr ""
+
+msgid "Reset Topic Restriction"
+msgstr ""
+
+msgid "Set Topic Restriction"
+msgstr ""
+
+msgid "Reset Private Channel"
+msgstr ""
+
+msgid "Set Private Channel"
+msgstr ""
+
+msgid "Reset Secret Channel"
+msgstr ""
+
+msgid "Set Secret Channel"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have to join the %s channel before you are able to join the private group"
+msgstr ""
+
+msgid "Join Private Group"
+msgstr ""
+
+msgid "Cannot join private group"
+msgstr ""
+
+msgid "Call Command"
+msgstr ""
+
+msgid "Cannot call command"
+msgstr ""
+
+msgid "Unknown command"
+msgstr ""
+
+msgid "Secure File Transfer"
+msgstr ""
+
+msgid "Error during file transfer"
+msgstr ""
+
+msgid "Remote disconnected"
+msgstr ""
+
+msgid "Permission denied"
+msgstr ""
+
+#, fuzzy
+msgid "Key agreement failed"
+msgstr "Makubaliano Muhimu"
+
+msgid "Connection timed out"
+msgstr "Muunganiko umepita muda"
+
+#, fuzzy
+msgid "Creating connection failed"
+msgstr "Muunganiko salama umeshindikana"
+
+msgid "File transfer session does not exist"
+msgstr ""
+
+msgid "No file transfer session active"
+msgstr ""
+
+msgid "File transfer already started"
+msgstr ""
+
+msgid "Could not perform key agreement for file transfer"
+msgstr ""
+
+msgid "Could not start the file transfer"
+msgstr ""
+
+msgid "Cannot send file"
+msgstr ""
+
+msgid "Error occurred"
+msgstr ""
+
+#, c-format
+msgid "%s has changed the topic of <I>%s</I> to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> set channel <I>%s</I> modes to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> removed all channel <I>%s</I> modes"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> set <I>%s's</I> modes to: %s"
+msgstr ""
+
+#, c-format
+msgid "<I>%s</I> removed all <I>%s's</I> modes"
+msgstr ""
+
+#, c-format
+msgid "You have been kicked off <I>%s</I> by <I>%s</I> (%s)"
+msgstr ""
+
+#, c-format
+msgid "You have been killed by %s (%s)"
+msgstr ""
+
+#, c-format
+msgid "Killed by %s (%s)"
+msgstr ""
+
+msgid "Server signoff"
+msgstr ""
+
+#, fuzzy
+msgid "Personal Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Birth Day"
+msgstr ""
+
+msgid "Job Role"
+msgstr ""
+
+#, fuzzy
+msgid "Organization"
+msgstr "Shirika:"
+
+#, fuzzy
+msgid "Unit"
+msgstr "Kizio:"
+
+msgid "Join Chat"
+msgstr ""
+
+#, c-format
+msgid "You are channel founder on <I>%s</I>"
+msgstr ""
+
+#, c-format
+msgid "Channel founder on <I>%s</I> is <I>%s</I>"
+msgstr ""
+
+msgid "Real Name"
+msgstr ""
+
+#, fuzzy
+msgid "Status Text"
+msgstr "M&wambaa Hali"
+
+msgid "Public Key Fingerprint"
+msgstr ""
+
+msgid "Public Key Babbleprint"
+msgstr ""
+
+msgid "_More..."
+msgstr ""
+
+msgid "Detach From Server"
+msgstr ""
+
+msgid "Cannot detach"
+msgstr ""
+
+msgid "Cannot set topic"
+msgstr ""
+
+msgid "Failed to change nickname"
+msgstr ""
+
+msgid "Roomlist"
+msgstr ""
+
+msgid "Cannot get room list"
+msgstr ""
+
+#, fuzzy
+msgid "Network is empty"
+msgstr "Muda wa mtandao umeisha"
+
+msgid "No public key was received"
+msgstr ""
+
+#, fuzzy
+msgid "Server Information"
+msgstr "Taarifa Zaidi"
+
+msgid "Cannot get server information"
+msgstr ""
+
+msgid "Server Statistics"
+msgstr ""
+
+msgid "Cannot get server statistics"
+msgstr ""
+
+#, c-format
+msgid ""
+"Local server start time: %s\n"
+"Local server uptime: %s\n"
+"Local server clients: %d\n"
+"Local server channels: %d\n"
+"Local server operators: %d\n"
+"Local router operators: %d\n"
+"Local cell clients: %d\n"
+"Local cell channels: %d\n"
+"Local cell servers: %d\n"
+"Total clients: %d\n"
+"Total channels: %d\n"
+"Total servers: %d\n"
+"Total routers: %d\n"
+"Total server operators: %d\n"
+"Total router operators: %d\n"
+msgstr ""
+
+msgid "Network Statistics"
+msgstr ""
+
+#, fuzzy
+msgid "Ping failed"
+msgstr "Imeshindwa kunakili"
+
+msgid "Ping reply received from server"
+msgstr ""
+
+msgid "Could not kill user"
+msgstr ""
+
+msgid "WATCH"
+msgstr ""
+
+msgid "Cannot watch user"
+msgstr ""
+
+#, fuzzy
+msgid "Resuming session"
+msgstr "Rejesha Awamu"
+
+msgid "Authenticating connection"
+msgstr ""
+
+msgid "Verifying server public key"
+msgstr ""
+
+#, fuzzy
+msgid "Passphrase required"
+msgstr "Nywila inatakiwa"
+
+#, c-format
+msgid ""
+"Received %s's public key. Your local copy does not match this key. Would you "
+"still like to accept this public key?"
+msgstr ""
+
+#, c-format
+msgid "Received %s's public key. Would you like to accept this public key?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Fingerprint and babbleprint for the %s key are:\n"
+"\n"
+"%s\n"
+"%s\n"
+msgstr ""
+
+#, fuzzy
+msgid "Verify Public Key"
+msgstr "Ufunguo Huria wa Muhusika"
+
+msgid "_View..."
+msgstr ""
+
+#, fuzzy
+msgid "Unsupported public key type"
+msgstr "Aina ya faili isiyo stahimiliwa."
+
+msgid "Disconnected by server"
+msgstr ""
+
+msgid "Error during connecting to SILC Server"
+msgstr ""
+
+msgid "Key Exchange failed"
+msgstr ""
+
+msgid ""
+"Resuming detached session failed. Press Reconnect to create new connection."
+msgstr ""
+
+#, fuzzy
+msgid "Connection failed"
+msgstr "Unganisho Limeshindikana"
+
+msgid "Performing key exchange"
+msgstr ""
+
+#, fuzzy
+msgid "Unable to create connection"
+msgstr "Haikuweza kuunganishwa"
+
+msgid "Could not load SILC key pair"
+msgstr ""
+
+#. Progress
+#, fuzzy
+msgid "Connecting to SILC Server"
+msgstr "Inaunganisha kwenye seva ya sasisho…"
+
+msgid "Out of memory"
+msgstr "Nje ya kumbukumbu"
+
+msgid "Cannot initialize SILC protocol"
+msgstr ""
+
+msgid "Error loading SILC key pair"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Download %s: %s"
+msgstr "Inapakua: %S"
+
+msgid "Your Current Mood"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Normal"
+msgstr "&Kawaida"
+
+msgid "In love"
+msgstr ""
+
+msgid ""
+"\n"
+"Your Preferred Contact Methods"
+msgstr ""
+
+msgid "SMS"
+msgstr ""
+
+msgid "MMS"
+msgstr ""
+
+msgid "Video conferencing"
+msgstr ""
+
+msgid "Your Current Status"
+msgstr ""
+
+#, fuzzy
+msgid "Online Services"
+msgstr "Huduma za tovuti"
+
+msgid "Let others see what services you are using"
+msgstr ""
+
+msgid "Let others see what computer you are using"
+msgstr ""
+
+msgid "Your VCard File"
+msgstr ""
+
+msgid "Timezone (UTC)"
+msgstr ""
+
+msgid "User Online Status Attributes"
+msgstr ""
+
+msgid ""
+"You can let other users see your online status information and your personal "
+"information. Please fill the information you would like other users to see "
+"about yourself."
+msgstr ""
+
+msgid "Message of the Day"
+msgstr ""
+
+msgid "No Message of the Day available"
+msgstr ""
+
+msgid "There is no Message of the Day associated with this connection"
+msgstr ""
+
+msgid "Create New SILC Key Pair"
+msgstr ""
+
+msgid "Passphrases do not match"
+msgstr ""
+
+msgid "Key Pair Generation failed"
+msgstr ""
+
+msgid "Key length"
+msgstr ""
+
+msgid "Public key file"
+msgstr ""
+
+msgid "Private key file"
+msgstr ""
+
+msgid "Passphrase (retype)"
+msgstr ""
+
+msgid "Generate Key Pair"
+msgstr ""
+
+#, fuzzy
+msgid "Online Status"
+msgstr "Marekani"
+
+msgid "View Message of the Day"
+msgstr ""
+
+msgid "Create SILC Key Pair..."
+msgstr ""
+
+#, c-format
+msgid "User <I>%s</I> is not present in the network"
+msgstr ""
+
+msgid "Topic too long"
+msgstr ""
+
+msgid "You must specify a nick"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "channel %s not found"
+msgstr "Mstari haujapatikana"
+
+#, c-format
+msgid "channel modes for %s: %s"
+msgstr ""
+
+#, c-format
+msgid "no channel modes are set on %s"
+msgstr ""
+
+#, c-format
+msgid "Failed to set cmodes for %s"
+msgstr ""
+
+#, c-format
+msgid "Unknown command: %s, (may be a client bug)"
+msgstr ""
+
+msgid "part [channel]:  Leave the chat"
+msgstr ""
+
+msgid "leave [channel]:  Leave the chat"
+msgstr ""
+
+msgid "topic [&lt;new topic&gt;]:  View or change the topic"
+msgstr ""
+
+msgid "join &lt;channel&gt; [&lt;password&gt;]:  Join a chat on this network"
+msgstr ""
+
+msgid "list:  List channels on this network"
+msgstr ""
+
+msgid "whois &lt;nick&gt;:  View nick's information"
+msgstr ""
+
+msgid "msg &lt;nick&gt; &lt;message&gt;:  Send a private message to a user"
+msgstr ""
+
+msgid "query &lt;nick&gt; [&lt;message&gt;]:  Send a private message to a user"
+msgstr ""
+
+msgid "motd:  View the server's Message Of The Day"
+msgstr ""
+
+msgid "detach:  Detach this session"
+msgstr ""
+
+msgid "quit [message]:  Disconnect from the server, with an optional message"
+msgstr ""
+
+msgid "call &lt;command&gt;:  Call any silc client command"
+msgstr ""
+
+msgid "kill &lt;nick&gt; [-pubkey|&lt;reason&gt;]:  Kill nick"
+msgstr ""
+
+msgid "nick &lt;newnick&gt;:  Change your nickname"
+msgstr ""
+
+msgid "whowas &lt;nick&gt;:  View nick's information"
+msgstr ""
+
+msgid ""
+"cmode &lt;channel&gt; [+|-&lt;modes&gt;] [arguments]:  Change or display "
+"channel modes"
+msgstr ""
+
+msgid ""
+"cumode &lt;channel&gt; +|-&lt;modes&gt; &lt;nick&gt;:  Change nick's modes "
+"on channel"
+msgstr ""
+
+msgid "umode &lt;usermodes&gt;:  Set your modes in the network"
+msgstr ""
+
+msgid "oper &lt;nick&gt; [-pubkey]:  Get server operator privileges"
+msgstr ""
+
+msgid ""
+"invite &lt;channel&gt; [-|+]&lt;nick&gt;:  invite nick or add/remove from "
+"channel invite list"
+msgstr ""
+
+msgid "kick &lt;channel&gt; &lt;nick&gt; [comment]:  Kick client from channel"
+msgstr ""
+
+msgid "info [server]:  View server administrative details"
+msgstr ""
+
+msgid "ban [&lt;channel&gt; +|-&lt;nick&gt;]:  Ban client from channel"
+msgstr ""
+
+msgid "getkey &lt;nick|server&gt;:  Retrieve client's or server's public key"
+msgstr ""
+
+msgid "stats:  View server and network statistics"
+msgstr ""
+
+msgid "ping:  Send PING to the connected server"
+msgstr ""
+
+msgid "users &lt;channel&gt;:  List users in channel"
+msgstr ""
+
+msgid ""
+"names [-count|-ops|-halfops|-voices|-normal] &lt;channel(s)&gt;:  List "
+"specific users in channel(s)"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+msgid "SILC Protocol Plugin"
+msgstr ""
+
+#. *  description
+msgid "Secure Internet Live Conferencing (SILC) Protocol"
+msgstr ""
+
+msgid "Network"
+msgstr "Mtandao"
+
+msgid "Public Key file"
+msgstr ""
+
+msgid "Private Key file"
+msgstr ""
+
+msgid "Cipher"
+msgstr ""
+
+msgid "HMAC"
+msgstr ""
+
+msgid "Use Perfect Forward Secrecy"
+msgstr ""
+
+#, fuzzy
+msgid "Public key authentication"
+msgstr "Ishara ya Uthibitisho Inayoulindwa"
+
+msgid "Block IMs without Key Exchange"
+msgstr ""
+
+msgid "Block messages to whiteboard"
+msgstr ""
+
+msgid "Automatically open whiteboard"
+msgstr ""
+
+msgid "Digitally sign and verify all messages"
+msgstr ""
+
+msgid "Creating SILC key pair..."
+msgstr ""
+
+msgid "Cannot create SILC key pair\n"
+msgstr ""
+
+#. Hint for translators: Please check the tabulator width here and in
+#. the next strings (short strings: 2 tabs, longer strings 1 tab,
+#. sum: 3 tabs or 24 characters)
+#, c-format
+msgid "Real Name: \t%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "User Name: \t%s\n"
+msgstr "Jina la Mtumiaji:"
+
+#, c-format
+msgid "Email: \t\t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Host Name: \t%s\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Organization: \t%s\n"
+msgstr "Jumuiya: \"%S\""
+
+#, c-format
+msgid "Country: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Algorithm: \t%s\n"
+msgstr ""
+
+#, c-format
+msgid "Key Length: \t%d bits\n"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Version: \t%s\n"
+msgstr "Toleo la 1"
+
+#, c-format
+msgid ""
+"Public Key Fingerprint:\n"
+"%s\n"
+"\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"Public Key Babbleprint:\n"
+"%s"
+msgstr ""
+
+#, fuzzy
+msgid "Public Key Information"
+msgstr "Fic&ha Taarifa"
+
+#, fuzzy
+msgid "Paging"
+msgstr "Inahifadhi"
+
+msgid "Video Conferencing"
+msgstr ""
+
+#, fuzzy
+msgid "Computer"
+msgstr "Imemaliza"
+
+msgid "PDA"
+msgstr ""
+
+msgid "Terminal"
+msgstr ""
+
+#, c-format
+msgid "%s sent message to whiteboard. Would you like to open the whiteboard?"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s sent message to whiteboard on %s channel. Would you like to open the "
+"whiteboard?"
+msgstr ""
+
+msgid "Whiteboard"
+msgstr ""
+
+msgid "No server statistics available"
+msgstr ""
+
+#, c-format
+msgid "Failure: Version mismatch, upgrade your client"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not trust/support your public key"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed KE group"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed cipher"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed PKCS"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed hash function"
+msgstr ""
+
+#, c-format
+msgid "Failure: Remote does not support proposed HMAC"
+msgstr ""
+
+#, c-format
+msgid "Failure: Incorrect signature"
+msgstr ""
+
+#, c-format
+msgid "Failure: Invalid cookie"
+msgstr ""
+
+#, c-format
+msgid "Failure: Authentication failed"
+msgstr ""
+
+msgid "Cannot initialize SILC Client connection"
+msgstr ""
+
+msgid "John Noname"
+msgstr ""
+
+#, c-format
+msgid "Could not load SILC key pair: %s"
+msgstr ""
+
+msgid "Could not write"
+msgstr ""
+
+#, fuzzy
+msgid "Could not connect"
+msgstr "\"Haikuweza kupakia: \""
+
+msgid "Unknown server response."
+msgstr ""
+
+msgid "Could not create listen socket"
+msgstr ""
+
+msgid "Could not resolve hostname"
+msgstr ""
+
+msgid "SIP usernames may not contain whitespaces or @ symbols"
+msgstr ""
+
+msgid "SIP connect server not specified"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "SIP/SIMPLE Protocol Plugin"
+msgstr ""
+
+#. *  summary
+msgid "The SIP/SIMPLE Protocol Plugin"
+msgstr ""
+
+msgid "Publish status (note: everyone may watch you)"
+msgstr ""
+
+msgid "Use UDP"
+msgstr ""
+
+msgid "Use proxy"
+msgstr ""
+
+msgid "Proxy"
+msgstr ""
+
+msgid "Auth User"
+msgstr ""
+
+msgid "Auth Domain"
+msgstr ""
+
+#, c-format
+msgid "%s has sent you a webcam invite, which is not yet supported."
+msgstr ""
+
+msgid "Your SMS was not delivered"
+msgstr ""
+
+msgid "Your Yahoo! message did not get sent."
+msgstr ""
+
+#, c-format
+msgid "Yahoo! system message for %s:"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s has (retroactively) denied your request to add them to your list for the "
+"following reason: %s."
+msgstr ""
+
+#, c-format
+msgid "%s has (retroactively) denied your request to add them to your list."
+msgstr ""
+
+msgid "Add buddy rejected"
+msgstr ""
+
+#. Some error in the received stream
+msgid "Received invalid data"
+msgstr ""
+
+#. Password incorrect
+#, fuzzy
+msgid "Incorrect Password"
+msgstr "Nywila ya sasa hivi:"
+
+#. security lock from too many failed login attempts
+msgid "Account locked: Too many failed login attempts"
+msgstr ""
+
+#. the username does not exist
+#, fuzzy
+msgid "Username does not exist"
+msgstr "Faili %S halipo"
+
+#. indicates a lock of some description
+msgid "Account locked: See the debug log"
+msgstr ""
+
+#. username or password missing
+msgid "Username or password missing"
+msgstr ""
+
+#, c-format
+msgid ""
+"The Yahoo server has requested the use of an unrecognized authentication "
+"method.  You will probably not be able to successfully sign on to Yahoo.  "
+"Check %s for updates."
+msgstr ""
+
+msgid "Failed Yahoo! Authentication"
+msgstr ""
+
+#, c-format
+msgid ""
+"You have tried to ignore %s, but the user is on your buddy list.  Clicking "
+"\"Yes\" will remove and ignore the buddy."
+msgstr ""
+
+msgid "Ignore buddy?"
+msgstr ""
+
+msgid "Your account is locked, please log in to the Yahoo! website."
+msgstr ""
+
+#, c-format
+msgid "Unknown error number %d. Logging into the Yahoo! website may fix this."
+msgstr ""
+
+#, c-format
+msgid "Could not add buddy %s to group %s to the server list on account %s."
+msgstr ""
+
+msgid "Could not add buddy to server list"
+msgstr ""
+
+#, c-format
+msgid "[ Audible %s/%s/%s.swf ] %s"
+msgstr ""
+
+#, fuzzy
+msgid "Received unexpected HTTP response from server."
+msgstr "Mwitiko wa bila kutegemea kutoka kwa seva"
+
+#, fuzzy
+msgid "Connection problem"
+msgstr "Unganisho Limeshindikana"
+
+#, c-format
+msgid ""
+"Lost connection with %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Could not establish a connection with %s:\n"
+"%s"
+msgstr ""
+
+msgid "Not at Home"
+msgstr ""
+
+msgid "Not at Desk"
+msgstr ""
+
+msgid "Not in Office"
+msgstr ""
+
+#, fuzzy
+msgid "On Vacation"
+msgstr "Fungua &Mahali…"
+
+msgid "Stepped Out"
+msgstr ""
+
+msgid "Not on server list"
+msgstr ""
+
+#, fuzzy
+msgid "Appear Online"
+msgstr "Baki Mkondoni"
+
+msgid "Appear Permanently Offline"
+msgstr ""
+
+#, fuzzy
+msgid "Presence"
+msgstr "Mapendekezo"
+
+msgid "Appear Offline"
+msgstr ""
+
+msgid "Don't Appear Permanently Offline"
+msgstr ""
+
+msgid "Join in Chat"
+msgstr ""
+
+msgid "Initiate Conference"
+msgstr ""
+
+msgid "Presence Settings"
+msgstr ""
+
+msgid "Start Doodling"
+msgstr ""
+
+msgid "Activate which ID?"
+msgstr ""
+
+msgid "Join whom in chat?"
+msgstr ""
+
+msgid "Activate ID..."
+msgstr ""
+
+msgid "Join User in Chat..."
+msgstr ""
+
+#, fuzzy
+msgid "Open Inbox"
+msgstr "Fungua katika:"
+
+msgid "join &lt;room&gt;:  Join a chat room on the Yahoo network"
+msgstr ""
+
+msgid "list: List rooms on the Yahoo network"
+msgstr ""
+
+msgid "doodle: Request user to start a Doodle session"
+msgstr ""
+
+msgid "Yahoo ID..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Yahoo Protocol Plugin"
+msgstr ""
+
+msgid "Yahoo Japan"
+msgstr ""
+
+msgid "Pager server"
+msgstr ""
+
+msgid "Japan Pager server"
+msgstr ""
+
+#, fuzzy
+msgid "Pager port"
+msgstr "Page Down"
+
+msgid "File transfer server"
+msgstr ""
+
+msgid "Japan file transfer server"
+msgstr ""
+
+msgid "File transfer port"
+msgstr ""
+
+msgid "Chat room locale"
+msgstr ""
+
+msgid "Ignore conference and chatroom invitations"
+msgstr ""
+
+msgid "Chat room list URL"
+msgstr ""
+
+msgid "Yahoo Chat server"
+msgstr ""
+
+msgid "Yahoo Chat port"
+msgstr ""
+
+#. Write a local message to this conversation showing that a request for a
+#. * Doodle session has been made
+#.
+msgid "Sent Doodle request."
+msgstr ""
+
+msgid "Unable to establish file descriptor."
+msgstr ""
+
+#, c-format
+msgid "%s is trying to send you a group of %d files.\n"
+msgstr ""
+
+msgid "Yahoo! Japan Profile"
+msgstr ""
+
+#, fuzzy
+msgid "Yahoo! Profile"
+msgstr "Yahoo! Barua"
+
+msgid ""
+"Sorry, profiles marked as containing adult content are not supported at this "
+"time."
+msgstr ""
+
+msgid ""
+"If you wish to view this profile, you will need to visit this link in your "
+"web browser:"
+msgstr ""
+
+#, fuzzy
+msgid "Yahoo! ID"
+msgstr "Yahoo! Barua"
+
+msgid "Hobbies"
+msgstr ""
+
+msgid "Latest News"
+msgstr ""
+
+#, fuzzy
+msgid "Home Page"
+msgstr "Ukurasa wa &Nyumbani:"
+
+msgid "Cool Link 1"
+msgstr ""
+
+msgid "Cool Link 2"
+msgstr ""
+
+msgid "Cool Link 3"
+msgstr ""
+
+msgid "Last Update"
+msgstr "Sasisho la mara ya mwisho"
+
+msgid ""
+"This profile is in a language or format that is not supported at this time."
+msgstr ""
+
+msgid ""
+"Could not retrieve the user's profile. This most likely is a temporary "
+"server-side problem. Please try again later."
+msgstr ""
+
+msgid ""
+"Could not retrieve the user's profile. This most likely means that the user "
+"does not exist; however, Yahoo! sometimes does fail to find a user's "
+"profile. If you know that the user exists, please try again later."
+msgstr ""
+
+msgid "The user's profile is empty."
+msgstr ""
+
+#, c-format
+msgid "%s declined your conference invitation to room \"%s\" because \"%s\"."
+msgstr ""
+
+msgid "Invitation Rejected"
+msgstr ""
+
+#, fuzzy
+msgid "Failed to join chat"
+msgstr "Imeshindwa kuunganisha"
+
+#. -6
+#, fuzzy
+msgid "Unknown room"
+msgstr "Hitilafu isiyojulikana"
+
+#. -15
+msgid "Maybe the room is full"
+msgstr ""
+
+#. -35
+msgid "Not available"
+msgstr "Haipatikani"
+
+msgid ""
+"Unknown error. You may need to logout and wait five minutes before being "
+"able to rejoin a chatroom"
+msgstr ""
+
+#, c-format
+msgid "You are now chatting in %s."
+msgstr ""
+
+msgid "Failed to join buddy in chat"
+msgstr ""
+
+msgid "Maybe they're not in a chat?"
+msgstr ""
+
+msgid "Fetching the room list failed."
+msgstr ""
+
+msgid "Voices"
+msgstr ""
+
+msgid "Webcams"
+msgstr ""
+
+msgid "Unable to fetch room list."
+msgstr ""
+
+msgid "User Rooms"
+msgstr ""
+
+msgid "Connection problem with the YCHT server."
+msgstr ""
+
+#, c-format
+msgid ""
+"Lost connection with server\n"
+"%s"
+msgstr ""
+
+msgid ""
+"(There was an error converting this message.\t Check the 'Encoding' option "
+"in the Account Editor)"
+msgstr ""
+
+#, c-format
+msgid "Unable to send to chat %s,%s,%s"
+msgstr ""
+
+msgid "Hidden or not logged-in"
+msgstr ""
+
+#, c-format
+msgid "<br>At %s since %s"
+msgstr ""
+
+msgid "Anyone"
+msgstr ""
+
+msgid "_Class:"
+msgstr ""
+
+#, fuzzy
+msgid "_Instance:"
+msgstr "Imesakinishwa"
+
+msgid "_Recipient:"
+msgstr ""
+
+#, c-format
+msgid "Attempt to subscribe to %s,%s,%s failed"
+msgstr ""
+
+msgid "zlocate &lt;nick&gt;: Locate user"
+msgstr ""
+
+msgid "zl &lt;nick&gt;: Locate user"
+msgstr ""
+
+msgid "instance &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "inst &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "topic &lt;instance&gt;: Set the instance to be used on this class"
+msgstr ""
+
+msgid "sub &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Join a new chat"
+msgstr ""
+
+msgid ""
+"zi &lt;instance&gt;: Send a message to &lt;message,<i>instance</i>,*&gt;"
+msgstr ""
+
+msgid ""
+"zci &lt;class&gt; &lt;instance&gt;: Send a message to &lt;<i>class</i>,"
+"<i>instance</i>,*&gt;"
+msgstr ""
+
+msgid ""
+"zcir &lt;class&gt; &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;"
+"<i>class</i>,<i>instance</i>,<i>recipient</i>&gt;"
+msgstr ""
+
+msgid ""
+"zir &lt;instance&gt; &lt;recipient&gt;: Send a message to &lt;MESSAGE,"
+"<i>instance</i>,<i>recipient</i>&gt;"
+msgstr ""
+
+msgid "zc &lt;class&gt;: Send a message to &lt;<i>class</i>,PERSONAL,*&gt;"
+msgstr ""
+
+#, fuzzy
+msgid "Resubscribe"
+msgstr "Jiunge"
+
+msgid "Retrieve subscriptions from server"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Zephyr Protocol Plugin"
+msgstr ""
+
+msgid "Use tzc"
+msgstr ""
+
+msgid "tzc command"
+msgstr ""
+
+msgid "Export to .anyone"
+msgstr ""
+
+msgid "Export to .zephyr.subs"
+msgstr ""
+
+msgid "Import from .anyone"
+msgstr ""
+
+msgid "Import from .zephyr.subs"
+msgstr ""
+
+#, fuzzy
+msgid "Realm"
+msgstr "Tayari"
+
+msgid "Exposure"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to create socket:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "Unable to parse response from HTTP proxy: %s\n"
+msgstr ""
+
+#, c-format
+msgid "HTTP proxy connection error %d"
+msgstr ""
+
+#, c-format
+msgid "Access denied: HTTP proxy server forbids port %d tunneling."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error resolving %s"
+msgstr "Hitilafu katika kuhifadhi %S"
+
+msgid "Could not resolve host name"
+msgstr ""
+
+#, c-format
+msgid "Requesting %s's attention..."
+msgstr ""
+
+#, c-format
+msgid "%s has requested your attention!"
+msgstr ""
+
+#. *
+#. * A wrapper for purple_request_action() that uses @c Yes and @c No buttons.
+#.
+#, fuzzy
+msgid "_Yes"
+msgstr "Ndiyo"
+
+#, fuzzy
+msgid "_No"
+msgstr "Hapana"
+
+#. *
+#. * A wrapper for purple_request_action() that uses Accept and Cancel buttons.
+#.
+msgid "_Accept"
+msgstr ""
+
+#. *
+#. * The default message to use when the user becomes auto-away.
+#.
+msgid "I'm not here right now"
+msgstr ""
+
+msgid "saved statuses"
+msgstr ""
+
+#, c-format
+msgid "%s is now known as %s.\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s has invited %s to the chat room %s:\n"
+"%s"
+msgstr ""
+
+#, c-format
+msgid "%s has invited %s to the chat room %s\n"
+msgstr ""
+
+msgid "Accept chat invitation?"
+msgstr ""
+
+#. Shortcut
+msgid "Shortcut"
+msgstr ""
+
+msgid "The text-shortcut for the smiley"
+msgstr ""
+
+#. Stored Image
+#, fuzzy
+msgid "Stored Image"
+msgstr "Hifadhi Taswira"
+
+msgid "Stored Image. (that'll have to do for now)"
+msgstr ""
+
+#, fuzzy
+msgid "SSL Connection Failed"
+msgstr "Unganisho Limeshindikana"
+
+msgid "SSL Handshake Failed"
+msgstr ""
+
+msgid "SSL peer presented an invalid certificate"
+msgstr ""
+
+#, fuzzy
+msgid "Unknown SSL error"
+msgstr "Hitilafu isiyojulikana"
+
+#, fuzzy
+msgid "Unset"
+msgstr "Haitumiki"
+
+msgid "Do not disturb"
+msgstr ""
+
+msgid "Extended away"
+msgstr ""
+
+msgid "Listening to music"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) changed status from %s to %s"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) is now %s"
+msgstr ""
+
+#, c-format
+msgid "%s (%s) is no longer %s"
+msgstr ""
+
+#, c-format
+msgid "%s became idle"
+msgstr ""
+
+#, c-format
+msgid "%s became unidle"
+msgstr ""
+
+#, c-format
+msgid "+++ %s became idle"
+msgstr ""
+
+#, c-format
+msgid "+++ %s became unidle"
+msgstr ""
+
+#.
+#. * This string determines how some dates are displayed.  The default
+#. * string "%x %X" shows the date then the time.  Translators can
+#. * change this to "%X %x" if they want the time to be shown first,
+#. * followed by the date.
+#.
+#, fuzzy, c-format
+msgid "%x %X"
+msgstr "%S %S"
+
+msgid "Calculating..."
+msgstr ""
+
+#, fuzzy
+msgid "Unknown."
+msgstr "Isiyojulikana"
+
+#, c-format
+msgid "%d second"
+msgid_plural "%d seconds"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d day"
+msgid_plural "%d days"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%s, %d hour"
+msgid_plural "%s, %d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d hour"
+msgid_plural "%d hours"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%s, %d minute"
+msgid_plural "%s, %d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "%d minute"
+msgid_plural "%d minutes"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "Could not open %s: Redirected too many times"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unable to connect to %s"
+msgstr "Haikuweza kuunganishwa"
+
+#, c-format
+msgid "Error reading from %s: response too long (%d bytes limit)"
+msgstr ""
+
+#, c-format
+msgid ""
+"Unable to allocate enough memory to hold the contents from %s.  The web "
+"server may be trying something malicious."
+msgstr ""
+
+#, c-format
+msgid "Error reading from %s: %s"
+msgstr ""
+
+#, c-format
+msgid "Error writing to %s: %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Unable to connect to %s: %s"
+msgstr "Haikuweza kuunganishwa"
+
+#, c-format
+msgid ""
+"Unable to connect to %s: Server requires TLS/SSL, but no TLS/SSL support was "
+"found."
+msgstr ""
+
+#, c-format
+msgid " - %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid " (%s)"
+msgstr "(%S)"
+
+#. 10053
+#, c-format
+msgid "Connection interrupted by other software on your computer."
+msgstr ""
+
+#. 10054
+#, fuzzy, c-format
+msgid "Remote host closed connection."
+msgstr "Mwenzi SSL imefunga uunganisho huu"
+
+#. 10060
+#, fuzzy, c-format
+msgid "Connection timed out."
+msgstr "Muunganiko umepita muda"
+
+#. 10061
+#, fuzzy, c-format
+msgid "Connection refused."
+msgstr "Muunganisho ulikataliwa"
+
+#. 10048
+#, c-format
+msgid "Address already in use."
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error Reading %s"
+msgstr "Hitilafu wakati natengeneza %S"
+
+#, c-format
+msgid ""
+"An error was encountered reading your %s.  The file has not been loaded, and "
+"the old file has been renamed to %s~."
+msgstr ""
+
+#, fuzzy
+msgid "Internet Messenger"
+msgstr "Internet Explorer"
+
+msgid "Pidgin Internet Messenger"
+msgstr ""
+
+msgid "Send instant messages over multiple protocols"
+msgstr ""
+
+#, fuzzy
+msgid "Orientation"
+msgstr "Mkao:"
+
+msgid "The orientation of the tray."
+msgstr ""
+
+#. Build the login options frame.
+msgid "Login Options"
+msgstr ""
+
+#, fuzzy
+msgid "Pro_tocol:"
+msgstr "Itifaki"
+
+#, fuzzy
+msgid "_Username:"
+msgstr "Jina la mtumiaji"
+
+#, fuzzy
+msgid "Remember pass_word"
+msgstr "Ingiza tena nywila:"
+
+#. Build the user options frame.
+#, fuzzy
+msgid "User Options"
+msgstr "Machaguo ya Mtandao"
+
+msgid "_Local alias:"
+msgstr ""
+
+#, fuzzy
+msgid "New _mail notifications"
+msgstr "Arifisho la Jumla"
+
+#. Buddy icon
+msgid "Use this buddy _icon for this account:"
+msgstr ""
+
+#, fuzzy
+msgid "_Advanced"
+msgstr "Pevu"
+
+#, fuzzy
+msgid "Use GNOME Proxy Settings"
+msgstr "&Tumia vipimo vya wakala vya mfumo"
+
+#, fuzzy
+msgid "Use Global Proxy Settings"
+msgstr "&Tumia vipimo vya wakala vya mfumo"
+
+#, fuzzy
+msgid "No Proxy"
+msgstr "Hakuna waka&la"
+
+msgid "HTTP"
+msgstr ""
+
+#, fuzzy
+msgid "SOCKS 4"
+msgstr "SOC&KS v4"
+
+#, fuzzy
+msgid "SOCKS 5"
+msgstr "SOCKS &v5"
+
+msgid "Use Environmental Settings"
+msgstr ""
+
+#. This is an easter egg.
+#. It means one of two things, both intended as humourus:
+#. A) your network is really slow and you have nothing better to do than
+#. look at butterflies.
+#. B)You are looking really closely at something that shouldn't matter.
+msgid "If you look real closely"
+msgstr ""
+
+#. This is an easter egg. See the comment on the previous line in the source.
+msgid "you can see the butterflies mating"
+msgstr ""
+
+msgid "Proxy _type:"
+msgstr ""
+
+#, fuzzy
+msgid "_Host:"
+msgstr "Mwenyeji:"
+
+#, fuzzy
+msgid "_Port:"
+msgstr "Lango:"
+
+#, fuzzy
+msgid "Pa_ssword:"
+msgstr "Nywila:"
+
+msgid "Unable to save new account"
+msgstr ""
+
+msgid "An account already exists with the specified criteria."
+msgstr ""
+
+msgid "Add Account"
+msgstr ""
+
+msgid "_Basic"
+msgstr ""
+
+msgid "Create _this new account on the server"
+msgstr ""
+
+msgid "_Proxy"
+msgstr ""
+
+msgid "Enabled"
+msgstr "Imeamshwa"
+
+#, fuzzy
+msgid "Protocol"
+msgstr "Itifaki"
+
+#, c-format
+msgid ""
+"<span size='larger' weight='bold'>Welcome to %s!</span>\n"
+"\n"
+"You have no IM accounts configured. To start connecting with %s press the "
+"<b>Add...</b> button below and configure your first account. If you want %s "
+"to connect to multiple IM accounts, press <b>Add...</b> again to configure "
+"them all.\n"
+"\n"
+"You can come back to this window to add, edit, or remove accounts from "
+"<b>Accounts->Manage Accounts</b> in the Buddy List window"
+msgstr ""
+
+#, 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] ""
+msgstr[1] ""
+
+msgid ""
+"Merging these contacts will cause them to share a single entry on the buddy "
+"list and use a single conversation window. You can separate them again by "
+"choosing 'Expand' from the contact's context menu"
+msgstr ""
+
+msgid "Please update the necessary fields."
+msgstr ""
+
+#, fuzzy
+msgid "A_ccount"
+msgstr "hesabu ya matembeleo"
+
+msgid ""
+"Please enter the appropriate information about the chat you would like to "
+"join.\n"
+msgstr ""
+
+msgid "Room _List"
+msgstr ""
+
+#, fuzzy
+msgid "_Block"
+msgstr "Zuia"
+
+msgid "Un_block"
+msgstr ""
+
+#, fuzzy
+msgid "Move to"
+msgstr "Sogeza kwenda:"
+
+msgid "Get _Info"
+msgstr ""
+
+msgid "I_M"
+msgstr ""
+
+msgid "_Audio Call"
+msgstr ""
+
+msgid "Audio/_Video Call"
+msgstr ""
+
+msgid "_Video Call"
+msgstr ""
+
+msgid "_Send File..."
+msgstr ""
+
+msgid "Add Buddy _Pounce..."
+msgstr ""
+
+msgid "View _Log"
+msgstr ""
+
+msgid "Hide when offline"
+msgstr ""
+
+msgid "_Alias..."
+msgstr ""
+
+#, fuzzy
+msgid "_Remove"
+msgstr "Ondoa"
+
+msgid "Set Custom Icon"
+msgstr ""
+
+msgid "Remove Custom Icon"
+msgstr ""
+
+msgid "Add _Buddy..."
+msgstr ""
+
+msgid "Add C_hat..."
+msgstr ""
+
+#, fuzzy
+msgid "_Delete Group"
+msgstr "Futa mwenyeji"
+
+#, fuzzy
+msgid "_Rename"
+msgstr "&Badili jina"
+
+#. join button
+msgid "_Join"
+msgstr ""
+
+msgid "Auto-Join"
+msgstr ""
+
+#, fuzzy
+msgid "Persistent"
+msgstr "Kipersia"
+
+msgid "_Edit Settings..."
+msgstr ""
+
+#, fuzzy
+msgid "_Collapse"
+msgstr "Kunja"
+
+#, fuzzy
+msgid "_Expand"
+msgstr "Tanua"
+
+msgid "/Tools/Mute Sounds"
+msgstr ""
+
+msgid ""
+"You are not currently signed on with an account that can add that buddy."
+msgstr ""
+
+#. I don't believe this can happen currently, I think
+#. * everything that calls this function checks for one of the
+#. * above node types first.
+#, fuzzy
+msgid "Unknown node type"
+msgstr "Utambulisho usiojulikana"
+
+#. Buddies menu
+msgid "/_Buddies"
+msgstr ""
+
+msgid "/Buddies/New Instant _Message..."
+msgstr ""
+
+msgid "/Buddies/Join a _Chat..."
+msgstr ""
+
+msgid "/Buddies/Get User _Info..."
+msgstr ""
+
+msgid "/Buddies/View User _Log..."
+msgstr ""
+
+msgid "/Buddies/Sh_ow"
+msgstr ""
+
+msgid "/Buddies/Show/_Offline Buddies"
+msgstr ""
+
+msgid "/Buddies/Show/_Empty Groups"
+msgstr ""
+
+msgid "/Buddies/Show/Buddy _Details"
+msgstr ""
+
+msgid "/Buddies/Show/Idle _Times"
+msgstr ""
+
+msgid "/Buddies/Show/_Protocol Icons"
+msgstr ""
+
+msgid "/Buddies/_Sort Buddies"
+msgstr ""
+
+msgid "/Buddies/_Add Buddy..."
+msgstr ""
+
+msgid "/Buddies/Add C_hat..."
+msgstr ""
+
+msgid "/Buddies/Add _Group..."
+msgstr ""
+
+msgid "/Buddies/_Quit"
+msgstr ""
+
+#. Accounts menu
+msgid "/_Accounts"
+msgstr ""
+
+msgid "/Accounts/Manage Accounts"
+msgstr ""
+
+#. Tools
+#, fuzzy
+msgid "/_Tools"
+msgstr "&Zana"
+
+msgid "/Tools/Buddy _Pounces"
+msgstr ""
+
+#, fuzzy
+msgid "/Tools/_Certificates"
+msgstr "Ithibati Zako"
+
+msgid "/Tools/Custom Smile_ys"
+msgstr ""
+
+msgid "/Tools/Plu_gins"
+msgstr ""
+
+msgid "/Tools/Pr_eferences"
+msgstr ""
+
+msgid "/Tools/Pr_ivacy"
+msgstr ""
+
+msgid "/Tools/_File Transfers"
+msgstr ""
+
+msgid "/Tools/R_oom List"
+msgstr ""
+
+msgid "/Tools/System _Log"
+msgstr ""
+
+msgid "/Tools/Mute _Sounds"
+msgstr ""
+
+#. Help
+#, fuzzy
+msgid "/_Help"
+msgstr "Msaada"
+
+msgid "/Help/Online _Help"
+msgstr ""
+
+msgid "/Help/_Debug Window"
+msgstr ""
+
+msgid "/Help/_About"
+msgstr ""
+
+#, c-format
+msgid "<b>Account:</b> %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Occupants:</b> %d"
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Topic:</b> %s"
+msgstr ""
+
+#, fuzzy
+msgid "(no topic set)"
+msgstr "(haijawekwa)"
+
+msgid "Buddy Alias"
+msgstr ""
+
+msgid "Logged In"
+msgstr "Ingia"
+
+msgid "Last Seen"
+msgstr ""
+
+msgid "Spooky"
+msgstr ""
+
+msgid "Awesome"
+msgstr ""
+
+msgid "Rockin'"
+msgstr ""
+
+msgid "Total Buddies"
+msgstr ""
+
+#, c-format
+msgid "Idle %dd %dh %02dm"
+msgstr ""
+
+#, c-format
+msgid "Idle %dh %02dm"
+msgstr ""
+
+#, c-format
+msgid "Idle %dm"
+msgstr ""
+
+msgid "/Buddies/New Instant Message..."
+msgstr ""
+
+msgid "/Buddies/Join a Chat..."
+msgstr ""
+
+msgid "/Buddies/Get User Info..."
+msgstr ""
+
+msgid "/Buddies/Add Buddy..."
+msgstr ""
+
+msgid "/Buddies/Add Chat..."
+msgstr ""
+
+msgid "/Buddies/Add Group..."
+msgstr ""
+
+msgid "/Tools/Privacy"
+msgstr ""
+
+msgid "/Tools/Room List"
+msgstr ""
+
+#, c-format
+msgid "%d unread message from %s\n"
+msgid_plural "%d unread messages from %s\n"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "Manually"
+msgstr "Januari"
+
+msgid "By status"
+msgstr ""
+
+msgid "By recent log activity"
+msgstr ""
+
+#, c-format
+msgid "%s disconnected"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "%s disabled"
+msgstr "Imelemazwa"
+
+msgid "Reconnect"
+msgstr ""
+
+msgid "Re-enable"
+msgstr ""
+
+#, fuzzy
+msgid "SSL FAQs"
+msgstr "SSL CA"
+
+#, fuzzy
+msgid "Welcome back!"
+msgstr "Karibu Wanadamu!"
+
+#, c-format
+msgid "%d account was disabled because you signed on from another location:"
+msgid_plural ""
+"%d accounts were disabled because you signed on from another location:"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "<b>Username:</b>"
+msgstr ""
+
+msgid "<b>Password:</b>"
+msgstr ""
+
+msgid "_Login"
+msgstr ""
+
+msgid "/Accounts"
+msgstr ""
+
+#. Translators: Please maintain the use of -> and <- to refer to menu heirarchy
+#, c-format
+msgid ""
+"<span weight='bold' size='larger'>Welcome to %s!</span>\n"
+"\n"
+"You have no accounts enabled. Enable your IM accounts from the <b>Accounts</"
+"b> window at <b>Accounts->Manage Accounts</b>. Once you enable accounts, "
+"you'll be able to sign on, set your status, and talk to your friends."
+msgstr ""
+
+#. set the Show Offline Buddies option. must be done
+#. * after the treeview or faceprint gets mad. -Robot101
+#.
+msgid "/Buddies/Show/Offline Buddies"
+msgstr ""
+
+msgid "/Buddies/Show/Empty Groups"
+msgstr ""
+
+msgid "/Buddies/Show/Buddy Details"
+msgstr ""
+
+msgid "/Buddies/Show/Idle Times"
+msgstr ""
+
+msgid "/Buddies/Show/Protocol Icons"
+msgstr ""
+
+msgid "Add a buddy.\n"
+msgstr ""
+
+msgid "Buddy's _username:"
+msgstr ""
+
+msgid "(Optional) A_lias:"
+msgstr ""
+
+msgid "Add buddy to _group:"
+msgstr ""
+
+msgid "This protocol does not support chat rooms."
+msgstr ""
+
+msgid ""
+"You are not currently signed on with any protocols that have the ability to "
+"chat."
+msgstr ""
+
+msgid ""
+"Please enter an alias, and the appropriate information about the chat you "
+"would like to add to your buddy list.\n"
+msgstr ""
+
+msgid "A_lias:"
+msgstr ""
+
+msgid "_Group:"
+msgstr ""
+
+msgid "Auto_join when account becomes online."
+msgstr ""
+
+msgid "_Remain in chat after window is closed."
+msgstr ""
+
+msgid "Please enter the name of the group to be added."
+msgstr ""
+
+msgid "Enable Account"
+msgstr ""
+
+msgid "<PurpleMain>/Accounts/Enable Account"
+msgstr ""
+
+msgid "<PurpleMain>/Accounts/"
+msgstr ""
+
+#, fuzzy
+msgid "_Edit Account"
+msgstr "hesabu ya matembeleo"
+
+#, fuzzy
+msgid "No actions available"
+msgstr "Haipatikani"
+
+#, fuzzy
+msgid "_Disable"
+msgstr "Lemaza"
+
+#, fuzzy
+msgid "/Tools"
+msgstr "&Zana"
+
+msgid "/Buddies/Sort Buddies"
+msgstr ""
+
+#. Widget creation function
+#, fuzzy
+msgid "SSL Servers"
+msgstr "SSL Seva"
+
+msgid "Unknown command."
+msgstr ""
+
+msgid "That buddy is not on the same protocol as this chat."
+msgstr ""
+
+msgid ""
+"You are not currently signed on with an account that can invite that buddy."
+msgstr ""
+
+msgid "Invite Buddy Into Chat Room"
+msgstr ""
+
+msgid "_Buddy:"
+msgstr ""
+
+#, fuzzy
+msgid "_Message:"
+msgstr "Ujumbe"
+
+#, c-format
+msgid "<h1>Conversation with %s</h1>\n"
+msgstr ""
+
+msgid "Save Conversation"
+msgstr ""
+
+msgid "Find"
+msgstr "Tafuta"
+
+msgid "_Search for:"
+msgstr ""
+
+msgid "Un-Ignore"
+msgstr ""
+
+msgid "Ignore"
+msgstr ""
+
+msgid "Get Away Message"
+msgstr ""
+
+#, fuzzy
+msgid "Last said"
+msgstr "Ukurasa wa mwisho"
+
+msgid "Unable to save icon file to disk."
+msgstr ""
+
+#, fuzzy
+msgid "Save Icon"
+msgstr "Hifadhi Taswira"
+
+#, fuzzy
+msgid "Animate"
+msgstr "Fanya hai"
+
+msgid "Hide Icon"
+msgstr ""
+
+msgid "Save Icon As..."
+msgstr ""
+
+msgid "Set Custom Icon..."
+msgstr ""
+
+msgid "Change Size"
+msgstr ""
+
+msgid "Show All"
+msgstr "Onyesha Zote"
+
+#. Conversation menu
+msgid "/_Conversation"
+msgstr ""
+
+msgid "/Conversation/New Instant _Message..."
+msgstr ""
+
+msgid "/Conversation/_Find..."
+msgstr ""
+
+msgid "/Conversation/View _Log"
+msgstr ""
+
+msgid "/Conversation/_Save As..."
+msgstr ""
+
+msgid "/Conversation/Clea_r Scrollback"
+msgstr ""
+
+msgid "/Conversation/M_edia"
+msgstr ""
+
+msgid "/Conversation/Media/_Audio Call"
+msgstr ""
+
+msgid "/Conversation/Media/_Video Call"
+msgstr ""
+
+msgid "/Conversation/Media/Audio\\/Video _Call"
+msgstr ""
+
+msgid "/Conversation/Se_nd File..."
+msgstr ""
+
+msgid "/Conversation/Add Buddy _Pounce..."
+msgstr ""
+
+msgid "/Conversation/_Get Info"
+msgstr ""
+
+msgid "/Conversation/In_vite..."
+msgstr ""
+
+msgid "/Conversation/M_ore"
+msgstr ""
+
+msgid "/Conversation/Al_ias..."
+msgstr ""
+
+msgid "/Conversation/_Block..."
+msgstr ""
+
+msgid "/Conversation/_Unblock..."
+msgstr ""
+
+msgid "/Conversation/_Add..."
+msgstr ""
+
+msgid "/Conversation/_Remove..."
+msgstr ""
+
+msgid "/Conversation/Insert Lin_k..."
+msgstr ""
+
+msgid "/Conversation/Insert Imag_e..."
+msgstr ""
+
+msgid "/Conversation/_Close"
+msgstr ""
+
+#. Options
+#, fuzzy
+msgid "/_Options"
+msgstr "Machaguo"
+
+msgid "/Options/Enable _Logging"
+msgstr ""
+
+msgid "/Options/Enable _Sounds"
+msgstr ""
+
+msgid "/Options/Show Formatting _Toolbars"
+msgstr ""
+
+msgid "/Options/Show Ti_mestamps"
+msgstr ""
+
+msgid "/Conversation/More"
+msgstr ""
+
+#, fuzzy
+msgid "/Options"
+msgstr "Machaguo"
+
+#. The menubar has been deactivated. Make sure the 'More' submenu is regenerated next time
+#. * the 'Conversation' menu pops up.
+#. Make sure the 'Conversation -> More' menuitems are regenerated whenever
+#. * the 'Conversation' menu pops up because the entries can change after the
+#. * conversation is created.
+#, fuzzy
+msgid "/Conversation"
+msgstr "Unganisho"
+
+msgid "/Conversation/View Log"
+msgstr ""
+
+msgid "/Conversation/Media/Audio Call"
+msgstr ""
+
+msgid "/Conversation/Media/Video Call"
+msgstr ""
+
+msgid "/Conversation/Media/Audio\\/Video Call"
+msgstr ""
+
+msgid "/Conversation/Send File..."
+msgstr ""
+
+msgid "/Conversation/Add Buddy Pounce..."
+msgstr ""
+
+msgid "/Conversation/Get Info"
+msgstr ""
+
+msgid "/Conversation/Invite..."
+msgstr ""
+
+msgid "/Conversation/Alias..."
+msgstr ""
+
+msgid "/Conversation/Block..."
+msgstr ""
+
+msgid "/Conversation/Unblock..."
+msgstr ""
+
+msgid "/Conversation/Add..."
+msgstr ""
+
+msgid "/Conversation/Remove..."
+msgstr ""
+
+msgid "/Conversation/Insert Link..."
+msgstr ""
+
+msgid "/Conversation/Insert Image..."
+msgstr ""
+
+msgid "/Options/Enable Logging"
+msgstr ""
+
+msgid "/Options/Enable Sounds"
+msgstr ""
+
+msgid "/Options/Show Formatting Toolbars"
+msgstr ""
+
+msgid "/Options/Show Timestamps"
+msgstr ""
+
+msgid "User is typing..."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"%s has stopped typing"
+msgstr ""
+
+#. Build the Send To menu
+#, fuzzy
+msgid "S_end To"
+msgstr "Tuma kwa:"
+
+msgid "_Send"
+msgstr ""
+
+#. Setup the label telling how many people are in the room.
+msgid "0 people in room"
+msgstr ""
+
+#, c-format
+msgid "%d person in room"
+msgid_plural "%d people in room"
+msgstr[0] ""
+msgstr[1] ""
+
+msgid "Typing"
+msgstr ""
+
+msgid "Stopped Typing"
+msgstr ""
+
+msgid "Nick Said"
+msgstr ""
+
+#, fuzzy
+msgid "Unread Messages"
+msgstr "Jumbe za tahadhari"
+
+msgid "New Event"
+msgstr ""
+
+msgid "clear: Clears all conversation scrollbacks."
+msgstr ""
+
+msgid "Confirm close"
+msgstr "Thibitisha kufunga"
+
+msgid "You have unread messages. Are you sure you want to close the window?"
+msgstr ""
+
+#, fuzzy
+msgid "Close other tabs"
+msgstr "Funga Tab&o Nyingine"
+
+#, fuzzy
+msgid "Close all tabs"
+msgstr "Funga tabo"
+
+msgid "Detach this tab"
+msgstr ""
+
+#, fuzzy
+msgid "Close this tab"
+msgstr "Funga ujumbe huu"
+
+msgid "Close conversation"
+msgstr ""
+
+msgid "Last created window"
+msgstr ""
+
+msgid "Separate IM and Chat windows"
+msgstr ""
+
+msgid "New window"
+msgstr "Dirisha jipya"
+
+msgid "By group"
+msgstr ""
+
+msgid "By account"
+msgstr ""
+
+msgid "Save Debug Log"
+msgstr ""
+
+msgid "Invert"
+msgstr ""
+
+#, fuzzy
+msgid "Highlight matches"
+msgstr "&Angaza yote"
+
+msgid "_Icon Only"
+msgstr ""
+
+#, fuzzy
+msgid "_Text Only"
+msgstr "Kuza Saizi ya Maandishi &Tu"
+
+msgid "_Both Icon & Text"
+msgstr ""
+
+#, fuzzy
+msgid "Filter"
+msgstr "Ch&uja:"
+
+msgid "Right click for more options."
+msgstr ""
+
+msgid "Level "
+msgstr ""
+
+msgid "Select the debug filter level."
+msgstr ""
+
+#, fuzzy
+msgid "All"
+msgstr "&Yote"
+
+msgid "Misc"
+msgstr ""
+
+#, fuzzy
+msgid "Warning"
+msgstr "Tahadhari:"
+
+#, fuzzy
+msgid "Error "
+msgstr "Hitikafu "
+
+#, fuzzy
+msgid "Fatal Error"
+msgstr "Hitilafu katika kusakinisha"
+
+msgid "bug master"
+msgstr ""
+
+msgid "artist"
+msgstr ""
+
+#. feel free to not translate this
+msgid "Ka-Hing Cheung"
+msgstr ""
+
+msgid "voice and video"
+msgstr ""
+
+msgid "support"
+msgstr ""
+
+msgid "webmaster"
+msgstr ""
+
+msgid "Senior Contributor/QA"
+msgstr ""
+
+msgid "win32 port"
+msgstr ""
+
+msgid "maintainer"
+msgstr ""
+
+msgid "libfaim maintainer"
+msgstr ""
+
+#. If "lazy bum" translates literally into a serious insult, use something else or omit it.
+msgid "hacker and designated driver [lazy bum]"
+msgstr ""
+
+msgid "support/QA"
+msgstr ""
+
+msgid "XMPP"
+msgstr ""
+
+msgid "original author"
+msgstr ""
+
+msgid "lead developer"
+msgstr ""
+
+msgid "Afrikaans"
+msgstr "Kiafriakansi"
+
+msgid "Arabic"
+msgstr "Kiarabu"
+
+#, fuzzy
+msgid "Belarusian Latin"
+msgstr "Kibelarusi"
+
+msgid "Bulgarian"
+msgstr "Kibulgaria"
+
+msgid "Bengali"
+msgstr "Kibengalia"
+
+msgid "Bosnian"
+msgstr "Kibosnia"
+
+msgid "Catalan"
+msgstr "Kicatala"
+
+msgid "Valencian-Catalan"
+msgstr ""
+
+msgid "Czech"
+msgstr "Kiczech"
+
+msgid "Danish"
+msgstr "Kidanishi"
+
+msgid "German"
+msgstr "Kijerumani"
+
+msgid "Dzongkha"
+msgstr "Kidzongkha"
+
+msgid "Greek"
+msgstr "Kigiriki"
+
+msgid "Australian English"
+msgstr ""
+
+msgid "Canadian English"
+msgstr ""
+
+msgid "British English"
+msgstr ""
+
+msgid "Esperanto"
+msgstr "Kiesperanto"
+
+msgid "Spanish"
+msgstr "Kihispania"
+
+msgid "Estonian"
+msgstr "Kiestonia"
+
+msgid "Euskera(Basque)"
+msgstr ""
+
+msgid "Persian"
+msgstr "Kipersia"
+
+msgid "Finnish"
+msgstr "Kifinishi"
+
+msgid "French"
+msgstr "Kifaransa"
+
+msgid "Irish"
+msgstr "Kiirishi"
+
+msgid "Galician"
+msgstr "Kigalacy"
+
+msgid "Gujarati"
+msgstr "Kigujarati"
+
+msgid "Gujarati Language Team"
+msgstr ""
+
+msgid "Hebrew"
+msgstr "Kiebrania"
+
+msgid "Hindi"
+msgstr "Kihindi"
+
+msgid "Hungarian"
+msgstr "Kihungaria"
+
+msgid "Indonesian"
+msgstr "Kindonesia"
+
+msgid "Italian"
+msgstr "Kiitalia"
+
+msgid "Japanese"
+msgstr "Kijapani"
+
+msgid "Georgian"
+msgstr "Kigeorgia"
+
+msgid "Ubuntu Georgian Translators"
+msgstr ""
+
+msgid "Khmer"
+msgstr "Kihemeri"
+
+msgid "Kannada"
+msgstr "Kikanada"
+
+msgid "Kannada Translation team"
+msgstr ""
+
+msgid "Korean"
+msgstr "Kikorea"
+
+msgid "Kurdish"
+msgstr "Kikurdi"
+
+msgid "Lao"
+msgstr "Lao"
+
+msgid "Lithuanian"
+msgstr "Kilithuania"
+
+msgid "Macedonian"
+msgstr "Kimacedonia"
+
+msgid "Mongolian"
+msgstr "Kimongolia"
+
+msgid "Bokmål Norwegian"
+msgstr ""
+
+msgid "Nepali"
+msgstr "Kinepali"
+
+msgid "Dutch, Flemish"
+msgstr ""
+
+msgid "Norwegian Nynorsk"
+msgstr "Kinynorsk cha Norway"
+
+msgid "Occitan"
+msgstr "Kioccita"
+
+msgid "Punjabi"
+msgstr "Kipunjabi"
+
+msgid "Polish"
+msgstr "Kipolishi"
+
+msgid "Portuguese"
+msgstr "Kireno"
+
+msgid "Portuguese-Brazil"
+msgstr ""
+
+msgid "Pashto"
+msgstr "Kipashto"
+
+msgid "Romanian"
+msgstr "Kiromania"
+
+msgid "Russian"
+msgstr "Kirusi"
+
+msgid "Slovak"
+msgstr "Kislovaki"
+
+msgid "Slovenian"
+msgstr "Kislovenia"
+
+msgid "Albanian"
+msgstr "Kialbania"
+
+msgid "Serbian"
+msgstr "Kiserbia"
+
+msgid "Sinhala"
+msgstr "Kisinihala"
+
+msgid "Swedish"
+msgstr "Kiswidi"
+
+msgid "Swahili Tanzania"
+msgstr ""
+
+msgid "Tamil"
+msgstr "Kitamilia"
+
+msgid "Telugu"
+msgstr "Kitelugu"
+
+msgid "Thai"
+msgstr "Kitai"
+
+msgid "Turkish"
+msgstr "Kituruki"
+
+msgid "Urdu"
+msgstr "Kiurdu"
+
+msgid "Vietnamese"
+msgstr "Kivietnamu"
+
+msgid "T.M.Thanh and the Gnome-Vi Team"
+msgstr ""
+
+msgid "Simplified Chinese"
+msgstr "Kichina Rahisi"
+
+msgid "Hong Kong Chinese"
+msgstr ""
+
+msgid "Traditional Chinese"
+msgstr "Kichina Asili"
+
+msgid "Amharic"
+msgstr "Kiamharic"
+
+#, fuzzy, c-format
+msgid "About %s"
+msgstr "Kuhusu %S"
+
+#, c-format
+msgid ""
+"%s is a graphical modular messaging client based on libpurple which is "
+"capable of connecting to AIM, MSN, Yahoo!, XMPP, ICQ, IRC, SILC, SIP/SIMPLE, "
+"Novell GroupWise, Lotus Sametime, Bonjour, Zephyr, MySpaceIM, Gadu-Gadu, and "
+"QQ all at once.  It is written using GTK+.<BR><BR>You may modify and "
+"redistribute the program under the terms of the GPL (version 2 or later).  A "
+"copy of the GPL is contained in the 'COPYING' file distributed with %s.  %s "
+"is copyrighted by its contributors.  See the 'COPYRIGHT' file for the "
+"complete list of contributors.  We provide no warranty for this program."
+"<BR><BR>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">FAQ:</FONT> <A HREF=\"http://developer.pidgin.im/wiki/FAQ"
+"\">http://developer.pidgin.im/wiki/FAQ</A><BR/><BR/>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">Help via e-mail:</FONT> <A HREF=\"mailto:support@pidgin.im"
+"\">support@pidgin.im</A><BR/><BR/>"
+msgstr ""
+
+#, c-format
+msgid ""
+"<FONT SIZE=\"4\">IRC Channel:</FONT> #pidgin on irc.freenode.net<BR><BR>"
+msgstr ""
+
+#, c-format
+msgid "<FONT SIZE=\"4\">XMPP MUC:</FONT> devel@conference.pidgin.im<BR><BR>"
+msgstr ""
+
+msgid "Current Developers"
+msgstr ""
+
+msgid "Crazy Patch Writers"
+msgstr ""
+
+msgid "Retired Developers"
+msgstr ""
+
+msgid "Retired Crazy Patch Writers"
+msgstr ""
+
+msgid "Current Translators"
+msgstr ""
+
+#, fuzzy
+msgid "Past Translators"
+msgstr "Watafsiri:"
+
+#, fuzzy
+msgid "Debugging Information"
+msgstr "Inachunguza taarifa"
+
+#, fuzzy
+msgid "_Name"
+msgstr "Jina"
+
+msgid "_Account"
+msgstr ""
+
+msgid "Get User Info"
+msgstr ""
+
+msgid ""
+"Please enter the username or alias of the person whose info you would like "
+"to view."
+msgstr ""
+
+msgid "View User Log"
+msgstr ""
+
+msgid "Alias Contact"
+msgstr ""
+
+msgid "Enter an alias for this contact."
+msgstr ""
+
+#, c-format
+msgid "Enter an alias for %s."
+msgstr ""
+
+msgid "Alias Buddy"
+msgstr ""
+
+msgid "Alias Chat"
+msgstr ""
+
+msgid "Enter an alias for this chat."
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove the contact containing %s and %d other buddy from "
+"your buddy list.  Do you want to continue?"
+msgid_plural ""
+"You are about to remove the contact containing %s and %d other buddies from "
+"your buddy list.  Do you want to continue?"
+msgstr[0] ""
+msgstr[1] ""
+
+#, fuzzy
+msgid "Remove Contact"
+msgstr "Ondoa Kuki"
+
+#, fuzzy
+msgid "_Remove Contact"
+msgstr "Ondoa Kuki"
+
+#, c-format
+msgid ""
+"You are about to merge the group called %s into the group called %s. Do you "
+"want to continue?"
+msgstr ""
+
+msgid "Merge Groups"
+msgstr ""
+
+msgid "_Merge Groups"
+msgstr ""
+
+#, c-format
+msgid ""
+"You are about to remove the group %s and all its members from your buddy "
+"list.  Do you want to continue?"
+msgstr ""
+
+#, fuzzy
+msgid "Remove Group"
+msgstr "Ondoa Kuki"
+
+msgid "_Remove Group"
+msgstr ""
+
+#, fuzzy, c-format
+msgid ""
+"You are about to remove %s from your buddy list.  Do you want to continue?"
+msgstr "Unakaribia kufunga tabo ya %S. Unauhakika unataka kuendelea?"
+
+msgid "Remove Buddy"
+msgstr ""
+
+msgid "_Remove Buddy"
+msgstr ""
+
+#, fuzzy, c-format
+msgid ""
+"You are about to remove the chat %s from your buddy list.  Do you want to "
+"continue?"
+msgstr "Unakaribia kufunga tabo ya %S. Unauhakika unataka kuendelea?"
+
+#, fuzzy
+msgid "Remove Chat"
+msgstr "Ondoa &All"
+
+msgid "_Remove Chat"
+msgstr ""
+
+msgid "Right-click for more unread messages...\n"
+msgstr ""
+
+msgid "_Change Status"
+msgstr ""
+
+msgid "Show Buddy _List"
+msgstr ""
+
+msgid "_Unread Messages"
+msgstr ""
+
+msgid "New _Message..."
+msgstr ""
+
+msgid "_Accounts"
+msgstr ""
+
+#, fuzzy
+msgid "Plu_gins"
+msgstr "Programu tumizi"
+
+#, fuzzy
+msgid "Pr_eferences"
+msgstr "Mapendekezo"
+
+msgid "Mute _Sounds"
+msgstr ""
+
+msgid "_Blink on New Message"
+msgstr ""
+
+#, fuzzy
+msgid "_Quit"
+msgstr "&Funga"
+
+#, fuzzy
+msgid "Not started"
+msgstr "Haujaanza"
+
+msgid "<b>Receiving As:</b>"
+msgstr ""
+
+msgid "<b>Receiving From:</b>"
+msgstr ""
+
+msgid "<b>Sending To:</b>"
+msgstr ""
+
+msgid "<b>Sending As:</b>"
+msgstr ""
+
+msgid "There is no application configured to open this type of file."
+msgstr ""
+
+msgid "An error occurred while opening the file."
+msgstr ""
+
+#, c-format
+msgid "Error launching %s: %s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Error running %s"
+msgstr "Hitilafu katika kufungua %S"
+
+#, c-format
+msgid "Process returned error code %d"
+msgstr ""
+
+#, fuzzy
+msgid "Filename:"
+msgstr "Jina la faili:"
+
+#, fuzzy
+msgid "Local File:"
+msgstr "faili la kikweti"
+
+msgid "Speed:"
+msgstr ""
+
+msgid "Time Elapsed:"
+msgstr "Muda Uliotumika:"
+
+#, fuzzy
+msgid "Time Remaining:"
+msgstr "#1 imebakia"
+
+msgid "Close this window when all transfers _finish"
+msgstr ""
+
+msgid "C_lear finished transfers"
+msgstr ""
+
+#. "Download Details" arrow
+msgid "File transfer _details"
+msgstr ""
+
+#. Pause button
+#, fuzzy
+msgid "_Pause"
+msgstr "Simamisha"
+
+#. Resume button
+#, fuzzy
+msgid "_Resume"
+msgstr "Endelea"
+
+msgid "Paste as Plain _Text"
+msgstr ""
+
+msgid "_Reset formatting"
+msgstr ""
+
+msgid "Disable _smileys in selected text"
+msgstr ""
+
+msgid "Hyperlink color"
+msgstr ""
+
+msgid "Color to draw hyperlinks."
+msgstr ""
+
+msgid "Hyperlink visited color"
+msgstr ""
+
+msgid "Color to draw hyperlinks after it has been visited (or activated)."
+msgstr ""
+
+msgid "Hyperlink prelight color"
+msgstr ""
+
+msgid "Color to draw hyperlinks when mouse is over them."
+msgstr ""
+
+msgid "Sent Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you sent."
+msgstr ""
+
+msgid "Received Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you received."
+msgstr ""
+
+msgid "\"Attention\" Name Color"
+msgstr ""
+
+msgid "Color to draw the name of a message you received containing your name."
+msgstr ""
+
+msgid "Action Message Name Color"
+msgstr ""
+
+msgid "Color to draw the name of an action message."
+msgstr ""
+
+msgid "Action Message Name Color for Whispered Message"
+msgstr ""
+
+msgid "Whisper Message Name Color"
+msgstr ""
+
+msgid "Typing notification color"
+msgstr ""
+
+msgid "The color to use for the typing notification font"
+msgstr ""
+
+msgid "Typing notification font"
+msgstr ""
+
+msgid "The font to use for the typing notification"
+msgstr ""
+
+msgid "Enable typing notification"
+msgstr ""
+
+msgid ""
+"<span size='larger' weight='bold'>Unrecognized file type</span>\n"
+"\n"
+"Defaulting to PNG."
+msgstr ""
+
+msgid ""
+"Unrecognized file type\n"
+"\n"
+"Defaulting to PNG."
+msgstr ""
+
+#, c-format
+msgid ""
+"<span size='larger' weight='bold'>Error saving image</span>\n"
+"\n"
+"%s"
+msgstr ""
+
+#, fuzzy, c-format
+msgid ""
+"Error saving image\n"
+"\n"
+"%s"
+msgstr "Hitilafu katika kuhifadhi %S"
+
+msgid "Save Image"
+msgstr "Hifadhi Taswira"
+
+#, fuzzy
+msgid "_Save Image..."
+msgstr "Hifadhi Taswira"
+
+msgid "_Add Custom Smiley..."
+msgstr ""
+
+#, fuzzy
+msgid "Select Font"
+msgstr "&Uchanguzi"
+
+msgid "Select Text Color"
+msgstr ""
+
+#, fuzzy
+msgid "Select Background Color"
+msgstr "Chapisha rangi za usuli"
+
+#, fuzzy
+msgid "_URL"
+msgstr "URL"
+
+#, fuzzy
+msgid "_Description"
+msgstr "Maelezo"
+
+msgid ""
+"Please enter the URL and description of the link that you want to insert. "
+"The description is optional."
+msgstr ""
+
+msgid "Please enter the URL of the link that you want to insert."
+msgstr ""
+
+msgid "Insert Link"
+msgstr ""
+
+msgid "_Insert"
+msgstr ""
+
+#, c-format
+msgid "Failed to store image: %s\n"
+msgstr ""
+
+msgid "Insert Image"
+msgstr ""
+
+#, c-format
+msgid ""
+"This smiley is disabled because a custom smiley exists for this shortcut:\n"
+" %s"
+msgstr ""
+
+msgid "Smile!"
+msgstr ""
+
+msgid "_Manage custom smileys"
+msgstr ""
+
+msgid "This theme has no available smileys."
+msgstr ""
+
+#, fuzzy
+msgid "_Font"
+msgstr "Fonti"
+
+msgid "Group Items"
+msgstr ""
+
+msgid "Ungroup Items"
+msgstr ""
+
+msgid "Bold"
+msgstr ""
+
+#, fuzzy
+msgid "Italic"
+msgstr "Kiitalia"
+
+#, fuzzy
+msgid "Underline"
+msgstr "Interlingue"
+
+msgid "Strikethrough"
+msgstr ""
+
+msgid "Increase Font Size"
+msgstr ""
+
+msgid "Decrease Font Size"
+msgstr ""
+
+msgid "Font Face"
+msgstr ""
+
+#, fuzzy
+msgid "Background Color"
+msgstr "Chapisha rangi za usuli"
+
+msgid "Foreground Color"
+msgstr ""
+
+msgid "Reset Formatting"
+msgstr ""
+
+msgid "Insert IM Image"
+msgstr ""
+
+msgid "Insert Smiley"
+msgstr ""
+
+msgid "<b>_Bold</b>"
+msgstr ""
+
+msgid "<i>_Italic</i>"
+msgstr ""
+
+msgid "<u>_Underline</u>"
+msgstr ""
+
+msgid "<span strikethrough='true'>Strikethrough</span>"
+msgstr ""
+
+msgid "<span size='larger'>_Larger</span>"
+msgstr ""
+
+#, fuzzy
+msgid "_Normal"
+msgstr "&Kawaida"
+
+msgid "<span size='smaller'>_Smaller</span>"
+msgstr ""
+
+#. If we want to show the formatting for the following items, we would
+#. * need to update them when formatting changes. The above items don't need
+#. * no updating nor nothin'
+msgid "_Font face"
+msgstr ""
+
+msgid "Foreground _color"
+msgstr ""
+
+msgid "Bac_kground color"
+msgstr ""
+
+#, fuzzy
+msgid "_Image"
+msgstr "Taswira"
+
+msgid "_Link"
+msgstr ""
+
+msgid "_Horizontal rule"
+msgstr ""
+
+msgid "_Smile!"
+msgstr ""
+
+#, fuzzy
+msgid "Log Deletion Failed"
+msgstr "Unganisho Limeshindikana"
+
+msgid "Check permissions and try again."
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the log of the conversation with "
+"%s which started at %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the log of the conversation in %"
+"s which started at %s?"
+msgstr ""
+
+#, c-format
+msgid ""
+"Are you sure you want to permanently delete the system log which started at %"
+"s?"
+msgstr ""
+
+#, fuzzy
+msgid "Delete Log?"
+msgstr "Futa mwenyeji"
+
+#, fuzzy
+msgid "Delete Log..."
+msgstr "Futa mwenyeji"
+
+#, c-format
+msgid "<span size='larger' weight='bold'>Conversation in %s on %s</span>"
+msgstr ""
+
+#, c-format
+msgid "<span size='larger' weight='bold'>Conversation with %s on %s</span>"
+msgstr ""
+
+#. Steal the "HELP" response and use it to trigger browsing to the logs folder
+msgid "_Browse logs folder"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "%s %s. Try `%s -h' for more information.\n"
+msgstr "\n"
+
+#, c-format
+msgid ""
+"%s %s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stdout\n"
+"  -f, --force-online  force online, regardless of network status\n"
+"  -h, --help          display this help and exit\n"
+"  -m, --multiple      do not ensure single instance\n"
+"  -n, --nologin       don't automatically login\n"
+"  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
+"                      specifies account(s) to use, separated by commas.\n"
+"                      Without this only the first account will be enabled).\n"
+"  --display=DISPLAY   X display to use\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s %s\n"
+"Usage: %s [OPTION]...\n"
+"\n"
+"  -c, --config=DIR    use DIR for config files\n"
+"  -d, --debug         print debugging messages to stdout\n"
+"  -f, --force-online  force online, regardless of network status\n"
+"  -h, --help          display this help and exit\n"
+"  -m, --multiple      do not ensure single instance\n"
+"  -n, --nologin       don't automatically login\n"
+"  -l, --login[=NAME]  enable specified account(s) (optional argument NAME\n"
+"                      specifies account(s) to use, separated by commas.\n"
+"                      Without this only the first account will be enabled).\n"
+"  -v, --version       display the current version and exit\n"
+msgstr ""
+
+#, c-format
+msgid ""
+"%s %s has segfaulted and attempted to dump a core file.\n"
+"This is a bug in the software and has happened through\n"
+"no fault of your own.\n"
+"\n"
+"If you can reproduce the crash, please notify the developers\n"
+"by reporting a bug at:\n"
+"%ssimpleticket/\n"
+"\n"
+"Please make sure to specify what you were doing at the time\n"
+"and post the backtrace from the core file.  If you do not know\n"
+"how to get the backtrace, please read the instructions at\n"
+"%swiki/GetABacktrace\n"
+msgstr ""
+
+#. Translators may want to transliterate the name.
+#. It is not to be translated.
+#, fuzzy
+msgid "Pidgin"
+msgstr "Programu-unganishi"
+
+#, c-format
+msgid "Exiting because another libpurple client is already running.\n"
+msgstr ""
+
+#, fuzzy
+msgid "/_Media"
+msgstr "Media"
+
+msgid "/Media/_Hangup"
+msgstr ""
+
+msgid "Calling..."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start an audio/video session with you."
+msgstr ""
+
+#, c-format
+msgid "%s wishes to start a video session with you."
+msgstr ""
+
+#, c-format
+msgid "%s has %d new message."
+msgid_plural "%s has %d new messages."
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "<b>%d new email.</b>"
+msgid_plural "<b>%d new emails.</b>"
+msgstr[0] ""
+msgstr[1] ""
+
+#, c-format
+msgid "The browser command \"%s\" is invalid."
+msgstr ""
+
+#, fuzzy
+msgid "Unable to open URL"
+msgstr "Nimeshindwa Kusasisha"
+
+#, c-format
+msgid "Error launching \"%s\": %s"
+msgstr ""
+
+msgid ""
+"The 'Manual' browser command has been chosen, but no command has been set."
+msgstr ""
+
+#, fuzzy
+msgid "Open All Messages"
+msgstr "Fungua kwenye Tabo zote"
+
+msgid "<span weight=\"bold\" size=\"larger\">You have mail!</span>"
+msgstr ""
+
+msgid "New Pounces"
+msgstr ""
+
+msgid "Dismiss"
+msgstr ""
+
+msgid "<span weight=\"bold\" size=\"larger\">You have pounced!</span>"
+msgstr ""
+
+#, fuzzy
+msgid "No message"
+msgstr "Ujumbe"
+
+#, fuzzy
+msgid "The following plugins will be unloaded."
+msgstr "Programu-jalizi zifuatazo zinapatikana:"
+
+msgid "Multiple plugins will be unloaded."
+msgstr ""
+
+#, fuzzy
+msgid "Unload Plugins"
+msgstr "Kuhusu Program-jalizi"
+
+msgid "Could not unload plugin"
+msgstr ""
+
+msgid ""
+"The plugin could not be unloaded now, but will be disabled at the next "
+"startup."
+msgstr ""
+
+#, c-format
+msgid ""
+"<span foreground=\"red\" weight=\"bold\">Error: %s\n"
+"Check the plugin website for an update.</span>"
+msgstr ""
+
+msgid "Author"
+msgstr ""
+
+msgid "<b>Written by:</b>"
+msgstr ""
+
+msgid "<b>Web site:</b>"
+msgstr ""
+
+msgid "<b>Filename:</b>"
+msgstr ""
+
+msgid "Configure Pl_ugin"
+msgstr ""
+
+msgid "<b>Plugin Details</b>"
+msgstr ""
+
+#, fuzzy
+msgid "Select a file"
+msgstr "Chagua Profaili"
+
+msgid "Modify Buddy Pounce"
+msgstr ""
+
+#. Create the "Pounce on Whom" frame.
+msgid "Pounce on Whom"
+msgstr ""
+
+msgid "_Account:"
+msgstr ""
+
+msgid "_Buddy name:"
+msgstr ""
+
+msgid "Si_gns on"
+msgstr ""
+
+msgid "Signs o_ff"
+msgstr ""
+
+msgid "Goes a_way"
+msgstr ""
+
+msgid "Ret_urns from away"
+msgstr ""
+
+msgid "Becomes _idle"
+msgstr ""
+
+msgid "Is no longer i_dle"
+msgstr ""
+
+msgid "Starts _typing"
+msgstr ""
+
+msgid "P_auses while typing"
+msgstr ""
+
+msgid "Stops t_yping"
+msgstr ""
+
+msgid "Sends a _message"
+msgstr ""
+
+#, fuzzy
+msgid "Ope_n an IM window"
+msgstr "Fungua dirisha jipya"
+
+msgid "_Pop up a notification"
+msgstr ""
+
+msgid "Send a _message"
+msgstr ""
+
+msgid "E_xecute a command"
+msgstr ""
+
+msgid "P_lay a sound"
+msgstr ""
+
+#, fuzzy
+msgid "Brows_e..."
+msgstr "Vinjari…"
+
+#, fuzzy
+msgid "Br_owse..."
+msgstr "Vinjari…"
+
+#, fuzzy
+msgid "Pre_view"
+msgstr "Hakiki"
+
+msgid "P_ounce only when my status is not Available"
+msgstr ""
+
+msgid "_Recurring"
+msgstr ""
+
+msgid "Pounce Target"
+msgstr ""
+
+#, c-format
+msgid "Started typing"
+msgstr ""
+
+#, c-format
+msgid "Paused while typing"
+msgstr ""
+
+#, c-format
+msgid "Signed on"
+msgstr ""
+
+#, c-format
+msgid "Returned from being idle"
+msgstr ""
+
+#, c-format
+msgid "Returned from being away"
+msgstr ""
+
+#, c-format
+msgid "Stopped typing"
+msgstr ""
+
+#, c-format
+msgid "Signed off"
+msgstr ""
+
+#, c-format
+msgid "Became idle"
+msgstr ""
+
+#, c-format
+msgid "Went away"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Sent a message"
+msgstr "Weka Ukurasa Nyumbani"
+
+#, c-format
+msgid "Unknown.... Please report this!"
+msgstr ""
+
+msgid "Smiley theme failed to unpack."
+msgstr ""
+
+#, fuzzy
+msgid "Install Theme"
+msgstr "Sakinisha Mandhari"
+
+msgid ""
+"Select a smiley theme that you would like to use from the list below. New "
+"themes can be installed by dragging and dropping them onto the theme list."
+msgstr ""
+
+msgid "Icon"
+msgstr "Ikoni"
+
+#, fuzzy
+msgid "Keyboard Shortcuts"
+msgstr "Uwekaji wa Mikato"
+
+msgid "Cl_ose conversations with the Escape key"
+msgstr ""
+
+#. Buddy List Themes
+msgid "Buddy List Theme"
+msgstr ""
+
+#. System Tray
+msgid "System Tray Icon"
+msgstr ""
+
+msgid "_Show system tray icon:"
+msgstr ""
+
+msgid "On unread messages"
+msgstr ""
+
+msgid "Conversation Window Hiding"
+msgstr ""
+
+msgid "_Hide new IM conversations:"
+msgstr ""
+
+msgid "When away"
+msgstr ""
+
+#. All the tab options!
+msgid "Tabs"
+msgstr "Tabo"
+
+msgid "Show IMs and chats in _tabbed windows"
+msgstr ""
+
+msgid "Show close b_utton on tabs"
+msgstr ""
+
+msgid "_Placement:"
+msgstr ""
+
+#, fuzzy
+msgid "Top"
+msgstr "Kwa:"
+
+#, fuzzy
+msgid "Bottom"
+msgstr "&Chini:"
+
+msgid "Left"
+msgstr "Kushoto"
+
+msgid "Right"
+msgstr "Kulia"
+
+msgid "Left Vertical"
+msgstr ""
+
+msgid "Right Vertical"
+msgstr ""
+
+msgid "N_ew conversations:"
+msgstr ""
+
+msgid "Show _formatting on incoming messages"
+msgstr ""
+
+msgid "Close IMs immediately when the tab is closed"
+msgstr ""
+
+msgid "Show _detailed information"
+msgstr ""
+
+msgid "Enable buddy ic_on animation"
+msgstr ""
+
+msgid "_Notify buddies that you are typing to them"
+msgstr ""
+
+msgid "Highlight _misspelled words"
+msgstr ""
+
+#, fuzzy
+msgid "Use smooth-scrolling"
+msgstr "Tu&mia ubiringizaji taratibu"
+
+msgid "F_lash window when IMs are received"
+msgstr ""
+
+msgid "Minimi_ze new conversation windows"
+msgstr ""
+
+msgid "Minimum input area height in lines:"
+msgstr ""
+
+#, fuzzy
+msgid "Font"
+msgstr "Fonti"
+
+msgid "Use document font from _theme"
+msgstr ""
+
+msgid "Use font from _theme"
+msgstr ""
+
+msgid "Conversation _font:"
+msgstr ""
+
+msgid "Default Formatting"
+msgstr ""
+
+msgid ""
+"This is how your outgoing message text will appear when you use protocols "
+"that support formatting."
+msgstr ""
+
+msgid "Cannot start proxy configuration program."
+msgstr ""
+
+msgid "Cannot start browser configuration program."
+msgstr ""
+
+msgid "<span style=\"italic\">Example: stunserver.org</span>"
+msgstr ""
+
+msgid "_Autodetect IP address"
+msgstr ""
+
+msgid "Public _IP:"
+msgstr ""
+
+#, fuzzy
+msgid "Ports"
+msgstr "Lango:"
+
+msgid "_Enable automatic router port forwarding"
+msgstr ""
+
+msgid "_Manually specify range of ports to listen on"
+msgstr ""
+
+msgid "_Start port:"
+msgstr ""
+
+#, fuzzy
+msgid "_End port:"
+msgstr "Tuma Kwa:"
+
+#. TURN server
+msgid "Relay Server (TURN)"
+msgstr ""
+
+msgid "Proxy Server &amp; Browser"
+msgstr ""
+
+msgid "<b>Proxy configuration program was not found.</b>"
+msgstr ""
+
+msgid "<b>Browser configuration program was not found.</b>"
+msgstr ""
+
+msgid ""
+"Proxy & Browser preferences are configured\n"
+"in GNOME Preferences"
+msgstr ""
+
+msgid "Configure _Proxy"
+msgstr ""
+
+msgid "Configure _Browser"
+msgstr ""
+
+msgid "Proxy Server"
+msgstr ""
+
+#, fuzzy
+msgid "No proxy"
+msgstr "Hakuna waka&la"
+
+#. This is a global option that affects SOCKS4 usage even with account-specific proxy settings
+msgid "Use remote DNS with SOCKS4 proxies"
+msgstr ""
+
+msgid "_User:"
+msgstr ""
+
+msgid "Seamonkey"
+msgstr ""
+
+msgid "Opera"
+msgstr "Opera"
+
+#, fuzzy
+msgid "Netscape"
+msgstr "Netscape 4"
+
+msgid "Mozilla"
+msgstr "Mozilla"
+
+msgid "Konqueror"
+msgstr "Konqueror"
+
+#, fuzzy
+msgid "Desktop Default"
+msgstr "Rejesha Misingi"
+
+#, fuzzy
+msgid "GNOME Default"
+msgstr "WPS Msingi"
+
+msgid "Galeon"
+msgstr "Galeon"
+
+msgid "Firefox"
+msgstr "Firefox"
+
+msgid "Firebird"
+msgstr ""
+
+msgid "Epiphany"
+msgstr "Epiphany"
+
+msgid "Manual"
+msgstr ""
+
+msgid "Browser Selection"
+msgstr ""
+
+#, fuzzy
+msgid "_Browser:"
+msgstr "Vinjari…"
+
+msgid "_Open link in:"
+msgstr ""
+
+#, fuzzy
+msgid "Browser default"
+msgstr "Tumia Msingi"
+
+msgid "Existing window"
+msgstr ""
+
+msgid "New tab"
+msgstr "Tabo mpya"
+
+#, c-format
+msgid ""
+"_Manual:\n"
+"(%s for URL)"
+msgstr ""
+
+msgid "Log _format:"
+msgstr ""
+
+msgid "Log all _instant messages"
+msgstr ""
+
+msgid "Log all c_hats"
+msgstr ""
+
+msgid "Log all _status changes to system log"
+msgstr ""
+
+#, fuzzy
+msgid "Sound Selection"
+msgstr "&Uchanguzi"
+
+#, c-format
+msgid "Quietest"
+msgstr ""
+
+#, c-format
+msgid "Quieter"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Quiet"
+msgstr "&Funga"
+
+#, fuzzy, c-format
+msgid "Loud"
+msgstr "&Pakia upya"
+
+#, fuzzy, c-format
+msgid "Louder"
+msgstr "folda"
+
+#, c-format
+msgid "Loudest"
+msgstr ""
+
+msgid "_Method:"
+msgstr ""
+
+msgid "Console beep"
+msgstr ""
+
+msgid "No sounds"
+msgstr ""
+
+#, c-format
+msgid ""
+"Sound c_ommand:\n"
+"(%s for filename)"
+msgstr ""
+
+msgid "M_ute sounds"
+msgstr ""
+
+msgid "Sounds when conversation has _focus"
+msgstr ""
+
+msgid "_Enable sounds:"
+msgstr ""
+
+#, fuzzy
+msgid "V_olume:"
+msgstr "Safu-wima:"
+
+#, fuzzy
+msgid "Play"
+msgstr "Che&za"
+
+#, fuzzy
+msgid "_Browse..."
+msgstr "Vinjari…"
+
+#, fuzzy
+msgid "_Reset"
+msgstr "Seti upya"
+
+msgid "_Report idle time:"
+msgstr ""
+
+msgid "Based on keyboard or mouse use"
+msgstr ""
+
+msgid "_Auto-reply:"
+msgstr ""
+
+msgid "When both away and idle"
+msgstr ""
+
+#. Auto-away stuff
+msgid "Auto-away"
+msgstr ""
+
+msgid "_Minutes before becoming idle:"
+msgstr ""
+
+msgid "Change status when _idle"
+msgstr ""
+
+#, fuzzy
+msgid "Change _status to:"
+msgstr "&Badili matini ya ufito hali"
+
+#. Signon status stuff
+msgid "Status at Startup"
+msgstr ""
+
+msgid "Use status from last _exit at startup"
+msgstr ""
+
+msgid "Status to a_pply at startup:"
+msgstr ""
+
+msgid "Interface"
+msgstr ""
+
+#, fuzzy
+msgid "Smiley Themes"
+msgstr "Pata Mandhari"
+
+#, fuzzy
+msgid "Browser"
+msgstr "Vinjari…"
+
+msgid "Status / Idle"
+msgstr ""
+
+msgid "Allow all users to contact me"
+msgstr ""
+
+msgid "Allow only the users on my buddy list"
+msgstr ""
+
+msgid "Allow only the users below"
+msgstr ""
+
+msgid "Block all users"
+msgstr ""
+
+msgid "Block only the users below"
+msgstr ""
+
+msgid "Privacy"
+msgstr "Faragha"
+
+msgid "Changes to privacy settings take effect immediately."
+msgstr ""
+
+msgid "Set privacy for:"
+msgstr ""
+
+#. Remove All button
+#, fuzzy
+msgid "Remove Al_l"
+msgstr "Ondoa &All"
+
+msgid "Permit User"
+msgstr ""
+
+msgid "Type a user you permit to contact you."
+msgstr ""
+
+msgid "Please enter the name of the user you wish to be able to contact you."
+msgstr ""
+
+msgid "_Permit"
+msgstr ""
+
+#, c-format
+msgid "Allow %s to contact you?"
+msgstr ""
+
+#, fuzzy, c-format
+msgid "Are you sure you wish to allow %s to contact you?"
+msgstr "Una uhakika unataka kuOnyesha nywila zako?"
+
+#, fuzzy
+msgid "Block User"
+msgstr "Imezuiliwa"
+
+msgid "Type a user to block."
+msgstr ""
+
+msgid "Please enter the name of the user you wish to block."
+msgstr ""
+
+#, c-format
+msgid "Block %s?"
+msgstr ""
+
+#, c-format
+msgid "Are you sure you want to block %s?"
+msgstr ""
+
+msgid "Apply"
+msgstr ""
+
+#, fuzzy
+msgid "That file already exists"
+msgstr "Ithibati tayari ipo."
+
+#, fuzzy
+msgid "Would you like to overwrite it?"
+msgstr "Ungependa kuhifadhi faili hili?"
+
+msgid "Overwrite"
+msgstr ""
+
+#, fuzzy
+msgid "Choose New Name"
+msgstr "Jina la Kuki"
+
+#, fuzzy
+msgid "Select Folder..."
+msgstr "Fold&a Lililochaguliwa"
+
+#. list button
+msgid "_Get List"
+msgstr ""
+
+#. add button
+msgid "_Add Chat"
+msgstr ""
+
+#, fuzzy
+msgid "Are you sure you want to delete the selected saved statuses?"
+msgstr "Je una uhakika uantaka kufuta ithibati hizi?"
+
+#. Use button
+msgid "_Use"
+msgstr ""
+
+msgid "Title already in use.  You must choose a unique title."
+msgstr ""
+
+msgid "Different"
+msgstr ""
+
+#, fuzzy
+msgid "_Title:"
+msgstr "Jina:"
+
+#, fuzzy
+msgid "_Status:"
+msgstr "Hali:"
+
+#. Different status message expander
+msgid "Use a _different status for some accounts"
+msgstr ""
+
+#. Save & Use button
+msgid "Sa_ve & Use"
+msgstr ""
+
+#, c-format
+msgid "Status for %s"
+msgstr ""
+
+#.
+#. * TODO: We should enable/disable the add button based on
+#. *       whether the user has entered all required data.  That
+#. *       would eliminate the need for this check and provide a
+#. *       better user experience.
+#.
+#, fuzzy
+msgid "Custom Smiley"
+msgstr "Kipimo cha kaida..."
+
+msgid "More Data needed"
+msgstr ""
+
+msgid "Please provide a shortcut to associate with the smiley."
+msgstr ""
+
+#, c-format
+msgid ""
+"A custom smiley for '%s' already exists.  Please use a different shortcut."
+msgstr ""
+
+#, fuzzy
+msgid "Duplicate Shortcut"
+msgstr "sifa rudufu"
+
+msgid "Please select an image for the smiley."
+msgstr ""
+
+msgid "Edit Smiley"
+msgstr ""
+
+msgid "Add Smiley"
+msgstr ""
+
+#, fuzzy
+msgid "_Image:"
+msgstr "Taswira"
+
+#. Shortcut text
+msgid "S_hortcut text:"
+msgstr ""
+
+msgid "Smiley"
+msgstr ""
+
+msgid "Shortcut Text"
+msgstr ""
+
+msgid "Custom Smiley Manager"
+msgstr ""
+
+#, fuzzy
+msgid "Select Buddy Icon"
+msgstr "&Uchanguzi"
+
+msgid "Click to change your buddyicon for this account."
+msgstr ""
+
+msgid "Click to change your buddyicon for all accounts."
+msgstr ""
+
+msgid "Waiting for network connection"
+msgstr ""
+
+msgid "New status..."
+msgstr ""
+
+msgid "Saved statuses..."
+msgstr ""
+
+msgid "Status Selector"
+msgstr ""
+
+msgid "Google Talk"
+msgstr ""
+
+#, c-format
+msgid "The following error has occurred loading %s: %s"
+msgstr ""
+
+#, fuzzy
+msgid "Failed to load image"
+msgstr "Imeshindwa Kuingia"
+
+#, c-format
+msgid "Cannot send folder %s."
+msgstr ""
+
+#, c-format
+msgid ""
+"%s cannot transfer a folder. You will need to send the files within "
+"individually."
+msgstr ""
+
+msgid "You have dragged an image"
+msgstr ""
+
+msgid ""
+"You can send this image as a file transfer, embed it into this message, or "
+"use it as the buddy icon for this user."
+msgstr ""
+
+msgid "Set as buddy icon"
+msgstr ""
+
+msgid "Send image file"
+msgstr ""
+
+#, fuzzy
+msgid "Insert in message"
+msgstr "Funga ujumbe huu"
+
+msgid "Would you like to set it as the buddy icon for this user?"
+msgstr ""
+
+msgid ""
+"You can send this image as a file transfer, or use it as the buddy icon for "
+"this user."
+msgstr ""
+
+msgid ""
+"You can insert this image into this message, or use it as the buddy icon for "
+"this user"
+msgstr ""
+
+#. I don't know if we really want to do anything here.  Most of the desktop item types are crap like
+#. * "MIME Type" (I have no clue how that would be a desktop item) and "Comment"... nothing we can really
+#. * send.  The only logical one is "Application," but do we really want to send a binary and nothing else?
+#. * Probably not.  I'll just give an error and return.
+#. The original patch sent the icon used by the launcher.  That's probably wrong
+msgid "Cannot send launcher"
+msgstr ""
+
+msgid ""
+"You dragged a desktop launcher. Most likely you wanted to send whatever this "
+"launcher points to instead of this launcher itself."
+msgstr ""
+
+#, c-format
+msgid ""
+"<b>File:</b> %s\n"
+"<b>File size:</b> %s\n"
+"<b>Image size:</b> %dx%d"
+msgstr ""
+
+#, c-format
+msgid "The file '%s' is too large for %s.  Please try a smaller image.\n"
+msgstr ""
+
+#, fuzzy
+msgid "Icon Error"
+msgstr "Hitilafu isiyojulikana"
+
+msgid "Could not set icon"
+msgstr ""
+
+#, c-format
+msgid "Failed to open file '%s': %s"
+msgstr ""
+
+#, c-format
+msgid ""
+"Failed to load image '%s': reason not known, probably a corrupt image file"
+msgstr ""
+
+#, fuzzy
+msgid "_Open Link"
+msgstr "Fungua katika:"
+
+#, fuzzy
+msgid "_Copy Link Location"
+msgstr "&Nakili Mahali pa Kiungo"
+
+#, fuzzy
+msgid "_Copy Email Address"
+msgstr "Nakili Anwani ya Barua-p&epe"
+
+#, fuzzy
+msgid "Save File"
+msgstr "&Hifadhi faili"
+
+#, fuzzy
+msgid "Select color"
+msgstr "Chagua &Yote"
+
+msgid "_Alias"
+msgstr ""
+
+#, fuzzy
+msgid "Close _tabs"
+msgstr "Funga tabo"
+
+msgid "_Get Info"
+msgstr ""
+
+msgid "_Invite"
+msgstr ""
+
+#, fuzzy
+msgid "_Modify..."
+msgstr "R&ekebisha"
+
+msgid "_Add..."
+msgstr ""
+
+#, fuzzy
+msgid "_Open Mail"
+msgstr "Fungua tabo"
+
+#, fuzzy
+msgid "_Edit"
+msgstr "&Hariri"
+
+msgid "Pidgin Tooltip"
+msgstr ""
+
+msgid "Pidgin smileys"
+msgstr ""
+
+msgid "Penguin Pimps"
+msgstr ""
+
+msgid "Selecting this disables graphical emoticons."
+msgstr ""
+
+#, fuzzy
+msgid "none"
+msgstr "Bila"
+
+#, fuzzy
+msgid "Small"
+msgstr "Kisomali"
+
+msgid "Smaller versions of the default smilies"
+msgstr ""
+
+msgid "Response Probability:"
+msgstr ""
+
+msgid "Statistics Configuration"
+msgstr ""
+
+#. msg_difference spinner
+msgid "Maximum response timeout:"
+msgstr ""
+
+msgid "minutes"
+msgstr ""
+
+#. last_seen spinner
+msgid "Maximum last-seen difference:"
+msgstr ""
+
+#. threshold spinner
+msgid "Threshold:"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Contact Availability Prediction"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Contact Availability Prediction plugin."
+msgstr ""
+
+#. *  summary
+msgid "Displays statistical information about your buddies' availability"
+msgstr ""
+
+msgid "Buddy is idle"
+msgstr ""
+
+msgid "Buddy is away"
+msgstr ""
+
+msgid "Buddy is \"extended\" away"
+msgstr ""
+
+#. Not used yet.
+msgid "Buddy is mobile"
+msgstr ""
+
+msgid "Buddy is offline"
+msgstr ""
+
+msgid "Point values to use when..."
+msgstr ""
+
+msgid ""
+"The buddy with the <i>largest score</i> is the buddy who will have priority "
+"in the contact.\n"
+msgstr ""
+
+msgid "Use last buddy when scores are equal"
+msgstr ""
+
+msgid "Point values to use for account..."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Contact Priority"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *< summary
+msgid ""
+"Allows for controlling the values associated with different buddy states."
+msgstr ""
+
+#. *< description
+msgid ""
+"Allows for changing the point values of idle/away/offline states for buddies "
+"in contact priority computations."
+msgstr ""
+
+msgid "Conversation Colors"
+msgstr ""
+
+msgid "Customize colors in the conversation window"
+msgstr ""
+
+#, fuzzy
+msgid "Error Messages"
+msgstr "Ufafanuzi wa Hitilafu"
+
+msgid "Highlighted Messages"
+msgstr ""
+
+#, fuzzy
+msgid "System Messages"
+msgstr "Misingi ya mfumo"
+
+#, fuzzy
+msgid "Sent Messages"
+msgstr "Jumbe za tahadhari"
+
+msgid "Received Messages"
+msgstr ""
+
+#, c-format
+msgid "Select Color for %s"
+msgstr ""
+
+msgid "Ignore incoming format"
+msgstr ""
+
+msgid "Apply in Chats"
+msgstr ""
+
+msgid "Apply in IMs"
+msgstr ""
+
+msgid "By conversation count"
+msgstr ""
+
+msgid "Conversation Placement"
+msgstr ""
+
+#. Translators: "New conversations" should match the text in the preferences dialog and "By conversation count" should be the same text used above
+msgid ""
+"Note: The preference for \"New conversations\" must be set to \"By "
+"conversation count\"."
+msgstr ""
+
+msgid "Number of conversations per window"
+msgstr ""
+
+msgid "Separate IM and Chat windows when placing by number"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "ExtPlacement"
+msgstr ""
+
+#. *< name
+#. *< version
+msgid "Extra conversation placement options."
+msgstr ""
+
+#. *< summary
+#. *  description
+msgid ""
+"Restrict the number of conversations per windows, optionally separating IMs "
+"and Chats"
+msgstr ""
+
+#. Configuration frame
+msgid "Mouse Gestures Configuration"
+msgstr ""
+
+msgid "Middle mouse button"
+msgstr ""
+
+msgid "Right mouse button"
+msgstr ""
+
+#. "Visual gesture display" checkbox
+msgid "_Visual gesture display"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Mouse Gestures"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Provides support for mouse gestures"
+msgstr ""
+
+#. *  description
+msgid ""
+"Allows support for mouse gestures in conversation windows. Drag the middle "
+"mouse button to perform certain actions:\n"
+" • Drag down and then to the right to close a conversation.\n"
+" • Drag up and then to the left to switch to the previous conversation.\n"
+" • Drag up and then to the right to switch to the next conversation."
+msgstr ""
+
+msgid "Instant Messaging"
+msgstr ""
+
+#. Add the label.
+msgid "Select a person from your address book below, or add a new person."
+msgstr ""
+
+#, fuzzy
+msgid "Group:"
+msgstr "Kusanya kwa:"
+
+#. "New Person" button
+#, fuzzy
+msgid "New Person"
+msgstr "Toleo Jipya"
+
+#. "Select Buddy" button
+msgid "Select Buddy"
+msgstr ""
+
+#. Add the label.
+msgid ""
+"Select a person from your address book to add this buddy to, or create a new "
+"person."
+msgstr ""
+
+#. Add the expander
+#, fuzzy
+msgid "User _details"
+msgstr "Onyesha &ufafanuzi"
+
+#. "Associate Buddy" button
+msgid "_Associate Buddy"
+msgstr ""
+
+#, fuzzy
+msgid "Unable to send email"
+msgstr "Haiwezi kufuta moduli"
+
+msgid "The evolution executable was not found in the PATH."
+msgstr ""
+
+msgid "An email address was not found for this buddy."
+msgstr ""
+
+msgid "Add to Address Book"
+msgstr ""
+
+msgid "Send Email"
+msgstr ""
+
+#. Configuration frame
+msgid "Evolution Integration Configuration"
+msgstr ""
+
+#. Label
+msgid "Select all accounts that buddies should be auto-added to."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Evolution Integration"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides integration with Evolution."
+msgstr ""
+
+msgid "Please enter the person's information below."
+msgstr ""
+
+msgid "Please enter the buddy's username and account type below."
+msgstr ""
+
+msgid "Account type:"
+msgstr ""
+
+#. Optional Information section
+#, fuzzy
+msgid "Optional information:"
+msgstr "Taarifa zaidi"
+
+#, fuzzy
+msgid "First name:"
+msgstr "Ukurasa wa kwanza"
+
+#, fuzzy
+msgid "Last name:"
+msgstr "Ukurasa wa mwisho"
+
+#, fuzzy
+msgid "Email:"
+msgstr "Barua pepe"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "GTK Signals Test"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Test to see that all ui signals are working properly."
+msgstr ""
+
+#, c-format
+msgid ""
+"\n"
+"<b>Buddy Note</b>: %s"
+msgstr ""
+
+msgid "History"
+msgstr "Historia"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Iconify on Away"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Iconifies the buddy list and your conversations when you go away."
+msgstr ""
+
+msgid "Mail Checker"
+msgstr ""
+
+msgid "Checks for new local mail."
+msgstr ""
+
+msgid "Adds a small box to the buddy list that shows if you have new mail."
+msgstr ""
+
+msgid "Markerline"
+msgstr ""
+
+msgid "Draw a line to indicate new messages in a conversation."
+msgstr ""
+
+msgid "Jump to markerline"
+msgstr ""
+
+msgid "Draw Markerline in "
+msgstr ""
+
+#, fuzzy
+msgid "_IM windows"
+msgstr "Dirisha jipya"
+
+msgid "C_hat windows"
+msgstr ""
+
+msgid ""
+"A music messaging session has been requested. Please click the MM icon to "
+"accept."
+msgstr ""
+
+msgid "Music messaging session confirmed."
+msgstr ""
+
+msgid "Music Messaging"
+msgstr ""
+
+msgid "There was a conflict in running the command:"
+msgstr ""
+
+#, fuzzy
+msgid "Error Running Editor"
+msgstr "Hitilafu katika Kutuma Taarifa"
+
+msgid "The following error has occurred:"
+msgstr ""
+
+#. Configuration frame
+msgid "Music Messaging Configuration"
+msgstr ""
+
+msgid "Score Editor Path"
+msgstr ""
+
+msgid "_Apply"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#. *< name
+#. *< version
+msgid "Music Messaging Plugin for collaborative composition."
+msgstr ""
+
+#. *  summary
+msgid ""
+"The Music Messaging Plugin allows a number of users to simultaneously work "
+"on a piece of music by editting a common score in real-time."
+msgstr ""
+
+#. ---------- "Notify For" ----------
+msgid "Notify For"
+msgstr ""
+
+msgid "\t_Only when someone says your username"
+msgstr ""
+
+msgid "_Focused windows"
+msgstr ""
+
+#. ---------- "Notification Methods" ----------
+msgid "Notification Methods"
+msgstr ""
+
+msgid "Prepend _string into window title:"
+msgstr ""
+
+#. Count method button
+msgid "Insert c_ount of new messages into window title"
+msgstr ""
+
+#. Count xprop method button
+msgid "Insert count of new message into _X property"
+msgstr ""
+
+#. Urgent method button
+msgid "Set window manager \"_URGENT\" hint"
+msgstr ""
+
+#, fuzzy
+msgid "_Flash window"
+msgstr "Dirisha sawa"
+
+#. Raise window method button
+msgid "R_aise conversation window"
+msgstr ""
+
+#. Present conversation method button
+msgid "_Present conversation window"
+msgstr ""
+
+#. ---------- "Notification Removals" ----------
+msgid "Notification Removal"
+msgstr ""
+
+#. Remove on focus button
+msgid "Remove when conversation window _gains focus"
+msgstr ""
+
+#. Remove on click button
+msgid "Remove when conversation window _receives click"
+msgstr ""
+
+#. Remove on type button
+msgid "Remove when _typing in conversation window"
+msgstr ""
+
+#. Remove on message send button
+msgid "Remove when a _message gets sent"
+msgstr ""
+
+#. Remove on conversation switch button
+msgid "Remove on switch to conversation ta_b"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "Message Notification"
+msgstr "Arifisho la Jumla"
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "Provides a variety of ways of notifying you of unread messages."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Pidgin Demonstration Plugin"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "An example plugin that does stuff - see the description."
+msgstr ""
+
+#. *  description
+msgid ""
+"This is a really cool plugin that does a lot of stuff:\n"
+"- It tells you who wrote the program when you log in\n"
+"- It reverses all incoming text\n"
+"- It sends a message to people on your list immediately when they sign on"
+msgstr ""
+
+msgid "Cursor Color"
+msgstr ""
+
+msgid "Secondary Cursor Color"
+msgstr ""
+
+msgid "Hyperlink Color"
+msgstr ""
+
+msgid "Visited Hyperlink Color"
+msgstr ""
+
+msgid "Highlighted Message Name Color"
+msgstr ""
+
+msgid "GtkTreeView Horizontal Separation"
+msgstr ""
+
+msgid "Conversation Entry"
+msgstr ""
+
+msgid "Request Dialog"
+msgstr ""
+
+msgid "Notify Dialog"
+msgstr ""
+
+#, fuzzy
+msgid "Select Color"
+msgstr "Chagua &Yote"
+
+#, c-format
+msgid "Select Interface Font"
+msgstr ""
+
+#, c-format
+msgid "Select Font for %s"
+msgstr ""
+
+msgid "GTK+ Interface Font"
+msgstr ""
+
+msgid "GTK+ Text Shortcut Theme"
+msgstr ""
+
+#.
+#. for (i = 0; i < G_N_ELEMENTS(widget_bool_prefs); i++) {
+#. hbox = gtk_hbox_new(FALSE, PIDGIN_HIG_CAT_SPACE);
+#. gtk_box_pack_start(GTK_BOX(frame), hbox, FALSE, FALSE, 0);
+#.
+#. check = pidgin_prefs_checkbox(_(widget_bool_names[i]),
+#. widget_bool_prefs_set[i], hbox);
+#. gtk_size_group_add_widget(labelsg, check);
+#.
+#. widget_bool_widgets[i] = pidgin_prefs_checkbox("", widget_bool_prefs[i], hbox);
+#. *
+#. gtk_size_group_add_widget(widgetsb, widget_bool_widgets[i]);
+#. *
+#. gtk_widget_set_sensitive(widget_bool_widgets[i],
+#. purple_prefs_get_bool(widget_bool_prefs_set[i]));
+#. g_signal_connect(G_OBJECT(check), "toggled",
+#. G_CALLBACK(pidgin_toggle_sensitive),
+#. widget_bool_widgets[i]);
+#. }
+#.
+msgid "Interface colors"
+msgstr ""
+
+msgid "Widget Sizes"
+msgstr ""
+
+msgid "Fonts"
+msgstr "Fonti"
+
+msgid "Gtkrc File Tools"
+msgstr ""
+
+#, c-format
+msgid "Write settings to %s%sgtkrc-2.0"
+msgstr ""
+
+msgid "Re-read gtkrc files"
+msgstr ""
+
+msgid "Pidgin GTK+ Theme Control"
+msgstr ""
+
+msgid "Provides access to commonly used gtkrc settings."
+msgstr ""
+
+msgid "Raw"
+msgstr ""
+
+msgid "Lets you send raw input to text-based protocols."
+msgstr ""
+
+msgid ""
+"Lets you send raw input to text-based protocols (XMPP, MSN, IRC, TOC). Hit "
+"'Enter' in the entry box to send. Watch the debug window."
+msgstr ""
+
+#, c-format
+msgid "You can upgrade to %s %s today."
+msgstr ""
+
+msgid "New Version Available"
+msgstr "Toleo Jipya Linapatikana"
+
+msgid "Later"
+msgstr "Baadae"
+
+#, fuzzy
+msgid "Download Now"
+msgstr "Hitilafu ya upakuzi"
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "Release Notification"
+msgstr "Arifisho la Jumla"
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Checks periodically for new releases."
+msgstr ""
+
+#. *  description
+msgid ""
+"Checks periodically for new releases and notifies the user with the "
+"ChangeLog."
+msgstr ""
+
+#. *< major version
+#. *< minor version
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "Send Button"
+msgstr "Tuma kwa:"
+
+#. *< name
+#. *< version
+msgid "Conversation Window Send Button."
+msgstr ""
+
+#. *< summary
+msgid ""
+"Adds a Send button to the entry area of the conversation window. Intended "
+"for when no physical keyboard is present."
+msgstr ""
+
+msgid "Duplicate Correction"
+msgstr ""
+
+msgid "The specified word already exists in the correction list."
+msgstr ""
+
+msgid "Text Replacements"
+msgstr ""
+
+#, fuzzy
+msgid "You type"
+msgstr "Aina ya uunganishi"
+
+msgid "You send"
+msgstr ""
+
+msgid "Whole words only"
+msgstr ""
+
+#, fuzzy
+msgid "Case sensitive"
+msgstr "(Nyepesi huhisi herufi kubwa au ndogo)"
+
+msgid "Add a new text replacement"
+msgstr ""
+
+msgid "You _type:"
+msgstr ""
+
+msgid "You _send:"
+msgstr ""
+
+#. Created here so it can be passed to whole_words_button_toggled.
+msgid "_Exact case match (uncheck for automatic case handling)"
+msgstr ""
+
+msgid "Only replace _whole words"
+msgstr ""
+
+msgid "General Text Replacement Options"
+msgstr ""
+
+msgid "Enable replacement of last word on send"
+msgstr ""
+
+msgid "Text replacement"
+msgstr ""
+
+msgid "Replaces text in outgoing messages according to user-defined rules."
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Buddy Ticker"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+#. *  description
+msgid "A horizontal scrolling version of the buddy list."
+msgstr ""
+
+msgid "Display Timestamps Every"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "Timestamp"
+msgstr "Uchapaji wa Muda"
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Display iChat-style timestamps"
+msgstr ""
+
+#. *  description
+msgid "Display iChat-style timestamps every N minutes."
+msgstr ""
+
+msgid "Timestamp Format Options"
+msgstr ""
+
+#, c-format
+msgid "_Force 24-hour time format"
+msgstr ""
+
+msgid "Show dates in..."
+msgstr ""
+
+msgid "Co_nversations:"
+msgstr ""
+
+msgid "For delayed messages"
+msgstr ""
+
+msgid "For delayed messages and in chats"
+msgstr ""
+
+msgid "_Message Logs:"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Message Timestamp Formats"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Customizes the message timestamp formats."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin allows the user to customize conversation and logging message "
+"timestamp formats."
+msgstr ""
+
+msgid "Opacity:"
+msgstr ""
+
+#. IM Convo trans options
+msgid "IM Conversation Windows"
+msgstr ""
+
+msgid "_IM window transparency"
+msgstr ""
+
+msgid "_Show slider bar in IM window"
+msgstr ""
+
+msgid "Remove IM window transparency on focus"
+msgstr ""
+
+#, fuzzy
+msgid "Always on top"
+msgstr "&Juu Daima"
+
+#. Buddy List trans options
+msgid "Buddy List Window"
+msgstr ""
+
+msgid "_Buddy List window transparency"
+msgstr ""
+
+msgid "Remove Buddy List window transparency on focus"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+msgid "Transparency"
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Variable Transparency for the buddy list and conversations."
+msgstr ""
+
+#. *  description
+msgid ""
+"This plugin enables variable alpha transparency on conversation windows and "
+"the buddy list.\n"
+"\n"
+"* Note: This plugin requires Win2000 or greater."
+msgstr ""
+
+msgid "GTK+ Runtime Version"
+msgstr ""
+
+#. Autostart
+msgid "Startup"
+msgstr "Kila unapoanzisha"
+
+#, c-format
+msgid "_Start %s on Windows startup"
+msgstr ""
+
+msgid "_Dockable Buddy List"
+msgstr ""
+
+#. Blist On Top
+msgid "_Keep Buddy List window on top:"
+msgstr ""
+
+#. XXX: Did this ever work?
+msgid "Only when docked"
+msgstr ""
+
+msgid "Windows Pidgin Options"
+msgstr ""
+
+msgid "Options specific to Pidgin for Windows."
+msgstr ""
+
+msgid ""
+"Provides options specific to Pidgin for Windows , such as buddy list docking."
+msgstr ""
+
+msgid "<font color='#777777'>Logged out.</font>"
+msgstr ""
+
+#. *< type
+#. *< ui_requirement
+#. *< flags
+#. *< dependencies
+#. *< priority
+#. *< id
+#, fuzzy
+msgid "XMPP Console"
+msgstr "Kiweko cha Hitilafu"
+
+msgid "Account: "
+msgstr ""
+
+msgid "<font color='#777777'>Not connected to XMPP</font>"
+msgstr ""
+
+msgid "Insert an <iq/> stanza."
+msgstr ""
+
+msgid "Insert a <presence/> stanza."
+msgstr ""
+
+msgid "Insert a <message/> stanza."
+msgstr ""
+
+#. *< name
+#. *< version
+#. *  summary
+msgid "Send and receive raw XMPP stanzas."
+msgstr ""
+
+#. *  description
+msgid "This plugin is useful for debbuging XMPP servers or clients."
+msgstr ""
--- a/share/ca-certs/Makefile.am	Sun May 10 06:24:26 2009 +0000
+++ b/share/ca-certs/Makefile.am	Sun Jun 28 04:41:07 2009 +0000
@@ -4,6 +4,7 @@
 		CAcert_Class3.pem \
 		Equifax_Secure_CA.pem \
 		GTE_CyberTrust_Global_Root.pem \
+		StartCom_Certification_Authority.pem \
 		StartCom_Free_SSL_CA.pem \
 		Verisign_RSA_Secure_Server_CA.pem \
 		Verisign_Class3_Primary_CA.pem \
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/share/ca-certs/StartCom_Certification_Authority.pem	Sun Jun 28 04:41:07 2009 +0000
@@ -0,0 +1,44 @@
+-----BEGIN CERTIFICATE-----
+MIIHyTCCBbGgAwIBAgIBATANBgkqhkiG9w0BAQUFADB9MQswCQYDVQQGEwJJTDEW
+MBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMiU2VjdXJlIERpZ2l0YWwg
+Q2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3RhcnRDb20gQ2VydGlmaWNh
+dGlvbiBBdXRob3JpdHkwHhcNMDYwOTE3MTk0NjM2WhcNMzYwOTE3MTk0NjM2WjB9
+MQswCQYDVQQGEwJJTDEWMBQGA1UEChMNU3RhcnRDb20gTHRkLjErMCkGA1UECxMi
+U2VjdXJlIERpZ2l0YWwgQ2VydGlmaWNhdGUgU2lnbmluZzEpMCcGA1UEAxMgU3Rh
+cnRDb20gQ2VydGlmaWNhdGlvbiBBdXRob3JpdHkwggIiMA0GCSqGSIb3DQEBAQUA
+A4ICDwAwggIKAoICAQDBiNsJvGxGfHiflXu1M5DycmLWwTYgIiRezul38kMKogZk
+pMyONvg45iPwbm2xPN1yo4UcodM9tDMr0y+v/uqwQVlntsQGfQqedIXWeUyAN3rf
+OQVSWff0G0ZDpNKFhdLDcfN1YjS6LIp/Ho/u7TTQEceWzVI9ujPW3U3eCztKS5/C
+Ji/6tRYccjV3yjxd5srhJosaNnZcAdt0FCX+7bWgiA/deMotHweXMAEtcnn6RtYT
+Kqi5pquDSR3l8u/d5AGOGAqPY1MWhWKpDhk6zLVmpsJrdAfkK+F2PrRt2PZE4XNi
+HzvEvqBTViVsUQn3qqvKv3b9bZvzndu/PWa8DFaqr5hIlTpL36dYUNk4dalb6kMM
+Av+Z6+hsTXBbKWWc3apdzK8BMewM69KN6Oqce+Zu9ydmDBpI125C4z/eIT574Q1w
++2OqqGwaVLRcJXrJosmLFqa7LH4XXgVNWG4SHQHuEhANxjJ/GP/89PrNbpHoNkm+
+Gkhpi8KWTRoSsmkXwQqQ1vp5Iki/untp+HDH+no32NgN0nZPV/+Qt+OR0t3vwmC3
+Zzrd/qqc8NSLf3Iizsafl7b4r4qgEKjZ+xjGtrVcUjyJthkqcwEKDwOzEmDyei+B
+26Nu/yYwl/WL3YlXtq09s68rxbd2AvCl1iuahhQqcvbjM4xdCUsT37uMdBNSSwID
+AQABo4ICUjCCAk4wDAYDVR0TBAUwAwEB/zALBgNVHQ8EBAMCAa4wHQYDVR0OBBYE
+FE4L7xqkQFulF2mHMMo0aEPQQa7yMGQGA1UdHwRdMFswLKAqoCiGJmh0dHA6Ly9j
+ZXJ0LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMCugKaAnhiVodHRwOi8vY3Js
+LnN0YXJ0Y29tLm9yZy9zZnNjYS1jcmwuY3JsMIIBXQYDVR0gBIIBVDCCAVAwggFM
+BgsrBgEEAYG1NwEBATCCATswLwYIKwYBBQUHAgEWI2h0dHA6Ly9jZXJ0LnN0YXJ0
+Y29tLm9yZy9wb2xpY3kucGRmMDUGCCsGAQUFBwIBFilodHRwOi8vY2VydC5zdGFy
+dGNvbS5vcmcvaW50ZXJtZWRpYXRlLnBkZjCB0AYIKwYBBQUHAgIwgcMwJxYgU3Rh
+cnQgQ29tbWVyY2lhbCAoU3RhcnRDb20pIEx0ZC4wAwIBARqBl0xpbWl0ZWQgTGlh
+YmlsaXR5LCByZWFkIHRoZSBzZWN0aW9uICpMZWdhbCBMaW1pdGF0aW9ucyogb2Yg
+dGhlIFN0YXJ0Q29tIENlcnRpZmljYXRpb24gQXV0aG9yaXR5IFBvbGljeSBhdmFp
+bGFibGUgYXQgaHR0cDovL2NlcnQuc3RhcnRjb20ub3JnL3BvbGljeS5wZGYwEQYJ
+YIZIAYb4QgEBBAQDAgAHMDgGCWCGSAGG+EIBDQQrFilTdGFydENvbSBGcmVlIFNT
+TCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTANBgkqhkiG9w0BAQUFAAOCAgEAFmyZ
+9GYMNPXQhV59CuzaEE44HF7fpiUFS5Eyweg78T3dRAlbB0mKKctmArexmvclmAk8
+jhvh3TaHK0u7aNM5Zj2gJsfyOZEdUauCe37Vzlrk4gNXcGmXCPleWKYK34wGmkUW
+FjgKXlf2Ysd6AgXmvB618p70qSmD+LIU424oh0TDkBreOKk8rENNZEXO3SipXPJz
+ewT4F+irsfMuXGRuczE6Eri8sxHkfY+BUZo7jYn0TZNmezwD7dOaHZrzZVD1oNB1
+ny+v8OqCQ5j4aZyJecRDjkZy42Q2Eq/3JR44iZB3fsNrarnDy0RLrHiQi+fHLB5L
+EUTINFInzQpdn4XBidUaePKVEFMy3YCEZnXZtWgo+2EuvoSoOMCZEoalHmdkrQYu
+L6lwhceWD3yJZfWOQ1QOq92lgDmUYMA0yZZwLKMS9R9Ie70cfmu3nZD0Ijuu+Pwq
+yvqCUqDvr0tVk+vBtfAii6w0TiYiBKGHLHVKt+V9E9e4DGTANtLJL4YSjCMJwRuC
+O3NJo2pXh5Tl1njFmUNj403gdy3hZZlyaQQaRwnmDwFWJPsfvw55qVguucQJAX6V
+um0ABj6y6koQOdjQK/W/7HW/lwLFCRsI3FU34oH7N4RDYiDK51ZLZer+bMEkkySh
+NOsF/5oirpt9P/FlUQqmMGqz9IgcgA38corog14=
+-----END CERTIFICATE-----