ajout plugins pour résoudre les messages d'erreurs
authorAnthony Ly <anthonyly.com@gmail.com>
Tue, 04 Dec 2012 18:43:10 -0800
changeset 196 5e8dcbe22c24
parent 195 c7c0fbc09788
child 197 6f2ea86df1aa
ajout plugins pour résoudre les messages d'erreurs
web/wp-content/plugins/bbpress/bbpress.php
web/wp-content/plugins/bbpress/humans.txt
web/wp-content/plugins/bbpress/includes/admin/actions.php
web/wp-content/plugins/bbpress/includes/admin/admin.php
web/wp-content/plugins/bbpress/includes/admin/converter.php
web/wp-content/plugins/bbpress/includes/admin/converters/Example.php
web/wp-content/plugins/bbpress/includes/admin/converters/Invision.php
web/wp-content/plugins/bbpress/includes/admin/converters/bbPress1.php
web/wp-content/plugins/bbpress/includes/admin/converters/index.php
web/wp-content/plugins/bbpress/includes/admin/converters/phpBB.php
web/wp-content/plugins/bbpress/includes/admin/converters/vBulletin.php
web/wp-content/plugins/bbpress/includes/admin/forums.php
web/wp-content/plugins/bbpress/includes/admin/functions.php
web/wp-content/plugins/bbpress/includes/admin/images/badge-2x.png
web/wp-content/plugins/bbpress/includes/admin/images/badge.png
web/wp-content/plugins/bbpress/includes/admin/images/button-grad.png
web/wp-content/plugins/bbpress/includes/admin/images/icons32-2x.png
web/wp-content/plugins/bbpress/includes/admin/images/icons32.png
web/wp-content/plugins/bbpress/includes/admin/images/index.php
web/wp-content/plugins/bbpress/includes/admin/images/menu-2x.png
web/wp-content/plugins/bbpress/includes/admin/images/menu.png
web/wp-content/plugins/bbpress/includes/admin/index.php
web/wp-content/plugins/bbpress/includes/admin/metaboxes.php
web/wp-content/plugins/bbpress/includes/admin/parser.php
web/wp-content/plugins/bbpress/includes/admin/replies.php
web/wp-content/plugins/bbpress/includes/admin/settings.php
web/wp-content/plugins/bbpress/includes/admin/styles/green-34.css
web/wp-content/plugins/bbpress/includes/admin/styles/green-34.dev.css
web/wp-content/plugins/bbpress/includes/admin/styles/green-34.min.css
web/wp-content/plugins/bbpress/includes/admin/styles/green.css
web/wp-content/plugins/bbpress/includes/admin/styles/green.min.css
web/wp-content/plugins/bbpress/includes/admin/styles/index.php
web/wp-content/plugins/bbpress/includes/admin/tools.php
web/wp-content/plugins/bbpress/includes/admin/topics.php
web/wp-content/plugins/bbpress/includes/admin/users.php
web/wp-content/plugins/bbpress/includes/common/classes.php
web/wp-content/plugins/bbpress/includes/common/functions.php
web/wp-content/plugins/bbpress/includes/common/index.php
web/wp-content/plugins/bbpress/includes/common/shortcodes.php
web/wp-content/plugins/bbpress/includes/common/template-tags.php
web/wp-content/plugins/bbpress/includes/common/widgets.php
web/wp-content/plugins/bbpress/includes/core/actions.php
web/wp-content/plugins/bbpress/includes/core/cache.php
web/wp-content/plugins/bbpress/includes/core/capabilities.php
web/wp-content/plugins/bbpress/includes/core/extend.php
web/wp-content/plugins/bbpress/includes/core/filters.php
web/wp-content/plugins/bbpress/includes/core/functions.php
web/wp-content/plugins/bbpress/includes/core/index.php
web/wp-content/plugins/bbpress/includes/core/options.php
web/wp-content/plugins/bbpress/includes/core/sub-actions.php
web/wp-content/plugins/bbpress/includes/core/template-functions.php
web/wp-content/plugins/bbpress/includes/core/template-loader.php
web/wp-content/plugins/bbpress/includes/core/theme-compat.php
web/wp-content/plugins/bbpress/includes/core/update.php
web/wp-content/plugins/bbpress/includes/extend/akismet.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/activity.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/functions.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/group.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/index.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/loader.php
web/wp-content/plugins/bbpress/includes/extend/buddypress/members.php
web/wp-content/plugins/bbpress/includes/extend/index.php
web/wp-content/plugins/bbpress/includes/forums/capabilities.php
web/wp-content/plugins/bbpress/includes/forums/functions.php
web/wp-content/plugins/bbpress/includes/forums/index.php
web/wp-content/plugins/bbpress/includes/forums/template-tags.php
web/wp-content/plugins/bbpress/includes/index.php
web/wp-content/plugins/bbpress/includes/replies/capabilities.php
web/wp-content/plugins/bbpress/includes/replies/functions.php
web/wp-content/plugins/bbpress/includes/replies/index.php
web/wp-content/plugins/bbpress/includes/replies/template-tags.php
web/wp-content/plugins/bbpress/includes/topics/capabilities.php
web/wp-content/plugins/bbpress/includes/topics/functions.php
web/wp-content/plugins/bbpress/includes/topics/index.php
web/wp-content/plugins/bbpress/includes/topics/template-tags.php
web/wp-content/plugins/bbpress/includes/users/capabilities.php
web/wp-content/plugins/bbpress/includes/users/functions.php
web/wp-content/plugins/bbpress/includes/users/index.php
web/wp-content/plugins/bbpress/includes/users/options.php
web/wp-content/plugins/bbpress/includes/users/template-tags.php
web/wp-content/plugins/bbpress/index.php
web/wp-content/plugins/bbpress/languages/bbpress.pot
web/wp-content/plugins/bbpress/languages/index.php
web/wp-content/plugins/bbpress/license.txt
web/wp-content/plugins/bbpress/readme.txt
web/wp-content/plugins/bbpress/templates/default/bbpress-functions.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-archive-forum.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-archive-topic.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-forum.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-reply.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-topic-lead.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-topic.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-user.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-view.php
web/wp-content/plugins/bbpress/templates/default/bbpress/content-topic-tag-edit.php
web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-logged-in.php
web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-access.php
web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-forums.php
web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-replies.php
web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-topics.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-anonymous.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-forum.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-protected.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-reply.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-merge.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-split.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-tag.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-edit.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-login.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-lost-pass.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-register.php
web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-roles.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-forums.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-replies.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-forum.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-reply.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-topic.php
web/wp-content/plugins/bbpress/templates/default/bbpress/loop-topics.php
web/wp-content/plugins/bbpress/templates/default/bbpress/pagination-replies.php
web/wp-content/plugins/bbpress/templates/default/bbpress/pagination-topics.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-details.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-favorites.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-profile.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-replies-created.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-subscriptions.php
web/wp-content/plugins/bbpress/templates/default/bbpress/user-topics-created.php
web/wp-content/plugins/bbpress/templates/default/css/bbpress-rtl.css
web/wp-content/plugins/bbpress/templates/default/css/bbpress-rtl.min.css
web/wp-content/plugins/bbpress/templates/default/css/bbpress.css
web/wp-content/plugins/bbpress/templates/default/css/bbpress.min.css
web/wp-content/plugins/bbpress/templates/default/extras/archive-forum.php
web/wp-content/plugins/bbpress/templates/default/extras/archive-topic.php
web/wp-content/plugins/bbpress/templates/default/extras/page-create-topic.php
web/wp-content/plugins/bbpress/templates/default/extras/page-forum-statistics.php
web/wp-content/plugins/bbpress/templates/default/extras/page-front-forums.php
web/wp-content/plugins/bbpress/templates/default/extras/page-front-topics.php
web/wp-content/plugins/bbpress/templates/default/extras/page-topic-tags.php
web/wp-content/plugins/bbpress/templates/default/extras/page-topics-no-replies.php
web/wp-content/plugins/bbpress/templates/default/extras/page-user-login.php
web/wp-content/plugins/bbpress/templates/default/extras/page-user-lost-pass.php
web/wp-content/plugins/bbpress/templates/default/extras/page-user-register.php
web/wp-content/plugins/bbpress/templates/default/extras/single-forum-edit.php
web/wp-content/plugins/bbpress/templates/default/extras/single-forum.php
web/wp-content/plugins/bbpress/templates/default/extras/single-reply-edit.php
web/wp-content/plugins/bbpress/templates/default/extras/single-reply.php
web/wp-content/plugins/bbpress/templates/default/extras/single-topic-edit.php
web/wp-content/plugins/bbpress/templates/default/extras/single-topic-merge.php
web/wp-content/plugins/bbpress/templates/default/extras/single-topic-split.php
web/wp-content/plugins/bbpress/templates/default/extras/single-topic.php
web/wp-content/plugins/bbpress/templates/default/extras/single-user-edit.php
web/wp-content/plugins/bbpress/templates/default/extras/single-user.php
web/wp-content/plugins/bbpress/templates/default/extras/single-view.php
web/wp-content/plugins/bbpress/templates/default/extras/taxonomy-topic-tag-edit.php
web/wp-content/plugins/bbpress/templates/default/extras/taxonomy-topic-tag.php
web/wp-content/plugins/bbpress/templates/default/js/topic.js
web/wp-content/plugins/bbpress/templates/default/js/topic.min.js
web/wp-content/plugins/bbpress/templates/index.php
web/wp-content/plugins/pik-slider/pik-slider.php
web/wp-content/plugins/social/LICENSE.txt
web/wp-content/plugins/social/README.txt
web/wp-content/plugins/social/assets/admin.css
web/wp-content/plugins/social/assets/admin.js
web/wp-content/plugins/social/assets/background-strikethrough.gif
web/wp-content/plugins/social/assets/child-account-bullet.gif
web/wp-content/plugins/social/assets/comments.css
web/wp-content/plugins/social/assets/e5e5e5.gif
web/wp-content/plugins/social/assets/like.png
web/wp-content/plugins/social/assets/mailchimp.png
web/wp-content/plugins/social/assets/retweet.png
web/wp-content/plugins/social/assets/social.js
web/wp-content/plugins/social/assets/social.png
web/wp-content/plugins/social/assets/sprite-y-24-icons.png
web/wp-content/plugins/social/assets/sprite-y-24.png
web/wp-content/plugins/social/assets/toggle.gif
web/wp-content/plugins/social/debug_log.txt
web/wp-content/plugins/social/lang/social.pot
web/wp-content/plugins/social/lib/social/aggregation/log.php
web/wp-content/plugins/social/lib/social/aggregation/queue.php
web/wp-content/plugins/social/lib/social/comment/form.php
web/wp-content/plugins/social/lib/social/controller.php
web/wp-content/plugins/social/lib/social/controller/aggregation.php
web/wp-content/plugins/social/lib/social/controller/auth.php
web/wp-content/plugins/social/lib/social/controller/broadcast.php
web/wp-content/plugins/social/lib/social/controller/cron.php
web/wp-content/plugins/social/lib/social/controller/import.php
web/wp-content/plugins/social/lib/social/controller/settings.php
web/wp-content/plugins/social/lib/social/date.php
web/wp-content/plugins/social/lib/social/interface/service.php
web/wp-content/plugins/social/lib/social/interface/service/account.php
web/wp-content/plugins/social/lib/social/log.php
web/wp-content/plugins/social/lib/social/request.php
web/wp-content/plugins/social/lib/social/response.php
web/wp-content/plugins/social/lib/social/semaphore.php
web/wp-content/plugins/social/lib/social/service.php
web/wp-content/plugins/social/lib/social/service/account.php
web/wp-content/plugins/social/lib/social/service/facebook.php
web/wp-content/plugins/social/lib/social/service/facebook/account.php
web/wp-content/plugins/social/lib/social/service/twitter.php
web/wp-content/plugins/social/lib/social/service/twitter/account.php
web/wp-content/plugins/social/lib/social/view.php
web/wp-content/plugins/social/lib/social/walker/comment.php
web/wp-content/plugins/social/screenshot-1.png
web/wp-content/plugins/social/screenshot-2.png
web/wp-content/plugins/social/screenshot-3.png
web/wp-content/plugins/social/screenshot-4.png
web/wp-content/plugins/social/screenshot-5.png
web/wp-content/plugins/social/social-facebook.php
web/wp-content/plugins/social/social-twitter.php
web/wp-content/plugins/social/social.php
web/wp-content/plugins/social/upgrades/2.0.php
web/wp-content/plugins/social/views/comment/comment.php
web/wp-content/plugins/social/views/comment/logged_in_as.php
web/wp-content/plugins/social/views/comment/social_item.php
web/wp-content/plugins/social/views/comment/top.php
web/wp-content/plugins/social/views/comments.php
web/wp-content/plugins/social/views/wp-admin/options.php
web/wp-content/plugins/social/views/wp-admin/parts/accounts.php
web/wp-content/plugins/social/views/wp-admin/post/broadcast/error/email.php
web/wp-content/plugins/social/views/wp-admin/post/broadcast/error/notice.php
web/wp-content/plugins/social/views/wp-admin/post/broadcast/facebook-link-preview.php
web/wp-content/plugins/social/views/wp-admin/post/broadcast/options.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/default.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/account.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/broadcasted.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/button.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/facebook/page.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/pending.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/private.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/scheduled.php
web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/shell.php
web/wp-content/plugins/social/views/wp-admin/post/meta/log/output.php
web/wp-content/plugins/social/views/wp-admin/post/meta/log/shell.php
web/wp-content/plugins/social/views/wp-admin/profile.php
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/bbpress.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,948 @@
+<?php
+
+/**
+ * The bbPress Plugin
+ *
+ * bbPress is forum software with a twist from the creators of WordPress.
+ *
+ * $Id: bbpress.php 4471 2012-11-23 11:24:58Z johnjamesjacoby $
+ *
+ * @package bbPress
+ * @subpackage Main
+ */
+
+/**
+ * Plugin Name: bbPress
+ * Plugin URI:  http://bbpress.org
+ * Description: bbPress is forum software with a twist from the creators of WordPress.
+ * Author:      The bbPress Community
+ * Author URI:  http://bbpress.org
+ * Version:     2.2.2
+ * Text Domain: bbpress
+ * Domain Path: /languages/
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'bbPress' ) ) :
+/**
+ * Main bbPress Class
+ *
+ * Tap tap tap... Is this thing on?
+ *
+ * @since bbPress (r2464)
+ */
+final class bbPress {
+
+	/** Magic *****************************************************************/
+
+	/**
+	 * bbPress uses many variables, most of which can be filtered to customize
+	 * the way that it works. To prevent unauthorized access, these variables
+	 * are stored in a private array that is magically updated using PHP 5.2+
+	 * methods. This is to prevent third party plugins from tampering with
+	 * essential information indirectly, which would cause issues later.
+	 *
+	 * @see bbPress::setup_globals()
+	 * @var array
+	 */
+	private $data;
+
+	/** Not Magic *************************************************************/
+
+	/**
+	 * @var mixed False when not logged in; WP_User object when logged in
+	 */
+	public $current_user = false;
+
+	/**
+	 * @var obj Add-ons append to this (Akismet, BuddyPress, etc...)
+	 */
+	public $extend;
+
+	/**
+	 * @var array Topic views
+	 */
+	public $views        = array();
+
+	/**
+	 * @var array Overloads get_option()
+	 */
+	public $options      = array();
+
+	/**
+	 * @var array Overloads get_user_meta()
+	 */
+	public $user_options = array();
+
+	/** Singleton *************************************************************/
+
+	/**
+	 * @var bbPress The one true bbPress
+	 */
+	private static $instance;
+
+	/**
+	 * Main bbPress Instance
+	 *
+	 * bbPress is fun
+	 * Please load it only one time
+	 * For this, we thank you
+	 *
+	 * Insures that only one instance of bbPress exists in memory at any one
+	 * time. Also prevents needing to define globals all over the place.
+	 *
+	 * @since bbPress (r3757)
+	 * @staticvar array $instance
+	 * @uses bbPress::setup_globals() Setup the globals needed
+	 * @uses bbPress::includes() Include the required files
+	 * @uses bbPress::setup_actions() Setup the hooks and actions
+	 * @see bbpress()
+	 * @return The one true bbPress
+	 */
+	public static function instance() {
+		if ( ! isset( self::$instance ) ) {
+			self::$instance = new bbPress;
+			self::$instance->setup_globals();
+			self::$instance->includes();
+			self::$instance->setup_actions();
+		}
+		return self::$instance;
+	}
+
+	/** Magic Methods *********************************************************/
+
+	/**
+	 * A dummy constructor to prevent bbPress from being loaded more than once.
+	 *
+	 * @since bbPress (r2464)
+	 * @see bbPress::instance()
+	 * @see bbpress();
+	 */
+	private function __construct() { /* Do nothing here */ }
+
+	/**
+	 * A dummy magic method to prevent bbPress from being cloned
+	 *
+	 * @since bbPress (r2464)
+	 */
+	public function __clone() { _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'bbpress' ), '2.1' ); }
+
+	/**
+	 * A dummy magic method to prevent bbPress from being unserialized
+	 *
+	 * @since bbPress (r2464)
+	 */
+	public function __wakeup() { _doing_it_wrong( __FUNCTION__, __( 'Cheatin&#8217; huh?', 'bbpress' ), '2.1' ); }
+
+	/**
+	 * Magic method for checking the existence of a certain custom field
+	 *
+	 * @since bbPress (r3951)
+	 */
+	public function __isset( $key ) { return isset( $this->data[$key] ); }
+
+	/**
+	 * Magic method for getting bbPress varibles
+	 *
+	 * @since bbPress (r3951)
+	 */
+	public function __get( $key ) { return isset( $this->data[$key] ) ? $this->data[$key] : null; }
+
+	/**
+	 * Magic method for setting bbPress varibles
+	 *
+	 * @since bbPress (r3951)
+	 */
+	public function __set( $key, $value ) { $this->data[$key] = $value; }
+
+	/**
+	 * Magic method to prevent notices and errors from invalid method calls
+	 *
+	 * @since bbPress (r4252)
+	 */
+	public function __call( $name = '', $args = array() ) { unset( $name, $args ); return null; }
+
+	/** Private Methods *******************************************************/
+
+	/**
+	 * Set some smart defaults to class variables. Allow some of them to be
+	 * filtered to allow for early overriding.
+	 *
+	 * @since bbPress (r2626)
+	 * @access private
+	 * @uses plugin_dir_path() To generate bbPress plugin path
+	 * @uses plugin_dir_url() To generate bbPress plugin url
+	 * @uses apply_filters() Calls various filters
+	 */
+	private function setup_globals() {
+
+		/** Versions **********************************************************/
+
+		$this->version    = '2.2.2';
+		$this->db_version = '220';
+
+		/** Paths *************************************************************/
+
+		// Setup some base path and URL information
+		$this->file       = __FILE__;
+		$this->basename   = apply_filters( 'bbp_plugin_basenname', plugin_basename( $this->file ) );
+		$this->plugin_dir = apply_filters( 'bbp_plugin_dir_path',  plugin_dir_path( $this->file ) );
+		$this->plugin_url = apply_filters( 'bbp_plugin_dir_url',   plugin_dir_url ( $this->file ) );
+
+		// Includes
+		$this->includes_dir = apply_filters( 'bbp_includes_dir', trailingslashit( $this->plugin_dir . 'includes'  ) );
+		$this->includes_url = apply_filters( 'bbp_includes_url', trailingslashit( $this->plugin_url . 'includes'  ) );
+
+		// Languages
+		$this->lang_dir     = apply_filters( 'bbp_lang_dir',     trailingslashit( $this->plugin_dir . 'languages' ) );
+
+		// Templates
+		$this->themes_dir   = apply_filters( 'bbp_themes_dir',   trailingslashit( $this->plugin_dir . 'templates' ) );
+		$this->themes_url   = apply_filters( 'bbp_themes_url',   trailingslashit( $this->plugin_url . 'templates' ) );
+
+		/** Identifiers *******************************************************/
+
+		// Post type identifiers
+		$this->forum_post_type   = apply_filters( 'bbp_forum_post_type',  'forum'     );
+		$this->topic_post_type   = apply_filters( 'bbp_topic_post_type',  'topic'     );
+		$this->reply_post_type   = apply_filters( 'bbp_reply_post_type',  'reply'     );
+		$this->topic_tag_tax_id  = apply_filters( 'bbp_topic_tag_tax_id', 'topic-tag' );
+
+		// Status identifiers
+		$this->spam_status_id    = apply_filters( 'bbp_spam_post_status',    'spam'    );
+		$this->closed_status_id  = apply_filters( 'bbp_closed_post_status',  'closed'  );
+		$this->orphan_status_id  = apply_filters( 'bbp_orphan_post_status',  'orphan'  );
+		$this->public_status_id  = apply_filters( 'bbp_public_post_status',  'publish' );
+		$this->pending_status_id = apply_filters( 'bbp_pending_post_status', 'pending' );
+		$this->private_status_id = apply_filters( 'bbp_private_post_status', 'private' );
+		$this->hidden_status_id  = apply_filters( 'bbp_hidden_post_status',  'hidden'  );
+		$this->trash_status_id   = apply_filters( 'bbp_trash_post_status',   'trash'   );
+
+		// Other identifiers
+		$this->user_id           = apply_filters( 'bbp_user_id', 'bbp_user' );
+		$this->tops_id           = apply_filters( 'bbp_tops_id', 'bbp_tops' );
+		$this->reps_id           = apply_filters( 'bbp_reps_id', 'bbp_reps' );
+		$this->favs_id           = apply_filters( 'bbp_favs_id', 'bbp_favs' );
+		$this->subs_id           = apply_filters( 'bbp_subs_id', 'bbp_subs' );
+		$this->view_id           = apply_filters( 'bbp_view_id', 'bbp_view' );
+		$this->edit_id           = apply_filters( 'bbp_edit_id', 'edit'     );
+
+		/** Queries ***********************************************************/
+
+		$this->current_forum_id     = 0; // Current forum id
+		$this->current_topic_id     = 0; // Current topic id
+		$this->current_reply_id     = 0; // Current reply id
+		$this->current_topic_tag_id = 0; // Current topic tag id
+
+		$this->forum_query    = new stdClass(); // Main forum query
+		$this->topic_query    = new stdClass(); // Main topic query
+		$this->reply_query    = new stdClass(); // Main reply query
+
+		/** Theme Compat ******************************************************/
+
+		$this->theme_compat   = new stdClass(); // Base theme compatibility class
+		$this->filters        = new stdClass(); // Used when adding/removing filters
+
+		/** Users *************************************************************/
+
+		$this->current_user   = new stdClass(); // Currently logged in user
+		$this->displayed_user = new stdClass(); // Currently displayed user
+
+		/** Misc **************************************************************/
+
+		$this->domain         = 'bbpress';      // Unique identifier for retrieving translated strings
+		$this->extend         = new stdClass(); // Plugins add data here
+		$this->errors         = new WP_Error(); // Feedback
+		$this->tab_index      = apply_filters( 'bbp_default_tab_index', 100 );
+
+		/** Cache *************************************************************/
+
+		// Add bbPress to global cache groups
+		wp_cache_add_global_groups( 'bbpress' );
+	}
+
+	/**
+	 * Include required files
+	 *
+	 * @since bbPress (r2626)
+	 * @access private
+	 * @uses is_admin() If in WordPress admin, load additional file
+	 */
+	private function includes() {
+
+		/** Core **************************************************************/
+
+		require( $this->includes_dir . 'core/sub-actions.php'        );
+		require( $this->includes_dir . 'core/functions.php'          );
+		require( $this->includes_dir . 'core/cache.php'              );
+		require( $this->includes_dir . 'core/options.php'            );
+		require( $this->includes_dir . 'core/capabilities.php'       );
+		require( $this->includes_dir . 'core/update.php'             );
+		require( $this->includes_dir . 'core/template-functions.php' );
+		require( $this->includes_dir . 'core/template-loader.php'    );
+		require( $this->includes_dir . 'core/theme-compat.php'       );
+
+		/** Components ********************************************************/
+
+		// Common
+		require( $this->includes_dir . 'common/classes.php'        );
+		require( $this->includes_dir . 'common/functions.php'      );
+		require( $this->includes_dir . 'common/template-tags.php'  );
+		require( $this->includes_dir . 'common/widgets.php'        );
+		require( $this->includes_dir . 'common/shortcodes.php'     );
+
+		// Forums
+		require( $this->includes_dir . 'forums/capabilities.php'   );
+		require( $this->includes_dir . 'forums/functions.php'      );
+		require( $this->includes_dir . 'forums/template-tags.php'  );
+
+		// Topics
+		require( $this->includes_dir . 'topics/capabilities.php'   );
+		require( $this->includes_dir . 'topics/functions.php'      );
+		require( $this->includes_dir . 'topics/template-tags.php'  );
+
+		// Replies
+		require( $this->includes_dir . 'replies/capabilities.php'  );
+		require( $this->includes_dir . 'replies/functions.php'     );
+		require( $this->includes_dir . 'replies/template-tags.php' );
+
+		// Users
+		require( $this->includes_dir . 'users/capabilities.php'    );
+		require( $this->includes_dir . 'users/functions.php'       );
+		require( $this->includes_dir . 'users/template-tags.php'   );
+		require( $this->includes_dir . 'users/options.php'         );
+
+		/** Hooks *************************************************************/
+
+		require( $this->includes_dir . 'core/extend.php'  );
+		require( $this->includes_dir . 'core/actions.php' );
+		require( $this->includes_dir . 'core/filters.php' );
+
+		/** Admin *************************************************************/
+
+		// Quick admin check and load if needed
+		if ( is_admin() ) {
+			require( $this->includes_dir . 'admin/admin.php'   );
+			require( $this->includes_dir . 'admin/actions.php' );
+		}
+	}
+
+	/**
+	 * Setup the default hooks and actions
+	 *
+	 * @since bbPress (r2644)
+	 * @access private
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		// Add actions to plugin activation and deactivation hooks
+		add_action( 'activate_'   . $this->basename, 'bbp_activation'   );
+		add_action( 'deactivate_' . $this->basename, 'bbp_deactivation' );
+
+		// If bbPress is being deactivated, do not add any actions
+		if ( bbp_is_deactivation( $this->basename ) )
+			return;
+
+		// Array of bbPress core actions
+		$actions = array(
+			'setup_theme',              // Setup the default theme compat
+			'setup_current_user',       // Setup currently logged in user
+			'register_post_types',      // Register post types (forum|topic|reply)
+			'register_post_statuses',   // Register post statuses (closed|spam|orphan|hidden)
+			'register_taxonomies',      // Register taxonomies (topic-tag)
+			'register_shortcodes',      // Register shortcodes (bbp-login)
+			'register_views',           // Register the views (no-replies)
+			'register_theme_packages',  // Register bundled theme packages (bbp-theme-compat/bbp-themes)
+			'load_textdomain',          // Load textdomain (bbpress)
+			'add_rewrite_tags',         // Add rewrite tags (view|user|edit)
+			'generate_rewrite_rules'    // Generate rewrite rules (view|edit)
+		);
+
+		// Add the actions
+		foreach( $actions as $class_action )
+			add_action( 'bbp_' . $class_action, array( $this, $class_action ), 5 );
+
+		// All bbPress actions are setup (includes bbp-core-hooks.php)
+		do_action_ref_array( 'bbp_after_setup_actions', array( &$this ) );
+	}
+
+	/** Public Methods ********************************************************/
+
+	/**
+	 * Register bundled theme packages
+	 *
+	 * Note that since we currently have complete control over bbp-themes and
+	 * the bbp-theme-compat folders, it's fine to hardcode these here. If at a
+	 * later date we need to automate this, and API will need to be built.
+	 *
+	 * @since bbPress (r3829)
+	 */
+	public function register_theme_packages() {
+
+		// Register the default theme compatibility package
+		bbp_register_theme_package( array(
+			'id'      => 'default',
+			'name'    => __( 'bbPress Default', 'bbpress' ),
+			'version' => bbp_get_version(),
+			'dir'     => trailingslashit( $this->themes_dir . 'default' ),
+			'url'     => trailingslashit( $this->themes_url . 'default' )
+		) );
+
+		// Register the basic theme stack. This is really dope.
+		bbp_register_template_stack( 'get_stylesheet_directory', 10 );
+		bbp_register_template_stack( 'get_template_directory',   12 );
+		bbp_register_template_stack( 'bbp_get_theme_compat_dir', 14 );
+	}
+
+	/**
+	 * Setup the default bbPress theme compatability location.
+	 *
+	 * @since bbPress (r3778)
+	 */
+	public function setup_theme() {
+
+		// Bail if something already has this under control
+		if ( ! empty( $this->theme_compat->theme ) )
+			return;
+
+		// Setup the theme package to use for compatibility
+		bbp_setup_theme_compat( bbp_get_theme_package_id() );
+	}
+
+	/**
+	 * Load the translation file for current language. Checks the languages
+	 * folder inside the bbPress plugin first, and then the default WordPress
+	 * languages folder.
+	 *
+	 * Note that custom translation files inside the bbPress plugin folder
+	 * will be removed on bbPress updates. If you're creating custom
+	 * translation files, please use the global language folder.
+	 *
+	 * @since bbPress (r2596)
+	 *
+	 * @uses apply_filters() Calls 'bbpress_locale' with the
+	 *                        {@link get_locale()} value
+	 * @uses load_textdomain() To load the textdomain
+	 * @return bool True on success, false on failure
+	 */
+	public function load_textdomain() {
+
+		// Traditional WordPress plugin locale filter
+		$locale        = apply_filters( 'plugin_locale',  get_locale(), $this->domain );
+		$mofile        = sprintf( '%1$s-%2$s.mo', $this->domain, $locale );
+
+		// Setup paths to current locale file
+		$mofile_local  = $this->lang_dir . $mofile;
+		$mofile_global = WP_LANG_DIR . '/bbpress/' . $mofile;
+
+		// Look in global /wp-content/languages/bbpress folder
+		if ( file_exists( $mofile_global ) ) {
+			return load_textdomain( $this->domain, $mofile_global );
+
+		// Look in local /wp-content/plugins/bbpress/bbp-languages/ folder
+		} elseif ( file_exists( $mofile_local ) ) {
+			return load_textdomain( $this->domain, $mofile_local );
+		}
+
+		// Nothing found
+		return false;
+	}
+
+	/**
+	 * Setup the post types for forums, topics and replies
+	 *
+	 * @since bbPress (r2597)
+	 * @uses register_post_type() To register the post types
+	 * @uses apply_filters() Calls various filters to modify the arguments
+	 *                        sent to register_post_type()
+	 */
+	public static function register_post_types() {
+
+		// Define local variable(s)
+		$post_type = array();
+
+		/** Forums ************************************************************/
+
+		// Forum labels
+		$post_type['labels'] = array(
+			'name'               => __( 'Forums',                   'bbpress' ),
+			'menu_name'          => __( 'Forums',                   'bbpress' ),
+			'singular_name'      => __( 'Forum',                    'bbpress' ),
+			'all_items'          => __( 'All Forums',               'bbpress' ),
+			'add_new'            => __( 'New Forum',                'bbpress' ),
+			'add_new_item'       => __( 'Create New Forum',         'bbpress' ),
+			'edit'               => __( 'Edit',                     'bbpress' ),
+			'edit_item'          => __( 'Edit Forum',               'bbpress' ),
+			'new_item'           => __( 'New Forum',                'bbpress' ),
+			'view'               => __( 'View Forum',               'bbpress' ),
+			'view_item'          => __( 'View Forum',               'bbpress' ),
+			'search_items'       => __( 'Search Forums',            'bbpress' ),
+			'not_found'          => __( 'No forums found',          'bbpress' ),
+			'not_found_in_trash' => __( 'No forums found in Trash', 'bbpress' ),
+			'parent_item_colon'  => __( 'Parent Forum:',            'bbpress' )
+		);
+
+		// Forum rewrite
+		$post_type['rewrite'] = array(
+			'slug'       => bbp_get_forum_slug(),
+			'with_front' => false
+		);
+
+		// Forum supports
+		$post_type['supports'] = array(
+			'title',
+			'editor',
+			'revisions'
+		);
+
+		// Register Forum content type
+		register_post_type(
+			bbp_get_forum_post_type(),
+			apply_filters( 'bbp_register_forum_post_type', array(
+				'labels'              => $post_type['labels'],
+				'rewrite'             => $post_type['rewrite'],
+				'supports'            => $post_type['supports'],
+				'description'         => __( 'bbPress Forums', 'bbpress' ),
+				'capabilities'        => bbp_get_forum_caps(),
+				'capability_type'     => array( 'forum', 'forums' ),
+				'menu_position'       => 555555,
+				'has_archive'         => bbp_get_root_slug(),
+				'exclude_from_search' => true,
+				'show_in_nav_menus'   => true,
+				'public'              => true,
+				'show_ui'             => current_user_can( 'bbp_forums_admin' ),
+				'can_export'          => true,
+				'hierarchical'        => true,
+				'query_var'           => true,
+				'menu_icon'           => ''
+			) )
+		);
+
+		/** Topics ************************************************************/
+
+		// Topic labels
+		$post_type['labels'] = array(
+			'name'               => __( 'Topics',                   'bbpress' ),
+			'menu_name'          => __( 'Topics',                   'bbpress' ),
+			'singular_name'      => __( 'Topic',                    'bbpress' ),
+			'all_items'          => __( 'All Topics',               'bbpress' ),
+			'add_new'            => __( 'New Topic',                'bbpress' ),
+			'add_new_item'       => __( 'Create New Topic',         'bbpress' ),
+			'edit'               => __( 'Edit',                     'bbpress' ),
+			'edit_item'          => __( 'Edit Topic',               'bbpress' ),
+			'new_item'           => __( 'New Topic',                'bbpress' ),
+			'view'               => __( 'View Topic',               'bbpress' ),
+			'view_item'          => __( 'View Topic',               'bbpress' ),
+			'search_items'       => __( 'Search Topics',            'bbpress' ),
+			'not_found'          => __( 'No topics found',          'bbpress' ),
+			'not_found_in_trash' => __( 'No topics found in Trash', 'bbpress' ),
+			'parent_item_colon'  => __( 'Forum:',                   'bbpress' )
+		);
+
+		// Topic rewrite
+		$post_type['rewrite'] = array(
+			'slug'       => bbp_get_topic_slug(),
+			'with_front' => false
+		);
+
+		// Topic supports
+		$post_type['supports'] = array(
+			'title',
+			'editor',
+			'revisions'
+		);
+
+		// Register Topic content type
+		register_post_type(
+			bbp_get_topic_post_type(),
+			apply_filters( 'bbp_register_topic_post_type', array(
+				'labels'              => $post_type['labels'],
+				'rewrite'             => $post_type['rewrite'],
+				'supports'            => $post_type['supports'],
+				'description'         => __( 'bbPress Topics', 'bbpress' ),
+				'capabilities'        => bbp_get_topic_caps(),
+				'capability_type'     => array( 'topic', 'topics' ),
+				'menu_position'       => 555555,
+				'has_archive'         => bbp_get_topic_archive_slug(),
+				'exclude_from_search' => true,
+				'show_in_nav_menus'   => false,
+				'public'              => true,
+				'show_ui'             => current_user_can( 'bbp_topics_admin' ),
+				'can_export'          => true,
+				'hierarchical'        => false,
+				'query_var'           => true,
+				'menu_icon'           => ''
+			)
+		) );
+
+		/** Replies ***********************************************************/
+
+		// Reply labels
+		$post_type['labels'] = array(
+			'name'               => __( 'Replies',                   'bbpress' ),
+			'menu_name'          => __( 'Replies',                   'bbpress' ),
+			'singular_name'      => __( 'Reply',                     'bbpress' ),
+			'all_items'          => __( 'All Replies',               'bbpress' ),
+			'add_new'            => __( 'New Reply',                 'bbpress' ),
+			'add_new_item'       => __( 'Create New Reply',          'bbpress' ),
+			'edit'               => __( 'Edit',                      'bbpress' ),
+			'edit_item'          => __( 'Edit Reply',                'bbpress' ),
+			'new_item'           => __( 'New Reply',                 'bbpress' ),
+			'view'               => __( 'View Reply',                'bbpress' ),
+			'view_item'          => __( 'View Reply',                'bbpress' ),
+			'search_items'       => __( 'Search Replies',            'bbpress' ),
+			'not_found'          => __( 'No replies found',          'bbpress' ),
+			'not_found_in_trash' => __( 'No replies found in Trash', 'bbpress' ),
+			'parent_item_colon'  => __( 'Topic:',                    'bbpress' )
+		);
+
+		// Reply rewrite
+		$post_type['rewrite'] = array(
+			'slug'       => bbp_get_reply_slug(),
+			'with_front' => false
+		);
+
+		// Reply supports
+		$post_type['supports'] = array(
+			'title',
+			'editor',
+			'revisions'
+		);
+
+		// Register reply content type
+		register_post_type(
+			bbp_get_reply_post_type(),
+			apply_filters( 'bbp_register_reply_post_type', array(
+				'labels'              => $post_type['labels'],
+				'rewrite'             => $post_type['rewrite'],
+				'supports'            => $post_type['supports'],
+				'description'         => __( 'bbPress Replies', 'bbpress' ),
+				'capabilities'        => bbp_get_reply_caps(),
+				'capability_type'     => array( 'reply', 'replies' ),
+				'menu_position'       => 555555,
+				'exclude_from_search' => true,
+				'has_archive'         => false,
+				'show_in_nav_menus'   => false,
+				'public'              => true,
+				'show_ui'             => current_user_can( 'bbp_replies_admin' ),
+				'can_export'          => true,
+				'hierarchical'        => false,
+				'query_var'           => true,
+				'menu_icon'           => ''
+			) )
+		);
+	}
+
+	/**
+	 * Register the post statuses used by bbPress
+	 *
+	 * We do some manipulation of the 'trash' status so trashed topics and
+	 * replies can be viewed from within the theme.
+	 *
+	 * @since bbPress (r2727)
+	 * @uses register_post_status() To register post statuses
+	 * @uses $wp_post_statuses To modify trash and private statuses
+	 * @uses current_user_can() To check if the current user is capable &
+	 *                           modify $wp_post_statuses accordingly
+	 */
+	public static function register_post_statuses() {
+
+		// Closed
+		register_post_status(
+			bbp_get_closed_status_id(),
+			apply_filters( 'bbp_register_closed_post_status', array(
+				'label'             => _x( 'Closed', 'post', 'bbpress' ),
+				'label_count'       => _nx_noop( 'Closed <span class="count">(%s)</span>', 'Closed <span class="count">(%s)</span>', 'bbpress' ),
+				'public'            => true,
+				'show_in_admin_all' => true
+			) )
+		);
+
+		// Spam
+		register_post_status(
+			bbp_get_spam_status_id(),
+			apply_filters( 'bbp_register_spam_post_status', array(
+				'label'                     => _x( 'Spam', 'post', 'bbpress' ),
+				'label_count'               => _nx_noop( 'Spam <span class="count">(%s)</span>', 'Spam <span class="count">(%s)</span>', 'bbpress' ),
+				'protected'                 => true,
+				'exclude_from_search'       => true,
+				'show_in_admin_status_list' => true,
+				'show_in_admin_all_list'    => false
+			) )
+		 );
+
+		// Orphan
+		register_post_status(
+			bbp_get_orphan_status_id(),
+			apply_filters( 'bbp_register_orphan_post_status', array(
+				'label'                     => _x( 'Orphan', 'post', 'bbpress' ),
+				'label_count'               => _nx_noop( 'Orphan <span class="count">(%s)</span>', 'Orphans <span class="count">(%s)</span>', 'bbpress' ),
+				'protected'                 => true,
+				'exclude_from_search'       => true,
+				'show_in_admin_status_list' => true,
+				'show_in_admin_all_list'    => false
+			) )
+		);
+
+		// Hidden
+		register_post_status(
+			bbp_get_hidden_status_id(),
+			apply_filters( 'bbp_register_hidden_post_status', array(
+				'label'                     => _x( 'Hidden', 'post', 'bbpress' ),
+				'label_count'               => _nx_noop( 'Hidden <span class="count">(%s)</span>', 'Hidden <span class="count">(%s)</span>', 'bbpress' ),
+				'private'                   => true,
+				'exclude_from_search'       => true,
+				'show_in_admin_status_list' => true,
+				'show_in_admin_all_list'    => true
+			) )
+		);
+
+		/**
+		 * Trash fix
+		 *
+		 * We need to remove the internal arg and change that to
+		 * protected so that the users with 'view_trash' cap can view
+		 * single trashed topics/replies in the front-end as wp_query
+		 * doesn't allow any hack for the trashed topics to be viewed.
+		 */
+		global $wp_post_statuses;
+
+		if ( !empty( $wp_post_statuses['trash'] ) ) {
+
+			// User can view trash so set internal to false
+			if ( current_user_can( 'view_trash' ) ) {
+				$wp_post_statuses['trash']->internal  = false;
+				$wp_post_statuses['trash']->protected = true;
+
+			// User cannot view trash so set internal to true
+			} elseif ( !current_user_can( 'view_trash' ) ) {
+				$wp_post_statuses['trash']->internal = true;
+			}
+		}
+	}
+
+	/**
+	 * Register the topic tag taxonomy
+	 *
+	 * @since bbPress (r2464)
+	 * @uses register_taxonomy() To register the taxonomy
+	 */
+	public static function register_taxonomies() {
+
+		// Define local variable(s)
+		$topic_tag = array();
+
+		// Topic tag labels
+		$topic_tag['labels'] = array(
+			'name'          => __( 'Topic Tags',     'bbpress' ),
+			'singular_name' => __( 'Topic Tag',      'bbpress' ),
+			'search_items'  => __( 'Search Tags',    'bbpress' ),
+			'popular_items' => __( 'Popular Tags',   'bbpress' ),
+			'all_items'     => __( 'All Tags',       'bbpress' ),
+			'edit_item'     => __( 'Edit Tag',       'bbpress' ),
+			'update_item'   => __( 'Update Tag',     'bbpress' ),
+			'add_new_item'  => __( 'Add New Tag',    'bbpress' ),
+			'new_item_name' => __( 'New Tag Name',   'bbpress' ),
+			'view_item'     => __( 'View Topic Tag', 'bbpress' )
+		);
+
+		// Topic tag rewrite
+		$topic_tag['rewrite'] = array(
+			'slug'       => bbp_get_topic_tag_tax_slug(),
+			'with_front' => false
+		);
+
+		// Register the topic tag taxonomy
+		register_taxonomy(
+			bbp_get_topic_tag_tax_id(),
+			bbp_get_topic_post_type(),
+			apply_filters( 'bbp_register_topic_taxonomy', array(
+				'labels'                => $topic_tag['labels'],
+				'rewrite'               => $topic_tag['rewrite'],
+				'capabilities'          => bbp_get_topic_tag_caps(),
+				'update_count_callback' => '_update_post_term_count',
+				'query_var'             => true,
+				'show_tagcloud'         => true,
+				'hierarchical'          => false,
+				'public'                => true,
+				'show_ui'               => bbp_allow_topic_tags() && current_user_can( 'bbp_topic_tags_admin' )
+			)
+		) );
+	}
+
+	/**
+	 * Register the bbPress views
+	 *
+	 * @since bbPress (r2789)
+	 * @uses bbp_register_view() To register the views
+	 */
+	public static function register_views() {
+
+		// Topics with no replies
+		bbp_register_view(
+			'no-replies',
+			__( 'Topics with no replies', 'bbpress' ),
+			apply_filters( 'bbp_register_view_no_replies', array(
+				'meta_key'     => '_bbp_reply_count',
+				'meta_value'   => 1,
+				'meta_compare' => '<',
+				'orderby'      => ''
+			)
+		) );
+	}
+
+	/**
+	 * Register the bbPress shortcodes
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @uses BBP_Shortcodes
+	 */
+	public function register_shortcodes() {
+		$this->shortcodes = new BBP_Shortcodes();
+	}
+
+	/**
+	 * Setup the currently logged-in user
+	 *
+	 * Do not to call this prematurely, I.E. before the 'init' action has
+	 * started. This function is naturally hooked into 'init' to ensure proper
+	 * execution. get_currentuserinfo() is used to check for XMLRPC_REQUEST to
+	 * avoid xmlrpc errors.
+	 *
+	 * @since bbPress (r2697)
+	 * @uses wp_get_current_user()
+	 */
+	public function setup_current_user() {
+		$this->current_user = &wp_get_current_user();
+	}
+
+	/** Custom Rewrite Rules **************************************************/
+
+	/**
+	 * Add the bbPress-specific rewrite tags
+	 *
+	 * @since bbPress (r2753)
+	 * @uses add_rewrite_tag() To add the rewrite tags
+	 */
+	public static function add_rewrite_tags() {
+		add_rewrite_tag( '%%' . bbp_get_view_rewrite_id()               . '%%', '([^/]+)'   ); // View Page tag
+		add_rewrite_tag( '%%' . bbp_get_edit_rewrite_id()               . '%%', '([1]{1,})' ); // Edit Page tag
+		add_rewrite_tag( '%%' . bbp_get_user_rewrite_id()               . '%%', '([^/]+)'   ); // User Profile tag
+		add_rewrite_tag( '%%' . bbp_get_user_favorites_rewrite_id()     . '%%', '([1]{1,})' ); // User Favorites tag
+		add_rewrite_tag( '%%' . bbp_get_user_subscriptions_rewrite_id() . '%%', '([1]{1,})' ); // User Subscriptions tag
+		add_rewrite_tag( '%%' . bbp_get_user_topics_rewrite_id()        . '%%', '([1]{1,})' ); // User Topics Tag
+		add_rewrite_tag( '%%' . bbp_get_user_replies_rewrite_id()       . '%%', '([1]{1,})' ); // User Replies Tag
+	}
+
+	/**
+	 * Register bbPress-specific rewrite rules for uri's that are not
+	 * setup for us by way of custom post types or taxonomies. This includes:
+	 * - Front-end editing
+	 * - Topic views
+	 * - User profiles
+	 *
+	 * @since bbPress (r2688)
+	 * @param WP_Rewrite $wp_rewrite bbPress-sepecific rules are appended in
+	 *                                $wp_rewrite->rules
+	 */
+	public static function generate_rewrite_rules( $wp_rewrite ) {
+
+		// Slugs
+		$view_slug = bbp_get_view_slug();
+		$user_slug = bbp_get_user_slug();
+
+		// Unique rewrite ID's
+		$edit_id = bbp_get_edit_rewrite_id();
+		$view_id = bbp_get_view_rewrite_id();
+		$user_id = bbp_get_user_rewrite_id();
+		$favs_id = bbp_get_user_favorites_rewrite_id();
+		$subs_id = bbp_get_user_subscriptions_rewrite_id();
+		$tops_id = bbp_get_user_topics_rewrite_id();
+		$reps_id = bbp_get_user_replies_rewrite_id();
+
+		// Rewrite rule matches used repeatedly below
+		$root_rule = '/([^/]+)/?$';
+		$edit_rule = '/([^/]+)/edit/?$';
+		$feed_rule = '/([^/]+)/feed/?$';
+		$page_rule = '/([^/]+)/page/?([0-9]{1,})/?$';
+
+		// User profile rules
+		$tops_rule      = '/([^/]+)/topics/?$';
+		$reps_rule      = '/([^/]+)/replies/?$';
+		$favs_rule      = '/([^/]+)/' . bbp_get_user_favorites_slug()     . '/?$';
+		$subs_rule      = '/([^/]+)/' . bbp_get_user_subscriptions_slug() . '/?$';
+		$tops_page_rule = '/([^/]+)/topics/page/?([0-9]{1,})/?$';
+		$reps_page_rule = '/([^/]+)/replies/page/?([0-9]{1,})/?$';
+		$favs_page_rule = '/([^/]+)/' . bbp_get_user_favorites_slug()     . '/page/?([0-9]{1,})/?$';
+		$subs_page_rule = '/([^/]+)/' . bbp_get_user_subscriptions_slug() . '/page/?([0-9]{1,})/?$';
+
+		// New bbPress specific rules to merge with existing that are not
+		// handled automatically by custom post types or taxonomy types
+		$bbp_rules = array(
+
+			// Edit Forum|Topic|Reply|Topic-tag
+			bbp_get_forum_slug()         . $edit_rule => 'index.php?' . bbp_get_forum_post_type()  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $edit_id . '=1',
+			bbp_get_topic_slug()         . $edit_rule => 'index.php?' . bbp_get_topic_post_type()  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $edit_id . '=1',
+			bbp_get_reply_slug()         . $edit_rule => 'index.php?' . bbp_get_reply_post_type()  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $edit_id . '=1',
+			bbp_get_topic_tag_tax_slug() . $edit_rule => 'index.php?' . bbp_get_topic_tag_tax_id() . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $edit_id . '=1',
+
+			// User Pagination|Edit|View
+			$user_slug . $tops_page_rule => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $tops_id . '=1&paged=' . $wp_rewrite->preg_index( 2 ),
+			$user_slug . $reps_page_rule => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $reps_id . '=1&paged=' . $wp_rewrite->preg_index( 2 ),
+			$user_slug . $favs_page_rule => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $favs_id . '=1&paged=' . $wp_rewrite->preg_index( 2 ),
+			$user_slug . $subs_page_rule => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $subs_id . '=1&paged=' . $wp_rewrite->preg_index( 2 ),
+			$user_slug . $tops_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $tops_id . '=1',
+			$user_slug . $reps_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $reps_id . '=1',
+			$user_slug . $favs_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $favs_id . '=1',
+			$user_slug . $subs_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $subs_id . '=1',
+			$user_slug . $edit_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ) . '&' . $edit_id . '=1',
+			$user_slug . $root_rule      => 'index.php?' . $user_id  . '=' . $wp_rewrite->preg_index( 1 ),
+
+			// Topic-View Pagination|Feed|View
+			$view_slug . $page_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ) . '&paged=' . $wp_rewrite->preg_index( 2 ),
+			$view_slug . $feed_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ) . '&feed='  . $wp_rewrite->preg_index( 2 ),
+			$view_slug . $root_rule => 'index.php?' . $view_id . '=' . $wp_rewrite->preg_index( 1 ),
+		);
+
+		// Merge bbPress rules with existing
+		$wp_rewrite->rules = array_merge( $bbp_rules, $wp_rewrite->rules );
+
+		// Return merged rules
+		return $wp_rewrite;
+	}
+}
+
+/**
+ * The main function responsible for returning the one true bbPress Instance
+ * to functions everywhere.
+ *
+ * Use this function like you would a global variable, except without needing
+ * to declare the global.
+ *
+ * Example: <?php $bbp = bbpress(); ?>
+ *
+ * @return The one true bbPress Instance
+ */
+function bbpress() {
+	return bbpress::instance();
+}
+
+/**
+ * Hook bbPress early onto the 'plugins_loaded' action.
+ *
+ * This gives all other plugins the chance to load before bbPress, to get their
+ * actions, filters, and overrides setup without bbPress being in the way.
+ */
+if ( defined( 'BBPRESS_LATE_LOAD' ) ) {
+	add_action( 'plugins_loaded', 'bbpress', (int) BBPRESS_LATE_LOAD );
+
+// "And now here's something we hope you'll really like!"
+} else {
+	bbpress();
+}
+
+endif; // class_exists check
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/humans.txt	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,46 @@
+                ..=OO$,
+            ~OO=. . . . .Z88
+        .78..  .,OOOOOOO    .7O
+       IO.  7OOOOOOOOOOOOOOO.   8..
+      O. .OOOOOOOOOOOOOOOOOOOOO   O.
+    7O  OOOOOOOOOOOOOOOOOOOOOOOO8  O.
+   ,O.      OOOOOOO..     OOOOOOOO. O,
+  IO  OO    OOOOOOOOO.   OOOOOOOOOO..O
+ .O .8OO    OOOOOOOOO.   OOOOOOOOOOO  O
+ O  OOOO   8OOOOOOOOO.   OOOOOOOOOOOZ ,O
+ O .OOO.  .OOOOOOOOOO   OOOOOOOOOOOOO .8
+.Z 7OOO   .OOOOOOOOO   .OOOOOOOOOOOOO  8.
+.O OOOO.  OOO~..ZOOO.  .OOO. +OOOOOOO: O.
+.O OOO.     .OI.  .$   Z..7O.  .OOOOO~ O.
+.Z $OO   .ZOOOOOO     ..OOOOOO   OOOO  O.
+ O  O7   OOOOOOOO     .OOOOOOO   IOOO  O
+ O  8   .OOOOOOOO     OOOOOOOO   OOOZ .O
+  8     .OOOOOOOO     OOOOOOOO   OOO .O.
+  ?O    OOOOOOOO      OOOOOOO.  .OO..O.
+   O+   OOOOOOO      +OOOOOO? ..OO  O,
+    78   OOOOI .,O8   OOOO8. .OO8 .O
+      O.  . . OOOOOO7..  ..OOOO  .8
+      .?O  .7OOOOOOOOOOOOOOO.. .8.
+         78    .,OOOOOOO.    7O..
+            :OO+.       .ZO8.
+                ..=OO$,
+
+    We are the humans behind bbPress
+
+/* TEAM */
+Name: Matt Mullenweg
+Title: Founding Developer
+Twitter: photomatt
+Favorite Food: BBQ
+
+Name: John James Jacoby
+Title: Lead Developer
+Twitter: jjj
+Favorite Food: Truffle Lasagna
+
+/* THANKS */
+Mike Adams, Gautam Gupta, jmdodd, Ben L, Justin Tadlock, cnorris23, anointed, andy, nacin, netweb
+
+/* META */
+Updated: 2012/11/09
+See: http://humanstxt.org/
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/actions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,184 @@
+<?php
+
+/**
+ * bbPress Admin Actions
+ *
+ * @package bbPress
+ * @subpackage Admin
+ *
+ * This file contains the actions that are used through-out bbPress Admin. They
+ * are consolidated here to make searching for them easier, and to help developers
+ * understand at a glance the order in which things occur.
+ *
+ * There are a few common places that additional actions can currently be found
+ *
+ *  - bbPress: In {@link bbPress::setup_actions()} in bbpress.php
+ *  - Admin: More in {@link BBP_Admin::setup_actions()} in admin.php
+ *
+ * @see bbp-core-actions.php
+ * @see bbp-core-filters.php
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Attach bbPress to WordPress
+ *
+ * bbPress uses its own internal actions to help aid in third-party plugin
+ * development, and to limit the amount of potential future code changes when
+ * updates to WordPress core occur.
+ *
+ * These actions exist to create the concept of 'plugin dependencies'. They
+ * provide a safe way for plugins to execute code *only* when bbPress is
+ * installed and activated, without needing to do complicated guesswork.
+ *
+ * For more information on how this works, see the 'Plugin Dependency' section
+ * near the bottom of this file.
+ *
+ *           v--WordPress Actions       v--bbPress Sub-actions
+ */
+add_action( 'admin_menu',              'bbp_admin_menu'                    );
+add_action( 'admin_init',              'bbp_admin_init'                    );
+add_action( 'admin_head',              'bbp_admin_head'                    );
+add_action( 'admin_notices',           'bbp_admin_notices'                 );
+add_action( 'custom_menu_order',       'bbp_admin_custom_menu_order'       );
+add_action( 'menu_order',              'bbp_admin_menu_order'              );
+add_action( 'wpmu_new_blog',           'bbp_new_site',               10, 6 );
+
+// Hook on to admin_init
+add_action( 'bbp_admin_init', 'bbp_admin_forums'                );
+add_action( 'bbp_admin_init', 'bbp_admin_topics'                );
+add_action( 'bbp_admin_init', 'bbp_admin_replies'               );
+add_action( 'bbp_admin_init', 'bbp_setup_updater',          999 );
+add_action( 'bbp_admin_init', 'bbp_register_importers'          );
+add_action( 'bbp_admin_init', 'bbp_register_admin_style'        );
+add_action( 'bbp_admin_init', 'bbp_register_admin_settings'     );
+add_action( 'bbp_admin_init', 'bbp_do_activation_redirect', 1   );
+
+// Initialize the admin area
+add_action( 'bbp_init', 'bbp_admin' );
+
+// Reset the menu order
+add_action( 'bbp_admin_menu', 'bbp_admin_separator' );
+
+// Activation
+add_action( 'bbp_activation', 'bbp_delete_rewrite_rules'    );
+
+// Deactivation
+add_action( 'bbp_deactivation', 'bbp_remove_caps'          );
+add_action( 'bbp_deactivation', 'bbp_delete_rewrite_rules' );
+
+// New Site
+add_action( 'bbp_new_site', 'bbp_create_initial_content', 8 );
+
+// Contextual Helpers
+add_action( 'load-settings_page_bbpress', 'bbp_admin_settings_help' );
+
+// Handle submission of Tools pages
+add_action( 'load-tools_page_bbp-repair', 'bbp_admin_repair_handler' );
+add_action( 'load-tools_page_bbp-reset',  'bbp_admin_reset_handler'  );
+
+// Add sample permalink filter
+add_filter( 'post_type_link', 'bbp_filter_sample_permalink', 10, 4 );
+
+/**
+ * When a new site is created in a multisite installation, run the activation
+ * routine on that site
+ *
+ * @since bbPress (r3283)
+ *
+ * @param int $blog_id
+ * @param int $user_id
+ * @param string $domain
+ * @param string $path
+ * @param int $site_id
+ * @param array() $meta
+ */
+function bbp_new_site( $blog_id, $user_id, $domain, $path, $site_id, $meta ) {
+
+	// Bail if plugin is not network activated
+	if ( ! is_plugin_active_for_network( bbpress()->basename ) )
+		return;
+
+	// Switch to the new blog
+	switch_to_blog( $blog_id );
+
+	// Do the bbPress activation routine
+	do_action( 'bbp_new_site', $blog_id, $user_id, $domain, $path, $site_id, $meta );
+
+	// restore original blog
+	restore_current_blog();
+}
+
+/** Sub-Actions ***************************************************************/
+
+/**
+ * Piggy back admin_init action
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_init'
+ */
+function bbp_admin_init() {
+	do_action( 'bbp_admin_init' );
+}
+
+/**
+ * Piggy back admin_menu action
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_menu'
+ */
+function bbp_admin_menu() {
+	do_action( 'bbp_admin_menu' );
+}
+
+/**
+ * Piggy back admin_head action
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_head'
+ */
+function bbp_admin_head() {
+	do_action( 'bbp_admin_head' );
+}
+
+/**
+ * Piggy back admin_notices action
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_notices'
+ */
+function bbp_admin_notices() {
+	do_action( 'bbp_admin_notices' );
+}
+
+/**
+ * Dedicated action to register bbPress importers
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_notices'
+ */
+function bbp_register_importers() {
+	do_action( 'bbp_register_importers' );
+}
+
+/**
+ * Dedicated action to register admin styles
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_admin_notices'
+ */
+function bbp_register_admin_style() {
+	do_action( 'bbp_register_admin_style' );
+}
+
+/**
+ * Dedicated action to register admin settings
+ *
+ * @since bbPress (r3766)
+ * @uses do_action() Calls 'bbp_register_admin_settings'
+ */
+function bbp_register_admin_settings() {
+	do_action( 'bbp_register_admin_settings' );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/admin.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1702 @@
+<?php
+
+/**
+ * Main bbPress Admin Class
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Admin' ) ) :
+/**
+ * Loads bbPress plugin admin area
+ *
+ * @package bbPress
+ * @subpackage Administration
+ * @since bbPress (r2464)
+ */
+class BBP_Admin {
+
+	/** Directory *************************************************************/
+
+	/**
+	 * @var string Path to the bbPress admin directory
+	 */
+	public $admin_dir = '';
+
+	/** URLs ******************************************************************/
+
+	/**
+	 * @var string URL to the bbPress admin directory
+	 */
+	public $admin_url = '';
+
+	/**
+	 * @var string URL to the bbPress images directory
+	 */
+	public $images_url = '';
+
+	/**
+	 * @var string URL to the bbPress admin styles directory
+	 */
+	public $styles_url = '';
+
+	/** Capability ************************************************************/
+
+	/**
+	 * @var bool Minimum capability to access Tools and Settings
+	 */
+	public $minimum_capability = 'manage_options';
+
+	/** Functions *************************************************************/
+
+	/**
+	 * The main bbPress admin loader
+	 *
+	 * @since bbPress (r2515)
+	 *
+	 * @uses BBP_Admin::setup_globals() Setup the globals needed
+	 * @uses BBP_Admin::includes() Include the required files
+	 * @uses BBP_Admin::setup_actions() Setup the hooks and actions
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->includes();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Admin globals
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 */
+	private function setup_globals() {
+		$bbp = bbpress();
+		$this->admin_dir  = trailingslashit( $bbp->includes_dir . 'admin'  ); // Admin path
+		$this->admin_url  = trailingslashit( $bbp->includes_url . 'admin'  ); // Admin url
+		$this->images_url = trailingslashit( $this->admin_url   . 'images' ); // Admin images URL
+		$this->styles_url = trailingslashit( $this->admin_url   . 'styles' ); // Admin styles URL
+	}
+
+	/**
+	 * Include required files
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 */
+	private function includes() {
+		require( $this->admin_dir . 'tools.php'     );
+		require( $this->admin_dir . 'converter.php' );
+		require( $this->admin_dir . 'settings.php'  );
+		require( $this->admin_dir . 'functions.php' );
+		require( $this->admin_dir . 'metaboxes.php' );
+		require( $this->admin_dir . 'forums.php'    );
+		require( $this->admin_dir . 'topics.php'    );
+		require( $this->admin_dir . 'replies.php'   );
+		require( $this->admin_dir . 'users.php'     );
+	}
+
+	/**
+	 * Setup the admin hooks, actions and filters
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 * @uses add_filter() To add various filters
+	 */
+	private function setup_actions() {
+
+		// Bail to prevent interfering with the deactivation process
+		if ( bbp_is_deactivation() )
+			return;
+
+		/** General Actions ***************************************************/
+
+		add_action( 'bbp_admin_menu',              array( $this, 'admin_menus'                ) ); // Add menu item to settings menu
+		add_action( 'bbp_admin_head',              array( $this, 'admin_head'                 ) ); // Add some general styling to the admin area
+		add_action( 'bbp_admin_notices',           array( $this, 'activation_notice'          ) ); // Add notice if not using a bbPress theme
+		add_action( 'bbp_register_admin_style',    array( $this, 'register_admin_style'       ) ); // Add green admin style
+		add_action( 'bbp_register_admin_settings', array( $this, 'register_admin_settings'    ) ); // Add settings
+		add_action( 'bbp_activation',              array( $this, 'new_install'                ) ); // Add menu item to settings menu
+		add_action( 'admin_enqueue_scripts',       array( $this, 'enqueue_scripts'            ) ); // Add enqueued JS and CSS
+		add_action( 'wp_dashboard_setup',          array( $this, 'dashboard_widget_right_now' ) ); // Forums 'Right now' Dashboard widget
+
+		/** Ajax **************************************************************/
+
+		add_action( 'wp_ajax_bbp_suggest_topic',        array( $this, 'suggest_topic' ) );
+		add_action( 'wp_ajax_nopriv_bbp_suggest_topic', array( $this, 'suggest_topic' ) );
+
+		/** Filters ***********************************************************/
+
+		// Modify bbPress's admin links
+		add_filter( 'plugin_action_links', array( $this, 'modify_plugin_action_links' ), 10, 2 );
+
+		// Map settings capabilities
+		add_filter( 'bbp_map_meta_caps',   array( $this, 'map_settings_meta_caps' ), 10, 4 );
+
+		// Hide the theme compat package selection
+		add_filter( 'bbp_admin_get_settings_sections', array( $this, 'hide_theme_compat_packages' ) );
+
+		/** Network Admin *****************************************************/
+
+		// Add menu item to settings menu
+		add_action( 'network_admin_menu',  array( $this, 'network_admin_menus' ) );
+
+		/** Dependencies ******************************************************/
+
+		// Allow plugins to modify these actions
+		do_action_ref_array( 'bbp_admin_loaded', array( &$this ) );
+	}
+
+	/**
+	 * Add the admin menus
+	 *
+	 * @since bbPress (r2646)
+	 *
+	 * @uses add_management_page() To add the Recount page in Tools section
+	 * @uses add_options_page() To add the Forums settings page in Settings
+	 *                           section
+	 */
+	public function admin_menus() {
+
+		$hooks = array();
+
+		// These are later removed in admin_head
+		if ( current_user_can( 'bbp_tools_page' ) ) {
+			if ( current_user_can( 'bbp_tools_repair_page' ) ) {
+				$hooks[] = add_management_page(
+					__( 'Repair Forums', 'bbpress' ),
+					__( 'Forum Repair',  'bbpress' ),
+					$this->minimum_capability,
+					'bbp-repair',
+					'bbp_admin_repair'
+				);
+			}
+
+			if ( current_user_can( 'bbp_tools_import_page' ) ) {
+				$hooks[] = add_management_page(
+					__( 'Import Forums', 'bbpress' ),
+					__( 'Forum Import',  'bbpress' ),
+					$this->minimum_capability,
+					'bbp-converter',
+					'bbp_converter_settings'
+				);
+			}
+
+			if ( current_user_can( 'bbp_tools_reset_page' ) ) {
+				$hooks[] = add_management_page(
+					__( 'Reset Forums', 'bbpress' ),
+					__( 'Forum Reset',  'bbpress' ),
+					$this->minimum_capability,
+					'bbp-reset',
+					'bbp_admin_reset'
+				);
+			}
+
+			// Fudge the highlighted subnav item when on a bbPress admin page
+			foreach( $hooks as $hook ) {
+				add_action( "admin_head-$hook", 'bbp_tools_modify_menu_highlight' );
+			}
+
+			// Forums Tools Root
+			add_management_page(
+				__( 'Forums', 'bbpress' ),
+				__( 'Forums', 'bbpress' ),
+				$this->minimum_capability,
+				'bbp-repair',
+				'bbp_admin_repair'
+			);
+		}
+
+		// Are settings enabled?
+		if ( current_user_can( 'bbp_settings_page' ) ) {
+			add_options_page(
+				__( 'Forums',  'bbpress' ),
+				__( 'Forums',  'bbpress' ),
+				$this->minimum_capability,
+				'bbpress',
+				'bbp_admin_settings'
+			);
+		}
+
+		// These are later removed in admin_head
+		if ( current_user_can( 'bbp_about_page' ) ) {
+
+			// About
+			add_dashboard_page(
+				__( 'Welcome to bbPress',  'bbpress' ),
+				__( 'Welcome to bbPress',  'bbpress' ),
+				$this->minimum_capability,
+				'bbp-about',
+				array( $this, 'about_screen' )
+			);
+
+			// Credits
+			add_dashboard_page(
+				__( 'Welcome to bbPress',  'bbpress' ),
+				__( 'Welcome to bbPress',  'bbpress' ),
+				$this->minimum_capability,
+				'bbp-credits',
+				array( $this, 'credits_screen' )
+			);
+		}
+
+		// Bail if plugin is not network activated
+		if ( ! is_plugin_active_for_network( bbpress()->basename ) )
+			return;
+
+		add_submenu_page(
+			'index.php',
+			__( 'Update Forums', 'bbpress' ),
+			__( 'Update Forums', 'bbpress' ),
+			'manage_network',
+			'bbp-update',
+			array( $this, 'update_screen' )
+		);
+	}
+
+	/**
+	 * Add the network admin menus
+	 *
+	 * @since bbPress (r3689)
+	 * @uses add_submenu_page() To add the Update Forums page in Updates
+	 */
+	public function network_admin_menus() {
+
+		// Bail if plugin is not network activated
+		if ( ! is_plugin_active_for_network( bbpress()->basename ) )
+			return;
+
+		add_submenu_page(
+			'upgrade.php',
+			__( 'Update Forums', 'bbpress' ),
+			__( 'Update Forums', 'bbpress' ),
+			'manage_network',
+			'bbpress-update',
+			array( $this, 'network_update_screen' )
+		);
+	}
+
+	/**
+	 * If this is a new installation, create some initial forum content.
+	 *
+	 * @since bbPress (r3767)
+	 * @return type
+	 */
+	public static function new_install() {
+		if ( !bbp_is_install() )
+			return;
+
+		bbp_create_initial_content();
+	}
+
+	/**
+	 * Register the settings
+	 *
+	 * @since bbPress (r2737)
+	 *
+	 * @uses add_settings_section() To add our own settings section
+	 * @uses add_settings_field() To add various settings fields
+	 * @uses register_setting() To register various settings
+	 * @todo Put fields into multidimensional array
+	 */
+	public static function register_admin_settings() {
+
+		// Bail if no sections available
+		$sections = bbp_admin_get_settings_sections();
+		if ( empty( $sections ) )
+			return false;
+
+		// Loop through sections
+		foreach ( (array) $sections as $section_id => $section ) {
+
+			// Only proceed if current user can see this section
+			if ( ! current_user_can( $section_id ) )
+				continue;
+
+			// Only add section and fields if section has fields
+			$fields = bbp_admin_get_settings_fields_for_section( $section_id );
+			if ( empty( $fields ) )
+				continue;
+
+			// Add the section
+			add_settings_section( $section_id, $section['title'], $section['callback'], $section['page'] );
+
+			// Loop through fields for this section
+			foreach ( (array) $fields as $field_id => $field ) {
+
+				// Add the field
+				add_settings_field( $field_id, $field['title'], $field['callback'], $section['page'], $section_id, $field['args'] );
+
+				// Register the setting
+				register_setting( $section['page'], $field_id, $field['sanitize_callback'] );
+			}
+		}
+	}
+
+	/**
+	 * Maps settings capabilities
+	 *
+	 * @since bbPress (r4242)
+	 *
+	 * @param array $caps Capabilities for meta capability
+	 * @param string $cap Capability name
+	 * @param int $user_id User id
+	 * @param mixed $args Arguments
+	 * @uses get_post() To get the post
+	 * @uses get_post_type_object() To get the post type object
+	 * @uses apply_filters() Calls 'bbp_map_meta_caps' with caps, cap, user id and
+	 *                        args
+	 * @return array Actual capabilities for meta capability
+	 */
+	public static function map_settings_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+		// What capability is being checked?
+		switch ( $cap ) {
+
+			// BuddyPress
+			case 'bbp_settings_buddypress' :
+				if ( ( is_plugin_active( 'buddypress/bp-loader.php' ) && defined( 'BP_VERSION' ) ) && is_super_admin() ) {
+					$caps = array( bbpress()->admin->minimum_capability );
+				} else {
+					$caps = array( 'do_not_allow' );
+				}
+
+				break;
+
+			// Akismet
+			case 'bbp_settings_akismet' :
+				if ( ( is_plugin_active( 'akismet/akismet.php' ) && defined( 'AKISMET_VERSION' ) ) && is_super_admin() ) {
+					$caps = array( bbpress()->admin->minimum_capability );
+				} else {
+					$caps = array( 'do_not_allow' );
+				}
+
+				break;
+
+			// bbPress
+			case 'bbp_about_page'            : // About and Credits
+			case 'bbp_tools_page'            : // Tools Page
+			case 'bbp_tools_repair_page'     : // Tools - Repair Page
+			case 'bbp_tools_import_page'     : // Tools - Import Page
+			case 'bbp_tools_reset_page'      : // Tools - Reset Page
+			case 'bbp_settings_page'         : // Settings Page
+			case 'bbp_settings_main'         : // Settings - General
+			case 'bbp_settings_theme_compat' : // Settings - Theme compat
+			case 'bbp_settings_root_slugs'   : // Settings - Root slugs
+			case 'bbp_settings_single_slugs' : // Settings - Single slugs
+			case 'bbp_settings_per_page'     : // Settings - Single slugs
+			case 'bbp_settings_per_page_rss' : // Settings - Single slugs
+				$caps = array( bbpress()->admin->minimum_capability );
+				break;
+		}
+
+		return apply_filters( 'bbp_map_settings_meta_caps', $caps, $cap, $user_id, $args );
+	}
+
+	/**
+	 * Register the importers
+	 *
+	 * @since bbPress (r2737)
+	 *
+	 * @uses apply_filters() Calls 'bbp_importer_path' filter to allow plugins
+	 *                        to customize the importer script locations.
+	 */
+	public function register_importers() {
+
+		// Leave if we're not in the import section
+		if ( !defined( 'WP_LOAD_IMPORTERS' ) )
+			return;
+
+		// Load Importer API
+		require_once( ABSPATH . 'wp-admin/includes/import.php' );
+
+		// Load our importers
+		$importers = apply_filters( 'bbp_importers', array( 'bbpress' ) );
+
+		// Loop through included importers
+		foreach ( $importers as $importer ) {
+
+			// Allow custom importer directory
+			$import_dir  = apply_filters( 'bbp_importer_path', $this->admin_dir . 'importers', $importer );
+
+			// Compile the importer path
+			$import_file = trailingslashit( $import_dir ) . $importer . '.php';
+
+			// If the file exists, include it
+			if ( file_exists( $import_file ) ) {
+				require( $import_file );
+			}
+		}
+	}
+
+	/**
+	 * Admin area activation notice
+	 *
+	 * Shows a nag message in admin area about the theme not supporting bbPress
+	 *
+	 * @since bbPress (r2743)
+	 *
+	 * @uses current_user_can() To check notice should be displayed.
+	 */
+	public function activation_notice() {
+		// @todo - something fun
+	}
+
+	/**
+	 * Add Settings link to plugins area
+	 *
+	 * @since bbPress (r2737)
+	 *
+	 * @param array $links Links array in which we would prepend our link
+	 * @param string $file Current plugin basename
+	 * @return array Processed links
+	 */
+	public static function modify_plugin_action_links( $links, $file ) {
+
+		// Return normal links if not bbPress
+		if ( plugin_basename( bbpress()->file ) != $file )
+			return $links;
+
+		// Add a few links to the existing links array
+		return array_merge( $links, array(
+			'settings' => '<a href="' . add_query_arg( array( 'page' => 'bbpress'   ), admin_url( 'options-general.php' ) ) . '">' . esc_html__( 'Settings', 'bbpress' ) . '</a>',
+			'about'    => '<a href="' . add_query_arg( array( 'page' => 'bbp-about' ), admin_url( 'index.php'           ) ) . '">' . esc_html__( 'About',    'bbpress' ) . '</a>'
+		) );
+	}
+
+	/**
+	 * Add the 'Right now in Forums' dashboard widget
+	 *
+	 * @since bbPress (r2770)
+	 *
+	 * @uses wp_add_dashboard_widget() To add the dashboard widget
+	 */
+	public static function dashboard_widget_right_now() {
+		wp_add_dashboard_widget( 'bbp-dashboard-right-now', __( 'Right Now in Forums', 'bbpress' ), 'bbp_dashboard_widget_right_now' );
+	}
+
+	/**
+	 * Enqueue any admin scripts we might need
+	 * @since bbPress (4260)
+	 */
+	public function enqueue_scripts() {
+		wp_enqueue_script( 'suggest' );
+	}
+
+	/**
+	 * Add some general styling to the admin area
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses sanitize_html_class() To sanitize the classes
+	 */
+	public function admin_head() {
+
+		// Remove the individual recount and converter menus.
+		// They are grouped together by h2 tabs
+		remove_submenu_page( 'tools.php', 'bbp-repair'    );
+		remove_submenu_page( 'tools.php', 'bbp-converter' );
+		remove_submenu_page( 'tools.php', 'bbp-reset'     );
+		remove_submenu_page( 'index.php', 'bbp-about'     );
+		remove_submenu_page( 'index.php', 'bbp-credits'   );
+
+		// The /wp-admin/images/ folder
+		$wp_admin_url     = admin_url( 'images/' );
+
+		// Icons for top level admin menus
+		$version          = bbp_get_version();
+		$menu_icon_url    = $this->images_url . 'menu.png?ver='       . $version;
+		$icon32_url       = $this->images_url . 'icons32.png?ver='    . $version;
+		$menu_icon_url_2x = $this->images_url . 'menu-2x.png?ver='    . $version;
+		$icon32_url_2x    = $this->images_url . 'icons32-2x.png?ver=' . $version;
+		$badge_url        = $this->images_url . 'badge.png?ver='      . $version;
+		$badge_url_2x     = $this->images_url . 'badge-2x.png?ver='   . $version;
+
+		// The image size changed in WordPress 3.5
+		if ( function_exists( 'wp_enqueue_media' ) ) {
+			$icon32_size = '756px 45px';
+		} else {
+			$icon32_size = '708px 45px';
+		}
+
+		// Top level menu classes
+		$forum_class = sanitize_html_class( bbp_get_forum_post_type() );
+		$topic_class = sanitize_html_class( bbp_get_topic_post_type() );
+		$reply_class = sanitize_html_class( bbp_get_reply_post_type() );
+
+		if ( ( 'post' == get_current_screen()->base ) && ( bbp_get_reply_post_type() == get_current_screen()->post_type ) ) : ?>
+
+		<script type="text/javascript">
+			jQuery(document).ready(function() {
+
+				var bbp_topic_id = jQuery( '#bbp_topic_id' );
+
+				bbp_topic_id.suggest( ajaxurl + '?action=bbp_suggest_topic', {
+					onSelect: function() {
+						var value = this.value;
+						bbp_topic_id.val( value.substr( 0, value.indexOf( ' ' ) ) );
+					}
+				} );
+			});
+		</script>
+
+		<?php endif; ?>
+
+		<style type="text/css" media="screen">
+		/*<![CDATA[*/
+
+			/* Kludge for too-wide forums dropdown */
+			#poststuff #bbp_forum_attributes select#parent_id,
+			#poststuff #bbp_topic_attributes select#parent_id,
+			#poststuff #bbp_reply_attributes select#bbp_forum_id {
+				max-width: 170px;
+			}
+
+			/* Version Badge */
+
+			.bbp-badge {
+				padding-top: 142px;
+				height: 50px;
+				width: 173px;
+				color: #fafafa;
+				font-weight: bold;
+				font-size: 14px;
+				text-align: center;
+				margin: 0 -5px;
+				background: url('<?php echo $badge_url; ?>') no-repeat;
+			}
+
+			.about-wrap .bbp-badge {
+				position: absolute;
+				top: 0;
+				right: 0;
+			}
+				body.rtl .about-wrap .bbp-badge {
+					right: auto;
+					left: 0;
+				}
+
+			#bbp-dashboard-right-now p.sub,
+			#bbp-dashboard-right-now .table,
+			#bbp-dashboard-right-now .versions {
+				margin: -12px;
+			}
+
+			#bbp-dashboard-right-now .inside {
+				font-size: 12px;
+				padding-top: 20px;
+				margin-bottom: 0;
+			}
+
+			#bbp-dashboard-right-now p.sub {
+				padding: 5px 0 15px;
+				color: #8f8f8f;
+				font-size: 14px;
+				position: absolute;
+				top: -17px;
+				left: 15px;
+			}
+				body.rtl #bbp-dashboard-right-now p.sub {
+					right: 15px;
+					left: 0;
+				}
+
+			#bbp-dashboard-right-now .table {
+				margin: 0;
+				padding: 0;
+				position: relative;
+			}
+
+			#bbp-dashboard-right-now .table_content {
+				float: left;
+				border-top: #ececec 1px solid;
+				width: 45%;
+			}
+				body.rtl #bbp-dashboard-right-now .table_content {
+					float: right;
+				}
+
+			#bbp-dashboard-right-now .table_discussion {
+				float: right;
+				border-top: #ececec 1px solid;
+				width: 45%;
+			}
+				body.rtl #bbp-dashboard-right-now .table_discussion {
+					float: left;
+				}
+
+			#bbp-dashboard-right-now table td {
+				padding: 3px 0;
+				white-space: nowrap;
+			}
+
+			#bbp-dashboard-right-now table tr.first td {
+				border-top: none;
+			}
+
+			#bbp-dashboard-right-now td.b {
+				padding-right: 6px;
+				text-align: right;
+				font-family: Georgia, "Times New Roman", "Bitstream Charter", Times, serif;
+				font-size: 14px;
+				width: 1%;
+			}
+				body.rtl #bbp-dashboard-right-now td.b {
+					padding-left: 6px;
+					padding-right: 0;
+				}
+
+			#bbp-dashboard-right-now td.b a {
+				font-size: 18px;
+			}
+
+			#bbp-dashboard-right-now td.b a:hover {
+				color: #d54e21;
+			}
+
+			#bbp-dashboard-right-now .t {
+				font-size: 12px;
+				padding-right: 12px;
+				padding-top: 6px;
+				color: #777;
+			}
+				body.rtl #bbp-dashboard-right-now .t {
+					padding-left: 12px;
+					padding-right: 0;
+				}
+
+			#bbp-dashboard-right-now .t a {
+				white-space: nowrap;
+			}
+
+			#bbp-dashboard-right-now .spam {
+				color: red;
+			}
+
+			#bbp-dashboard-right-now .waiting {
+				color: #e66f00;
+			}
+
+			#bbp-dashboard-right-now .approved {
+				color: green;
+			}
+
+			#bbp-dashboard-right-now .versions {
+				padding: 6px 10px 12px;
+				clear: both;
+			}
+
+			#bbp-dashboard-right-now .versions .b {
+				font-weight: bold;
+			}
+
+			#bbp-dashboard-right-now a.button {
+				float: right;
+				clear: right;
+				position: relative;
+				top: -5px;
+			}
+				body.rtl #bbp-dashboard-right-now a.button {
+					float: left;
+					clear: left;
+				}
+
+			/* Icon 32 */
+			#icon-edit.icon32-posts-<?php echo $forum_class; ?>,
+			#icon-edit.icon32-posts-<?php echo $topic_class; ?>,
+			#icon-edit.icon32-posts-<?php echo $reply_class; ?> {
+				background: url('<?php echo $icon32_url; ?>');
+				background-repeat: no-repeat;
+			}
+
+			/* Icon Positions */
+			#icon-edit.icon32-posts-<?php echo $forum_class; ?> {
+				background-position: -4px 0px;
+			}
+
+			#icon-edit.icon32-posts-<?php echo $topic_class; ?> {
+				background-position: -4px -90px;
+			}
+
+			#icon-edit.icon32-posts-<?php echo $reply_class; ?> {
+				background-position: -4px -180px;
+			}
+
+			/* Icon 32 2x */
+			@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+				#icon-edit.icon32-posts-<?php echo $forum_class; ?>,
+				#icon-edit.icon32-posts-<?php echo $topic_class; ?>,
+				#icon-edit.icon32-posts-<?php echo $reply_class; ?> {
+					background-image: url('<?php echo $icon32_url_2x; ?>');
+					background-size: 45px 255px;
+				}
+			}
+
+			/* Menu */
+			#menu-posts-<?php echo $forum_class; ?> .wp-menu-image,
+			#menu-posts-<?php echo $topic_class; ?> .wp-menu-image,
+			#menu-posts-<?php echo $reply_class; ?> .wp-menu-image,
+
+			#menu-posts-<?php echo $forum_class; ?>:hover .wp-menu-image,
+			#menu-posts-<?php echo $topic_class; ?>:hover .wp-menu-image,
+			#menu-posts-<?php echo $reply_class; ?>:hover .wp-menu-image,
+
+			#menu-posts-<?php echo $forum_class; ?>.wp-has-current-submenu .wp-menu-image,
+			#menu-posts-<?php echo $topic_class; ?>.wp-has-current-submenu .wp-menu-image,
+			#menu-posts-<?php echo $reply_class; ?>.wp-has-current-submenu .wp-menu-image {
+				background: url('<?php echo $menu_icon_url; ?>');
+				background-repeat: no-repeat;
+			}
+
+			/* Menu Positions */
+			#menu-posts-<?php echo $forum_class; ?> .wp-menu-image {
+				background-position: 0px -32px;
+			}
+			#menu-posts-<?php echo $forum_class; ?>:hover .wp-menu-image,
+			#menu-posts-<?php echo $forum_class; ?>.wp-has-current-submenu .wp-menu-image {
+				background-position: 0px 0px;
+			}
+			#menu-posts-<?php echo $topic_class; ?> .wp-menu-image {
+				background-position: -70px -32px;
+			}
+			#menu-posts-<?php echo $topic_class; ?>:hover .wp-menu-image,
+			#menu-posts-<?php echo $topic_class; ?>.wp-has-current-submenu .wp-menu-image {
+				background-position: -70px 0px;
+			}
+			#menu-posts-<?php echo $reply_class; ?> .wp-menu-image {
+				background-position: -35px -32px;
+			}
+			#menu-posts-<?php echo $reply_class; ?>:hover .wp-menu-image,
+			#menu-posts-<?php echo $reply_class; ?>.wp-has-current-submenu .wp-menu-image {
+				background-position:  -35px 0px;
+			}
+
+			/* Menu 2x */
+			@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+				#menu-posts-<?php echo $forum_class; ?> .wp-menu-image,
+				#menu-posts-<?php echo $topic_class; ?> .wp-menu-image,
+				#menu-posts-<?php echo $reply_class; ?> .wp-menu-image,
+
+				#menu-posts-<?php echo $forum_class; ?>:hover .wp-menu-image,
+				#menu-posts-<?php echo $topic_class; ?>:hover .wp-menu-image,
+				#menu-posts-<?php echo $reply_class; ?>:hover .wp-menu-image,
+
+				#menu-posts-<?php echo $forum_class; ?>.wp-has-current-submenu .wp-menu-image,
+				#menu-posts-<?php echo $topic_class; ?>.wp-has-current-submenu .wp-menu-image,
+				#menu-posts-<?php echo $reply_class; ?>.wp-has-current-submenu .wp-menu-image {
+					background-image: url('<?php echo $menu_icon_url_2x; ?>');
+					background-size: 100px 64px;
+				}
+
+				.bbp-badge {
+					background-image: url('<?php echo $badge_url_2x; ?>');
+					background-size: 173px 194px;
+				}
+			}
+
+			<?php if ( 'bbpress' == get_user_option( 'admin_color' ) ) : ?>
+
+				/* Green Scheme Images */
+
+				.post-com-count {
+					background-image: url('<?php echo $wp_admin_url; ?>bubble_bg.gif');
+				}
+
+				.button,
+				.submit input,
+				.button-secondary {
+					background-image: url('<?php echo $wp_admin_url; ?>white-grad.png');
+				}
+
+				.button:active,
+				.submit input:active,
+				.button-secondary:active {
+					background-image: url('<?php echo $wp_admin_url; ?>white-grad-active.png');
+				}
+
+				.curtime #timestamp {
+					background-image: url('<?php echo $wp_admin_url; ?>date-button.gif');
+				}
+
+				.tagchecklist span a,
+				#bulk-titles div a {
+					background-image: url('<?php echo $wp_admin_url; ?>xit.gif');
+				}
+
+				.tagchecklist span a:hover,
+				#bulk-titles div a:hover {
+					background-image: url('<?php echo $wp_admin_url; ?>xit.gif');
+				}
+				#screen-meta-links a.show-settings {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				#screen-meta-links a.show-settings.screen-meta-active {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				#adminmenushadow,
+				#adminmenuback {
+					background-image: url('<?php echo $wp_admin_url; ?>menu-shadow.png');
+				}
+
+				#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+				#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows-dark.png');
+				}
+
+				#adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+				#adminmenu .wp-menu-open .wp-menu-toggle {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				#collapse-button div {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				/* menu and screen icons */
+				.icon16.icon-dashboard,
+				#adminmenu .menu-icon-dashboard div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,
+				#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,
+				#adminmenu .menu-icon-dashboard.current div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-post,
+				#adminmenu .menu-icon-post div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-post:hover div.wp-menu-image,
+				#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-media,
+				#adminmenu .menu-icon-media div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-media:hover div.wp-menu-image,
+				#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-links,
+				#adminmenu .menu-icon-links div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-links:hover div.wp-menu-image,
+				#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-page,
+				#adminmenu .menu-icon-page div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-page:hover div.wp-menu-image,
+				#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-comments,
+				#adminmenu .menu-icon-comments div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-comments:hover div.wp-menu-image,
+				#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,
+				#adminmenu .menu-icon-comments.current div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-appearance,
+				#adminmenu .menu-icon-appearance div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-appearance:hover div.wp-menu-image,
+				#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-plugins,
+				#adminmenu .menu-icon-plugins div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-plugins:hover div.wp-menu-image,
+				#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-users,
+				#adminmenu .menu-icon-users div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-users:hover div.wp-menu-image,
+				#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,
+				#adminmenu .menu-icon-users.current div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-tools,
+				#adminmenu .menu-icon-tools div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-tools:hover div.wp-menu-image,
+				#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,
+				#adminmenu .menu-icon-tools.current div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-settings,
+				#adminmenu .menu-icon-settings div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-settings:hover div.wp-menu-image,
+				#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				.icon16.icon-site,
+				#adminmenu .menu-icon-site div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+
+				#adminmenu .menu-icon-site:hover div.wp-menu-image,
+				#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image {
+					background-image: url('<?php echo $wp_admin_url; ?>menu.png?ver=20100531');
+				}
+				/* end menu and screen icons */
+
+				/* Screen Icons */
+				.icon32.icon-post,
+				#icon-edit,
+				#icon-post {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-dashboard,
+				#icon-index {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-media,
+				#icon-upload {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-links,
+				#icon-link-manager,
+				#icon-link,
+				#icon-link-category {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-page,
+				#icon-edit-pages,
+				#icon-page {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-comments,
+				#icon-edit-comments {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-appearance,
+				#icon-themes {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-plugins,
+				#icon-plugins {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-users,
+				#icon-users,
+				#icon-profile,
+				#icon-user-edit {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-tools,
+				#icon-tools,
+				#icon-admin {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-settings,
+				#icon-options-general {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+
+				.icon32.icon-site,
+				#icon-ms-admin {
+					background-image: url('<?php echo $wp_admin_url; ?>icons32.png?ver=20100531');
+				}
+				/* end screen icons */
+
+				.meta-box-sortables .postbox:hover .handlediv {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.tablenav .tablenav-pages a {
+					background-image: url('<?php echo $wp_admin_url; ?>menu-bits.gif?ver=20100610');
+				}
+
+				.view-switch #view-switch-list {
+					background-image: url('<?php echo $wp_admin_url; ?>list.png');
+				}
+
+				.view-switch .current #view-switch-list {
+					background-image: url('<?php echo $wp_admin_url; ?>list.png');
+				}
+
+				.view-switch #view-switch-excerpt {
+					background-image: url('<?php echo $wp_admin_url; ?>list.png');
+				}
+
+				.view-switch .current #view-switch-excerpt {
+					background-image: url('<?php echo $wp_admin_url; ?>list.png');
+				}
+
+				#header-logo {
+					background-image: url('<?php echo $wp_admin_url; ?>wp-logo.png?ver=20110504');
+				}
+
+				.sidebar-name-arrow {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.sidebar-name:hover .sidebar-name-arrow {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows-dark.png');
+				}
+
+				.item-edit {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.item-edit:hover {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows-dark.png');
+				}
+
+				.wp-badge {
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png');
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), -ms-linear-gradient(top, #378aac, #165d84); /* IE10 */
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), -moz-linear-gradient(top, #378aac, #165d84); /* Firefox */
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), -o-linear-gradient(top, #378aac, #165d84); /* Opera */
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), -webkit-gradient(linear, left top, left bottom, from(#378aac), to(#165d84)); /* old Webkit */
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), -webkit-linear-gradient(top, #378aac, #165d84); /* new Webkit */
+					background-image: url('<?php echo $wp_admin_url; ?>wp-badge.png'), linear-gradient(top, #378aac, #165d84); /* proposed W3C Markup */
+				}
+
+				.rtl .post-com-count {
+					background-image: url('<?php echo $wp_admin_url; ?>bubble_bg-rtl.gif');
+				}
+
+				/* Menu */
+				.rtl #adminmenushadow,
+				.rtl #adminmenuback {
+					background-image: url('<?php echo $wp_admin_url; ?>menu-shadow-rtl.png');
+				}
+
+				.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+				.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows-dark.png');
+				}
+
+				.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+				.rtl #adminmenu .wp-menu-open .wp-menu-toggle {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.rtl .meta-box-sortables .postbox:hover .handlediv {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.rtl .tablenav .tablenav-pages a {
+					background-image: url('<?php echo $wp_admin_url; ?>menu-bits-rtl.gif?ver=20100610');
+				}
+
+				.rtl .sidebar-name-arrow {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows.png');
+				}
+
+				.rtl .sidebar-name:hover .sidebar-name-arrow {
+					background-image: url('<?php echo $wp_admin_url; ?>arrows-dark.png');
+				}
+
+				@media only screen and (-webkit-min-device-pixel-ratio: 1.5) {
+					.icon32.icon-post,
+					#icon-edit,
+					#icon-post,
+					.icon32.icon-dashboard,
+					#icon-index,
+					.icon32.icon-media,
+					#icon-upload,
+					.icon32.icon-links,
+					#icon-link-manager,
+					#icon-link,
+					#icon-link-category,
+					.icon32.icon-page,
+					#icon-edit-pages,
+					#icon-page,
+					.icon32.icon-comments,
+					#icon-edit-comments,
+					.icon32.icon-appearance,
+					#icon-themes,
+					.icon32.icon-plugins,
+					#icon-plugins,
+					.icon32.icon-users,
+					#icon-users,
+					#icon-profile,
+					#icon-user-edit,
+					.icon32.icon-tools,
+					#icon-tools,
+					#icon-admin,
+					.icon32.icon-settings,
+					#icon-options-general,
+					.icon32.icon-site,
+					#icon-ms-admin {
+						background-image: url('<?php echo $wp_admin_url; ?>icons32-2x.png?ver=20120412') !important;
+						background-size: <?php echo $icon32_size; ?>
+					}
+
+					.icon16.icon-dashboard,
+					.menu-icon-dashboard div.wp-menu-image,
+					.icon16.icon-post,
+					.menu-icon-post div.wp-menu-image,
+					.icon16.icon-media,
+					.menu-icon-media div.wp-menu-image,
+					.icon16.icon-links,
+					.menu-icon-links div.wp-menu-image,
+					.icon16.icon-page,
+					.menu-icon-page div.wp-menu-image,
+					.icon16.icon-comments,
+					.menu-icon-comments div.wp-menu-image,
+					.icon16.icon-appearance,
+					.menu-icon-appearance div.wp-menu-image,
+					.icon16.icon-plugins,
+					.menu-icon-plugins div.wp-menu-image,
+					.icon16.icon-users,
+					.menu-icon-users div.wp-menu-image,
+					.icon16.icon-tools,
+					.menu-icon-tools div.wp-menu-image,
+					.icon16.icon-settings,
+					.menu-icon-settings div.wp-menu-image,
+					.icon16.icon-site,
+					.menu-icon-site div.wp-menu-image {
+						background-image: url('<?php echo $wp_admin_url; ?>menu-2x.png?ver=20120412') !important;
+						background-size: 390px 64px;
+					}
+				}
+			<?php endif; ?>
+
+		/*]]>*/
+		</style>
+
+		<?php
+	}
+
+	/**
+	 * Registers the bbPress admin color scheme
+	 *
+	 * Because wp-content can exist outside of the WordPress root there is no
+	 * way to be certain what the relative path of the admin images is.
+	 * We are including the two most common configurations here, just in case.
+	 *
+	 * @since bbPress (r2521)
+	 *
+	 * @uses wp_admin_css_color() To register the color scheme
+	 */
+	public function register_admin_style () {
+
+		// Updated admin color scheme CSS
+		if ( function_exists( 'wp_enqueue_media' ) ) {
+			$green_scheme = $this->styles_url . 'green.css';
+
+		} else {
+			$green_scheme = $this->styles_url . 'green-34.css';
+		}
+
+		// Register the green scheme
+		wp_admin_css_color( 'bbpress', esc_html_x( 'Green', 'admin color scheme', 'bbpress' ), $green_scheme, array( '#222222', '#006600', '#deece1', '#6eb469' ) );
+	}
+
+	/**
+	 * Hide theme compat package selection if only 1 package is registered
+	 *
+	 * @since bbPress (r4315)
+	 *
+	 * @param array $sections Forums settings sections
+	 * @return array
+	 */
+	public function hide_theme_compat_packages( $sections = array() ) {
+		if ( count( bbpress()->theme_compat->packages ) <= 1 )
+			unset( $sections['bbp_settings_theme_compat'] );
+
+		return $sections;
+	}
+
+	/** Ajax ******************************************************************/
+
+	/**
+	 * Ajax action for facilitating the forum auto-suggest
+	 *
+	 * @since bbPress (r4261)
+	 *
+	 * @uses get_posts()
+	 * @uses bbp_get_topic_post_type()
+	 * @uses bbp_get_topic_id()
+	 * @uses bbp_get_topic_title()
+	 */
+	public function suggest_topic() {
+
+		// TRy to get some topics
+		$topics = get_posts( array(
+			's'         => like_escape( $_REQUEST['q'] ),
+			'post_type' => bbp_get_topic_post_type()
+		) );
+
+		// If we found some topics, loop through and display them
+		if ( ! empty( $topics ) ) {
+			foreach ( (array) $topics as $post ) {
+				echo sprintf( __( '%s - %s', 'bbpress' ), bbp_get_topic_id( $post->ID ), bbp_get_topic_title( $post->ID ) ) . "\n";
+			}
+		}
+		die();
+	}
+
+	/** About *****************************************************************/
+
+	/**
+	 * Output the about screen
+	 *
+	 * @since bbPress (r4159)
+	 */
+	public function about_screen() {
+
+		list( $display_version ) = explode( '-', bbp_get_version() ); ?>
+
+		<div class="wrap about-wrap">
+			<h1><?php printf( __( 'Welcome to bbPress %s' ), $display_version ); ?></h1>
+			<div class="about-text"><?php printf( __( 'Thank you for updating to the latest version! bbPress %s is ready to make your community a safer, faster, and better looking place to hang out!' ), $display_version ); ?></div>
+			<div class="bbp-badge"><?php printf( __( 'Version %s' ), $display_version ); ?></div>
+
+			<h2 class="nav-tab-wrapper">
+				<a class="nav-tab nav-tab-active" href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbp-about' ), 'index.php' ) ) ); ?>">
+					<?php _e( 'What&#8217;s New' ); ?>
+				</a><a class="nav-tab" href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbp-credits' ), 'index.php' ) ) ); ?>">
+					<?php _e( 'Credits' ); ?>
+				</a>
+			</h2>
+
+			<div class="changelog">
+				<h3><?php _e( 'In-depth User Profiles', 'bbpress' ); ?></h3>
+
+				<div class="feature-section">
+					<h4><?php _e( 'User Details', 'bbpress' ); ?></h4>
+					<p><?php _e( 'Forum profiles include the details of your forum activity, including your topics and replies, subscriptions, and favorites.', 'bbpress' ); ?></p>
+
+					<h4><?php _e( 'Easy Updating', 'bbpress' ); ?></h4>
+					<p><?php _e( 'You can easily update your profile without leaving bbPress.', 'bbpress' ); ?></p>
+				</div>
+			</div>
+
+			<div class="changelog">
+				<h3><?php _e( 'Theme Compatability', 'bbpress' ); ?></h3>
+
+				<div class="feature-section">
+					<h4><?php _e( 'Twenty Twelve', 'bbpress' ); ?></h4>
+					<p><?php _e( 'Updated default templates are now Twenty Twelve compatible, and we refreshed our CSS to better integrate with other popular themes, too.', 'bbpress' ); ?></p>
+				</div>
+			</div>
+
+			<div class="changelog">
+				<h3><?php _e( 'Improved User Management', 'bbpress' ); ?></h3>
+
+				<div class="feature-section">
+					<h4><?php _e( 'Dynamic User Roles and Capabilities', 'bbpress' ); ?></h4>
+					<p><?php _e( 'bbPress now includes some fancy user-roles with smart default capabilities to help you manage your forums. New roles include Key Master (for complete administrative access), Moderator, and Participant for regular forum users.', 'bbpress' ); ?></p>
+
+					<h4><?php _e( 'Manage Forum Users from WordPress', 'bbpress' ); ?></h4>
+					<p><?php _e( 'You can assign Forums roles to users individually, or bulk update them from the WordPress Users page. Users automatically start out as forum participants.', 'bbpress' ); ?></p>
+				</div>
+			</div>
+
+			<div class="changelog">
+				<h3><?php _e( 'Better BuddyPress Integration', 'bbpress' ); ?></h3>
+
+				<div class="feature-section">
+					<h4><?php _e( 'Use bbPress for Your BuddyPress Group Forums', 'bbpress' ); ?></h4>
+					<p><?php _e( 'You can now use bbPress to manage your BuddyPress Group Forums, allowing for seamless integration and improved plugin performance. Plugins developed for bbPress can now be extended to improve the BuddyPress Group Forums experience.', 'bbpress' ); ?></p>
+
+					<h4><?php _e( 'Activity Stream Syncing', 'bbpress' ); ?></h4>
+					<p><?php _e( 'bbPress now keeps track of changes to topics and replies and keeps their corresponding BuddyPress Activity Stream updates synced.', 'bbpress' ); ?></p>
+				</div>
+			</div>
+
+			<div class="changelog">
+				<h3><?php _e( 'Under the Hood', 'bbpress' ); ?></h3>
+
+				<div class="feature-section three-col">
+					<div>
+						<h4><?php _e( 'Template Logic', 'bbpress' ); ?></h4>
+						<p><?php _e( 'New functions and template stacks are in place to help plugin developers extend bbPress further.', 'bbpress' ); ?></p> 
+
+						<h4><?php _e( 'Plugin Directory Structure', 'bbpress' ); ?></h4>
+						<p><?php _e( 'We simplified the bbPress plugin directory structure, making it easier for plugin developers to find the relevant code.', 'bbpress' ); ?></p>
+					</div>
+
+					<div>
+						<h4><?php _e( 'Autocomplete', 'bbpress' ); ?></h4>
+						<p><?php _e( 'In WordPress Admin, you now select a parent forum or topic via autocomplete rather than a dropdown.', 'bbpress' ); ?></p>
+
+						<h4><?php _e( 'Fancy Editor Support', 'bbpress' ); ?></h4>
+						<p><?php _e( 'We improved our support of the Fancy Editor, giving forum users a better experience.', 'bbpress' ); ?></p>
+					</div>
+
+					<div class="last-feature">
+						<h4><?php _e( 'WordPress 3.5-ready', 'bbpress' ); ?></h4>
+						<p><?php _e( 'bbPress 2.2 has been thoroughly tested against the ongoing development of WordPress 3.5.', 'bbpress' ); ?></p>
+					</div>
+				</div>
+			</div>
+
+			<div class="return-to-dashboard">
+				<a href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbpress' ), 'options-general.php' ) ) ); ?>"><?php _e( 'Go to Forum Settings' ); ?></a>
+			</div>
+
+		</div>
+
+		<?php
+	}
+
+	/**
+	 * Output the credits screen
+	 *
+	 * Hardcoding this in here is pretty janky. It's fine for 2.2, but we'll
+	 * want to leverage api.wordpress.org eventually.
+	 *
+	 * @since bbPress (r4159)
+	 */
+	public function credits_screen() {
+
+		list( $display_version ) = explode( '-', bbp_get_version() ); ?>
+
+		<div class="wrap about-wrap">
+			<h1><?php printf( __( 'Welcome to bbPress %s' ), $display_version ); ?></h1>
+			<div class="about-text"><?php printf( __( 'Thank you for updating to the latest version! bbPress %s is ready to make your community a safer, faster, and better looking place to hang out!' ), $display_version ); ?></div>
+			<div class="bbp-badge"><?php printf( __( 'Version %s' ), $display_version ); ?></div>
+
+			<h2 class="nav-tab-wrapper">
+				<a href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbp-about' ), 'index.php' ) ) ); ?>" class="nav-tab">
+					<?php _e( 'What&#8217;s New' ); ?>
+				</a><a href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbp-credits' ), 'index.php' ) ) ); ?>" class="nav-tab nav-tab-active">
+					<?php _e( 'Credits' ); ?>
+				</a>
+			</h2>
+
+			<p class="about-description"><?php _e( 'bbPress is created by a worldwide swarm of busy, busy bees.', 'bbpress' ); ?></p>
+
+			<h4 class="wp-people-group"><?php _e( 'Project Leaders', 'bbpress' ); ?></h4>
+			<ul class="wp-people-group " id="wp-people-group-project-leaders">
+				<li class="wp-person" id="wp-person-matt">
+					<a href="http://profiles.wordpress.org/matt"><img src="http://0.gravatar.com/avatar/767fc9c115a1b989744c755db47feb60?s=60" class="gravatar" alt="Matt Mullenweg" /></a>
+					<a class="web" href="http://profiles.wordpress.org/matt">Matt Mullenweg</a>
+					<span class="title"><?php _e( 'Founding Developer', 'bbpress' ); ?></span>
+				</li>
+				<li class="wp-person" id="wp-person-johnjamesjacoby">
+					<a href="http://profiles.wordpress.org/johnjamesjacoby"><img src="http://0.gravatar.com/avatar/81ec16063d89b162d55efe72165c105f?s=60" class="gravatar" alt="John James Jacoby" /></a>
+					<a class="web" href="http://profiles.wordpress.org/johnjamesjacoby">John James Jacoby</a>
+					<span class="title"><?php _e( 'Lead Developer', 'bbpress' ); ?></span>
+				</li>
+			</ul>
+
+			<h4 class="wp-people-group"><?php _e( 'Contributing Developers', 'bbpress' ); ?></h4>
+			<ul class="wp-people-group " id="wp-people-group-contributing-developers">
+				<li class="wp-person" id="wp-person-jmdodd">
+					<a href="http://profiles.wordpress.org/jmdodd"><img src="http://0.gravatar.com/avatar/6a7c997edea340616bcc6d0fe03f65dd?s=60" class="gravatar" alt="Jennifer M. Dodd" /></a>
+					<a class="web" href="http://profiles.wordpress.org/jmdodd">Jennifer M. Dodd</a>
+					<span class="title"></span>
+				</li>
+				<li class="wp-person" id="wp-person-jaredatch">
+					<a href="http://profiles.wordpress.org/jaredatch"><img src="http://0.gravatar.com/avatar/e341eca9e1a85dcae7127044301b4363?s=60" class="gravatar" alt="Jared Atchison" /></a>
+					<a class="web" href="http://profiles.wordpress.org/jaredatch">Jared Atchison</a>
+					<span class="title"></span>
+				</li>
+				<li class="wp-person" id="wp-person-gautamgupta">
+					<a href="http://profiles.wordpress.org/gautamgupta"><img src="http://0.gravatar.com/avatar/b0810422cbe6e4eead4def5ae7a90b34?s=60" class="gravatar" alt="Gautam Gupta" /></a>
+					<a class="web" href="http://profiles.wordpress.org/gautamgupta">Gautam Gupta</a>
+					<span class="title"></span>
+				</li>
+			</ul>
+
+			<h4 class="wp-people-group"><?php _e( 'Codex Rockstars', 'bbpress' ); ?></h4>
+			<ul class="wp-people-group " id="wp-people-group-codex-rockstars">
+				<li class="wp-person" id="wp-person-masonjames">
+					<a href="http://profiles.wordpress.org/masonjames"><img src="http://0.gravatar.com/avatar/99dee4d5287d0f9e26ff72e7228d97ac?s=60" class="gravatar" alt="Mason James" /></a>
+					<a class="web" href="http://profiles.wordpress.org/masonjames">Mason James</a>
+					<span class="title"></span>
+				</li>
+				<li class="wp-person" id="wp-person-wordsforwp">
+					<a href="http://profiles.wordpress.org/wordsforwp"><img src="http://0.gravatar.com/avatar/5437119b446adad1af813c44944e6c9c?s=60" class="gravatar" alt="Siobhan McKeown" /></a>
+					<a class="web" href="http://profiles.wordpress.org/wordsforwp">Siobhan McKeown</a>
+					<span class="title"></span>
+				</li>
+				<li class="wp-person" id="wp-person-JarretC">
+					<a href="http://profiles.wordpress.org/JarretC"><img src="http://0.gravatar.com/avatar/e00501bf782b42d5db19ff75fca14f6a?s=60" class="gravatar" alt="Jarret Cade" /></a>
+					<a class="web" href="http://profiles.wordpress.org/JarretC">Jarret Cade</a>
+					<span class="title"></span>
+				</li>
+			</ul>
+
+			<h4 class="wp-people-group"><?php _e( 'Core Contributors to bbPress 2.2', 'bbpress' ); ?></h4>
+			<p class="wp-credits-list">
+				<a href="http://profiles.wordpress.org/alexvorn2">alexvorn2</a>,
+				<a href="http://profiles.wordpress.org/anointed">anointed</a>,
+				<a href="http://profiles.wordpress.org/boonebgorges">boonebgorges</a>,
+				<a href="http://profiles.wordpress.org/chexee">chexee</a>,
+				<a href="http://profiles.wordpress.org/cnorris23">cnorris23</a>,
+				<a href="http://profiles.wordpress.org/DanielJuhl">DanielJuhl</a>,
+				<a href="http://profiles.wordpress.org/daveshine">daveshine</a>,
+				<a href="http://profiles.wordpress.org/dimadin">dimadin</a>,
+				<a href="http://profiles.wordpress.org/DJPaul">DJPaul</a>,
+				<a href="http://profiles.wordpress.org/duck_">duck_</a>,
+				<a href="http://profiles.wordpress.org/gawain">gawain</a>,
+				<a href="http://profiles.wordpress.org/iamzippy">iamzippy</a>,
+				<a href="http://profiles.wordpress.org/isaacchapman">isaacchapman</a>,
+				<a href="http://profiles.wordpress.org/jane">jane</a>,
+				<a href="http://profiles.wordpress.org/jkudish">jkudish</a>,
+				<a href="http://profiles.wordpress.org/mamaduka">mamaduka</a>,
+				<a href="http://profiles.wordpress.org/mercime">mercime</a>,
+				<a href="http://profiles.wordpress.org/mesayre">mesayre</a>,
+				<a href="http://profiles.wordpress.org/mordauk">mordauk</a>,
+				<a href="http://profiles.wordpress.org/MZAWeb">MZAWeb</a>,
+				<a href="http://profiles.wordpress.org/netweb">netweb</a>,
+				<a href="http://profiles.wordpress.org/nexia">nexia</a>,
+				<a href="http://profiles.wordpress.org/Omicron7">Omicron7</a>,
+				<a href="http://profiles.wordpress.org/otto42">otto42</a>,
+				<a href="http://profiles.wordpress.org/pavelevap">pavelevap</a>,
+				<a href="http://profiles.wordpress.org/plescheff">plescheff</a>,
+				<a href="http://profiles.wordpress.org/scribu">scribu</a>,
+				<a href="http://profiles.wordpress.org/sorich87">sorich87</a>,
+				<a href="http://profiles.wordpress.org/SteveAtty">SteveAtty</a>,
+				<a href="http://profiles.wordpress.org/tmoorewp">tmoorewp</a>,
+				<a href="http://profiles.wordpress.org/tott">tott</a>,
+				<a href="http://profiles.wordpress.org/tungdo">tungdo</a>,
+				<a href="http://profiles.wordpress.org/vibol">vibol</a>,
+				<a href="http://profiles.wordpress.org/wonderboymusic">wonderboymusic</a>,
+				<a href="http://profiles.wordpress.org/westi">westi</a>,
+				<a href="http://profiles.wordpress.org/xiosen">xiosen</a>,
+			</p>
+
+			<div class="return-to-dashboard">
+				<a href="<?php echo esc_url( admin_url( add_query_arg( array( 'page' => 'bbpress' ), 'options-general.php' ) ) ); ?>"><?php _e( 'Go to Forum Settings' ); ?></a>
+			</div>
+
+		</div>
+
+		<?php
+	}
+
+	/** Updaters **************************************************************/
+
+	/**
+	 * Update all bbPress forums across all sites
+	 *
+	 * @since bbPress (r3689)
+	 *
+	 * @global WPDB $wpdb
+	 * @uses get_blog_option()
+	 * @uses wp_remote_get()
+	 */
+	public static function update_screen() {
+
+		// Get action
+		$action = isset( $_GET['action'] ) ? $_GET['action'] : ''; ?>
+
+		<div class="wrap">
+			<div id="icon-edit" class="icon32 icon32-posts-topic"><br /></div>
+			<h2><?php _e( 'Update Forum', 'bbpress' ); ?></h2>
+
+		<?php
+
+		// Taking action
+		switch ( $action ) {
+			case 'bbp-update' :
+
+				// Run the full updater
+				bbp_version_updater(); ?>
+
+				<p><?php _e( 'All done!', 'bbpress' ); ?></p>
+				<a class="button" href="index.php?page=bbp-update"><?php _e( 'Go Back', 'bbpress' ); ?></a>
+
+				<?php
+
+				break;
+
+			case 'show' :
+			default : ?>
+
+				<p><?php _e( 'You can update your forum through this page. Hit the link below to update.', 'bbpress' ); ?></p>
+				<p><a class="button" href="index.php?page=bbp-update&amp;action=bbp-update"><?php _e( 'Update Forum', 'bbpress' ); ?></a></p>
+
+			<?php break;
+
+		} ?>
+
+		</div><?php
+	}
+
+	/**
+	 * Update all bbPress forums across all sites
+	 *
+	 * @since bbPress (r3689)
+	 *
+	 * @global WPDB $wpdb
+	 * @uses get_blog_option()
+	 * @uses wp_remote_get()
+	 */
+	public static function network_update_screen() {
+		global $wpdb;
+
+		// Get action
+		$action = isset( $_GET['action'] ) ? $_GET['action'] : ''; ?>
+
+		<div class="wrap">
+			<div id="icon-edit" class="icon32 icon32-posts-topic"><br /></div>
+			<h2><?php _e( 'Update Forums', 'bbpress' ); ?></h2>
+
+		<?php
+
+		// Taking action
+		switch ( $action ) {
+			case 'bbpress-update' :
+
+				// Site counter
+				$n = isset( $_GET['n'] ) ? intval( $_GET['n'] ) : 0;
+
+				// Get blogs 5 at a time
+				$blogs = $wpdb->get_results( "SELECT * FROM {$wpdb->blogs} WHERE site_id = '{$wpdb->siteid}' AND spam = '0' AND deleted = '0' AND archived = '0' ORDER BY registered DESC LIMIT {$n}, 5", ARRAY_A );
+
+				// No blogs so all done!
+				if ( empty( $blogs ) ) : ?>
+
+					<p><?php _e( 'All done!', 'bbpress' ); ?></p>
+					<a class="button" href="update-core.php?page=bbpress-update"><?php _e( 'Go Back', 'bbpress' ); ?></a>
+
+					<?php break; ?>
+
+				<?php
+
+				// Still have sites to loop through
+				else : ?>
+
+					<ul>
+
+						<?php foreach ( (array) $blogs as $details ) :
+
+							$siteurl = get_blog_option( $details['blog_id'], 'siteurl' ); ?>
+
+							<li><?php echo $siteurl; ?></li>
+
+							<?php
+
+							// Get the response of the bbPress update on this site
+							$response = wp_remote_get(
+								trailingslashit( $siteurl ) . 'wp-admin/index.php?page=bbp-update&action=bbp-update',
+								array( 'timeout' => 30, 'httpversion' => '1.1' )
+							);
+
+							// Site errored out, no response?
+							if ( is_wp_error( $response ) )
+								wp_die( sprintf( __( 'Warning! Problem updating %1$s. Your server may not be able to connect to sites running on it. Error message: <em>%2$s</em>', 'bbpress' ), $siteurl, $response->get_error_message() ) );
+
+							// Switch to the new blog
+							switch_to_blog( $details[ 'blog_id' ] );
+
+							$basename = bbpress()->basename;
+
+							// Run the updater on this site
+							if ( is_plugin_active_for_network( $basename ) || is_plugin_active( $basename ) ) {
+								bbp_version_updater();
+							}
+
+							// restore original blog
+							restore_current_blog();
+
+							// Do some actions to allow plugins to do things too
+							do_action( 'after_bbpress_upgrade', $response             );
+							do_action( 'bbp_upgrade_site',      $details[ 'blog_id' ] );
+
+						endforeach; ?>
+
+					</ul>
+
+					<p>
+						<?php _e( 'If your browser doesn&#8217;t start loading the next page automatically, click this link:', 'bbpress' ); ?>
+						<a class="button" href="update-core.php?page=bbpress-update&amp;action=bbpress-update&amp;n=<?php echo ( $n + 5 ); ?>"><?php _e( 'Next Forums', 'bbpress' ); ?></a>
+					</p>
+					<script type='text/javascript'>
+						<!--
+						function nextpage() {
+							location.href = 'update-core.php?page=bbpress-update&action=bbpress-update&n=<?php echo ( $n + 5 ) ?>';
+						}
+						setTimeout( 'nextpage()', 250 );
+						//-->
+					</script><?php
+
+				endif;
+
+				break;
+
+			case 'show' :
+			default : ?>
+
+				<p><?php _e( 'You can update all the forums on your network through this page. It works by calling the update script of each site automatically. Hit the link below to update.', 'bbpress' ); ?></p>
+				<p><a class="button" href="update-core.php?page=bbpress-update&amp;action=bbpress-update"><?php _e( 'Update Forums', 'bbpress' ); ?></a></p>
+
+			<?php break;
+
+		} ?>
+
+		</div><?php
+	}
+}
+endif; // class_exists check
+
+/**
+ * Setup bbPress Admin
+ *
+ * @since bbPress (r2596)
+ *
+ * @uses BBP_Admin
+ */
+function bbp_admin() {
+	bbpress()->admin = new BBP_Admin();
+
+	bbpress()->admin->converter = new BBP_Converter();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converter.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1295 @@
+<?php
+
+/**
+ * bbPress Converter
+ *
+ * Based on the hard work of Adam Ellis at http://bbconverter.com
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Main BBP_Converter Class
+ */
+class BBP_Converter {
+
+	/**
+	 * The main bbPress Converter loader
+	 *
+	 * @since bbPress (r3813)
+	 * @uses BBP_Converter::includes() Include the required files
+	 * @uses BBP_Converter::setup_actions() Setup the actions
+	 */
+	public function __construct() {
+
+		// Bail if request is not correct
+		switch ( strtoupper( $_SERVER['REQUEST_METHOD'] ) ) {
+
+			// Converter is converting
+			case 'POST' :
+				if ( ( empty( $_POST['action'] ) || ( 'bbconverter_process' !=  $_POST['action'] ) ) )
+					return;
+
+				break;
+
+			// Some other admin page
+			case 'GET'  :
+				if ( ( empty( $_GET['page'] ) || ( 'bbp-converter' !=  $_GET['page'] ) ) )
+					return;
+
+				break;
+		}
+
+		// Proceed with the actions
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the default actions
+	 *
+	 * @since bbPress (r3813)
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		// Attach to the admin head with our ajax requests cycle and css
+		add_action( 'bbp_admin_head',              array( $this, 'admin_head'              ) );
+
+		// Attach the bbConverter admin settings action to the WordPress admin init action.
+		add_action( 'bbp_register_admin_settings', array( $this, 'register_admin_settings' ) );
+
+		// Attach to the admin ajax request to process cycles
+		add_action( 'wp_ajax_bbconverter_process', array( $this, 'process_callback'        ) );
+	}
+
+	/**
+	 * Register the settings
+	 *
+	 * @since bbPress (r3813)
+	 * @uses add_settings_section() To add our own settings section
+	 * @uses add_settings_field() To add various settings fields
+	 * @uses register_setting() To register various settings
+	 */
+	public function register_admin_settings() {
+
+		// Add the main section
+		add_settings_section( 'bbpress_converter_main',     __( 'Database Settings', 'bbpress' ),  'bbp_converter_setting_callback_main_section', 'bbpress_converter' );
+
+		// System Select
+		add_settings_field( '_bbp_converter_platform',      __( 'Select Platform',   'bbpress' ),  'bbp_converter_setting_callback_platform', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_platform',           'sanitize_title' );
+
+		// Database Server
+		add_settings_field( '_bbp_converter_db_server',     __( 'Database Server',   'bbpress' ),  'bbp_converter_setting_callback_dbserver', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_server',          'sanitize_title' );
+
+		// Database Server Port
+		add_settings_field( '_bbp_converter_db_port',       __( 'Database Port',     'bbpress' ),  'bbp_converter_setting_callback_dbport', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_port',            'sanitize_title' );
+
+		// Database Name
+		add_settings_field( '_bbp_converter_db_name',       __( 'Database Name',     'bbpress' ),  'bbp_converter_setting_callback_dbname', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_name',            'sanitize_title' );
+
+		// Database User
+		add_settings_field( '_bbp_converter_db_user',       __( 'Database User',     'bbpress' ),  'bbp_converter_setting_callback_dbuser', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_user',            'sanitize_title' );
+
+		// Database Pass
+		add_settings_field( '_bbp_converter_db_pass',       __( 'Database Password', 'bbpress' ),  'bbp_converter_setting_callback_dbpass', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_pass',            'sanitize_title' );
+
+		// Database Prefix
+		add_settings_field( '_bbp_converter_db_prefix',     __( 'Table Prefix',      'bbpress' ),  'bbp_converter_setting_callback_dbprefix', 'bbpress_converter', 'bbpress_converter_main' );
+		register_setting  ( 'bbpress_converter_main',       '_bbp_converter_db_prefix',          'sanitize_title' );
+
+		// Add the options section
+		add_settings_section( 'bbpress_converter_opt',      __( 'Options',           'bbpress' ),  'bbp_converter_setting_callback_options_section', 'bbpress_converter' );
+
+		// Rows Limit
+		add_settings_field( '_bbp_converter_rows',          __( 'Rows Limit',        'bbpress' ),  'bbp_converter_setting_callback_rows', 'bbpress_converter', 'bbpress_converter_opt' );
+		register_setting  ( 'bbpress_converter_opt',        '_bbp_converter_rows',               'intval' );
+
+		// Delay Time
+		add_settings_field( '_bbp_converter_delay_time',    __( 'Delay Time',        'bbpress' ), 'bbp_converter_setting_callback_delay_time', 'bbpress_converter', 'bbpress_converter_opt' );
+		register_setting  ( 'bbpress_converter_opt',        '_bbp_converter_delay_time',        'intval' );
+
+		// Convert Users ?
+		add_settings_field( '_bbp_converter_convert_users', __( 'Convert Users',     'bbpress' ), 'bbp_converter_setting_callback_convert_users', 'bbpress_converter', 'bbpress_converter_opt' );
+		register_setting  ( 'bbpress_converter_opt',        '_bbp_converter_convert_users',     'intval' );
+
+		// Restart
+		add_settings_field( '_bbp_converter_restart',       __( 'Start Over',        'bbpress' ), 'bbp_converter_setting_callback_restart', 'bbpress_converter', 'bbpress_converter_opt' );
+		register_setting  ( 'bbpress_converter_opt',        '_bbp_converter_restart',           'intval' );
+
+		// Clean
+		add_settings_field( '_bbp_converter_clean',         __( 'Purge Previous Import', 'bbpress' ), 'bbp_converter_setting_callback_clean', 'bbpress_converter', 'bbpress_converter_opt' );
+		register_setting  ( 'bbpress_converter_opt',        '_bbp_converter_clean',             'intval' );
+	}
+
+	/**
+	 * Admin scripts
+	 *
+	 * @since bbPress (r3813)
+	 */
+	public function admin_head() { ?>
+
+		<style type="text/css" media="screen">
+			/*<![CDATA[*/
+
+			div.bbp-converter-updated,
+			div.bbp-converter-warning {
+				border-radius: 3px 3px 3px 3px;
+				border-style: solid;
+				border-width: 1px;
+				padding: 5px 5px 5px 5px;
+			}
+
+			div.bbp-converter-updated {
+				height: 300px;
+				overflow: auto;
+				display: none;
+				background-color: #FFFFE0;
+				border-color: #E6DB55;
+				font-family: monospace;
+				font-weight: bold;
+			}
+
+			div.bbp-converter-updated p {
+				margin: 0.5em 0;
+				padding: 2px;
+				float: left;
+				clear: left;
+			}
+
+			div.bbp-converter-updated p.loading {
+				padding: 2px 20px 2px 2px;
+				background-image: url('<?php echo admin_url(); ?>images/wpspin_light.gif');
+				background-repeat: no-repeat;
+				background-position: center right;
+			}
+
+			#bbp-converter-stop {
+				display:none;
+			}
+
+			#bbp-converter-progress {
+				display:none;
+			}
+
+			/*]]>*/
+		</style>
+
+		<script language="javascript">
+
+			var bbconverter_is_running = false;
+			var bbconverter_run_timer;
+			var bbconverter_delay_time = 0;
+
+			function bbconverter_grab_data() {
+				var values = {};
+				jQuery.each(jQuery('#bbp-converter-settings').serializeArray(), function(i, field) {
+					values[field.name] = field.value;
+				});
+
+				if( values['_bbp_converter_restart'] ) {
+					jQuery('#_bbp_converter_restart').removeAttr("checked");
+				}
+
+				if( values['_bbp_converter_delay_time'] ) {
+					bbconverter_delay_time = values['_bbp_converter_delay_time'] * 1000;
+				}
+
+				values['action'] = 'bbconverter_process';
+				values['_ajax_nonce'] = '<?php echo  wp_create_nonce( 'bbp_converter_process' ); ?>';
+
+				return values;
+			}
+
+			function bbconverter_start() {
+				if( false == bbconverter_is_running ) {
+					bbconverter_is_running = true;
+					jQuery('#bbp-converter-start').hide();
+					jQuery('#bbp-converter-stop').show();
+					jQuery('#bbp-converter-progress').show();
+					bbconverter_log( '<p class="loading"><?php _e( 'Starting Conversion', 'bbpress' ); ?></p>' );
+					bbconverter_run();
+				}
+			}
+
+			function bbconverter_run() {
+				jQuery.post(ajaxurl, bbconverter_grab_data(), function(response) {
+					var response_length = response.length - 1;
+					response = response.substring(0,response_length);
+					bbconverter_success(response);
+				});
+			}
+
+			function bbconverter_stop() {
+				jQuery('#bbp-converter-start').show();
+				jQuery('#bbp-converter-stop').hide();
+				jQuery('#bbp-converter-progress').hide();
+				jQuery('#bbp-converter-message p').removeClass( 'loading' );
+				bbconverter_is_running = false;
+				clearTimeout( bbconverter_run_timer );
+			}
+
+			function bbconverter_success(response) {
+				bbconverter_log(response);
+
+				if ( response == '<p class="loading"><?php _e( 'Conversion Complete', 'bbpress' ); ?></p>' || response.indexOf('error') > -1 ) {
+					bbconverter_log('<p>Repair any missing information: <a href="<?php echo admin_url(); ?>tools.php?page=bbp-repair">Continue</a></p>');
+					bbconverter_stop();
+				} else if( bbconverter_is_running ) { // keep going
+					jQuery('#bbp-converter-progress').show();
+					clearTimeout( bbconverter_run_timer );
+					bbconverter_run_timer = setTimeout( 'bbconverter_run()', bbconverter_delay_time );
+				} else {
+					bbconverter_stop();
+				}
+			}
+
+			function bbconverter_log(text) {
+				if ( jQuery('#bbp-converter-message').css('display') == 'none' ) {
+					jQuery('#bbp-converter-message').show();
+				}
+				if ( text ) {
+					jQuery('#bbp-converter-message p').removeClass( 'loading' );
+					jQuery('#bbp-converter-message').prepend( text );
+				}
+			}
+
+		</script>
+
+		<?php
+	}
+
+	/**
+	 * Wrap the converter output in paragraph tags, so styling can be applied
+	 *
+	 * @since bbPress (r4052)
+	 *
+	 * @param string $output
+	 */
+	private static function converter_output( $output = '' ) {
+
+		// Get the last query
+		$before = '<p class="loading">';
+		$after  = '</p>';
+		$query  = get_option( '_bbp_converter_query' );
+
+		if ( ! empty( $query ) )
+			$before = '<p class="loading" title="' . esc_attr( $query ) . '">';
+
+		echo $before . $output . $after;
+	}
+
+	/**
+	 * Callback processor
+	 *
+	 * @since bbPress (r3813)
+	 */
+	public function process_callback() {
+
+		// Verify intent
+		check_ajax_referer( 'bbp_converter_process' );
+
+		if ( ! ini_get( 'safe_mode' ) ) {
+			set_time_limit( 0 );
+			ini_set( 'memory_limit',   '256M' );
+			ini_set( 'implicit_flush', '1'    );
+			ignore_user_abort( true );
+		}
+
+		// Save step and count so that it can be restarted.
+		if ( ! get_option( '_bbp_converter_step' ) || ( !empty( $_POST['_bbp_converter_restart'] ) ) ) {
+			update_option( '_bbp_converter_step',  1 );
+			update_option( '_bbp_converter_start', 0 );
+		}
+
+		$step  = (int) get_option( '_bbp_converter_step',  1 );
+		$min   = (int) get_option( '_bbp_converter_start', 0 );
+		$count = (int) ! empty( $_POST['_bbp_converter_rows'] ) ? $_POST['_bbp_converter_rows'] : 100;
+		$max   = ( $min + $count ) - 1;
+		$start = $min;
+
+		// Bail if platform did not get saved
+		$platform = !empty( $_POST['_bbp_converter_platform' ] ) ? $_POST['_bbp_converter_platform' ] : get_option( '_bbp_converter_platform' );
+		if ( empty( $platform ) )
+			return;
+
+		// Include the appropriate converter.
+		$converter = bbp_new_converter( $platform );
+
+		switch ( $step ) {
+
+			// STEP 1. Clean all tables.
+			case 1 :
+				if ( !empty( $_POST['_bbp_converter_clean'] ) ) {
+					if ( $converter->clean( $start ) ) {
+						update_option( '_bbp_converter_step',  $step + 1 );
+						update_option( '_bbp_converter_start', 0         );
+						$this->sync_table( true );
+						if ( empty( $start ) ) {
+							$this->converter_output( __( 'No data to clean', 'bbpress' ) );
+						}
+					} else {
+						update_option( '_bbp_converter_start', $max + 1 );
+						$this->converter_output( sprintf( __( 'Deleting previously converted data (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+					}
+				} else {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+				}
+
+				break;
+
+			// STEP 2. Convert users.
+			case 2 :
+				if ( !empty( $_POST['_bbp_converter_convert_users'] ) ) {
+					if ( $converter->convert_users( $start ) ) {
+						update_option( '_bbp_converter_step',  $step + 1 );
+						update_option( '_bbp_converter_start', 0         );
+						if ( empty( $start ) ) {
+							$this->converter_output( __( 'No users to convert', 'bbpress' ) );
+						}
+					} else {
+						update_option( '_bbp_converter_start', $max + 1 );
+						$this->converter_output( sprintf(  __( 'Converting users (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+					}
+				} else {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+				}
+
+				break;
+
+			// STEP 3. Clean passwords.
+			case 3 :
+				if ( !empty( $_POST['_bbp_converter_convert_users'] ) ) {
+					if ( $converter->clean_passwords( $start ) ) {
+						update_option( '_bbp_converter_step',  $step + 1 );
+						update_option( '_bbp_converter_start', 0         );
+						if ( empty( $start ) ) {
+							$this->converter_output( __( 'No passwords to clear', 'bbpress' ) );
+						}
+					} else {
+						update_option( '_bbp_converter_start', $max + 1 );
+						$this->converter_output( sprintf( __( 'Delete users wordpress default passwords (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+					}
+				} else {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+				}
+
+				break;
+
+			// STEP 4. Convert forums.
+			case 4 :
+				if ( $converter->convert_forums( $start ) ) {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+					if ( empty( $start ) ) {
+						$this->converter_output( __( 'No forums to convert', 'bbpress' ) );
+					}
+				} else {
+					update_option( '_bbp_converter_start', $max + 1 );
+					$this->converter_output( sprintf( __( 'Converting forums (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+				}
+
+				break;
+
+			// STEP 5. Convert forum parents.
+			case 5 :
+				if ( $converter->convert_forum_parents( $start ) ) {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+					if ( empty( $start ) ) {
+						$this->converter_output( __( 'No forum parents to convert', 'bbpress' ) );
+					}
+				} else {
+					update_option( '_bbp_converter_start', $max + 1 );
+					$this->converter_output( sprintf( __( 'Calculating forum hierarchy (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+				}
+
+				break;
+
+			// STEP 6. Convert topics.
+			case 6 :
+				if ( $converter->convert_topics( $start ) ) {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+					if ( empty( $start ) ) {
+						$this->converter_output( __( 'No topics to convert', 'bbpress' ) );
+					}
+				} else {
+					update_option( '_bbp_converter_start', $max + 1 );
+					$this->converter_output( sprintf( __( 'Converting topics (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+				}
+
+				break;
+
+			// STEP 7. Convert tags.
+			case 7 :
+				if ( $converter->convert_tags( $start ) ) {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+					if ( empty( $start ) ) {
+						$this->converter_output( __( 'No tags to convert', 'bbpress' ) );
+					}
+				} else {
+					update_option( '_bbp_converter_start', $max + 1 );
+					$this->converter_output( sprintf( __( 'Converting topic tags (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+				}
+
+				break;
+
+			// STEP 8. Convert replies.
+			case 8 :
+				if ( $converter->convert_replies( $start ) ) {
+					update_option( '_bbp_converter_step',  $step + 1 );
+					update_option( '_bbp_converter_start', 0         );
+					if ( empty( $start ) ) {
+						$this->converter_output( __( 'No replies to convert', 'bbpress' ) );
+					}
+				} else {
+					update_option( '_bbp_converter_start', $max + 1 );
+					$this->converter_output( sprintf( __( 'Converting replies (%1$s - %2$s)', 'bbpress' ), $min, $max ) );
+				}
+
+				break;
+
+			default :
+				delete_option( '_bbp_converter_step'  );
+				delete_option( '_bbp_converter_start' );
+				delete_option( '_bbp_converter_query' );
+
+				$this->converter_output( __( 'Conversion Complete', 'bbpress' ) );
+
+				break;
+		}
+	}
+
+	/**
+	 * Create Tables for fast syncing
+	 *
+	 * @since bbPress (r3813)
+	 */
+	public function sync_table( $drop = false ) {
+		global $wpdb;
+
+		$table_name = $wpdb->prefix . 'bbp_converter_translator';
+		if ( ! empty( $drop ) && $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) == $table_name )
+			$wpdb->query( "DROP TABLE {$table_name}" );
+
+		require_once( ABSPATH . '/wp-admin/includes/upgrade.php' );
+
+		if ( !empty( $wpdb->charset ) ) {
+			$charset_collate = "DEFAULT CHARACTER SET $wpdb->charset";
+		}
+
+		if ( !empty( $wpdb->collate ) ) {
+			$charset_collate .= " COLLATE $wpdb->collate";
+		}
+
+		/** Translator ****************************************************/
+
+		$sql = "CREATE TABLE {$table_name} (
+					meta_id mediumint(8) unsigned not null auto_increment,
+					value_type varchar(25) null,
+					value_id bigint(20) unsigned not null default '0',
+					meta_key varchar(25) null,
+					meta_value varchar(25) null,
+				PRIMARY KEY  (meta_id),
+					KEY value_id (value_id),
+					KEY meta_join (meta_key, meta_value) ) {$charset_collate};";
+
+		dbDelta( $sql );
+	}
+}
+
+/**
+ * Base class to be extended by specific individual importers
+ *
+ * @since bbPress (r3813)
+ */
+abstract class BBP_Converter_Base {
+
+	/**
+	 * @var array() This is the field mapping array to process.
+	 */
+	protected $field_map = array();
+
+	/**
+	 * @var object This is the connection to the wordpress datbase.
+	 */
+	protected $wpdb;
+
+	/**
+	 * @var object This is the connection to the other platforms database.
+	 */
+	protected $opdb;
+
+	/**
+	 * @var int This is the max rows to process at a time.
+	 */
+	public $max_rows;
+
+	/**
+	 * @var array() Map of topic to forum.  It is for optimization.
+	 */
+	private $map_topicid_to_forumid = array();
+
+	/**
+	 * @var array() Map of from old forum ids to new forum ids.  It is for optimization.
+	 */
+	private $map_forumid = array();
+
+	/**
+	 * @var array() Map of from old topic ids to new topic ids.  It is for optimization.
+	 */
+	private $map_topicid = array();
+
+	/**
+	 * @var array() Map of from old user ids to new user ids.  It is for optimization.
+	 */
+	private $map_userid = array();
+
+	/**
+	 * @var str This is the charset for your wp database.
+	 */
+	public $charset;
+
+	/**
+	 * @var boolean Sync table available.
+	 */
+	public $sync_table = false;
+
+	/**
+	 * @var str Sync table name.
+	 */
+	public $sync_table_name;
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * This is the constructor and it connects to the platform databases.
+	 */
+	public function __construct() {
+		$this->setup_globals();
+	}
+
+	private function setup_globals() {
+		global $wpdb;
+
+		/** Get database connections ******************************************/
+
+		$this->wpdb         = $wpdb;
+		$this->max_rows     = (int) $_POST['_bbp_converter_rows'];
+		$this->opdb         = new wpdb( $_POST['_bbp_converter_db_user'], $_POST['_bbp_converter_db_pass'], $_POST['_bbp_converter_db_name'], $_POST['_bbp_converter_db_server'] );
+		$this->opdb->prefix = $_POST['_bbp_converter_db_prefix'];
+
+		/**
+		 * Error Reporting
+		 */
+		$this->wpdb->show_errors();
+		$this->opdb->show_errors();
+
+		/**
+		 * Syncing
+		 */
+		$this->sync_table_name = $this->wpdb->prefix . 'bbp_converter_translator';
+		if ( $this->wpdb->get_var( "SHOW TABLES LIKE '" . $this->sync_table_name . "'" ) == $this->sync_table_name ) {
+			$this->sync_table = true;
+		} else {
+			$this->sync_table = false;
+		}
+
+		/**
+		 * Charset
+		 */
+		if ( empty( $this->wpdb->charset ) ) {
+			$this->charset = 'UTF8';
+		} else {
+			$this->charset = $this->wpdb->charset;
+		}
+
+		/**
+		 * Default mapping.
+		 */
+
+		/** Forum Section *****************************************************/
+
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_status',
+			'default'      => 'publish'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'comment_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'ping_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_type',
+			'default'      => 'forum'
+		);
+
+		/** Topic Section *****************************************************/
+
+		$this->field_map[] = array(
+			'to_type'      => 'topic',
+			'to_fieldname' => 'post_status',
+			'default'      => 'publish'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'topic',
+			'to_fieldname' => 'comment_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'topic',
+			'to_fieldname' => 'ping_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'topic',
+			'to_fieldname' => 'post_type',
+			'default'      => 'topic'
+		);
+
+		/** Post Section ******************************************************/
+
+		$this->field_map[] = array(
+			'to_type'      => 'reply',
+			'to_fieldname' => 'post_status',
+			'default'      => 'publish'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'reply',
+			'to_fieldname' => 'comment_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'reply',
+			'to_fieldname' => 'ping_status',
+			'default'      => 'closed'
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'reply',
+			'to_fieldname' => 'post_type',
+			'default'      => 'reply'
+		);
+
+		/** User Section ******************************************************/
+
+		$this->field_map[] = array(
+			'to_type'      => 'user',
+			'to_fieldname' => 'role',
+			'default'      => get_option( 'default_role' )
+		);
+	}
+
+	/**
+	 * Convert Forums
+	 */
+	public function convert_forums( $start = 1 ) {
+		return $this->convert_table( 'forum', $start );
+	}
+
+	/**
+	 * Convert Topics / Threads
+	 */
+	public function convert_topics( $start = 1 ) {
+		return $this->convert_table( 'topic', $start );
+	}
+
+	/**
+	 * Convert Posts
+	 */
+	public function convert_replies( $start = 1 ) {
+		return $this->convert_table( 'reply', $start );
+	}
+
+	/**
+	 * Convert Users
+	 */
+	public function convert_users( $start = 1 ) {
+		return $this->convert_table( 'user', $start );
+	}
+
+	/**
+	 * Convert Tags
+	 */
+	public function convert_tags( $start = 1 ) {
+		return $this->convert_table( 'tags', $start );
+	}
+
+	/**
+	 * Convert Table
+	 *
+	 * @param string to type
+	 * @param int Start row
+	 */
+	public function convert_table( $to_type, $start ) {
+
+		// Are we usig a sync table, or postmeta?
+		if ( $this->wpdb->get_var( "SHOW TABLES LIKE '" . $this->sync_table_name . "'" ) == $this->sync_table_name ) {
+			$this->sync_table = true;
+		} else {
+			$this->sync_table = false;
+		}
+
+		// Set some defaults
+		$has_insert     = false;
+		$from_tablename = '';
+		$field_list     = $from_tables = $tablefield_array = array();
+
+		// Toggle Table Name based on $to_type (destination)
+		switch ( $to_type ) {
+			case 'user' :
+				$tablename = $this->wpdb->users;
+				break;
+
+			case 'tags' :
+				$tablename = '';
+				break;
+
+			default :
+				$tablename = $this->wpdb->posts;
+		}
+
+		// Get the fields from the destination table
+		if ( !empty( $tablename ) ) {
+			$tablefield_array = $this->get_fields( $tablename );
+		}
+
+		/** Step 1 ************************************************************/
+
+		// Loop through the field maps, and look for to_type matches
+		foreach ( $this->field_map as $item ) {
+
+			// Yay a match, and we have a from table, too
+			if ( ( $item['to_type'] == $to_type ) && !empty( $item['from_tablename'] ) ) {
+
+				// $from_tablename was set from a previous loop iteration
+				if ( ! empty( $from_tablename ) ) {
+
+					// Doing some joining
+					if ( !in_array( $item['from_tablename'], $from_tables ) && in_array( $item['join_tablename'], $from_tables ) ) {
+						$from_tablename .= ' ' . $item['join_type'] . ' JOIN ' . $this->opdb->prefix . $item['from_tablename'] . ' AS ' . $item['from_tablename'] . ' ' . $item['join_expression'];
+					}
+
+				// $from_tablename needs to be set
+				} else {
+					$from_tablename = $item['from_tablename'] . ' AS ' . $item['from_tablename'];
+				}
+
+				// Specific FROM expression data used
+				if ( !empty( $item['from_expression'] ) ) {
+
+					// No 'WHERE' in expression
+					if ( stripos( $from_tablename, "WHERE" ) === false ) {
+						$from_tablename .= ' ' . $item['from_expression'];
+
+					// 'WHERE' in expression, so replace with 'AND'
+					} else {
+						$from_tablename .= ' ' . str_replace( "WHERE", "AND", $item['from_expression'] );
+					}
+				}
+
+				// Add tablename and fieldname to arrays, formatted for querying
+				$from_tables[] = $item['from_tablename'];
+				$field_list[]  = 'convert(' . $item['from_tablename'] . '.' . $item['from_fieldname'] . ' USING "' . $this->charset . '") AS ' . $item['from_fieldname'];
+			}
+		}
+
+		/** Step 2 ************************************************************/
+
+		// We have a $from_tablename, so we want to get some data to convert
+		if ( !empty( $from_tablename ) ) {
+
+			// Get some data from the old forums
+			$field_list  = array_unique( $field_list );
+			$forum_query = 'SELECT ' . implode( ',', $field_list ) . ' FROM ' . $this->opdb->prefix . $from_tablename . ' LIMIT ' . $start . ', ' . $this->max_rows;
+			$forum_array = $this->opdb->get_results( $forum_query, ARRAY_A );
+
+			// Set this query as the last one ran
+			update_option( '_bbp_converter_query', $forum_query );
+
+			// Query returned some results
+			if ( !empty( $forum_array ) ) {
+
+				// Loop through results
+				foreach ( (array) $forum_array as $forum ) {
+
+					// Reset some defaults
+					$insert_post = $insert_postmeta = $insert_data = array();
+
+					// Loop through field map, again...
+					foreach ( $this->field_map as $row ) {
+
+						// Types matchand to_fieldname is present. This means
+						// we have some work to do here.
+						if ( ( $row['to_type'] == $to_type ) && ! is_null( $row['to_fieldname'] ) ) {
+
+							// This row has a destination that matches one of the
+							// columns in this table.
+							if ( in_array( $row['to_fieldname'], $tablefield_array ) ) {
+
+								// Allows us to set default fields.
+								if ( isset( $row['default'] ) ) {
+									$insert_post[$row['to_fieldname']] = $row['default'];
+
+								// Translates a field from the old forum.
+								} elseif ( isset( $row['callback_method'] ) ) {
+									if ( ( 'callback_userid' == $row['callback_method'] ) && empty( $_POST['_bbp_converter_convert_users'] ) ) {
+										$insert_post[$row['to_fieldname']] = $forum[$row['from_fieldname']];
+									} else {
+										$insert_post[$row['to_fieldname']] = call_user_func_array( array( $this, $row['callback_method'] ), array( $forum[$row['from_fieldname']], $forum ) );
+									}
+
+								// Maps the field from the old forum.
+								} else {
+									$insert_post[$row['to_fieldname']] = $forum[$row['from_fieldname']];
+								}
+
+							// Destination field is not empty, so we might need
+							// to do some extra work or set a default.
+							} elseif ( !empty( $row['to_fieldname'] ) ) {
+
+								// Allows us to set default fields.
+								if ( isset( $row['default'] ) ) {
+									$insert_postmeta[$row['to_fieldname']] = $row['default'];
+
+								// Translates a field from the old forum.
+								} elseif ( isset( $row['callback_method'] ) ) {
+									if ( ( $row['callback_method'] == 'callback_userid' ) && ( 0 == $_POST['_bbp_converter_convert_users'] ) ) {
+										$insert_postmeta[$row['to_fieldname']] = $forum[$row['from_fieldname']];
+									} else {
+										$insert_postmeta[$row['to_fieldname']] = call_user_func_array( array( $this, $row['callback_method'] ), array( $forum[$row['from_fieldname']], $forum ) );
+									}
+
+								// Maps the field from the old forum.
+								} else {
+									$insert_postmeta[$row['to_fieldname']] = $forum[$row['from_fieldname']];
+								}
+							}
+						}
+					}
+
+					/** Step 3 ************************************************/
+
+					// Something to insert into the destination field
+					if ( count( $insert_post ) > 0 || ( $to_type == 'tags' && count( $insert_postmeta ) > 0 ) ) {
+
+						switch ( $to_type ) {
+
+							/** New user **************************************/
+
+							case 'user':
+								if ( username_exists( $insert_post['user_login'] ) ) {
+									$insert_post['user_login'] = 'imported_' . $insert_post['user_login'];
+								}
+
+								if ( email_exists( $insert_post['user_email'] ) ) {
+									$insert_post['user_email'] = 'imported_' . $insert_post['user_email'];
+								}
+
+								$post_id = wp_insert_user( $insert_post );
+
+								if ( is_numeric( $post_id ) ) {
+
+									foreach ( $insert_postmeta as $key => $value ) {
+
+										add_user_meta( $post_id, $key, $value, true );
+
+										if ( '_id' == substr( $key, -3 ) && ( true === $this->sync_table ) ) {
+											$this->wpdb->insert( $this->sync_table_name, array( 'value_type' => 'user', 'value_id' => $post_id, 'meta_key' => $key, 'meta_value' => $value ) );
+										}
+									}
+								}
+								break;
+
+							/** New Topic-Tag *********************************/
+
+							case 'tags':
+								$post_id = wp_set_object_terms( $insert_postmeta['objectid'], $insert_postmeta['name'], 'topic-tag', true );
+								break;
+
+							/** Forum, Topic, Reply ***************************/
+
+							default:
+								$post_id = wp_insert_post( $insert_post );
+
+								if ( is_numeric( $post_id ) ) {
+
+									foreach ( $insert_postmeta as $key => $value ) {
+
+										add_post_meta( $post_id, $key, $value, true );
+
+										// Forums need to save their old ID for group forum association
+										if ( ( 'forum' == $to_type ) && ( '_bbp_forum_id' == $key ) )
+											add_post_meta( $post_id, '_bbp_old_forum_id', $value );
+
+										// Topics need an extra bit of metadata
+										// to be keyed to the new post_id
+										if ( ( 'topic' == $to_type ) && ( '_bbp_topic_id' == $key ) ) {
+
+											// Update the live topic ID
+											update_post_meta( $post_id, $key, $post_id );
+
+											// Save the old topic ID
+											add_post_meta( $post_id, '_bbp_old_topic_id', $value );
+											if ( '_id' == substr( $key, -3 ) && ( true === $this->sync_table ) ) {
+												$this->wpdb->insert( $this->sync_table_name, array( 'value_type' => 'post', 'value_id' => $post_id, 'meta_key' => '_bbp_topic_id',     'meta_value' => $post_id ) );
+												$this->wpdb->insert( $this->sync_table_name, array( 'value_type' => 'post', 'value_id' => $post_id, 'meta_key' => '_bbp_old_topic_id', 'meta_value' => $value   ) );
+											}
+
+										} elseif ( '_id' == substr( $key, -3 ) && ( true === $this->sync_table ) ) {
+											$this->wpdb->insert( $this->sync_table_name, array( 'value_type' => 'post', 'value_id' => $post_id, 'meta_key' => $key, 'meta_value' => $value ) );
+										}
+									}
+								}
+								break;
+						}
+						$has_insert = true;
+					}
+				}
+			}
+		}
+
+		return ! $has_insert;
+	}
+
+	public function convert_forum_parents( $start ) {
+
+		$has_update = false;
+
+		if ( !empty( $this->sync_table ) )
+			$query = 'SELECT value_id, meta_value FROM ' . $this->sync_table_name . ' WHERE meta_key = "_bbp_forum_parent_id" AND meta_value > 0 LIMIT ' . $start . ', ' . $this->max_rows;
+		else
+			$query = 'SELECT post_id AS value_id, meta_value FROM ' . $this->wpdb->postmeta . ' WHERE meta_key = "_bbp_forum_parent_id" AND meta_value > 0 LIMIT ' . $start . ', ' . $this->max_rows;
+
+		update_option( '_bbp_converter_query', $query );
+
+		$forum_array = $this->wpdb->get_results( $query );
+
+		foreach ( (array) $forum_array as $row ) {
+			$parent_id = $this->callback_forumid( $row->meta_value );
+			$this->wpdb->query( 'UPDATE ' . $this->wpdb->posts . ' SET post_parent = "' . $parent_id . '" WHERE ID = "' . $row->value_id . '" LIMIT 1' );
+			$has_update = true;
+		}
+
+		return ! $has_update;
+	}
+
+	/**
+	 * This method deletes data from the wp database.
+	 */
+	public function clean( $start ) {
+
+		$start      = 0;
+		$has_delete = false;
+
+		/** Delete bbconverter topics/forums/posts ****************************/
+
+		if ( true === $this->sync_table )
+			$query = 'SELECT value_id FROM ' . $this->sync_table_name . ' INNER JOIN ' . $this->wpdb->posts . ' ON(value_id = ID) WHERE meta_key LIKE "_bbp_%" AND value_type = "post" GROUP BY value_id ORDER BY value_id DESC LIMIT ' . $this->max_rows;
+		else
+			$query = 'SELECT post_id AS value_id FROM ' . $this->wpdb->postmeta . ' WHERE meta_key LIKE "_bbp_%" GROUP BY post_id ORDER BY post_id DESC LIMIT ' . $this->max_rows;
+
+		update_option( '_bbp_converter_query', $query );
+
+		$posts = $this->wpdb->get_results( $query, ARRAY_A );
+
+		if ( isset( $posts[0] ) && ! empty( $posts[0]['value_id'] ) ) {
+			foreach ( (array) $posts as $value ) {
+				wp_delete_post( $value['value_id'], true );
+			}
+			$has_delete = true;
+		}
+
+		/** Delete bbconverter users ******************************************/
+
+		if ( true === $this->sync_table )
+			$query = 'SELECT value_id FROM ' . $this->sync_table_name . ' INNER JOIN ' . $this->wpdb->users . ' ON(value_id = ID) WHERE meta_key = "_bbp_user_id" AND value_type = "user" LIMIT ' . $this->max_rows;
+		else
+			$query = 'SELECT user_id AS value_id FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_user_id" LIMIT ' . $this->max_rows;
+
+		update_option( '_bbp_converter_query', $query );
+
+		$users = $this->wpdb->get_results( $query, ARRAY_A );
+
+		if ( !empty( $users ) ) {
+			foreach ( $users as $value ) {
+				wp_delete_user( $value['value_id'] );
+			}
+			$has_delete = true;
+		}
+
+		unset( $posts );
+		unset( $users );
+
+		return ! $has_delete;
+	}
+
+	/**
+	 * This method deletes passwords from the wp database.
+	 *
+	 * @param int Start row
+	 */
+	public function clean_passwords( $start ) {
+
+		$has_delete = false;
+
+		/** Delete bbconverter passwords **************************************/
+
+		$query       = 'SELECT user_id, meta_value FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_password" LIMIT ' . $start . ', ' . $this->max_rows;
+		update_option( '_bbp_converter_query', $query );
+
+		$bbconverter = $this->wpdb->get_results( $query, ARRAY_A );
+
+		if ( !empty( $bbconverter ) ) {
+
+			foreach ( $bbconverter as $value ) {
+				if ( is_serialized( $value['meta_value'] ) ) {
+					$this->wpdb->query( 'UPDATE ' . $this->wpdb->users . ' ' . 'SET user_pass = "" ' . 'WHERE ID = "' . $value['user_id'] . '"' );
+				} else {
+					$this->wpdb->query( 'UPDATE ' . $this->wpdb->users . ' ' . 'SET user_pass = "' . $value['meta_value'] . '" ' . 'WHERE ID = "' . $value['user_id'] . '"' );
+					$this->wpdb->query( 'DELETE FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_password" AND user_id = "' . $value['user_id'] . '"' );
+				}
+			}
+			$has_delete = true;
+		}
+
+		return ! $has_delete;
+	}
+
+	/**
+	 * This method implements the authentication for the different forums.
+	 *
+	 * @param string Unencoded password.
+	 */
+	abstract protected function authenticate_pass( $password, $hash );
+
+	/**
+	 * Info
+	 */
+	abstract protected function info();
+
+	/**
+	 * This method grabs appropriate fields from the table specified
+	 *
+	 * @param string The table name to grab fields from
+	 */
+	private function get_fields( $tablename ) {
+		$rval        = array();
+		$field_array = $this->wpdb->get_results( 'DESCRIBE ' . $tablename, ARRAY_A );
+
+		foreach ( $field_array as $field ) {
+			$rval[] = $field['Field'];
+		}
+
+		if ( $tablename == $this->wpdb->users ) {
+			$rval[] = 'role';
+			$rval[] = 'yim';
+			$rval[] = 'aim';
+			$rval[] = 'jabber';
+		}
+		return $rval;
+	}
+
+	/** Callbacks *************************************************************/
+
+	/**
+	 * Run password through wp_hash_password()
+	 *
+	 * @param string $username
+	 * @param string $password
+	 */
+	public function callback_pass( $username, $password ) {
+		$user = $this->wpdb->get_row( 'SELECT * FROM ' . $this->wpdb->users . ' WHERE user_login = "' . $username . '" AND user_pass = "" LIMIT 1' );
+		if ( !empty( $user ) ) {
+			$usermeta = $this->wpdb->get_row( 'SELECT * FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_password" AND user_id = "' . $user->ID . '" LIMIT 1' );
+
+			if ( !empty( $usermeta ) ) {
+				if ( $this->authenticate_pass( $password, $usermeta->meta_value ) ) {
+					$this->wpdb->query( 'UPDATE ' . $this->wpdb->users . ' ' . 'SET user_pass = "' . wp_hash_password( $password ) . '" ' . 'WHERE ID = "' . $user->ID . '"' );
+					$this->wpdb->query( 'DELETE FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_password" AND user_id = "' . $user->ID . '"' );
+				}
+			}
+		}
+	}
+
+	/**
+	 * A mini cache system to reduce database calls to forum ID's
+	 *
+	 * @param string $field
+	 * @return string
+	 */
+	private function callback_forumid( $field ) {
+		if ( !isset( $this->map_forumid[$field] ) ) {
+			if ( !empty( $this->sync_table ) ) {
+				$row = $this->wpdb->get_row( 'SELECT value_id, meta_value FROM ' . $this->sync_table_name . ' WHERE meta_key = "_bbp_forum_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			} else {
+				$row = $this->wpdb->get_row( 'SELECT post_id AS value_id FROM ' . $this->wpdb->postmeta . ' WHERE meta_key = "_bbp_forum_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			}
+
+			if ( !is_null( $row ) ) {
+				$this->map_forumid[$field] = $row->value_id;
+			} else {
+				$this->map_forumid[$field] = 0;
+			}
+		}
+		return $this->map_forumid[$field];
+	}
+
+	/**
+	 * A mini cache system to reduce database calls to topic ID's
+	 *
+	 * @param string $field
+	 * @return string
+	 */
+	private function callback_topicid( $field ) {
+		if ( !isset( $this->map_topicid[$field] ) ) {
+			if ( !empty( $this->sync_table ) ) {
+				$row = $this->wpdb->get_row( 'SELECT value_id, meta_value FROM ' . $this->sync_table_name . ' WHERE meta_key = "_bbp_old_topic_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			} else {
+				$row = $this->wpdb->get_row( 'SELECT post_id AS value_id FROM ' . $this->wpdb->postmeta . ' WHERE meta_key = "_bbp_old_topic_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			}
+
+			if ( !is_null( $row ) ) {
+				$this->map_topicid[$field] = $row->value_id;
+			} else {
+				$this->map_topicid[$field] = 0;
+			}
+		}
+		return $this->map_topicid[$field];
+	}
+
+	/**
+	 * A mini cache system to reduce database calls to user ID's
+	 *
+	 * @param string $field
+	 * @return string
+	 */
+	private function callback_userid( $field ) {
+		if ( !isset( $this->map_userid[$field] ) ) {
+			if ( !empty( $this->sync_table ) ) {
+				$row = $this->wpdb->get_row( 'SELECT value_id, meta_value FROM ' . $this->sync_table_name . ' WHERE meta_key = "_bbp_user_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			} else {
+				$row = $this->wpdb->get_row( 'SELECT user_id AS value_id FROM ' . $this->wpdb->usermeta . ' WHERE meta_key = "_bbp_user_id" AND meta_value = "' . $field . '" LIMIT 1' );
+			}
+
+			if ( !is_null( $row ) ) {
+				$this->map_userid[$field] = $row->value_id;
+			} else {
+				if ( !empty( $_POST['_bbp_converter_convert_users'] ) && ( $_POST['_bbp_converter_convert_users'] == 1 ) ) {
+					$this->map_userid[$field] = 0;
+				} else {
+					$this->map_userid[$field] = $field;
+				}
+			}
+		}
+		return $this->map_userid[$field];
+	}
+
+	/**
+	 * A mini cache system to reduce database calls map topics ID's to forum ID's
+	 *
+	 * @param string $field
+	 * @return string
+	 */
+	private function callback_topicid_to_forumid( $field ) {
+		$topicid = $this->callback_topicid( $field );
+		if ( empty( $topicid ) ) {
+			$this->map_topicid_to_forumid[$topicid] = 0;
+		} elseif ( ! isset( $this->map_topicid_to_forumid[$topicid] ) ) {
+			$row = $this->wpdb->get_row( 'SELECT post_parent FROM ' . $this->wpdb->posts . ' WHERE ID = "' . $topicid . '" LIMIT 1' );
+
+			if ( !is_null( $row ) ) {
+				$this->map_topicid_to_forumid[$topicid] = $row->post_parent;
+			} else {
+				$this->map_topicid_to_forumid[$topicid] = 0;
+			}
+		}
+
+		return $this->map_topicid_to_forumid[$topicid];
+	}
+
+	protected function callback_slug( $field ) {
+		return sanitize_title( $field );
+	}
+
+	protected function callback_negative( $field ) {
+		if ( $field < 0 ) {
+			return 0;
+		} else {
+			return $field;
+		}
+	}
+
+	protected function callback_html( $field ) {
+		require_once( bbpress()->admin->admin_dir . 'parser.php' );
+		$bbcode = BBCode::getInstance();
+		return html_entity_decode( $bbcode->Parse( $field ) );
+	}
+
+	protected function callback_null( $field ) {
+		if ( is_null( $field ) ) {
+			return '';
+		} else {
+			return $field;
+		}
+	}
+
+	protected function callback_datetime( $field ) {
+		if ( is_numeric( $field ) ) {
+			return date( 'Y-m-d H:i:s', $field );
+		} else {
+			return date( 'Y-m-d H:i:s', strtotime( $field ) );
+		}
+	}
+}
+
+/**
+ * This is a function that is purposely written to look like a "new" statement.
+ * It is basically a dynamic loader that will load in the platform conversion
+ * of your choice.
+ *
+ * @param string $platform Name of valid platform class.
+ */
+function bbp_new_converter( $platform ) {
+	$found = false;
+
+	if ( $curdir = opendir( bbpress()->admin->admin_dir . 'converters/' ) ) {
+		while ( $file = readdir( $curdir ) ) {
+			if ( stristr( $file, '.php' ) && stristr( $file, 'index' ) === FALSE ) {
+				$file = preg_replace( '/.php/', '', $file );
+				if ( $platform == $file ) {
+					$found = true;
+					continue;
+				}
+			}
+		}
+		closedir( $curdir );
+	}
+
+	if ( true === $found ) {
+		require_once( bbpress()->admin->admin_dir . 'converters/' . $platform . '.php' );
+		return new $platform;
+	} else {
+		return null;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/Example.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,332 @@
+<?php
+
+/**
+ * Implementation of Example converter.
+ */
+class Example_Converter extends BBP_Converter_Base
+{
+	function __construct()
+	{
+		parent::__construct();
+		$this->setup_globals();
+	}
+
+	public function setup_globals()
+	{
+		/** Forum Section ******************************************************/
+
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'forumid',
+			'to_type' => 'forum', 'to_fieldname' => '_bbp_forum_id'
+		);
+		
+		// Forum parent id.  If no parent, than 0. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'parentid',
+			'to_type' => 'forum', 'to_fieldname' => '_bbp_parent_id'
+		);
+		
+		// Forum title.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'title',
+			'to_type' => 'forum', 'to_fieldname' => 'post_title'
+		);
+		
+		// Forum slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'title_clean',
+			'to_type' => 'forum', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum description.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'description',
+			'to_type' => 'forum', 'to_fieldname' => 'post_content',
+			'callback_method' => 'callback_null'
+		);
+		
+		// Forum display order.  Starts from 1.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum', 'from_fieldname' => 'displayorder',
+			'to_type' => 'forum', 'to_fieldname' => 'menu_order'
+		);
+		
+		// Forum date update.
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_date',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_date_gmt',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_modified',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_modified_gmt',
+			'default' => date('Y-m-d H:i:s')
+		);
+
+		/** Topic Section ******************************************************/
+
+		// Topic id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'threadid',
+			'to_type' => 'topic', 'to_fieldname' => '_bbp_topic_id'
+		);
+		
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'forumid',
+			'to_type' => 'topic', 'to_fieldname' => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+				
+		// Topic author.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'postuserid',
+			'to_type' => 'topic', 'to_fieldname' => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+		
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'title',
+			'to_type' => 'topic', 'to_fieldname' => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'title',
+			'to_type' => 'topic', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'forumid',
+			'to_type' => 'topic', 'to_fieldname' => 'post_parent',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'dateline',
+			'to_type' => 'topic', 'to_fieldname' => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'dateline',
+			'to_type' => 'topic', 'to_fieldname' => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'dateline',
+			'to_type' => 'topic', 'to_fieldname' => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'thread', 'from_fieldname' => 'dateline',
+			'to_type' => 'topic', 'to_fieldname' => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** Tags Section ******************************************************/
+		
+		// Topic id.
+		$this->field_map[] = array(
+			'from_tablename' => 'tagcontent', 'from_fieldname' => 'contentid',
+			'to_type' => 'tags', 'to_fieldname' => 'objectid',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Tags text.
+		$this->field_map[] = array(
+			'from_tablename' => 'tag', 'from_fieldname' => 'tagtext',
+			'join_tablename' => 'tagcontent', 'join_type' => 'INNER', 'join_expression' => 'USING (tagid)',
+			'to_type' => 'tags', 'to_fieldname' => 'name'
+		);		
+
+		/** Post Section ******************************************************/
+
+		// Post id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'postid',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_post_id'
+		);
+		
+		// Forum id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'threadid',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_forum_id',
+			'callback_method' => 'callback_topicid_to_forumid'
+		);
+		
+		// Topic id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'threadid',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_topic_id',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'ipaddress',
+			'to_type' => 'reply', 'to_fieldname' => '__bbp_author_ip'
+		);	
+			
+		// Post author.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'userid',
+			'to_type' => 'reply', 'to_fieldname' => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+		
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'title',
+			'to_type' => 'reply', 'to_fieldname' => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'title',
+			'to_type' => 'reply', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Post content.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'pagetext',
+			'to_type' => 'reply', 'to_fieldname' => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+		
+		// Topic id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'threadid',
+			'to_type' => 'reply', 'to_fieldname' => 'post_parent',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'dateline',
+			'to_type' => 'reply', 'to_fieldname' => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'dateline',
+			'to_type' => 'reply', 'to_fieldname' => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'dateline',
+			'to_type' => 'reply', 'to_fieldname' => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'post', 'from_fieldname' => 'dateline',
+			'to_type' => 'reply', 'to_fieldname' => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** User Section ******************************************************/
+
+		// Store old User id. Stores in usermeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'userid',
+			'to_type' => 'user', 'to_fieldname' => '_bbp_user_id'
+		);
+		
+		// Store old User password. Stores in usermeta serialized with salt.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'password',
+			'to_type' => 'user', 'to_fieldname' => '_bbp_password',
+			'callback_method' => 'callback_savepass'
+		);
+
+		// Store old User Salt. This is only used for the SELECT row info for the above password save
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'salt',
+			'to_type' => 'user', 'to_fieldname' => ''
+		);
+				
+		// User password verify class. Stores in usermeta for verifying password.
+		$this->field_map[] = array(
+			'to_type' => 'user', 'to_fieldname' => '_bbp_class',
+			'default' => 'Vbulletin'
+		);
+		
+		// User name.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'username',
+			'to_type' => 'user', 'to_fieldname' => 'user_login'
+		);
+				
+		// User email.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'email',
+			'to_type' => 'user', 'to_fieldname' => 'user_email'
+		);
+		
+		// User homepage.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'homepage',
+			'to_type' => 'user', 'to_fieldname' => 'user_url'
+		);
+		
+		// User registered.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'joindate',
+			'to_type' => 'user', 'to_fieldname' => 'user_registered',
+			'callback_method' => 'callback_datetime'
+		);
+		
+		// User aim.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'aim',
+			'to_type' => 'user', 'to_fieldname' => 'aim'
+		);
+		
+		// User yahoo.
+		$this->field_map[] = array(
+			'from_tablename' => 'user', 'from_fieldname' => 'yahoo',
+			'to_type' => 'user', 'to_fieldname' => 'yim'
+		);	
+	}
+	
+	/**
+	 * This method allows us to indicates what is or is not converted for each
+	 * converter.
+	 */
+	public function info()
+	{
+		return '';
+	}
+
+	/**
+	 * This method is to save the salt and password together.  That
+	 * way when we authenticate it we can get it out of the database
+	 * as one value. Array values are auto sanitized by wordpress.
+	 */
+	public function callback_savepass( $field, $row )
+	{
+		$pass_array = array( 'hash' => $field, 'salt' => $row['salt'] );
+		return $pass_array;
+	}
+
+	/**
+	 * This method is to take the pass out of the database and compare
+	 * to a pass the user has typed in.
+	 */
+	public function authenticate_pass( $password, $serialized_pass )
+	{
+		$pass_array = unserialize( $serialized_pass );
+		return ( $pass_array['hash'] == md5( md5( $password ). $pass_array['salt'] ) );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/Invision.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,363 @@
+<?php
+
+/**
+ * Implementation of Invision Power Board converter.
+ */
+class Invision extends BBP_Converter_Base
+{
+	function __construct()
+	{
+		parent::__construct();
+		$this->setup_globals();
+	}
+
+	public function setup_globals()
+	{
+		/** Forum Section ******************************************************/
+
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'id',
+			'to_type' => 'forum', 'to_fieldname' => '_bbp_forum_id'
+		);
+		
+		// Forum parent id.  If no parent, than 0. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'parent_id',
+			'to_type' => 'forum', 'to_fieldname' => '_bbp_parent_id'
+		);
+		
+		// Forum title.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'name',
+			'to_type' => 'forum', 'to_fieldname' => 'post_title'
+		);
+		
+		// Forum slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'name',
+			'to_type' => 'forum', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum description.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'description',
+			'to_type' => 'forum', 'to_fieldname' => 'post_content',
+			'callback_method' => 'callback_null'
+		);
+		
+		// Forum display order.  Starts from 1.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums', 'from_fieldname' => 'position',
+			'to_type' => 'forum', 'to_fieldname' => 'menu_order'
+		);
+		
+		// Forum date update.
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_date',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_date_gmt',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_modified',
+			'default' => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type' => 'forum', 'to_fieldname' => 'post_modified_gmt',
+			'default' => date('Y-m-d H:i:s')
+		);
+
+		/** Topic Section ******************************************************/
+
+		// Topic id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'tid',
+			'to_type' => 'topic', 'to_fieldname' => '_bbp_topic_id'
+		);
+		
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'forum_id',
+			'to_type' => 'topic', 'to_fieldname' => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+				
+		// Topic author.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'starter_id',
+			'to_type' => 'topic', 'to_fieldname' => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+			
+		// Topic content.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post',
+			'join_tablename' => 'topics', 'join_type' => 'INNER', 'join_expression' => 'ON(topics.tid = posts.topic_id) WHERE posts.new_topic = 1',
+			'to_type' => 'topic', 'to_fieldname' => 'post_content',
+			'callback_method' => 'callback_html'
+		);	
+		
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'title',
+			'to_type' => 'topic', 'to_fieldname' => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'title',
+			'to_type' => 'topic', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'forum_id',
+			'to_type' => 'topic', 'to_fieldname' => 'post_parent',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'start_date',
+			'to_type' => 'topic', 'to_fieldname' => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'start_date',
+			'to_type' => 'topic', 'to_fieldname' => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'last_post',
+			'to_type' => 'topic', 'to_fieldname' => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics', 'from_fieldname' => 'last_post',
+			'to_type' => 'topic', 'to_fieldname' => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** Tags Section ******************************************************/
+		
+		// Topic id.
+		$this->field_map[] = array(
+			'from_tablename' => 'core_tags', 'from_fieldname' => 'tag_meta_id',
+			'to_type' => 'tags', 'to_fieldname' => 'objectid',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Tags text.
+		$this->field_map[] = array(
+			'from_tablename' => 'core_tags', 'from_fieldname' => 'tag_text',
+			'to_type' => 'tags', 'to_fieldname' => 'name'
+		);	
+		
+		/** Post Section ******************************************************/
+
+		// Post id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'pid', 'from_expression' => 'WHERE posts.new_topic = 0',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_post_id'
+		);
+		
+		// Forum id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'topic_id',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_forum_id',
+			'callback_method' => 'callback_topicid_to_forumid'
+		);
+		
+		// Topic id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'topic_id',
+			'to_type' => 'reply', 'to_fieldname' => '_bbp_topic_id',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'ip_address',
+			'to_type' => 'reply', 'to_fieldname' => '__bbp_author_ip'
+		);	
+			
+		// Post author.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'author_id',
+			'to_type' => 'reply', 'to_fieldname' => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+		
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post_title',
+			'to_type' => 'reply', 'to_fieldname' => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post_title',
+			'to_type' => 'reply', 'to_fieldname' => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Post content.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post',
+			'to_type' => 'reply', 'to_fieldname' => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+		
+		// Topic id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'topic_id',
+			'to_type' => 'reply', 'to_fieldname' => 'post_parent',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post_date',
+			'to_type' => 'reply', 'to_fieldname' => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'post_date',
+			'to_type' => 'reply', 'to_fieldname' => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'edit_time',
+			'to_type' => 'reply', 'to_fieldname' => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts', 'from_fieldname' => 'edit_time',
+			'to_type' => 'reply', 'to_fieldname' => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** User Section ******************************************************/
+
+		// Store old User id. Stores in usermeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'member_id',
+			'to_type' => 'user', 'to_fieldname' => '_bbp_user_id'
+		);
+		
+		// Store old User password. Stores in usermeta serialized with salt.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'members_pass_hash',
+			'to_type' => 'user', 'to_fieldname' => '_bbp_password',
+			'callback_method' => 'callback_savepass'
+		);
+
+		// Store old User Salt. This is only used for the SELECT row info for the above password save
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'members_pass_salt',
+			'to_type' => 'user', 'to_fieldname' => ''
+		);
+				
+		// User password verify class. Stores in usermeta for verifying password.
+		$this->field_map[] = array(
+			'to_type' => 'user', 'to_fieldname' => '_bbp_class',
+			'default' => 'Invision'
+		);
+		
+		// User name.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'name',
+			'to_type' => 'user', 'to_fieldname' => 'user_login'
+		);
+				
+		// User email.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'email',
+			'to_type' => 'user', 'to_fieldname' => 'user_email'
+		);
+		
+		// User registered.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'joined',
+			'to_type' => 'user', 'to_fieldname' => 'user_registered',
+			'callback_method' => 'callback_datetime'
+		);
+				
+/*	
+ * Table pfields_content AND pfields_data	
+		// User homepage.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'homepage',
+			'to_type' => 'user', 'to_fieldname' => 'user_url'
+		);		
+		
+		// User aim.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'aim',
+			'to_type' => 'user', 'to_fieldname' => 'aim'
+		);
+		
+		// User yahoo.
+		$this->field_map[] = array(
+			'from_tablename' => 'members', 'from_fieldname' => 'yahoo',
+			'to_type' => 'user', 'to_fieldname' => 'yim'
+		);
+*/		
+		
+	}
+
+	/**
+	 * This method allows us to indicates what is or is not converted for each
+	 * converter.
+	 */
+	public function info()
+	{
+		return '';
+	}
+
+	/**
+	 * This method is to save the salt and password together.  That
+	 * way when we authenticate it we can get it out of the database
+	 * as one value. Array values are auto sanitized by wordpress.
+	 */
+	public function callback_savepass( $field, $row )
+	{
+		$pass_array = array( 'hash' => $field, 'salt' => $row['members_pass_salt'] );
+		return $pass_array;
+	}
+
+	/**
+	 * This method is to take the pass out of the database and compare
+	 * to a pass the user has typed in.
+	 */
+	public function authenticate_pass( $password, $serialized_pass )
+	{
+		$pass_array = unserialize( $serialized_pass );
+		return ( $pass_array['hash'] == md5( md5( $pass_array['salt'] ) . md5( $this->to_char( $password ) ) ) );
+	}
+
+	public function to_char( $input )
+	{
+		$output = "";
+		for( $i = 0; $i < strlen( $input ); $i++ )
+		{
+			$j = ord( $input{$i} );
+			if( ( $j >= 65 && $j <= 90 )
+				|| ( $j >= 97 && $j <= 122 )
+				|| ( $j >= 48 && $j <= 57 ) )
+			{
+				$output .= $input{$i};
+			}
+			else
+			{
+				$output .= "&#" . ord( $input{$i} ) . ";";
+			}
+		}
+		return $output;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/bbPress1.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,560 @@
+<?php
+
+/**
+ * bbPress 1.1 Converter
+ *
+ * @since bbPress (rxxxx)
+ */
+class bbPress1 extends BBP_Converter_Base {
+
+	/**
+	 * Main constructor
+	 *
+	 * @uses bbPress1::setup_globals()
+	 */
+	function __construct() {
+		parent::__construct();
+		$this->setup_globals();
+	}
+
+	/**
+	 * Sets up the field mappings
+	 */
+	public function setup_globals() {
+
+		/** Forum Section *****************************************************/
+
+		// Forum id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_id',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_forum_id'
+		);
+
+		// Forum parent id (If no parent, 0. Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_parent',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_forum_parent_id'
+		);
+
+		// Forum topic count (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'topics',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_topic_count'
+		);
+
+		// Forum reply count (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'posts',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_reply_count'
+		);
+
+		// Forum topic count (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'topics',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_total_topic_count'
+		);
+
+		// Forum reply count (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'posts',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_total_reply_count'
+		);
+
+		// Forum title.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_name',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'post_title'
+		);
+
+		// Forum slug (Clean name to avoid confilcts)
+		$this->field_map[] = array(
+			'from_tablename'   => 'forums',
+			'from_fieldname'   => 'forum_slug',
+			'to_type'          => 'forum',
+			'to_fieldname'     => 'post_name',
+			'callback_method'  => 'callback_slug'
+		);
+
+		// Forum description.
+		$this->field_map[] = array(
+			'from_tablename'   => 'forums',
+			'from_fieldname'   => 'forum_desc',
+			'to_type'          => 'forum',
+			'to_fieldname'     => 'post_content',
+			'callback_method'  => 'callback_null'
+		);
+
+		// Forum display order (Starts from 1)
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_order',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'menu_order'
+		);
+
+		// Forum dates.
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_date',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_date_gmt',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_modified',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_modified_gmt',
+			'default'      => date('Y-m-d H:i:s')
+		);
+
+		/** Topic Section *****************************************************/
+
+		// Topic id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_id',
+			'to_type'        => 'topic',
+			'to_fieldname'   => '_bbp_topic_id'
+		);
+
+		// Reply count (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_posts',
+			'to_type'         => 'topic',
+			'to_fieldname'    => '_bbp_reply_count',
+			'callback_method' => 'callback_topic_reply_count'
+		);
+
+		// Forum id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'topic',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_poster',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_title',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_title'
+		);
+
+		// Topic slug (Clean name to avoid conflicts)
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_title',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+
+		// Topic content.
+		// Note: We join the posts table because topics do not have content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_text',
+			'join_tablename'  => 'topics',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_position IN (0,1)',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+
+		// Topic status.
+		// Note: post_status is more accurate than topic_status
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_status',
+			'join_tablename'  => 'topics',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_position IN (0,1)',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_status',
+			'callback_method' => 'callback_status'
+		);
+
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'poster_ip',
+			'join_tablename'  => 'topics',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_position IN (0,1)',
+			'to_type'         => 'topic',
+			'to_fieldname'    => '_bbp_author_ip'
+		);
+
+		// Forum id (If no parent, 0)
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic dates.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_start_time',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_date'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_start_time',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_date_gmt'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_time',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_modified'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_time',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_modified_gmt'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_time',
+			'to_type'        => 'topic',
+			'to_fieldname'   => '_bbp_last_active_time'
+		);
+
+		/** Tags Section ******************************************************/
+
+		// Topic id.
+		$this->field_map[] = array(
+			'from_tablename'  => 'term_relationships',
+			'from_fieldname'  => 'object_id',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'objectid',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Taxonomy ID.
+		$this->field_map[] = array(
+			'from_tablename'  => 'term_taxonomy',
+			'from_fieldname'  => 'term_taxonomy_id',
+			'join_tablename'  => 'term_relationships',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (term_taxonomy_id)',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'taxonomy'
+		);
+
+		// Term text.
+		$this->field_map[] = array(
+			'from_tablename'  => 'terms',
+			'from_fieldname'  => 'name',
+			'join_tablename'  => 'term_taxonomy',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (term_id)',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'name'
+		);
+
+		/** Reply Section *****************************************************/
+
+		// Post id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_post_id'
+		);
+
+		// Topic id (Stores in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'topic_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_topic_id',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Forum id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic title (for reply title).
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_title',
+			'join_tablename'  => 'posts',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_position NOT IN (0,1)',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_title',
+			'callback_method' => 'callback_reply_title'
+		);
+
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'poster_ip',
+			'to_type'        => 'reply',
+			'to_fieldname'   => '_bbp_author_ip'
+		);
+
+		// Reply author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'poster_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+
+		// Reply status
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_status',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_status',
+			'callback_method' => 'callback_status'
+		);
+
+		// Reply content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_text',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+
+		// Reply order.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_position',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'menu_order'
+		);
+
+		// Topic id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'topic_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Reply dates.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_time',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_date'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_time',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_date_gmt'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_time',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_modified'
+		);
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_time',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_modified_gmt'
+		);
+
+		/** User Section ******************************************************/
+
+		// Store old User id. Stores in usermeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'ID',
+			'to_type'        => 'user',
+			'to_fieldname'   => '_bbp_user_id'
+		);
+
+		// Store old User password. Stores in usermeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_pass',
+			'to_type'        => 'user',
+			'to_fieldname'   => '_bbp_password'
+		);
+
+		// User name.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_login',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_login'
+		);
+
+		// User nice name.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_nicename',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_nicename'
+		);
+
+		// User email.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_email',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_email'
+		);
+
+		// User homepage.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_url',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_url'
+		);
+
+		// User registered.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_registered',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_registered'
+		);
+
+		// User status.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_status',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_status'
+		);
+
+		// User status.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'display_name',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'display_name'
+		);
+	}
+
+	/**
+	 * This method allows us to indicates what is or is not converted for each
+	 * converter.
+	 */
+	public function info() {
+		return '';
+	}
+
+	/**
+	 * Translate the post status from bbPress 1's numeric's to WordPress's
+	 * strings.
+	 *
+	 * @param int $status bbPress 1.x numeric status
+	 * @return string WordPress safe
+	 */
+	public function callback_status( $status = 0 ) {
+		switch ( $status ) {
+			case 2 :
+				$status = 'spam';    // bbp_get_spam_status_id()
+				break;
+
+			case 1 :
+				$status = 'trash';   // bbp_get_trash_status_id()
+				break;
+
+			case 0  :
+			default :
+				$status = 'publish'; // bbp_get_public_status_id()
+				break;
+		}
+		return $status;
+	}
+
+	/**
+	 * Verify the topic reply count.
+	 *
+	 * @param int $count bbPress 1.x reply count
+	 * @return string WordPress safe
+	 */
+	public function callback_topic_reply_count( $count = 1 ) {
+		$count = absint( (int) $count - 1 );
+		return $count;
+	}
+
+	/**
+	 * Set the reply title
+	 *
+	 * @param string $title bbPress 1.x topic title of this reply
+	 * @return string Prefixed topic title, or empty string
+	 */
+	public function callback_reply_title( $title = '' ) {
+		$title = !empty( $title ) ? __( 'Re: ', 'bbpress' ) . html_entity_decode( $title ) : '';
+		return $title;
+	}
+
+	/**
+	 * This method is to save the salt and password together. That
+	 * way when we authenticate it we can get it out of the database
+	 * as one value. Array values are auto sanitized by wordpress.
+	 */
+	public function callback_savepass( $field, $row ) {
+		return false;
+	}
+
+	/**
+	 * This method is to take the pass out of the database and compare
+	 * to a pass the user has typed in.
+	 */
+	public function authenticate_pass( $password, $serialized_pass ) {
+		return false;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/phpBB.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,538 @@
+<?php
+
+/**
+ * Implementation of phpBB converter.
+ */
+class phpBB extends BBP_Converter_Base {
+	function __construct() {
+		parent::__construct();
+		$this->setup_globals();
+	}
+
+	public function setup_globals() {
+
+		/** Forum Section ******************************************************/
+
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_id',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_forum_id'
+		);
+		
+		// Forum parent id.  If no parent, than 0. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'parent_id',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_parent_id'
+		);
+		
+		// Forum title.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'forum_name',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'post_title'
+		);
+		
+		// Forum slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename'  => 'forums',
+			'from_fieldname'  => 'forum_name',
+			'to_type'         => 'forum',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum description.
+		$this->field_map[] = array(
+			'from_tablename'  => 'forums',
+			'from_fieldname'  => 'forum_desc',
+			'to_type'         => 'forum',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_null'
+		);
+		
+		// Forum display order.  Starts from 1.
+		$this->field_map[] = array(
+			'from_tablename' => 'forums',
+			'from_fieldname' => 'display_on_index',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'menu_order'
+		);
+		
+		// Forum date update.
+		$this->field_map[] = array(
+			'to_type'      => 'forums',
+			'to_fieldname' => 'forum_last_post_time',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forums',
+			'to_fieldname' => 'forum_last_post_time',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forums',
+			'to_fieldname' => 'forum_last_post_time',
+			'default'      => date('Y-m-d H:i:s')
+		);
+		$this->field_map[] = array(
+			'to_type'      => 'forums',
+			'to_fieldname' => 'forum_last_post_time',
+			'default'      => date('Y-m-d H:i:s')
+		);
+
+		/** Topic Section ******************************************************/
+
+		// Topic id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_id',
+			'to_type'        => 'topic',
+			'to_fieldname'   => '_bbp_topic_id'
+		);
+		
+		// Forum id. Stored in postmeta.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'topic',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+				
+		// Topic author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_poster',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+
+		// Topic content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_text',
+			'join_tablename'  => 'topics',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_id = topics.topic_first_post_id',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);	
+
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'topics',
+			'from_fieldname' => 'topic_title',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_title',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Forum id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_time',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_time',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_time',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_time',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		
+		/** Tags Section ******************************************************/
+		/*
+		// Topic id.
+		$this->field_map[] = array(
+			'from_tablename'  => 'tagcontent',
+			'from_fieldname'  => 'contentid',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'objectid',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Tags text.
+		$this->field_map[] = array(
+			'from_tablename'  => 'tag',
+			'from_fieldname'  => 'tagtext',
+			'join_tablename'  => 'tagcontent',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (tagid)',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'name'
+		);		
+		*/
+		
+		/** Post Section ******************************************************/
+
+		// Post id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_id',
+			'to_type'        => 'reply',
+			'to_fieldname'   => '_bbp_post_id'
+		);
+		
+		// Topic content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'topics',
+			'from_fieldname'  => 'topic_id',
+			'join_tablename'  => 'posts',
+			'join_type'       => 'LEFT',
+			'join_expression' => 'USING (topic_id) WHERE posts.post_id != topics.topic_first_post_id',
+			'to_type'         => 'reply'
+		);	
+		
+		// Forum id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'forum_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_topicid_to_forumid'
+		);
+		
+		// Topic id. Stores in postmeta.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'topic_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_topic_id',
+			'callback_method' => 'callback_topicid'
+		);
+		
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'poster_ip',
+			'to_type'        => 'reply',
+			'to_fieldname'   => '_bbp_author_ip'
+		);	
+			
+		// Post author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'poster_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+		
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'posts',
+			'from_fieldname' => 'post_subject',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_title'
+		);
+		
+		// Topic slug. Clean name.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_subject',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+		
+		// Post content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_text',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+		
+		// Topic id.  If no parent, than 0.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'topic_id',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_time',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_time',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_time',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'posts',
+			'from_fieldname'  => 'post_time',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** User Section ******************************************************/
+
+		// Store old User id. Stores in usermeta.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_id',
+			'to_type'        => 'user',
+			'to_fieldname'   => '_bbp_user_id'
+		);
+		
+		// Store old User password. Stores in usermeta serialized with salt.
+		$this->field_map[] = array(
+			'from_tablename'  => 'users',
+			'from_fieldname'  => 'user_password',
+			'to_type'         => 'user',
+			'to_fieldname'    => '_bbp_password',
+			'callback_method' => 'callback_savepass'
+		);
+
+		// Store old User Salt. This is only used for the SELECT row info for the above password save
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_form_salt',
+			'to_type'        => 'user',
+			'to_fieldname'   => ''
+		);
+				
+		// User password verify class. Stores in usermeta for verifying password.
+		$this->field_map[] = array(
+			'to_type'      => 'user',
+			'to_fieldname' => '_bbp_class',
+			'default'      => 'phpBB'
+		);
+				
+		// User name.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'username',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_login'
+		);
+				
+		// User email.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_email',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_email'
+		);
+		
+		// User homepage.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_website',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_url'
+		);
+		
+		// User registered.
+		$this->field_map[] = array(
+			'from_tablename'  => 'users',
+			'from_fieldname'  => 'user_regdate',
+			'to_type'         => 'user',
+			'to_fieldname'    => 'user_registered',
+			'callback_method' => 'callback_datetime'
+		);
+		
+		// User aim.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_aim',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'aim'
+		);
+		
+		// User yahoo.
+		$this->field_map[] = array(
+			'from_tablename' => 'users',
+			'from_fieldname' => 'user_yim',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'yim'
+		);	
+	}
+
+	/**
+	 * This method allows us to indicates what is or is not converted for each
+	 * converter.
+	 */
+	public function info() {
+		return '';
+	}
+
+	/**
+	 * This method is to save the salt and password together.  That
+	 * way when it is authenticate it we can get it out of the database
+	 * as one value.
+	 */
+	public function callback_savepass( $field, $row ) {
+		$pass_array = array('hash' => $field, 'salt' => $row['salt']);
+		return $pass_array;
+	}
+	
+	/**
+	 * Check for correct password
+	 *
+	 * @param string $password The password in plain text
+	 * @param string $hash The stored password hash
+	 *
+	 * @return bool Returns true if the password is correct, false if not.
+	 */
+	public function authenticate_pass($password, $serialized_pass) {
+		$itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';
+		$pass_array = unserialize($serialized_pass);
+		if (strlen($pass_array['hash']) == 34) {				
+			return ($this->_hash_crypt_private($password, $pass_array['hash'], $itoa64) === $pass_array['hash']) ? true : false;
+		}
+	
+		return (md5($password) === $pass_array['hash']) ? true : false;
+	}
+	
+	/**
+	 * The crypt function/replacement
+	 */
+	private function _hash_crypt_private($password, $setting, &$itoa64) {
+		$output = '*';
+	
+		// Check for correct hash
+		if (substr($setting, 0, 3) != '$H$') {
+			return $output;
+		}
+	
+		$count_log2 = strpos($itoa64, $setting[3]);
+	
+		if ($count_log2 < 7 || $count_log2 > 30) {
+			return $output;
+		}
+	
+		$count = 1 << $count_log2;
+		$salt = substr($setting, 4, 8);
+	
+		if (strlen($salt) != 8) {
+			return $output;
+		}
+	
+		/**
+		 * We're kind of forced to use MD5 here since it's the only
+		 * cryptographic primitive available in all versions of PHP
+		 * currently in use.  To implement our own low-level crypto
+		 * in PHP would result in much worse performance and
+		 * consequently in lower iteration counts and hashes that are
+		 * quicker to crack (by non-PHP code).
+		 */
+		if (floatval(phpversion()) >= 5) {
+			$hash = md5($salt . $password, true);
+			do
+			{
+				$hash = md5($hash . $password, true);
+			}
+			while (--$count);
+		} else {
+			$hash = pack('H*', md5($salt . $password));
+			do {
+				$hash = pack('H*', md5($hash . $password));
+			}
+			while (--$count);
+		}
+
+		$output = substr($setting, 0, 12);
+		$output .= $this->_hash_encode64($hash, 16, $itoa64);
+	
+		return $output;
+	}
+		
+	/**
+	 * Encode hash
+	 */
+	private function _hash_encode64($input, $count, &$itoa64) {
+		$output = '';
+		$i = 0;
+	
+		do {
+			$value = ord($input[$i++]);
+			$output .= $itoa64[$value & 0x3f];
+	
+			if ($i < $count) {
+				$value |= ord($input[$i]) << 8;
+			}
+	
+			$output .= $itoa64[($value >> 6) & 0x3f];
+	
+			if ($i++ >= $count) {
+				break;
+			}
+	
+			if ($i < $count) {
+				$value |= ord($input[$i]) << 16;
+			}
+	
+			$output .= $itoa64[($value >> 12) & 0x3f];
+	
+			if ($i++ >= $count) {
+				break;
+			}
+	
+			$output .= $itoa64[($value >> 18) & 0x3f];
+		}
+		while ($i < $count);
+	
+		return $output;
+	}
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/converters/vBulletin.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,448 @@
+<?php
+
+/**
+ * vBulletin Converter
+ *
+ * @since bbPress (r)
+ */
+class vBulletin extends BBP_Converter_Base {
+
+	/**
+	 * Main constructor
+	 *
+	 * @uses vBulletin::setup_globals()
+	 */
+	function __construct() {
+		parent::__construct();
+		$this->setup_globals();
+	}
+
+	/**
+	 * Sets up the field mappings
+	 */
+	private function setup_globals() {
+
+		/** Forum Section *****************************************************/
+
+		// Forum id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forum',
+			'from_fieldname' => 'forumid',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_forum_id'
+		);
+
+		// Forum parent id (If no parent, than 0. Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'forum',
+			'from_fieldname' => 'parentid',
+			'to_type'        => 'forum',
+			'to_fieldname'   => '_bbp_forum_parent_id'
+		);
+
+		// Forum title.
+		$this->field_map[] = array(
+			'from_tablename' => 'forum',
+			'from_fieldname' => 'title',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'post_title'
+		);
+
+		// Forum slug (Clean name to avoid confilcts)
+		$this->field_map[] = array(
+			'from_tablename'  => 'forum',
+			'from_fieldname'  => 'title_clean',
+			'to_type'         => 'forum',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+
+		// Forum description.
+		$this->field_map[] = array(
+			'from_tablename'  => 'forum',
+			'from_fieldname'  => 'description',
+			'to_type'         => 'forum',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_null'
+		);
+
+		// Forum display order (Starts from 1)
+		$this->field_map[] = array(
+			'from_tablename' => 'forum',
+			'from_fieldname' => 'displayorder',
+			'to_type'        => 'forum',
+			'to_fieldname'   => 'menu_order'
+		);
+
+		// Forum date update.
+		$this->field_map[] = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_date',
+			'default'      => date( 'Y-m-d H:i:s' )
+		);
+		$this->field_map[]	 = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_date_gmt',
+			'default'      => date( 'Y-m-d H:i:s' )
+		);
+		$this->field_map[]	 = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_modified',
+			'default'      => date( 'Y-m-d H:i:s' )
+		);
+		$this->field_map[]	 = array(
+			'to_type'      => 'forum',
+			'to_fieldname' => 'post_modified_gmt',
+			'default'      => date( 'Y-m-d H:i:s' )
+		);
+
+		/** Topic Section *****************************************************/
+
+		// Topic id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'thread',
+			'from_fieldname' => 'threadid',
+			'to_type'        => 'topic',
+			'to_fieldname'   => '_bbp_topic_id'
+		);
+
+		// Forum id (Stored in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'forumid',
+			'to_type'         => 'topic',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'postuserid',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'thread',
+			'from_fieldname' => 'title',
+			'to_type'        => 'topic',
+			'to_fieldname'   => 'post_title'
+		);
+
+		// Topic slug (Clean name to avoid conflicts)
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'title',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+
+		// Forum id (If no parent, than 0)
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'forumid',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_forumid'
+		);
+
+		// Topic content.
+		// Note: We join the posts table because topics do not have content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'pagetext',
+			'join_tablename'  => 'thread',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (threadid) WHERE post.parentid = 0',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'thread',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'topic',
+			'to_fieldname'    => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** Tags Section ******************************************************/
+
+		// Topic id.
+		$this->field_map[] = array(
+			'from_tablename'  => 'tagcontent',
+			'from_fieldname'  => 'contentid',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'objectid',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Tags text.
+		$this->field_map[] = array(
+			'from_tablename'  => 'tag',
+			'from_fieldname'  => 'tagtext',
+			'join_tablename'  => 'tagcontent',
+			'join_type'       => 'INNER',
+			'join_expression' => 'USING (tagid)',
+			'to_type'         => 'tags',
+			'to_fieldname'    => 'name'
+		);
+
+		/** Post Section ******************************************************/
+
+		// Post id (Stores in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'postid',
+			'from_expression' => 'WHERE post.parentid != 0',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_post_id'
+		);
+
+		// Forum id (Stores in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'threadid',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_forum_id',
+			'callback_method' => 'callback_topicid_to_forumid'
+		);
+
+		// Topic id (Stores in postmeta)
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'threadid',
+			'to_type'         => 'reply',
+			'to_fieldname'    => '_bbp_topic_id',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Author ip.
+		$this->field_map[] = array(
+			'from_tablename' => 'post',
+			'from_fieldname' => 'ipaddress',
+			'to_type'        => 'reply',
+			'to_fieldname'   => '_bbp_author_ip'
+		);
+
+		// Post author.
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'userid',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_author',
+			'callback_method' => 'callback_userid'
+		);
+
+		// Topic title.
+		$this->field_map[] = array(
+			'from_tablename' => 'post',
+			'from_fieldname' => 'title',
+			'to_type'        => 'reply',
+			'to_fieldname'   => 'post_title'
+		);
+
+		// Topic slug (Clean name)
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'title',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_name',
+			'callback_method' => 'callback_slug'
+		);
+
+		// Post content.
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'pagetext',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_content',
+			'callback_method' => 'callback_html'
+		);
+
+		// Topic id (If no parent, than 0)
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'threadid',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_parent',
+			'callback_method' => 'callback_topicid'
+		);
+
+		// Topic date update.
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_date',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_date_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[] = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_modified',
+			'callback_method' => 'callback_datetime'
+		);
+		$this->field_map[]	 = array(
+			'from_tablename'  => 'post',
+			'from_fieldname'  => 'dateline',
+			'to_type'         => 'reply',
+			'to_fieldname'    => 'post_modified_gmt',
+			'callback_method' => 'callback_datetime'
+		);
+
+		/** User Section ******************************************************/
+
+		// Store old User id (Stores in usermeta)
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'userid',
+			'to_type'        => 'user',
+			'to_fieldname'   => '_bbp_user_id'
+		);
+
+		// Store old User password (Stores in usermeta serialized with salt)
+		$this->field_map[] = array(
+			'from_tablename'  => 'user',
+			'from_fieldname'  => 'password',
+			'to_type'         => 'user',
+			'to_fieldname'    => '_bbp_password',
+			'callback_method' => 'callback_savepass'
+		);
+
+		// Store old User Salt (This is only used for the SELECT row info for
+		// the above password save)
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'salt',
+			'to_type'        => 'user',
+			'to_fieldname'   => ''
+		);
+
+		// User password verify class (Stores in usermeta for verifying password)
+		$this->field_map[] = array(
+			'to_type'      => 'user',
+			'to_fieldname' => '_bbp_class',
+			'default'      => 'vBulletin'
+		);
+
+		// User name.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'username',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_login'
+		);
+
+		// User nice name.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'user_nicename',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_nicename'
+		);
+
+		// User email.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'email',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_email'
+		);
+
+		// User homepage.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'homepage',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'user_url'
+		);
+
+		// User registered.
+		$this->field_map[] = array(
+			'from_tablename'  => 'user',
+			'from_fieldname'  => 'joindate',
+			'to_type'         => 'user',
+			'to_fieldname'    => 'user_registered',
+			'callback_method' => 'callback_datetime'
+		);
+
+		// User aim.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'aim',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'aim'
+		);
+
+		// User yahoo.
+		$this->field_map[] = array(
+			'from_tablename' => 'user',
+			'from_fieldname' => 'yahoo',
+			'to_type'        => 'user',
+			'to_fieldname'   => 'yim'
+		);
+	}
+
+	/**
+	 * This method allows us to indicates what is or is not converted for each
+	 * converter.
+	 */
+	public function info() {
+		return '';
+	}
+
+	/**
+	 * This method is to save the salt and password together.  That
+	 * way when we authenticate it we can get it out of the database
+	 * as one value. Array values are auto sanitized by wordpress.
+	 */
+	public function callback_savepass( $field, $row ) {
+		$pass_array = array( 'hash'	 => $field, 'salt'	 => $row['salt'] );
+		return $pass_array;
+	}
+
+	/**
+	 * This method is to take the pass out of the database and compare
+	 * to a pass the user has typed in.
+	 */
+	public function authenticate_pass( $password, $serialized_pass ) {
+		$pass_array = unserialize( $serialized_pass );
+		return ( $pass_array['hash'] == md5( md5( $password ) . $pass_array['salt'] ) );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/forums.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,594 @@
+<?php
+
+/**
+ * bbPress Forum Admin Class
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Forums_Admin' ) ) :
+/**
+ * Loads bbPress forums admin area
+ *
+ * @package bbPress
+ * @subpackage Administration
+ * @since bbPress (r2464)
+ */
+class BBP_Forums_Admin {
+
+	/** Variables *************************************************************/
+
+	/**
+	 * @var The post type of this admin component
+	 */
+	private $post_type = '';
+
+	/** Functions *************************************************************/
+
+	/**
+	 * The main bbPress forums admin loader
+	 *
+	 * @since bbPress (r2515)
+	 *
+	 * @uses BBP_Forums_Admin::setup_globals() Setup the globals needed
+	 * @uses BBP_Forums_Admin::setup_actions() Setup the hooks and actions
+	 * @uses BBP_Forums_Admin::setup_help() Setup the help text
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the admin hooks, actions and filters
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 * @uses add_filter() To add various filters
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 */
+	private function setup_actions() {
+
+		// Add some general styling to the admin area
+		add_action( 'bbp_admin_head',        array( $this, 'admin_head'       ) );
+
+		// Messages
+		add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
+
+		// Metabox actions
+		add_action( 'add_meta_boxes',        array( $this, 'attributes_metabox'      ) );
+		add_action( 'save_post',             array( $this, 'attributes_metabox_save' ) );
+
+		// Column headers.
+		add_filter( 'manage_' . $this->post_type . '_posts_columns',        array( $this, 'column_headers' )        );
+
+		// Columns (in page row)
+		add_action( 'manage_' . $this->post_type . '_posts_custom_column',  array( $this, 'column_data'    ), 10, 2 );
+		add_filter( 'page_row_actions',                                     array( $this, 'row_actions'    ), 10, 2 );
+
+		// Contextual Help
+		add_action( 'load-edit.php',     array( $this, 'edit_help' ) );
+		add_action( 'load-post-new.php', array( $this, 'new_help'  ) );
+	}
+
+	/**
+	 * Should we bail out of this method?
+	 *
+	 * @since bbPress (r4067)
+	 * @return boolean
+	 */
+	private function bail() {
+		if ( !isset( get_current_screen()->post_type ) || ( $this->post_type != get_current_screen()->post_type ) )
+			return true;
+
+		return false;
+	}
+
+	/**
+	 * Admin globals
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 */
+	private function setup_globals() {
+		$this->post_type = bbp_get_forum_post_type();
+	}
+
+	/** Contextual Help *******************************************************/
+
+	/**
+	 * Contextual help for bbPress forum edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function edit_help() {
+
+		if ( $this->bail() ) return;
+
+		// Overview
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'overview',
+			'title'		=> __( 'Overview', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'This screen displays the individual forums on your site. You can customize the display of this screen to suit your workflow.', 'bbpress' ) . '</p>'
+		) );
+
+		// Screen Content
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'screen-content',
+			'title'		=> __( 'Screen Content', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can customize the display of this screen&#8217;s contents in a number of ways:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( 'You can hide/display columns based on your needs and decide how many forums to list per screen using the Screen Options tab.',                                                                                                                                'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can filter the list of forums by forum status using the text links in the upper left to show All, Published, or Trashed forums. The default view is to show all forums.',                                                                                 'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can refine the list to show only forums from a specific month by using the dropdown menus above the forums list. Click the Filter button after making your selection. You also can refine the list by clicking on the forum creator in the forums list.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Available Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'action-links',
+			'title'		=> __( 'Available Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'Hovering over a row in the forums list will display action links that allow you to manage your forum. You can perform the following actions:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Edit</strong> takes you to the editing screen for that forum. You can also reach that screen by clicking on the forum title.',                                                                              'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Trash</strong> removes your forum from this list and places it in the trash, from which you can permanently delete it.',                                                                                    'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>View</strong> will show you what your draft forum will look like if you publish it. View will take you to your live site to view the forum. Which link is available depends on your forum&#8217;s status.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Bulk Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'bulk-actions',
+			'title'		=> __( 'Bulk Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can also edit or move multiple forums to the trash at once. Select the forums you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.',           'bbpress' ) . '</p>' .
+				'<p>' . __( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected forums at once. To remove a forum from the grouping, just click the x next to its name in the Bulk Edit area that appears.', 'bbpress' ) . '</p>'
+		) );
+
+		// Help Sidebar
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Contextual help for bbPress forum edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function new_help() {
+
+		if ( $this->bail() ) return;
+
+		$customize_display = '<p>' . __( 'The title field and the big forum editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.', 'bbpress' ) . '</p>';
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'customize-display',
+			'title'   => __( 'Customizing This Display', 'bbpress' ),
+			'content' => $customize_display,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'title-forum-editor',
+			'title'   => __( 'Title and Forum Editor', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Title</strong> - Enter a title for your forum. After you enter a title, you&#8217;ll see the permalink below, which you can edit.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Forum Editor</strong> - Enter the text for your forum. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your forum text. You can insert media files by clicking the icons above the forum editor and following the directions. You can go to the distraction-free writing screen via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular forum editor.', 'bbpress' ) . '</p>'
+		) );
+
+		$publish_box = '<p>' . __( '<strong>Publish</strong> - You can set the terms of publishing your forum in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a forum or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a forum to be published in the future or backdate a forum.', 'bbpress' ) . '</p>';
+
+		if ( current_theme_supports( 'forum-formats' ) && forum_type_supports( 'forum', 'forum-formats' ) ) {
+			$publish_box .= '<p>' . __( '<strong>forum Format</strong> - This designates how your theme will display a specific forum. For example, you could have a <em>standard</em> blog forum with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Please refer to the Codex for <a href="http://codex.wordpress.org/Post_Formats#Supported_Formats">descriptions of each forum format</a>. Your theme could enable all or some of 10 possible formats.', 'bbpress' ) . '</p>';
+		}
+
+		if ( current_theme_supports( 'forum-thumbnails' ) && forum_type_supports( 'forum', 'thumbnail' ) ) {
+			$publish_box .= '<p>' . __( '<strong>Featured Image</strong> - This allows you to associate an image with your forum without inserting it. This is usually useful only if your theme makes use of the featured image as a forum thumbnail on the home page, a custom header, etc.', 'bbpress' ) . '</p>';
+		}
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'forum-attributes',
+			'title'   => __( 'Forum Attributes', 'bbpress' ),
+			'content' =>
+				'<p>' . __( 'Select the attributes that your forum should have:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Type</strong> indicates if the forum is a category or forum. Categories generally contain other forums.',                                                                                'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Status</strong> allows you to close a forum to new topics and forums.',                                                                                                                  'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Visibility</strong> lets you pick the scope of each forum and what users are allowed to access it.',                                                                                     'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Parent</strong> dropdown determines the parent forum. Select the forum or category from the dropdown, or leave the default (No Parent) to create the forum at the root of your forums.', 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Order</strong> allows you to order your forums numerically.',                                                                                                                            'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'publish-box',
+			'title'   => __( 'Publish Box', 'bbpress' ),
+			'content' => $publish_box,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'discussion-settings',
+			'title'   => __( 'Discussion Settings', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Send Trackbacks</strong> - Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they&#8217;ll be notified automatically using pingbacks, and this field is unnecessary.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Discussion</strong> - You can turn comments and pings on or off, and if there are comments on the forum, you can see them here and moderate them.', 'bbpress' ) . '</p>'
+		) );
+
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Add the forum attributes metabox
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses add_meta_box() To add the metabox
+	 * @uses do_action() Calls 'bbp_forum_attributes_metabox'
+	 */
+	public function attributes_metabox() {
+
+		if ( $this->bail() ) return;
+
+		add_meta_box (
+			'bbp_forum_attributes',
+			__( 'Forum Attributes', 'bbpress' ),
+			'bbp_forum_metabox',
+			$this->post_type,
+			'side',
+			'high'
+		);
+
+		do_action( 'bbp_forum_attributes_metabox' );
+	}
+
+	/**
+	 * Pass the forum attributes for processing
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param int $forum_id Forum id
+	 * @uses current_user_can() To check if the current user is capable of
+	 *                           editing the forum
+	 * @uses bbp_get_forum() To get the forum
+	 * @uses bbp_is_forum_closed() To check if the forum is closed
+	 * @uses bbp_is_forum_category() To check if the forum is a category
+	 * @uses bbp_is_forum_private() To check if the forum is private
+	 * @uses bbp_close_forum() To close the forum
+	 * @uses bbp_open_forum() To open the forum
+	 * @uses bbp_categorize_forum() To make the forum a category
+	 * @uses bbp_normalize_forum() To make the forum normal (not category)
+	 * @uses bbp_privatize_forum() To mark the forum as private
+	 * @uses bbp_publicize_forum() To mark the forum as public
+	 * @uses do_action() Calls 'bbp_forum_attributes_metabox_save' with the
+	 *                    forum id
+	 * @return int Forum id
+	 */
+	public function attributes_metabox_save( $forum_id ) {
+
+		if ( $this->bail() ) return $forum_id;
+
+		// Bail if doing an autosave
+		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
+			return $forum_id;
+
+		// Bail if not a post request
+		if ( 'POST' != strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return $forum_id;
+
+		// Nonce check
+		if ( empty( $_POST['bbp_forum_metabox'] ) || !wp_verify_nonce( $_POST['bbp_forum_metabox'], 'bbp_forum_metabox_save' ) )
+			return $forum_id;
+
+		// Only save for forum post-types
+		if ( ! bbp_is_forum( $forum_id ) )
+			return $forum_id;
+
+		// Bail if current user cannot edit this forum
+		if ( !current_user_can( 'edit_forum', $forum_id ) )
+			return $forum_id;
+
+		// Parent ID
+		$parent_id = ( !empty( $_POST['parent_id'] ) && is_numeric( $_POST['parent_id'] ) ) ? (int) $_POST['parent_id'] : 0;
+
+		// Update the forum meta bidness
+		bbp_update_forum( array(
+			'forum_id'    => $forum_id,
+			'post_parent' => (int) $parent_id
+		) );
+
+		do_action( 'bbp_forum_attributes_metabox_save', $forum_id );
+
+		return $forum_id;
+	}
+
+	/**
+	 * Add some general styling to the admin area
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses sanitize_html_class() To sanitize the classes
+	 * @uses do_action() Calls 'bbp_admin_head'
+	 */
+	public function admin_head() {
+
+		if ( $this->bail() ) return;
+
+		?>
+
+		<style type="text/css" media="screen">
+		/*<![CDATA[*/
+
+			#misc-publishing-actions,
+			#save-post {
+				display: none;
+			}
+
+			strong.label {
+				display: inline-block;
+				width: 60px;
+			}
+
+			#bbp_forum_attributes hr {
+				border-style: solid;
+				border-width: 1px;
+				border-color: #ccc #fff #fff #ccc;
+			}
+
+			.column-bbp_forum_topic_count,
+			.column-bbp_forum_reply_count,
+			.column-bbp_topic_reply_count,
+			.column-bbp_topic_voice_count {
+				width: 8% !important;
+			}
+
+			.column-author,
+			.column-bbp_reply_author,
+			.column-bbp_topic_author {
+				width: 10% !important;
+			}
+
+			.column-bbp_topic_forum,
+			.column-bbp_reply_forum,
+			.column-bbp_reply_topic {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_freshness,
+			.column-bbp_topic_freshness {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_created,
+			.column-bbp_topic_created,
+			.column-bbp_reply_created {
+				width: 15% !important;
+			}
+
+			.status-closed {
+				background-color: #eaeaea;
+			}
+
+			.status-spam {
+				background-color: #faeaea;
+			}
+
+		/*]]>*/
+		</style>
+
+		<?php
+	}
+
+	/**
+	 * Manage the column headers for the forums page
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param array $columns The columns
+	 * @uses apply_filters() Calls 'bbp_admin_forums_column_headers' with
+	 *                        the columns
+	 * @return array $columns bbPress forum columns
+	 */
+	public function column_headers( $columns ) {
+
+		if ( $this->bail() ) return $columns;
+
+		$columns = array (
+			'cb'                    => '<input type="checkbox" />',
+			'title'                 => __( 'Forum',     'bbpress' ),
+			'bbp_forum_topic_count' => __( 'Topics',    'bbpress' ),
+			'bbp_forum_reply_count' => __( 'Replies',   'bbpress' ),
+			'author'                => __( 'Creator',   'bbpress' ),
+			'bbp_forum_created'     => __( 'Created' ,  'bbpress' ),
+			'bbp_forum_freshness'   => __( 'Freshness', 'bbpress' )
+		);
+
+		return apply_filters( 'bbp_admin_forums_column_headers', $columns );
+	}
+
+	/**
+	 * Print extra columns for the forums page
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param string $column Column
+	 * @param int $forum_id Forum id
+	 * @uses bbp_forum_topic_count() To output the forum topic count
+	 * @uses bbp_forum_reply_count() To output the forum reply count
+	 * @uses get_the_date() Get the forum creation date
+	 * @uses get_the_time() Get the forum creation time
+	 * @uses esc_attr() To sanitize the forum creation time
+	 * @uses bbp_get_forum_last_active_time() To get the time when the forum was
+	 *                                    last active
+	 * @uses do_action() Calls 'bbp_admin_forums_column_data' with the
+	 *                    column and forum id
+	 */
+	public function column_data( $column, $forum_id ) {
+
+		if ( $this->bail() ) return;
+
+		switch ( $column ) {
+			case 'bbp_forum_topic_count' :
+				bbp_forum_topic_count( $forum_id );
+				break;
+
+			case 'bbp_forum_reply_count' :
+				bbp_forum_reply_count( $forum_id );
+				break;
+
+			case 'bbp_forum_created':
+				printf( __( '%1$s <br /> %2$s', 'bbpress' ),
+					get_the_date(),
+					esc_attr( get_the_time() )
+				);
+
+				break;
+
+			case 'bbp_forum_freshness' :
+				$last_active = bbp_get_forum_last_active_time( $forum_id, false );
+				if ( !empty( $last_active ) )
+					echo $last_active;
+				else
+					_e( 'No Topics', 'bbpress' );
+
+				break;
+
+			default:
+				do_action( 'bbp_admin_forums_column_data', $column, $forum_id );
+				break;
+		}
+	}
+
+	/**
+	 * Forum Row actions
+	 *
+	 * Remove the quick-edit action link and display the description under
+	 * the forum title
+	 *
+	 * @since bbPress (r2577)
+	 *
+	 * @param array $actions Actions
+	 * @param array $forum Forum object
+	 * @uses the_content() To output forum description
+	 * @return array $actions Actions
+	 */
+	public function row_actions( $actions, $forum ) {
+
+		if ( $this->bail() ) return $actions;
+
+		unset( $actions['inline hide-if-no-js'] );
+
+		// simple hack to show the forum description under the title
+		bbp_forum_content( $forum->ID );
+
+		return $actions;
+	}
+
+	/**
+	 * Custom user feedback messages for forum post type
+	 *
+	 * @since bbPress (r3080)
+	 *
+	 * @global int $post_ID
+	 * @uses bbp_get_forum_permalink()
+	 * @uses wp_post_revision_title()
+	 * @uses esc_url()
+	 * @uses add_query_arg()
+	 *
+	 * @param array $messages
+	 *
+	 * @return array
+	 */
+	public function updated_messages( $messages ) {
+		global $post_ID;
+
+		if ( $this->bail() ) return $messages;
+
+		// URL for the current forum
+		$forum_url = bbp_get_forum_permalink( $post_ID );
+
+		// Current forum's post_date
+		$post_date = bbp_get_global_post_field( 'post_date', 'raw' );
+
+		// Messages array
+		$messages[$this->post_type] = array(
+			0 =>  '', // Left empty on purpose
+
+			// Updated
+			1 =>  sprintf( __( 'Forum updated. <a href="%s">View forum</a>', 'bbpress' ), $forum_url ),
+
+			// Custom field updated
+			2 => __( 'Custom field updated.', 'bbpress' ),
+
+			// Custom field deleted
+			3 => __( 'Custom field deleted.', 'bbpress' ),
+
+			// Forum updated
+			4 => __( 'Forum updated.', 'bbpress' ),
+
+			// Restored from revision
+			// translators: %s: date and time of the revision
+			5 => isset( $_GET['revision'] )
+					? sprintf( __( 'Forum restored to revision from %s', 'bbpress' ), wp_post_revision_title( (int) $_GET['revision'], false ) )
+					: false,
+
+			// Forum created
+			6 => sprintf( __( 'Forum created. <a href="%s">View forum</a>', 'bbpress' ), $forum_url ),
+
+			// Forum saved
+			7 => __( 'Forum saved.', 'bbpress' ),
+
+			// Forum submitted
+			8 => sprintf( __( 'Forum submitted. <a target="_blank" href="%s">Preview forum</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $forum_url ) ) ),
+
+			// Forum scheduled
+			9 => sprintf( __( 'Forum scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview forum</a>', 'bbpress' ),
+					// translators: Publish box date format, see http://php.net/date
+					date_i18n( __( 'M j, Y @ G:i', 'bbpress' ),
+					strtotime( $post_date ) ),
+					$forum_url ),
+
+			// Forum draft updated
+			10 => sprintf( __( 'Forum draft updated. <a target="_blank" href="%s">Preview forum</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $forum_url ) ) ),
+		);
+
+		return $messages;
+	}
+}
+endif; // class_exists check
+
+/**
+ * Setup bbPress Forums Admin
+ *
+ * This is currently here to make hooking and unhooking of the admin UI easy.
+ * It could use dependency injection in the future, but for now this is easier.
+ *
+ * @since bbPress (r2596)
+ *
+ * @uses BBP_Forums_Admin
+ */
+function bbp_admin_forums() {
+	bbpress()->admin->forums = new BBP_Forums_Admin();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,245 @@
+<?php
+
+/**
+ * bbPress Admin Functions
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Admin Menus ***************************************************************/
+
+/**
+ * Add a separator to the WordPress admin menus
+ *
+ * @since bbPress (r2957)
+ */
+function bbp_admin_separator() {
+
+	// Prevent duplicate separators when no new menu items exist
+	if ( !current_user_can( 'edit_forums' ) && !current_user_can( 'edit_topics' ) && !current_user_can( 'edit_replies' ) )
+		return;
+
+	// Prevent duplicate separators when no core menu items exist
+	if ( !current_user_can( 'manage_options' ) )
+		return;
+
+	global $menu;
+
+	$menu[] = array( '', 'read', 'separator-bbpress', '', 'wp-menu-separator bbpress' );
+}
+
+/**
+ * Tell WordPress we have a custom menu order
+ *
+ * @since bbPress (r2957)
+ *
+ * @param bool $menu_order Menu order
+ * @return bool Always true
+ */
+function bbp_admin_custom_menu_order( $menu_order = false ) {
+	if ( !current_user_can( 'edit_forums' ) && !current_user_can( 'edit_topics' ) && !current_user_can( 'edit_replies' ) )
+		return $menu_order;
+
+	return true;
+}
+
+/**
+ * Move our custom separator above our custom post types
+ *
+ * @since bbPress (r2957)
+ *
+ * @param array $menu_order Menu Order
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @return array Modified menu order
+ */
+function bbp_admin_menu_order( $menu_order ) {
+
+	// Bail if user cannot see any top level bbPress menus
+	if ( empty( $menu_order ) || ( !current_user_can( 'edit_forums' ) && !current_user_can( 'edit_topics' ) && !current_user_can( 'edit_replies' ) ) )
+		return $menu_order;
+
+	// Initialize our custom order array
+	$bbp_menu_order = array();
+
+	// Menu values
+	$second_sep   = 'separator2';
+	$custom_menus = array(
+		'separator-bbpress',                               // Separator
+		'edit.php?post_type=' . bbp_get_forum_post_type(), // Forums
+		'edit.php?post_type=' . bbp_get_topic_post_type(), // Topics
+		'edit.php?post_type=' . bbp_get_reply_post_type()  // Replies
+	);
+
+	// Loop through menu order and do some rearranging
+	foreach ( $menu_order as $item ) {
+
+		// Position bbPress menus above appearance
+		if ( $second_sep == $item ) {
+
+			// Add our custom menus
+			foreach( $custom_menus as $custom_menu ) {
+				if ( array_search( $custom_menu, $menu_order ) ) {
+					$bbp_menu_order[] = $custom_menu;
+				}
+			}
+
+			// Add the appearance separator
+			$bbp_menu_order[] = $second_sep;
+
+		// Skip our menu items
+		} elseif ( ! in_array( $item, $custom_menus ) ) {
+			$bbp_menu_order[] = $item;
+		}
+	}
+
+	// Return our custom order
+	return $bbp_menu_order;
+}
+
+/**
+ * Filter sample permalinks so that certain languages display properly.
+ *
+ * @since bbPress (r3336)
+ *
+ * @param string $post_link Custom post type permalink
+ * @param object $_post Post data object
+ * @param bool $leavename Optional, defaults to false. Whether to keep post name or page name.
+ * @param bool $sample Optional, defaults to false. Is it a sample permalink.
+ *
+ * @uses is_admin() To make sure we're on an admin page
+ * @uses bbp_is_custom_post_type() To get the forum post type
+ *
+ * @return string The custom post type permalink
+ */
+function bbp_filter_sample_permalink( $post_link, $_post, $leavename = false, $sample = false ) {
+
+	// Bail if not on an admin page and not getting a sample permalink
+	if ( !empty( $sample ) && is_admin() && bbp_is_custom_post_type() )
+		return urldecode( $post_link );
+
+	// Return post link
+	return $post_link;
+}
+
+/**
+ * Uninstall all bbPress options and capabilities from a specific site.
+ *
+ * @since bbPress (r3765)
+ * @param type $site_id
+ */
+function bbp_do_uninstall( $site_id = 0 ) {
+	if ( empty( $site_id ) )
+		$site_id = get_current_blog_id();
+
+	switch_to_blog( $site_id );
+	bbp_delete_options();
+	bbp_remove_caps();
+	flush_rewrite_rules();
+	restore_current_blog();
+}
+
+/**
+ * Redirect user to bbPress's What's New page on activation
+ *
+ * @since bbPress (r4389)
+ *
+ * @internal Used internally to redirect bbPress to the about page on activation
+ *
+ * @uses get_transient() To see if transient to redirect exists
+ * @uses delete_transient() To delete the transient if it exists
+ * @uses is_network_admin() To bail if being network activated
+ * @uses wp_safe_redirect() To redirect
+ * @uses add_query_arg() To help build the URL to redirect to
+ * @uses admin_url() To get the admin URL to index.php
+ *
+ * @return If no transient, or in network admin, or is bulk activation
+ */
+function bbp_do_activation_redirect() {
+
+	// Bail if no activation redirect
+    if ( ! get_transient( '_bbp_activation_redirect' ) )
+		return;
+
+	// Delete the redirect transient
+	delete_transient( '_bbp_activation_redirect' );
+
+	// Bail if activating from network, or bulk
+	if ( is_network_admin() || isset( $_GET['activate-multi'] ) )
+		return;
+
+	// Redirect to bbPress about page
+	wp_safe_redirect( add_query_arg( array( 'page' => 'bbp-about' ), admin_url( 'index.php' ) ) );
+}
+
+/**
+ * This tells WP to highlight the Tools > Forums menu item,
+ * regardless of which actual bbPress Tools screen we are on.
+ *
+ * The conditional prevents the override when the user is viewing settings or
+ * any third-party plugins.
+ *
+ * @since bbPress (r3888)
+ * @global string $plugin_page
+ * @global array $submenu_file
+ */
+function bbp_tools_modify_menu_highlight() {
+	global $plugin_page, $submenu_file;
+
+	// This tweaks the Tools subnav menu to only show one bbPress menu item
+	if ( ! in_array( $plugin_page, array( 'bbp-settings' ) ) )
+		$submenu_file = 'bbp-repair';
+}
+
+/**
+ * Output the tabs in the admin area
+ *
+ * @since bbPress (r3872)
+ * @param string $active_tab Name of the tab that is active
+ */
+function bbp_tools_admin_tabs( $active_tab = '' ) {
+	echo bbp_get_tools_admin_tabs( $active_tab );
+}
+
+	/**
+	 * Output the tabs in the admin area
+	 *
+	 * @since bbPress (r3872)
+	 * @param string $active_tab Name of the tab that is active
+	 */
+	function bbp_get_tools_admin_tabs( $active_tab = '' ) {
+
+		// Declare local variables
+		$tabs_html    = '';
+		$idle_class   = 'nav-tab';
+		$active_class = 'nav-tab nav-tab-active';
+
+		// Setup core admin tabs
+		$tabs = apply_filters( 'bbp_tools_admin_tabs', array(
+			'0' => array(
+				'href' => get_admin_url( '', add_query_arg( array( 'page' => 'bbp-repair'    ), 'tools.php' ) ),
+				'name' => __( 'Repair Forums', 'bbpress' )
+			),
+			'1' => array(
+				'href' => get_admin_url( '', add_query_arg( array( 'page' => 'bbp-converter' ), 'tools.php' ) ),
+				'name' => __( 'Import Forums', 'bbpress' )
+			),
+			'2' => array(
+				'href' => get_admin_url( '', add_query_arg( array( 'page' => 'bbp-reset'     ), 'tools.php' ) ),
+				'name' => __( 'Reset Forums', 'bbpress' )
+			)
+		) );
+
+		// Loop through tabs and build navigation
+		foreach( $tabs as $tab_id => $tab_data ) {
+			$is_current = (bool) ( $tab_data['name'] == $active_tab );
+			$tab_class  = $is_current ? $active_class : $idle_class;
+			$tabs_html .= '<a href="' . $tab_data['href'] . '" class="' . $tab_class . '">' . $tab_data['name'] . '</a>';
+		}
+
+		// Output the tabs
+		return $tabs_html;
+	}
Binary file web/wp-content/plugins/bbpress/includes/admin/images/badge-2x.png has changed
Binary file web/wp-content/plugins/bbpress/includes/admin/images/badge.png has changed
Binary file web/wp-content/plugins/bbpress/includes/admin/images/button-grad.png has changed
Binary file web/wp-content/plugins/bbpress/includes/admin/images/icons32-2x.png has changed
Binary file web/wp-content/plugins/bbpress/includes/admin/images/icons32.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/images/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
Binary file web/wp-content/plugins/bbpress/includes/admin/images/menu-2x.png has changed
Binary file web/wp-content/plugins/bbpress/includes/admin/images/menu.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/metaboxes.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,495 @@
+<?php
+
+/**
+ * bbPress Admin Metaboxes
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+/** Dashboard *****************************************************************/
+
+/**
+ * bbPress Dashboard Right Now Widget
+ *
+ * Adds a dashboard widget with forum statistics
+ *
+ * @since bbPress (r2770)
+ *
+ * @uses bbp_get_version() To get the current bbPress version
+ * @uses bbp_get_statistics() To get the forum statistics
+ * @uses current_user_can() To check if the user is capable of doing things
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses get_admin_url() To get the administration url
+ * @uses add_query_arg() To add custom args to the url
+ * @uses do_action() Calls 'bbp_dashboard_widget_right_now_content_table_end'
+ *                    below the content table
+ * @uses do_action() Calls 'bbp_dashboard_widget_right_now_table_end'
+ *                    below the discussion table
+ * @uses do_action() Calls 'bbp_dashboard_widget_right_now_discussion_table_end'
+ *                    below the discussion table
+ * @uses do_action() Calls 'bbp_dashboard_widget_right_now_end' below the widget
+ */
+function bbp_dashboard_widget_right_now() {
+
+	// Get the statistics and extract them
+	extract( bbp_get_statistics(), EXTR_SKIP ); ?>
+
+	<div class="table table_content">
+
+		<p class="sub"><?php _e( 'Discussion', 'bbpress' ); ?></p>
+
+		<table>
+
+			<tr class="first">
+
+				<?php
+					$num  = $forum_count;
+					$text = _n( 'Forum', 'Forums', $forum_count, 'bbpress' );
+					if ( current_user_can( 'publish_forums' ) ) {
+						$link = add_query_arg( array( 'post_type' => bbp_get_forum_post_type() ), get_admin_url( null, 'edit.php' ) );
+						$num  = '<a href="' . $link . '">' . $num  . '</a>';
+						$text = '<a href="' . $link . '">' . $text . '</a>';
+					}
+				?>
+
+				<td class="first b b-forums"><?php echo $num; ?></td>
+				<td class="t forums"><?php echo $text; ?></td>
+
+			</tr>
+
+			<tr>
+
+				<?php
+					$num  = $topic_count;
+					$text = _n( 'Topic', 'Topics', $topic_count, 'bbpress' );
+					if ( current_user_can( 'publish_topics' ) ) {
+						$link = add_query_arg( array( 'post_type' => bbp_get_topic_post_type() ), get_admin_url( null, 'edit.php' ) );
+						$num  = '<a href="' . $link . '">' . $num  . '</a>';
+						$text = '<a href="' . $link . '">' . $text . '</a>';
+					}
+				?>
+
+				<td class="first b b-topics"><?php echo $num; ?></td>
+				<td class="t topics"><?php echo $text; ?></td>
+
+			</tr>
+
+			<tr>
+
+				<?php
+					$num  = $reply_count;
+					$text = _n( 'Reply', 'Replies', $reply_count, 'bbpress' );
+					if ( current_user_can( 'publish_replies' ) ) {
+						$link = add_query_arg( array( 'post_type' => bbp_get_reply_post_type() ), get_admin_url( null, 'edit.php' ) );
+						$num  = '<a href="' . $link . '">' . $num  . '</a>';
+						$text = '<a href="' . $link . '">' . $text . '</a>';
+					}
+				?>
+
+				<td class="first b b-replies"><?php echo $num; ?></td>
+				<td class="t replies"><?php echo $text; ?></td>
+
+			</tr>
+
+			<?php if ( bbp_allow_topic_tags() ) : ?>
+
+				<tr>
+
+					<?php
+						$num  = $topic_tag_count;
+						$text = _n( 'Topic Tag', 'Topic Tags', $topic_tag_count, 'bbpress' );
+						if ( current_user_can( 'manage_topic_tags' ) ) {
+							$link = add_query_arg( array( 'taxonomy' => bbp_get_topic_tag_tax_id(), 'post_type' => bbp_get_topic_post_type() ), get_admin_url( null, 'edit-tags.php' ) );
+							$num  = '<a href="' . $link . '">' . $num  . '</a>';
+							$text = '<a href="' . $link . '">' . $text . '</a>';
+						}
+					?>
+
+					<td class="first b b-topic_tags"><span class="total-count"><?php echo $num; ?></span></td>
+					<td class="t topic_tags"><?php echo $text; ?></td>
+
+				</tr>
+
+			<?php endif; ?>
+
+			<?php do_action( 'bbp_dashboard_widget_right_now_content_table_end' ); ?>
+
+		</table>
+
+	</div>
+
+
+	<div class="table table_discussion">
+
+		<p class="sub"><?php _e( 'Users &amp; Moderation', 'bbpress' ); ?></p>
+
+		<table>
+
+			<tr class="first">
+
+				<?php
+					$num  = $user_count;
+					$text = _n( 'User', 'Users', $user_count, 'bbpress' );
+					if ( current_user_can( 'edit_users' ) ) {
+						$link = get_admin_url( null, 'users.php' );
+						$num  = '<a href="' . $link . '">' . $num  . '</a>';
+						$text = '<a href="' . $link . '">' . $text . '</a>';
+					}
+				?>
+
+				<td class="b b-users"><span class="total-count"><?php echo $num; ?></span></td>
+				<td class="last t users"><?php echo $text; ?></td>
+
+			</tr>
+
+			<?php if ( isset( $topic_count_hidden ) ) : ?>
+
+				<tr>
+
+					<?php
+						$num  = $topic_count_hidden;
+						$text = _n( 'Hidden Topic', 'Hidden Topics', $topic_count_hidden, 'bbpress' );
+						$link = add_query_arg( array( 'post_type' => bbp_get_topic_post_type() ), get_admin_url( null, 'edit.php' ) );
+						if ( '0' != $num ) {
+							$link = add_query_arg( array( 'post_status' => bbp_get_spam_status_id() ), $link );
+						}
+                        $num  = '<a href="' . $link . '" title="' . esc_attr( $hidden_topic_title ) . '">' . $num  . '</a>';
+						$text = '<a class="waiting" href="' . $link . '" title="' . esc_attr( $hidden_topic_title ) . '">' . $text . '</a>';
+					?>
+
+					<td class="b b-hidden-topics"><?php echo $num; ?></td>
+					<td class="last t hidden-replies"><?php echo $text; ?></td>
+
+				</tr>
+
+			<?php endif; ?>
+
+			<?php if ( isset( $reply_count_hidden ) ) : ?>
+
+				<tr>
+
+					<?php
+						$num  = $reply_count_hidden;
+						$text = _n( 'Hidden Reply', 'Hidden Replies', $reply_count_hidden, 'bbpress' );
+						$link = add_query_arg( array( 'post_type' => bbp_get_reply_post_type() ), get_admin_url( null, 'edit.php' ) );
+						if ( '0' != $num ) {
+							$link = add_query_arg( array( 'post_status' => bbp_get_spam_status_id() ), $link );
+						}
+                        $num  = '<a href="' . $link . '" title="' . esc_attr( $hidden_reply_title ) . '">' . $num  . '</a>';
+						$text = '<a class="waiting" href="' . $link . '" title="' . esc_attr( $hidden_reply_title ) . '">' . $text . '</a>';
+					?>
+
+					<td class="b b-hidden-replies"><?php echo $num; ?></td>
+					<td class="last t hidden-replies"><?php echo $text; ?></td>
+
+				</tr>
+
+			<?php endif; ?>
+
+			<?php if ( bbp_allow_topic_tags() && isset( $empty_topic_tag_count ) ) : ?>
+
+				<tr>
+
+					<?php
+						$num  = $empty_topic_tag_count;
+						$text = _n( 'Empty Topic Tag', 'Empty Topic Tags', $empty_topic_tag_count, 'bbpress' );
+						$link = add_query_arg( array( 'taxonomy' => bbp_get_topic_tag_tax_id(), 'post_type' => bbp_get_topic_post_type() ), get_admin_url( null, 'edit-tags.php' ) );
+						$num  = '<a href="' . $link . '">' . $num  . '</a>';
+						$text = '<a class="waiting" href="' . $link . '">' . $text . '</a>';
+					?>
+
+					<td class="b b-hidden-topic-tags"><?php echo $num; ?></td>
+					<td class="last t hidden-topic-tags"><?php echo $text; ?></td>
+
+				</tr>
+
+			<?php endif; ?>
+
+			<?php do_action( 'bbp_dashboard_widget_right_now_discussion_table_end' ); ?>
+
+		</table>
+
+	</div>
+
+	<?php do_action( 'bbp_dashboard_widget_right_now_table_end' ); ?>
+
+	<div class="versions">
+
+		<span id="wp-version-message">
+			<?php printf( __( 'You are using <span class="b">bbPress %s</span>.', 'bbpress' ), bbp_get_version() ); ?>
+		</span>
+
+	</div>
+
+	<br class="clear" />
+
+	<?php
+
+	do_action( 'bbp_dashboard_widget_right_now_end' );
+}
+
+/** Forums ********************************************************************/
+
+/**
+ * Forum metabox
+ *
+ * The metabox that holds all of the additional forum information
+ *
+ * @since bbPress (r2744)
+ *
+ * @uses bbp_is_forum_closed() To check if a forum is closed or not
+ * @uses bbp_is_forum_category() To check if a forum is a category or not
+ * @uses bbp_is_forum_private() To check if a forum is private or not
+ * @uses bbp_dropdown() To show a dropdown of the forums for forum parent
+ * @uses do_action() Calls 'bbp_forum_metabox'
+ */
+function bbp_forum_metabox() {
+
+	// Post ID
+	$post_id     = get_the_ID();
+	$post_parent = bbp_get_global_post_field( 'post_parent', 'raw'  );
+	$menu_order  = bbp_get_global_post_field( 'menu_order',  'edit' );
+
+	/** Type ******************************************************************/
+
+	?>
+
+	<p>
+		<strong class="label"><?php _e( 'Type:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="bbp_forum_type_select"><?php _e( 'Type:', 'bbpress' ) ?></label>
+		<?php bbp_form_forum_type_dropdown( $post_id ); ?>
+	</p>
+
+	<?php
+
+	/** Status ****************************************************************/
+
+	?>
+
+	<p>
+		<strong class="label"><?php _e( 'Status:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="bbp_forum_status_select"><?php _e( 'Status:', 'bbpress' ) ?></label>
+		<?php bbp_form_forum_status_dropdown( $post_id ); ?>
+	</p>
+
+	<?php
+
+	/** Visibility ************************************************************/
+
+	?>
+
+	<p>
+		<strong class="label"><?php _e( 'Visibility:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="bbp_forum_visibility_select"><?php _e( 'Visibility:', 'bbpress' ) ?></label>
+		<?php bbp_form_forum_visibility_dropdown( $post_id ); ?>
+	</p>
+
+	<hr />
+
+	<?php
+
+	/** Parent ****************************************************************/
+
+	?>
+
+	<p>
+		<strong class="label"><?php _e( 'Parent:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="parent_id"><?php _e( 'Forum Parent', 'bbpress' ); ?></label>
+		<?php bbp_dropdown( array(
+			'post_type'          => bbp_get_forum_post_type(),
+			'selected'           => $post_parent,
+			'child_of'           => '0',
+			'numberposts'        => -1,
+			'orderby'            => 'title',
+			'order'              => 'ASC',
+			'walker'             => '',
+			'exclude'            => $post_id,
+
+			// Output-related
+			'select_id'          => 'parent_id',
+			'tab'                => bbp_get_tab_index(),
+			'options_only'       => false,
+			'show_none'          => __( '&mdash; No parent &mdash;', 'bbpress' ),
+			'none_found'         => false,
+			'disable_categories' => false,
+			'disabled'           => ''
+		) ); ?>
+	</p>
+
+	<p>
+		<strong class="label"><?php _e( 'Order:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="menu_order"><?php _e( 'Forum Order', 'bbpress' ); ?></label>
+		<input name="menu_order" type="number" step="1" size="4" id="menu_order" value="<?php echo esc_attr( $menu_order ); ?>" />
+	</p>
+
+	<?php
+	wp_nonce_field( 'bbp_forum_metabox_save', 'bbp_forum_metabox' );
+	do_action( 'bbp_forum_metabox', $post_id );
+}
+
+/** Topics ********************************************************************/
+
+/**
+ * Topic metabox
+ *
+ * The metabox that holds all of the additional topic information
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses do_action() Calls 'bbp_topic_metabox'
+ */
+function bbp_topic_metabox() {
+
+	// Post ID
+	$post_id = get_the_ID(); ?>
+
+	<p>
+		<strong class="label"><?php _e( 'Type:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="bbp_stick_topic"><?php _e( 'Topic Type', 'bbpress' ); ?></label>
+		<?php bbp_topic_type_select( array( 'topic_id' => $post_id ) ); ?>
+	</p>
+
+	<p>
+		<strong class="label"><?php _e( 'Forum:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="parent_id"><?php _e( 'Forum', 'bbpress' ); ?></label>
+		<?php bbp_dropdown( array(
+			'post_type'          => bbp_get_forum_post_type(),
+			'selected'           => bbp_get_topic_forum_id( $post_id ),
+			'child_of'           => '0',
+			'numberposts'        => -1,
+			'orderby'            => 'title',
+			'order'              => 'ASC',
+			'walker'             => '',
+			'exclude'            => '',
+
+			// Output-related
+			'select_id'          => 'parent_id',
+			'tab'                => bbp_get_tab_index(),
+			'options_only'       => false,
+			'show_none'          => __( '&mdash; No parent &mdash;', 'bbpress' ),
+			'none_found'         => false,
+			'disable_categories' => current_user_can( 'edit_forums' ),
+			'disabled'           => ''
+		) ); ?>
+	</p>
+
+	<?php
+	wp_nonce_field( 'bbp_topic_metabox_save', 'bbp_topic_metabox' );
+	do_action( 'bbp_topic_metabox', $post_id );
+}
+
+/** Replies *******************************************************************/
+
+/**
+ * Reply metabox
+ *
+ * The metabox that holds all of the additional reply information
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses do_action() Calls 'bbp_reply_metabox'
+ */
+function bbp_reply_metabox() {
+
+	// Post ID
+	$post_id = get_the_ID();
+
+	// Get some meta
+	$reply_topic_id = bbp_get_reply_topic_id( $post_id );
+	$reply_forum_id = bbp_get_reply_forum_id( $post_id );
+
+	// Allow individual manipulation of reply forum
+	if ( current_user_can( 'edit_others_replies' ) || current_user_can( 'moderate' ) ) : ?>
+
+		<p>
+			<strong class="label"><?php _e( 'Forum:', 'bbpress' ); ?></strong>
+			<label class="screen-reader-text" for="bbp_forum_id"><?php _e( 'Forum', 'bbpress' ); ?></label>
+			<?php bbp_dropdown( array(
+				'post_type'          => bbp_get_forum_post_type(),
+				'selected'           => $reply_forum_id,
+				'child_of'           => '0',
+				'numberposts'        => -1,
+				'orderby'            => 'title',
+				'order'              => 'ASC',
+				'walker'             => '',
+				'exclude'            => '',
+
+				// Output-related
+				'select_id'          => 'bbp_forum_id',
+				'tab'                => bbp_get_tab_index(),
+				'options_only'       => false,
+				'show_none'          => __( '&mdash; No parent &mdash;', 'bbpress' ),
+				'none_found'         => false,
+				'disable_categories' => current_user_can( 'edit_forums' ),
+				'disabled'           => ''
+			) ); ?>
+		</p>
+
+	<?php endif; ?>
+
+	<p>
+		<strong class="label"><?php _e( 'Topic:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="parent_id"><?php _e( 'Topic', 'bbpress' ); ?></label>
+		<input name="parent_id" id="bbp_topic_id" type="text" value="<?php echo esc_attr( $reply_topic_id ); ?>" />
+	</p>
+
+	<?php
+	wp_nonce_field( 'bbp_reply_metabox_save', 'bbp_reply_metabox' );
+	do_action( 'bbp_reply_metabox', $post_id );
+}
+
+/** Users *********************************************************************/
+
+/**
+ * Anonymous user information metabox
+ *
+ * @since bbPress (r2828)
+ *
+ * @uses bbp_is_reply_anonymous() To check if reply is anonymous
+ * @uses bbp_is_topic_anonymous() To check if topic is anonymous
+ * @uses get_the_ID() To get the global post ID
+ * @uses get_post_meta() To get the author user information
+ */
+function bbp_author_metabox() {
+
+	// Post ID
+	$post_id = get_the_ID();
+
+	// Show extra bits if topic/reply is anonymous
+	if ( bbp_is_reply_anonymous( $post_id ) || bbp_is_topic_anonymous( $post_id ) ) : ?>
+
+		<p>
+			<strong class="label"><?php _e( 'Name:', 'bbpress' ); ?></strong>
+			<label class="screen-reader-text" for="bbp_anonymous_name"><?php _e( 'Name', 'bbpress' ); ?></label>
+			<input type="text" id="bbp_anonymous_name" name="bbp_anonymous_name" value="<?php echo esc_attr( get_post_meta( $post_id, '_bbp_anonymous_name', true ) ); ?>" />
+		</p>
+
+		<p>
+			<strong class="label"><?php _e( 'Email:', 'bbpress' ); ?></strong>
+			<label class="screen-reader-text" for="bbp_anonymous_email"><?php _e( 'Email', 'bbpress' ); ?></label>
+			<input type="text" id="bbp_anonymous_email" name="bbp_anonymous_email" value="<?php echo esc_attr( get_post_meta( $post_id, '_bbp_anonymous_email', true ) ); ?>" />
+		</p>
+
+		<p>
+			<strong class="label"><?php _e( 'Website:', 'bbpress' ); ?></strong>
+			<label class="screen-reader-text" for="bbp_anonymous_website"><?php _e( 'Website', 'bbpress' ); ?></label>
+			<input type="text" id="bbp_anonymous_website" name="bbp_anonymous_website" value="<?php echo esc_attr( get_post_meta( $post_id, '_bbp_anonymous_website', true ) ); ?>" />
+		</p>
+
+	<?php endif; ?>
+
+	<p>
+		<strong class="label"><?php _e( 'IP:', 'bbpress' ); ?></strong>
+		<label class="screen-reader-text" for="bbp_author_ip_address"><?php _e( 'IP Address', 'bbpress' ); ?></label>
+		<input type="text" id="bbp_author_ip_address" name="bbp_author_ip_address" value="<?php echo esc_attr( get_post_meta( $post_id, '_bbp_author_ip', true ) ); ?>" disabled="disabled" />
+	</p>
+
+	<?php
+
+	do_action( 'bbp_author_metabox', $post_id );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/parser.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2073 @@
+<?php
+/*
+This is a compressed copy of NBBC. Do not edit!
+
+Copyright (c) 2008-9, the Phantom Inker.  All rights reserved.
+Portions Copyright (c) 2004-2008 AddedBytes.com
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted provided that the following conditions
+are met:
+
+* Redistributions of source code must retain the above copyright
+  notice, this list of conditions and the following disclaimer.
+
+* Redistributions in binary form must reproduce the above copyright
+  notice, this list of conditions and the following disclaimer in
+  the documentation and/or other materials provided with the
+  distribution.
+
+THIS SOFTWARE IS PROVIDED BY THE PHANTOM INKER "AS IS" AND ANY EXPRESS
+OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
+DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
+LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN
+IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+*/
+
+define("BBCODE_VERSION", "1.4.5");
+define("BBCODE_RELEASE", "2010-09-17");
+define("BBCODE_VERBATIM", 2);
+define("BBCODE_REQUIRED", 1);
+define("BBCODE_OPTIONAL", 0);
+define("BBCODE_PROHIBIT", -1);
+define("BBCODE_CHECK", 1);
+define("BBCODE_OUTPUT", 2);
+define("BBCODE_ENDTAG", 5);
+define("BBCODE_TAG", 4);
+define("BBCODE_TEXT", 3);
+define("BBCODE_NL", 2);
+define("BBCODE_WS", 1);
+define("BBCODE_EOI", 0);
+define("BBCODE_LEXSTATE_TEXT", 0);
+define("BBCODE_LEXSTATE_TAG", 1);
+define("BBCODE_MODE_SIMPLE", 0);
+define("BBCODE_MODE_CALLBACK", 1);
+define("BBCODE_MODE_INTERNAL", 2);
+define("BBCODE_MODE_LIBRARY", 3);
+define("BBCODE_MODE_ENHANCED", 4);
+define("BBCODE_STACK_TOKEN", 0);
+define("BBCODE_STACK_TEXT", 1);
+define("BBCODE_STACK_TAG", 2);
+define("BBCODE_STACK_CLASS", 3);
+if (!function_exists('str_split')) {
+function str_split($string, $split_length = 1) {
+$array = explode("\r\n", chunk_split($string, $split_length));
+array_pop($array);
+return $array;
+}
+}
+$BBCode_SourceDir = dirname(__FILE__);
+
+class BBCodeLexer {
+var $token;
+var $text;
+var $tag;
+var $state;
+var $input;
+var $ptr;
+var $unget;
+var $verbatim;
+var $debug;
+var $tagmarker;
+var $end_tagmarker;
+var $pat_main;
+var $pat_comment;
+var $pat_comment2;
+var $pat_wiki;
+function BBCodeLexer($string, $tagmarker = '[') {
+$regex_beginmarkers = Array( '[' => '\[', '<' => '<', '{' => '\{', '(' => '\(' );
+$regex_endmarkers = Array( '[' => '\]', '<' => '>', '{' => '\}', '(' => '\)' );
+$endmarkers = Array( '[' => ']', '<' => '>', '{' => '}', '(' => ')' );
+if (!isset($regex_endmarkers[$tagmarker])) $tagmarker = '[';
+$e = $regex_endmarkers[$tagmarker];
+$b = $regex_beginmarkers[$tagmarker];
+$this->tagmarker = $tagmarker;
+$this->end_tagmarker = $endmarkers[$tagmarker];
+$this->pat_main = "/( "
+. "{$b}"
+. "(?! -- | ' | !-- | {$b}{$b} )"
+. "(?: [^\\n\\r{$b}{$e}] | \\\" [^\\\"\\n\\r]* \\\" | \\' [^\\'\\n\\r]* \\' )*"
+. "{$e}"
+. "| {$b}{$b} (?: [^{$e}\\r\\n] | {$e}[^{$e}\\r\\n] )* {$e}{$e}"
+. "| {$b} (?: -- | ' ) (?: [^{$e}\\n\\r]* ) {$e}"
+. "| {$b}!-- (?: [^-] | -[^-] | --[^{$e}] )* --{$e}"
+. "| -----+"
+. "| \\x0D\\x0A | \\x0A\\x0D | \\x0D | \\x0A"
+. "| [\\x00-\\x09\\x0B-\\x0C\\x0E-\\x20]+(?=[\\x0D\\x0A{$b}]|-----|$)"
+. "| (?<=[\\x0D\\x0A{$e}]|-----|^)[\\x00-\\x09\\x0B-\\x0C\\x0E-\\x20]+"
+. " )/Dx";
+$this->input = preg_split($this->pat_main, $string, -1, PREG_SPLIT_DELIM_CAPTURE);
+$this->pat_comment = "/^ {$b} (?: -- | ' ) /Dx";
+$this->pat_comment2 = "/^ {$b}!-- (?: [^-] | -[^-] | --[^{$e}] )* --{$e} $/Dx";
+$this->pat_wiki = "/^ {$b}{$b} ([^\\|]*) (?:\\|(.*))? {$e}{$e} $/Dx";
+$this->ptr = 0;
+$this->unget = false;
+$this->state = BBCODE_LEXSTATE_TEXT;
+$this->verbatim = false;
+$this->token = BBCODE_EOI;
+$this->tag = false;
+$this->text = "";
+}
+function GuessTextLength() {
+$length = 0;
+$ptr = 0;
+$state = BBCODE_LEXSTATE_TEXT;
+while ($ptr < count($this->input)) {
+$text = $this->input[$ptr++];
+if ($state == BBCODE_LEXSTATE_TEXT) {
+$state = BBCODE_LEXSTATE_TAG;
+$length += strlen($text);
+}
+else {
+switch (ord(substr($this->text, 0, 1))) {
+case 10:
+case 13:
+$state = BBCODE_LEXSTATE_TEXT;
+$length++;
+break;
+default:
+$state = BBCODE_LEXSTATE_TEXT;
+$length += strlen($text);
+break;
+case 40:
+case 60:
+case 91:
+case 123:
+$state = BBCODE_LEXSTATE_TEXT;
+break;
+}
+}
+}
+return $length;
+}
+function NextToken() {
+if ($this->unget) {
+$this->unget = false;
+return $this->token;
+}
+while (true) {
+if ($this->ptr >= count($this->input)) {
+$this->text = "";
+$this->tag = false;
+return $this->token = BBCODE_EOI;
+}
+$this->text = preg_replace("/[\\x00-\\x08\\x0B-\\x0C\\x0E-\\x1F]/", "",
+$this->input[$this->ptr++]);
+if ($this->verbatim) {
+$this->tag = false;
+if ($this->state == BBCODE_LEXSTATE_TEXT) {
+$this->state = BBCODE_LEXSTATE_TAG;
+$token_type = BBCODE_TEXT;
+}
+else {
+$this->state = BBCODE_LEXSTATE_TEXT;
+switch (ord(substr($this->text, 0, 1))) {
+case 10:
+case 13:
+$token_type = BBCODE_NL;
+break;
+default:
+$token_type = BBCODE_WS;
+break;
+case 45:
+case 40:
+case 60:
+case 91:
+case 123:
+$token_type = BBCODE_TEXT;
+break;
+}
+}
+if (strlen($this->text) > 0)
+return $this->token = $token_type;
+}
+else if ($this->state == BBCODE_LEXSTATE_TEXT) {
+$this->state = BBCODE_LEXSTATE_TAG;
+$this->tag = false;
+if (strlen($this->text) > 0)
+return $this->token = BBCODE_TEXT;
+}
+else {
+switch (ord(substr($this->text, 0, 1))) {
+case 10:
+case 13:
+$this->tag = false;
+$this->state = BBCODE_LEXSTATE_TEXT;
+return $this->token = BBCODE_NL;
+case 45:
+if (preg_match("/^-----/", $this->text)) {
+$this->tag = Array('_name' => 'rule', '_endtag' => false, '_default' => '');
+$this->state = BBCODE_LEXSTATE_TEXT;
+return $this->token = BBCODE_TAG;
+}
+else {
+$this->tag = false;
+$this->state = BBCODE_LEXSTATE_TEXT;
+if (strlen($this->text) > 0)
+return $this->token = BBCODE_TEXT;
+continue;
+}
+default:
+$this->tag = false;
+$this->state = BBCODE_LEXSTATE_TEXT;
+return $this->token = BBCODE_WS;
+case 40:
+case 60:
+case 91:
+case 123:
+if (preg_match($this->pat_comment, $this->text)) {
+$this->state = BBCODE_LEXSTATE_TEXT;
+continue;
+}
+if (preg_match($this->pat_comment2, $this->text)) {
+$this->state = BBCODE_LEXSTATE_TEXT;
+continue;
+}
+if (preg_match($this->pat_wiki, $this->text, $matches)) {
+$this->tag = Array('_name' => 'wiki', '_endtag' => false,
+'_default' => @$matches[1], 'title' => @$matches[2]);
+$this->state = BBCODE_LEXSTATE_TEXT;
+return $this->token = BBCODE_TAG;
+}
+$this->tag = $this->Internal_DecodeTag($this->text);
+$this->state = BBCODE_LEXSTATE_TEXT;
+return $this->token = ($this->tag['_end'] ? BBCODE_ENDTAG : BBCODE_TAG);
+}
+}
+}
+}
+function UngetToken() {
+if ($this->token !== BBCODE_EOI)
+$this->unget = true;
+}
+function PeekToken() {
+$result = $this->NextToken();
+if ($this->token !== BBCODE_EOI)
+$this->unget = true;
+return $result;
+}
+function SaveState() {
+return Array(
+'token' => $this->token,
+'text' => $this->text,
+'tag' => $this->tag,
+'state' => $this->state,
+'input' => $this->input,
+'ptr' => $this->ptr,
+'unget' => $this->unget,
+'verbatim' => $this->verbatim
+);
+}
+function RestoreState($state) {
+if (!is_array($state)) return;
+$this->token = @$state['token'];
+$this->text = @$state['text'];
+$this->tag = @$state['tag'];
+$this->state = @$state['state'];
+$this->input = @$state['input'];
+$this->ptr = @$state['ptr'];
+$this->unget = @$state['unget'];
+$this->verbatim = @$state['verbatim'];
+}
+function Internal_StripQuotes($string) {
+if (preg_match("/^\\\"(.*)\\\"$/", $string, $matches))
+return $matches[1];
+else if (preg_match("/^\\'(.*)\\'$/", $string, $matches))
+return $matches[1];
+else return $string;
+}
+function Internal_ClassifyPiece($ptr, $pieces) {
+if ($ptr >= count($pieces)) return -1;
+$piece = $pieces[$ptr];
+if ($piece == '=') return '=';
+else if (preg_match("/^[\\'\\\"]/", $piece)) return '"';
+else if (preg_match("/^[\\x00-\\x20]+$/", $piece)) return ' ';
+else return 'A';
+}
+function Internal_DecodeTag($tag) {
+$result = Array('_tag' => $tag, '_endtag' => '', '_name' => '',
+'_hasend' => false, '_end' => false, '_default' => false);
+$tag = substr($tag, 1, strlen($tag)-2);
+$ch = ord(substr($tag, 0, 1));
+if ($ch >= 0 && $ch <= 32) return $result;
+$pieces = preg_split("/(\\\"[^\\\"]+\\\"|\\'[^\\']+\\'|=|[\\x00-\\x20]+)/",
+$tag, -1, PREG_SPLIT_DELIM_CAPTURE|PREG_SPLIT_NO_EMPTY);
+$ptr = 0;
+if (count($pieces) < 1) return $result;
+if (@substr($pieces[$ptr], 0, 1) == '/') {
+$result['_name'] = strtolower(substr($pieces[$ptr++], 1));
+$result['_end'] = true;
+}
+else {
+$result['_name'] = strtolower($pieces[$ptr++]);
+$result['_end'] = false;
+}
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) == ' ')
+$ptr++;
+$params = Array();
+if ($type != '=') {
+$result['_default'] = false;
+$params[] = Array('key' => '', 'value' => '');
+}
+else {
+$ptr++;
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) == ' ')
+$ptr++;
+if ($type == "\"")
+$value = $this->Internal_StripQuotes($pieces[$ptr++]);
+else {
+$after_space = false;
+$start = $ptr;
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) != -1) {
+if ($type == ' ') $after_space = true;
+if ($type == '=' && $after_space) break;
+$ptr++;
+}
+if ($type == -1) $ptr--;
+if ($type == '=') {
+$ptr--;
+while ($ptr > $start && $this->Internal_ClassifyPiece($ptr, $pieces) == ' ')
+$ptr--;
+while ($ptr > $start && $this->Internal_ClassifyPiece($ptr, $pieces) != ' ')
+$ptr--;
+}
+$value = "";
+for (; $start <= $ptr; $start++) {
+if ($this->Internal_ClassifyPiece($start, $pieces) == ' ')
+$value .= " ";
+else $value .= $this->Internal_StripQuotes($pieces[$start]);
+}
+$value = trim($value);
+$ptr++;
+}
+$result['_default'] = $value;
+$params[] = Array('key' => '', 'value' => $value);
+}
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) != -1) {
+while ($type == ' ') {
+$ptr++;
+$type = $this->Internal_ClassifyPiece($ptr, $pieces);
+}
+if ($type == 'A' || $type == '"')
+$key = strtolower($this->Internal_StripQuotes(@$pieces[$ptr++]));
+else if ($type == '=') {
+$ptr++;
+continue;
+}
+else if ($type == -1) break;
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) == ' ')
+$ptr++;
+if ($type != '=')
+$value = $this->Internal_StripQuotes($key);
+else {
+$ptr++;
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) == ' ')
+$ptr++;
+if ($type == '"') {
+$value = $this->Internal_StripQuotes($pieces[$ptr++]);
+}
+else if ($type != -1) {
+$value = $pieces[$ptr++];
+while (($type = $this->Internal_ClassifyPiece($ptr, $pieces)) != -1
+&& $type != ' ')
+$value .= $pieces[$ptr++];
+}
+else $value = "";
+}
+if (substr($key, 0, 1) != '_')
+$result[$key] = $value;
+$params[] = Array('key' => $key, 'value' => $value);
+}
+$result['_params'] = $params;
+return $result;
+}
+}
+
+class BBCodeLibrary {
+var $default_smileys = Array(
+':)' => 'smile.gif', ':-)' => 'smile.gif',
+'=)' => 'smile.gif', '=-)' => 'smile.gif',
+':(' => 'frown.gif', ':-(' => 'frown.gif',
+'=(' => 'frown.gif', '=-(' => 'frown.gif',
+':D' => 'bigsmile.gif', ':-D' => 'bigsmile.gif',
+'=D' => 'bigsmile.gif', '=-D' => 'bigsmile.gif',
+'>:('=> 'angry.gif', '>:-('=> 'angry.gif',
+'>=('=> 'angry.gif', '>=-('=> 'angry.gif',
+'D:' => 'angry.gif', 'D-:' => 'angry.gif',
+'D=' => 'angry.gif', 'D-=' => 'angry.gif',
+'>:)'=> 'evil.gif', '>:-)'=> 'evil.gif',
+'>=)'=> 'evil.gif', '>=-)'=> 'evil.gif',
+'>:D'=> 'evil.gif', '>:-D'=> 'evil.gif',
+'>=D'=> 'evil.gif', '>=-D'=> 'evil.gif',
+'>;)'=> 'sneaky.gif', '>;-)'=> 'sneaky.gif',
+'>;D'=> 'sneaky.gif', '>;-D'=> 'sneaky.gif',
+'O:)' => 'saint.gif', 'O:-)' => 'saint.gif',
+'O=)' => 'saint.gif', 'O=-)' => 'saint.gif',
+':O' => 'surprise.gif', ':-O' => 'surprise.gif',
+'=O' => 'surprise.gif', '=-O' => 'surprise.gif',
+':?' => 'confuse.gif', ':-?' => 'confuse.gif',
+'=?' => 'confuse.gif', '=-?' => 'confuse.gif',
+':s' => 'worry.gif', ':-S' => 'worry.gif',
+'=s' => 'worry.gif', '=-S' => 'worry.gif',
+':|' => 'neutral.gif', ':-|' => 'neutral.gif',
+'=|' => 'neutral.gif', '=-|' => 'neutral.gif',
+':I' => 'neutral.gif', ':-I' => 'neutral.gif',
+'=I' => 'neutral.gif', '=-I' => 'neutral.gif',
+':/' => 'irritated.gif', ':-/' => 'irritated.gif',
+'=/' => 'irritated.gif', '=-/' => 'irritated.gif',
+':\\' => 'irritated.gif', ':-\\' => 'irritated.gif',
+'=\\' => 'irritated.gif', '=-\\' => 'irritated.gif',
+':P' => 'tongue.gif', ':-P' => 'tongue.gif',
+'=P' => 'tongue.gif', '=-P' => 'tongue.gif',
+'X-P' => 'tongue.gif',
+'8)' => 'bigeyes.gif', '8-)' => 'bigeyes.gif',
+'B)' => 'cool.gif', 'B-)' => 'cool.gif',
+';)' => 'wink.gif', ';-)' => 'wink.gif',
+';D' => 'bigwink.gif', ';-D' => 'bigwink.gif',
+'^_^'=> 'anime.gif', '^^;' => 'sweatdrop.gif',
+'>_>'=> 'lookright.gif', '>.>' => 'lookright.gif',
+'<_<'=> 'lookleft.gif', '<.<' => 'lookleft.gif',
+'XD' => 'laugh.gif', 'X-D' => 'laugh.gif',
+';D' => 'bigwink.gif', ';-D' => 'bigwink.gif',
+':3' => 'smile3.gif', ':-3' => 'smile3.gif',
+'=3' => 'smile3.gif', '=-3' => 'smile3.gif',
+';3' => 'wink3.gif', ';-3' => 'wink3.gif',
+'<g>' => 'teeth.gif', '<G>' => 'teeth.gif',
+'o.O' => 'boggle.gif', 'O.o' => 'boggle.gif',
+':blue:' => 'blue.gif',
+':zzz:' => 'sleepy.gif',
+'<3' => 'heart.gif',
+':star:' => 'star.gif',
+);
+var $default_tag_rules = Array(
+'b' => Array(
+'simple_start' => "<b>",
+'simple_end' => "</b>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'plain_start' => "<b>",
+'plain_end' => "</b>",
+),
+'i' => Array(
+'simple_start' => "<i>",
+'simple_end' => "</i>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'plain_start' => "<i>",
+'plain_end' => "</i>",
+),
+'u' => Array(
+'simple_start' => "<u>",
+'simple_end' => "</u>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'plain_start' => "<u>",
+'plain_end' => "</u>",
+),
+'s' => Array(
+'simple_start' => "<strike>",
+'simple_end' => "</strike>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'plain_start' => "<i>",
+'plain_end' => "</i>",
+),
+'font' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'allow' => Array('_default' => '/^[a-zA-Z0-9._ -]+$/'),
+'method' => 'DoFont',
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'color' => Array(
+'mode' => BBCODE_MODE_ENHANCED,
+'allow' => Array('_default' => '/^#?[a-zA-Z0-9._ -]+$/'),
+'template' => '<span style="color:{$_default/tw}">{$_content/v}</span>',
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'size' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'allow' => Array('_default' => '/^[0-9.]+$/D'),
+'method' => 'DoSize',
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'sup' => Array(
+'simple_start' => "<sup>",
+'simple_end' => "</sup>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'sub' => Array(
+'simple_start' => "<sub>",
+'simple_end' => "</sub>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'spoiler' => Array(
+'simple_start' => "<span class=\"bbcode_spoiler\">",
+'simple_end' => "</span>",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'acronym' => Array(
+'mode' => BBCODE_MODE_ENHANCED,
+'template' => '<span class="bbcode_acronym" title="{$_default/e}">{$_content/v}</span>',
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+),
+'url' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => 'DoURL',
+'class' => 'link',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline'),
+'content' => BBCODE_REQUIRED,
+'plain_start' => "<a href=\"{\$link}\">",
+'plain_end' => "</a>",
+'plain_content' => Array('_content', '_default'),
+'plain_link' => Array('_default', '_content'),
+),
+'email' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => 'DoEmail',
+'class' => 'link',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline'),
+'content' => BBCODE_REQUIRED,
+'plain_start' => "<a href=\"mailto:{\$link}\">",
+'plain_end' => "</a>",
+'plain_content' => Array('_content', '_default'),
+'plain_link' => Array('_default', '_content'),
+),
+'wiki' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => "DoWiki",
+'class' => 'link',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline'),
+'end_tag' => BBCODE_PROHIBIT,
+'content' => BBCODE_PROHIBIT,
+'plain_start' => "<b>[",
+'plain_end' => "]</b>",
+'plain_content' => Array('title', '_default'),
+'plain_link' => Array('_default', '_content'),
+),
+'img' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => "DoImage",
+'class' => 'image',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'end_tag' => BBCODE_REQUIRED,
+'content' => BBCODE_REQUIRED,
+'plain_start' => "[image]",
+'plain_content' => Array(),
+),
+'rule' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => "DoRule",
+'class' => 'block',
+'allow_in' => Array('listitem', 'block', 'columns'),
+'end_tag' => BBCODE_PROHIBIT,
+'content' => BBCODE_PROHIBIT,
+'before_tag' => "sns",
+'after_tag' => "sns",
+'plain_start' => "\n-----\n",
+'plain_end' => "",
+'plain_content' => Array(),
+),
+'br' => Array(
+'mode' => BBCODE_MODE_SIMPLE,
+'simple_start' => "<br />\n",
+'simple_end' => "",
+'class' => 'inline',
+'allow_in' => Array('listitem', 'block', 'columns', 'inline', 'link'),
+'end_tag' => BBCODE_PROHIBIT,
+'content' => BBCODE_PROHIBIT,
+'before_tag' => "s",
+'after_tag' => "s",
+'plain_start' => "\n",
+'plain_end' => "",
+'plain_content' => Array(),
+),
+'left' => Array(
+'simple_start' => "\n<div class=\"bbcode_left\" style=\"text-align:left\">\n",
+'simple_end' => "\n</div>\n",
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'right' => Array(
+'simple_start' => "\n<div class=\"bbcode_right\" style=\"text-align:right\">\n",
+'simple_end' => "\n</div>\n",
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'center' => Array(
+'simple_start' => "\n<div class=\"bbcode_center\" style=\"text-align:center\">\n",
+'simple_end' => "\n</div>\n",
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'indent' => Array(
+'simple_start' => "\n<div class=\"bbcode_indent\" style=\"margin-left:4em\">\n",
+'simple_end' => "\n</div>\n",
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'columns' => Array(
+'simple_start' => "\n<table class=\"bbcode_columns\"><tbody><tr><td class=\"bbcode_column bbcode_firstcolumn\">\n",
+'simple_end' => "\n</td></tr></tbody></table>\n",
+'class' => 'columns',
+'allow_in' => Array('listitem', 'block', 'columns'),
+'end_tag' => BBCODE_REQUIRED,
+'content' => BBCODE_REQUIRED,
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'nextcol' => Array(
+'simple_start' => "\n</td><td class=\"bbcode_column\">\n",
+'class' => 'nextcol',
+'allow_in' => Array('columns'),
+'end_tag' => BBCODE_PROHIBIT,
+'content' => BBCODE_PROHIBIT,
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "",
+),
+'code' => Array(
+'mode' => BBCODE_MODE_ENHANCED,
+'template' => "\n<div class=\"bbcode_code\">\n<div class=\"bbcode_code_head\">Code:</div>\n<div class=\"bbcode_code_body\" style=\"white-space:pre\">{\$_content/v}</div>\n</div>\n",
+'class' => 'code',
+'allow_in' => Array('listitem', 'block', 'columns'),
+'content' => BBCODE_VERBATIM,
+'before_tag' => "sns",
+'after_tag' => "sn",
+'before_endtag' => "sn",
+'after_endtag' => "sns",
+'plain_start' => "\n<b>Code:</b>\n",
+'plain_end' => "\n",
+),
+'quote' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => "DoQuote",
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n<b>Quote:</b>\n",
+'plain_end' => "\n",
+),
+'list' => Array(
+'mode' => BBCODE_MODE_LIBRARY,
+'method' => 'DoList',
+'class' => 'list',
+'allow_in' => Array('listitem', 'block', 'columns'),
+'before_tag' => "sns",
+'after_tag' => "sns",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n",
+'plain_end' => "\n",
+),
+'*' => Array(
+'simple_start' => "<li>",
+'simple_end' => "</li>\n",
+'class' => 'listitem',
+'allow_in' => Array('list'),
+'end_tag' => BBCODE_OPTIONAL,
+'before_tag' => "s",
+'after_tag' => "s",
+'before_endtag' => "sns",
+'after_endtag' => "sns",
+'plain_start' => "\n * ",
+'plain_end' => "\n",
+),
+);
+function DoURL($bbcode, $action, $name, $default, $params, $content) {
+if ($action == BBCODE_CHECK) return true;
+$url = is_string($default) ? $default : $bbcode->UnHTMLEncode(strip_tags($content));
+if ($bbcode->IsValidURL($url)) {
+if ($bbcode->debug)
+print "ISVALIDURL<br />";
+if ($bbcode->url_targetable !== false && isset($params['target']))
+$target = " target=\"" . htmlspecialchars($params['target']) . "\"";
+else $target = "";
+if ($bbcode->url_target !== false)
+if (!($bbcode->url_targetable == 'override' && isset($params['target'])))
+$target = " target=\"" . htmlspecialchars($bbcode->url_target) . "\"";
+return '<a href="' . htmlspecialchars($url) . '" class="bbcode_url"' . $target . '>' . $content . '</a>';
+}
+else return htmlspecialchars($params['_tag']) . $content . htmlspecialchars($params['_endtag']);
+}
+function DoEmail($bbcode, $action, $name, $default, $params, $content) {
+if ($action == BBCODE_CHECK) return true;
+$email = is_string($default) ? $default : $bbcode->UnHTMLEncode(strip_tags($content));
+if ($bbcode->IsValidEmail($email))
+return '<a href="mailto:' . htmlspecialchars($email) . '" class="bbcode_email">' . $content . '</a>';
+else return htmlspecialchars($params['_tag']) . $content . htmlspecialchars($params['_endtag']);
+}
+function DoSize($bbcode, $action, $name, $default, $params, $content) {
+switch ($default) {
+case '0': $size = '.5em'; break;
+case '1': $size = '.67em'; break;
+case '2': $size = '.83em'; break;
+default:
+case '3': $size = '1.0em'; break;
+case '4': $size = '1.17em'; break;
+case '5': $size = '1.5em'; break;
+case '6': $size = '2.0em'; break;
+case '7': $size = '2.5em'; break;
+}
+return "<span style=\"font-size:$size\">$content</span>";
+}
+function DoFont($bbcode, $action, $name, $default, $params, $content) {
+$fonts = explode(",", $default);
+$result = "";
+$special_fonts = Array(
+'serif' => 'serif',
+'sans-serif' => 'sans-serif',
+'sans serif' => 'sans-serif',
+'sansserif' => 'sans-serif',
+'sans' => 'sans-serif',
+'cursive' => 'cursive',
+'fantasy' => 'fantasy',
+'monospace' => 'monospace',
+'mono' => 'monospace',
+);
+foreach ($fonts as $font) {
+$font = trim($font);
+if (isset($special_fonts[$font])) {
+if (strlen($result) > 0) $result .= ",";
+$result .= $special_fonts[$font];
+}
+else if (strlen($font) > 0) {
+if (strlen($result) > 0) $result .= ",";
+$result .= "'$font'";
+}
+}
+return "<span style=\"font-family:$result\">$content</span>";
+}
+function DoWiki($bbcode, $action, $name, $default, $params, $content) {
+$name = $bbcode->Wikify($default);
+if ($action == BBCODE_CHECK)
+return strlen($name) > 0;
+$title = trim(@$params['title']);
+if (strlen($title) <= 0) $title = trim($default);
+return "<a href=\"{$bbcode->wiki_url}$name\" class=\"bbcode_wiki\">"
+. htmlspecialchars($title) . "</a>";
+}
+function DoImage($bbcode, $action, $name, $default, $params, $content) {
+if ($action == BBCODE_CHECK) return true;
+$content = trim($bbcode->UnHTMLEncode(strip_tags($content)));
+if (preg_match("/\\.(?:gif|jpeg|jpg|jpe|png)$/", $content)) {
+if (preg_match("/^[a-zA-Z0-9_][^:]+$/", $content)) {
+if (!preg_match("/(?:\\/\\.\\.\\/)|(?:^\\.\\.\\/)|(?:^\\/)/", $content)) {
+$info = @getimagesize("{$bbcode->local_img_dir}/{$content}");
+if ($info[2] == IMAGETYPE_GIF || $info[2] == IMAGETYPE_JPEG || $info[2] == IMAGETYPE_PNG) {
+return "<img src=\""
+. htmlspecialchars("{$bbcode->local_img_url}/{$content}") . "\" alt=\""
+. htmlspecialchars(basename($content)) . "\" width=\""
+. htmlspecialchars($info[0]) . "\" height=\""
+. htmlspecialchars($info[1]) . "\" class=\"bbcode_img\" />";
+}
+}
+}
+else if ($bbcode->IsValidURL($content, false)) {
+return "<img src=\"" . htmlspecialchars($content) . "\" alt=\""
+. htmlspecialchars(basename($content)) . "\" class=\"bbcode_img\" />";
+}
+}
+return htmlspecialchars($params['_tag']) . htmlspecialchars($content) . htmlspecialchars($params['_endtag']);
+}
+function DoRule($bbcode, $action, $name, $default, $params, $content) {
+if ($action == BBCODE_CHECK) return true;
+else return $bbcode->rule_html;
+}
+function DoQuote($bbcode, $action, $name, $default, $params, $content) {
+if ($action == BBCODE_CHECK) return true;
+if (isset($params['name'])) {
+$title = htmlspecialchars(trim($params['name'])) . " wrote";
+if (isset($params['date']))
+$title .= " on " . htmlspecialchars(trim($params['date']));
+$title .= ":";
+if (isset($params['url'])) {
+$url = trim($params['url']);
+if ($bbcode->IsValidURL($url))
+$title = "<a href=\"" . htmlspecialchars($params['url']) . "\">" . $title . "</a>";
+}
+}
+else if (!is_string($default))
+$title = "Quote:";
+else $title = htmlspecialchars(trim($default)) . " wrote:";
+return "\n<div class=\"bbcode_quote\">\n<div class=\"bbcode_quote_head\">"
+. $title . "</div>\n<div class=\"bbcode_quote_body\">"
+. $content . "</div>\n</div>\n";
+}
+function DoList($bbcode, $action, $name, $default, $params, $content) {
+$list_styles = Array(
+'1' => 'decimal',
+'01' => 'decimal-leading-zero',
+'i' => 'lower-roman',
+'I' => 'upper-roman',
+'a' => 'lower-alpha',
+'A' => 'upper-alpha',
+);
+$ci_list_styles = Array(
+'circle' => 'circle',
+'disc' => 'disc',
+'square' => 'square',
+'greek' => 'lower-greek',
+'armenian' => 'armenian',
+'georgian' => 'georgian',
+);
+$ul_types = Array(
+'circle' => 'circle',
+'disc' => 'disc',
+'square' => 'square',
+);
+$default = trim($default);
+if ($action == BBCODE_CHECK) {
+if (!is_string($default) || strlen($default) == "") return true;
+else if (isset($list_styles[$default])) return true;
+else if (isset($ci_list_styles[strtolower($default)])) return true;
+else return false;
+}
+if (!is_string($default) || strlen($default) == "") {
+$elem = 'ul';
+$type = '';
+}
+else if ($default == '1') {
+$elem = 'ol';
+$type = '';
+}
+else if (isset($list_styles[$default])) {
+$elem = 'ol';
+$type = $list_styles[$default];
+}
+else {
+$default = strtolower($default);
+if (isset($ul_types[$default])) {
+$elem = 'ul';
+$type = $ul_types[$default];
+}
+else if (isset($ci_list_styles[$default])) {
+$elem = 'ol';
+$type = $ci_list_styles[$default];
+}
+}
+if (strlen($type))
+return "\n<$elem class=\"bbcode_list\" style=\"list-style-type:$type\">\n$content</$elem>\n";
+else return "\n<$elem class=\"bbcode_list\">\n$content</$elem>\n";
+}
+}
+
+class BBCodeEmailAddressValidator {
+function check_email_address($strEmailAddress) {
+if (preg_match('/[\x00-\x1F\x7F-\xFF]/', $strEmailAddress)) {
+return false;
+}
+$intAtSymbol = strrpos($strEmailAddress, '@');
+if ($intAtSymbol === false) {
+return false;
+}
+$arrEmailAddress[0] = substr($strEmailAddress, 0, $intAtSymbol);
+$arrEmailAddress[1] = substr($strEmailAddress, $intAtSymbol + 1);
+$arrTempAddress[0] = preg_replace('/"[^"]+"/'
+,''
+,$arrEmailAddress[0]);
+$arrTempAddress[1] = $arrEmailAddress[1];
+$strTempAddress = $arrTempAddress[0] . $arrTempAddress[1];
+if (strrpos($strTempAddress, '@') !== false) {
+return false;
+}
+if (!$this->check_local_portion($arrEmailAddress[0])) {
+return false;
+}
+if (!$this->check_domain_portion($arrEmailAddress[1])) {
+return false;
+}
+return true;
+}
+function check_local_portion($strLocalPortion) {
+if (!$this->check_text_length($strLocalPortion, 1, 64)) {
+return false;
+}
+$arrLocalPortion = explode('.', $strLocalPortion);
+for ($i = 0, $max = sizeof($arrLocalPortion); $i < $max; $i++) {
+if (!preg_match('.^('
+. '([A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]'
+. '[A-Za-z0-9!#$%&\'*+/=?^_`{|}~-]{0,63})'
+.'|'
+. '("[^\\\"]{0,62}")'
+.')$.'
+,$arrLocalPortion[$i])) {
+return false;
+}
+}
+return true;
+}
+function check_domain_portion($strDomainPortion) {
+if (!$this->check_text_length($strDomainPortion, 1, 255)) {
+return false;
+}
+if (preg_match('/^(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
+.'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}$/'
+,$strDomainPortion) ||
+preg_match('/^\[(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])'
+.'(\.(25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9]?[0-9])){3}\]$/'
+,$strDomainPortion)) {
+return true;
+} else {
+$arrDomainPortion = explode('.', $strDomainPortion);
+if (sizeof($arrDomainPortion) < 2) {
+return false;
+}
+for ($i = 0, $max = sizeof($arrDomainPortion); $i < $max; $i++) {
+if (!$this->check_text_length($arrDomainPortion[$i], 1, 63)) {
+return false;
+}
+if (!preg_match('/^(([A-Za-z0-9][A-Za-z0-9-]{0,61}[A-Za-z0-9])|'
+.'([A-Za-z0-9]+))$/', $arrDomainPortion[$i])) {
+return false;
+}
+}
+}
+return true;
+}
+function check_text_length($strText, $intMinimum, $intMaximum) {
+$intTextLength = strlen($strText);
+if (($intTextLength < $intMinimum) || ($intTextLength > $intMaximum)) {
+return false;
+} else {
+return true;
+}
+}
+}
+
+class BBCode {
+var $tag_rules;
+var $defaults;
+var $current_class;
+var $root_class;
+var $lost_start_tags;
+var $start_tags;
+var $allow_ampersand;
+var $tag_marker;
+var $ignore_newlines;
+var $plain_mode;
+var $detect_urls;
+var $url_pattern;
+var $output_limit;
+var $text_length;
+var $was_limited;
+var $limit_tail;
+var $limit_precision;
+var $smiley_dir;
+var $smiley_url;
+var $smileys;
+var $smiley_regex;
+var $enable_smileys;
+var $wiki_url;
+var $local_img_dir;
+var $local_img_url;
+var $url_targetable;
+var $url_target;
+var $rule_html;
+var $pre_trim;
+var $post_trim;
+var $debug;
+
+
+/* ADDED */
+// singleton instance
+private static $instance;
+
+// private constructor function
+// to prevent external instantiation
+private function __construct()
+{
+	$this->defaults = new BBCodeLibrary;
+	$this->tag_rules = $this->defaults->default_tag_rules;
+	$this->smileys = $this->defaults->default_smileys;
+	$this->enable_smileys = true;
+	$this->smiley_regex = false;
+	$this->smiley_dir = $this->GetDefaultSmileyDir();
+	$this->smiley_url = $this->GetDefaultSmileyURL();
+	$this->wiki_url = $this->GetDefaultWikiURL();
+	$this->local_img_dir = $this->GetDefaultLocalImgDir();
+	$this->local_img_url = $this->GetDefaultLocalImgURL();
+	$this->rule_html = $this->GetDefaultRuleHTML();
+	$this->pre_trim = "";
+	$this->post_trim = "";
+	$this->root_class = 'block';
+	$this->lost_start_tags = Array();
+	$this->start_tags = Array();
+	$this->tag_marker = '[';
+	$this->allow_ampsersand = false;
+	$this->current_class = $this->root_class;
+	$this->debug = false;
+	$this->ignore_newlines = false;
+	$this->output_limit = 0;
+	$this->plain_mode = false;
+	$this->was_limited = false;
+	$this->limit_tail = "...";
+	$this->limit_precision = 0.15;
+	$this->detect_urls = false;
+	$this->url_pattern = '<a href="{$url/h}">{$text/h}</a>';
+	$this->url_targetable = false;
+	$this->url_target = false;
+}
+
+// getInstance method
+public static function getInstance()
+{
+    if(!self::$instance)
+    {
+      self::$instance = new self();
+    }
+
+    return self::$instance;
+}
+/* ADDED */
+
+
+function SetPreTrim($trim = "a") { $this->pre_trim = $trim; }
+function GetPreTrim() { return $this->pre_trim; }
+function SetPostTrim($trim = "a") { $this->post_trim = $trim; }
+function GetPostTrim() { return $this->post_trim; }
+function SetRoot($class = 'block') { $this->root_class = $class; }
+function SetRootInline() { $this->root_class = 'inline'; }
+function SetRootBlock() { $this->root_class = 'block'; }
+function GetRoot() { return $this->root_class; }
+function SetDebug($enable = true) { $this->debug = $enable; }
+function GetDebug() { return $this->debug; }
+function SetAllowAmpersand($enable = true) { $this->allow_ampersand = $enable; }
+function GetAllowAmpersand() { return $this->allow_ampersand; }
+function SetTagMarker($marker = '[') { $this->tag_marker = $marker; }
+function GetTagMarker() { return $this->tag_marker; }
+function SetIgnoreNewlines($ignore = true) { $this->ignore_newlines = $ignore; }
+function GetIgnoreNewlines() { return $this->ignore_newlines; }
+function SetLimit($limit = 0) { $this->output_limit = $limit; }
+function GetLimit() { return $this->output_limit; }
+function SetLimitTail($tail = "...") { $this->limit_tail = $tail; }
+function GetLimitTail() { return $this->limit_tail; }
+function SetLimitPrecision($prec = 0.15) { $this->limit_precision = $prec; }
+function GetLimitPrecision() { return $this->limit_precision; }
+function WasLimited() { return $this->was_limited; }
+function SetPlainMode($enable = true) { $this->plain_mode = $enable; }
+function GetPlainMode() { return $this->plain_mode; }
+function SetDetectURLs($enable = true) { $this->detect_urls = $enable; }
+function GetDetectURLs() { return $this->detect_urls; }
+function SetURLPattern($pattern) { $this->url_pattern = $pattern; }
+function GetURLPattern() { return $this->url_pattern; }
+function SetURLTargetable($enable) { $this->url_targetable = $enable; }
+function GetURLTargetable() { return $this->url_targetable; }
+function SetURLTarget($target) { $this->url_target = $target; }
+function GetURLTarget() { return $this->url_target; }
+function AddRule($name, $rule) { $this->tag_rules[$name] = $rule; }
+function RemoveRule($name) { unset($this->tag_rules[$name]); }
+function GetRule($name) { return isset($this->tag_rules[$name])
+? $this->tag_rules[$name] : false; }
+function ClearRules() { $this->tag_rules = Array(); }
+function GetDefaultRule($name) { return isset($this->defaults->default_tag_rules[$name])
+? $this->defaults->default_tag_rules[$name] : false; }
+function SetDefaultRule($name) { if (isset($this->defaults->default_tag_rules[$name]))
+$this->AddRule($name, $this->defaults->default_tag_rules[$name]);
+else $this->RemoveRule($name); }
+function GetDefaultRules() { return $this->defaults->default_tag_rules; }
+function SetDefaultRules() { $this->tag_rules = $this->defaults->default_tag_rules; }
+function SetWikiURL($url) { $this->wiki_url = $url; }
+function GetWikiURL($url) { return $this->wiki_url; }
+function GetDefaultWikiURL() { return '/?page='; }
+function SetLocalImgDir($path) { $this->local_img_dir = $path; }
+function GetLocalImgDir() { return $this->local_img_dir; }
+function GetDefaultLocalImgDir() { return "img"; }
+function SetLocalImgURL($path) { $this->local_img_url = $path; }
+function GetLocalImgURL() { return $this->local_img_url; }
+function GetDefaultLocalImgURL() { return "img"; }
+function SetRuleHTML($html) { $this->rule_html = $html; }
+function GetRuleHTML() { return $this->rule_html; }
+function GetDefaultRuleHTML() { return "\n<hr class=\"bbcode_rule\" />\n"; }
+function AddSmiley($code, $image) { $this->smileys[$code] = $image; $this->smiley_regex = false; }
+function RemoveSmiley($code) { unset($this->smileys[$code]); $this->smiley_regex = false; }
+function GetSmiley($code) { return isset($this->smileys[$code])
+? $this->smileys[$code] : false; }
+function ClearSmileys() { $this->smileys = Array(); $this->smiley_regex = false; }
+function GetDefaultSmiley($code) { return isset($this->defaults->default_smileys[$code])
+? $this->defaults->default_smileys[$code] : false; }
+function SetDefaultSmiley($code) { $this->smileys[$code] = @$this->defaults->default_smileys[$code];
+$this->smiley_regex = false; }
+function GetDefaultSmileys() { return $this->defaults->default_smileys; }
+function SetDefaultSmileys() { $this->smileys = $this->defaults->default_smileys;
+$this->smiley_regex = false; }
+function SetSmileyDir($path) { $this->smiley_dir = $path; }
+function GetSmileyDir() { return $this->smiley_dir; }
+function GetDefaultSmileyDir() { return "smileys"; }
+function SetSmileyURL($path) { $this->smiley_url = $path; }
+function GetSmileyURL() { return $this->smiley_url; }
+function GetDefaultSmileyURL() { return "smileys"; }
+function SetEnableSmileys($enable = true) { $this->enable_smileys = $enable; }
+function GetEnableSmileys() { return $this->enable_smileys; }
+function nl2br($string) {
+return preg_replace("/\\x0A|\\x0D|\\x0A\\x0D|\\x0D\\x0A/", "<br />\n", $string);
+}
+function UnHTMLEncode($string) {
+if (function_exists("html_entity_decode"))
+return html_entity_decode($string);
+$string = preg_replace('~&#x([0-9a-f]+);~ei', 'chr(hexdec("\\1"))', $string);
+$string = preg_replace('~&#([0-9]+);~e', 'chr("\\1")', $string);
+$trans_tbl = get_html_translation_table(HTML_ENTITIES);
+$trans_tbl = array_flip($trans_tbl);
+return strtr($string, $trans_tbl);
+}
+function Wikify($string) {
+return rawurlencode(str_replace(" ", "_",
+trim(preg_replace("/[!?;@#\$%\\^&*<>=+`~\\x00-\\x20_-]+/", " ", $string))));
+}
+function IsValidURL($string, $email_too = true) {
+if (preg_match("/^
+(?:https?|ftp):\\/\\/
+(?:
+(?:[a-zA-Z0-9](?:[a-zA-Z0-9-]*[a-zA-Z0-9])?\\.)+
+[a-zA-Z0-9]
+(?:[a-zA-Z0-9-]*[a-zA-Z0-9])?
+|
+\\[
+(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}
+(?:
+25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-zA-Z0-9-]*[a-zA-Z0-9]:
+(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21-\\x5A\\x53-\\x7F]
+|\\\\[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F])+
+)
+\\]
+)
+(?::[0-9]{1,5})?
+(?:[\\/\\?\\#][^\\n\\r]*)?
+$/Dx", $string)) return true;
+if (preg_match("/^[^:]+([\\/\\\\?#][^\\r\\n]*)?$/D", $string))
+return true;
+if ($email_too)
+if (substr($string, 0, 7) == "mailto:")
+return $this->IsValidEmail(substr($string, 7));
+return false;
+}
+function IsValidEmail($string) {
+$validator = new BBCodeEmailAddressValidator;
+return $validator->check_email_address($string);
+/*
+return preg_match("/^
+(?:
+[a-z0-9\\!\\#\\\$\\%\\&\\'\\*\\+\\/=\\?\\^_`\\{\\|\\}~-]+
+(?:\.[a-z0-9\\!\\#\\\$\\%\\&\\'\\*\\+\\/=\\?\\^_`\\{\\|\\}~-]+)*
+|
+\"(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21\\x23-\\x5B\\x5D-\\x7F]
+|\\\\[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F])*\"
+)
+@
+(?:
+(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+
+[a-z0-9]
+(?:[a-z0-9-]*[a-z0-9])?
+|
+\\[
+(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\\.){3}
+(?:
+25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-]*[a-z0-9]:
+(?:[\\x01-\\x08\\x0B\\x0C\\x0E-\\x1F\\x21-\\x5A\\x53-\\x7F]
+|\\\\[\\x01-\\x09\\x0B\\x0C\\x0E-\\x7F])+
+)
+\\]
+)
+$/Dx", $string);
+*/
+}
+function HTMLEncode($string) {
+if (!$this->allow_ampersand)
+return htmlspecialchars($string);
+else return str_replace(Array('<', '>', '"'),
+Array('&lt;', '&gt;', '&quot;'), $string);
+}
+function FixupOutput($string) {
+if (!$this->detect_urls) {
+$output = $this->Internal_ProcessSmileys($string);
+}
+else {
+$chunks = $this->Internal_AutoDetectURLs($string);
+$output = Array();
+if (count($chunks)) {
+$is_a_url = false;
+foreach ($chunks as $index => $chunk) {
+if (!$is_a_url) {
+$chunk = $this->Internal_ProcessSmileys($chunk);
+}
+$output[] = $chunk;
+$is_a_url = !$is_a_url;
+}
+}
+$output = implode("", $output);
+}
+return $output;
+}
+function Internal_ProcessSmileys($string) {
+if (!$this->enable_smileys || $this->plain_mode) {
+$output = $this->HTMLEncode($string);
+}
+else {
+if ($this->smiley_regex === false) {
+$this->Internal_RebuildSmileys();
+}
+$tokens = preg_split($this->smiley_regex, $string, -1, PREG_SPLIT_DELIM_CAPTURE);
+if (count($tokens) <= 1) {
+$output = $this->HTMLEncode($string);
+}
+else {
+$output = "";
+$is_a_smiley = false;
+foreach ($tokens as $token) {
+if (!$is_a_smiley) {
+$output .= $this->HTMLEncode($token);
+}
+else {
+if (isset($this->smiley_info[$token])) {
+$info = $this->smiley_info[$token];
+}
+else {
+$info = @getimagesize($this->smiley_dir . '/' . $this->smileys[$token]);
+$this->smiley_info[$token] = $info;
+}
+$alt = htmlspecialchars($token);
+$output .= "<img src=\"" . htmlspecialchars($this->smiley_url . '/' . $this->smileys[$token])
+. "\" width=\"{$info[0]}\" height=\"{$info[1]}\""
+. " alt=\"$alt\" title=\"$alt\" class=\"bbcode_smiley\" />";
+}
+$is_a_smiley = !$is_a_smiley;
+}
+}
+}
+return $output;
+}
+function Internal_RebuildSmileys() {
+$regex = Array("/(?<![\\w])(");
+$first = true;
+foreach ($this->smileys as $code => $filename) {
+if (!$first) $regex[] = "|";
+$regex[] = preg_quote("$code", '/');
+$first = false;
+}
+$regex[] = ")(?![\\w])/";
+$this->smiley_regex = implode("", $regex);
+}
+function Internal_AutoDetectURLs($string) {
+$output = preg_split("/( (?:
+(?:https?|ftp) : \\/*
+(?:
+(?: (?: [a-zA-Z0-9-]{2,} \\. )+
+(?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
+| aero | biz | coop | info | museum | name | pro
+| example | invalid | localhost | test | local | onion | swift ) )
+| (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
+| (?: [0-9A-Fa-f:]+ : [0-9A-Fa-f]{1,4} )
+)
+(?: : [0-9]+ )?
+(?! [a-zA-Z0-9.:-] )
+(?:
+\\/
+[^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
+)?
+(?:
+[?#]
+[^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
+)?
+) | (?:
+(?:
+(?: (?: [a-zA-Z0-9-]{2,} \\. )+
+(?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
+| aero | biz | coop | info | museum | name | pro
+| example | invalid | localhost | test | local | onion | swift ) )
+| (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
+)
+(?: : [0-9]+ )?
+(?! [a-zA-Z0-9.:-] )
+(?:
+\\/
+[^&?#\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]*
+)?
+(?:
+[?#]
+[^\\(\\)\\[\\]\\{\\}<>\\'\\\"\\x00-\\x20\\x7F-\\xFF]+
+)?
+) | (?:
+[a-zA-Z0-9._-]{2,} @
+(?:
+(?: (?: [a-zA-Z0-9-]{2,} \\. )+
+(?: arpa | com | org | net | edu | gov | mil | int | [a-z]{2}
+| aero | biz | coop | info | museum | name | pro
+| example | invalid | localhost | test | local | onion | swift ) )
+| (?: [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} \\. [0-9]{1,3} )
+)
+) )/Dx", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
+if (count($output) > 1) {
+$is_a_url = false;
+foreach ($output as $index => $token) {
+if ($is_a_url) {
+if (preg_match("/^[a-zA-Z0-9._-]{2,}@/", $token)) {
+$url = "mailto:" . $token;
+}
+else if (preg_match("/^(https?:|ftp:)\\/*([^\\/&?#]+)\\/*(.*)\$/", $token, $matches)) {
+$url = $matches[1] . '/' . '/' . $matches[2] . "/" . $matches[3];
+}
+else {
+preg_match("/^([^\\/&?#]+)\\/*(.*)\$/", $token, $matches);
+$url = "http:/" . "/" . $matches[1] . "/" . $matches[2];
+}
+$params = @parse_url($url);
+if (!is_array($params)) $params = Array();
+$params['url'] = $url;
+$params['link'] = $url;
+$params['text'] = $token;
+$output[$index] = $this->FillTemplate($this->url_pattern, $params);
+}
+$is_a_url = !$is_a_url;
+}
+}
+return $output;
+}
+function FillTemplate($template, $insert_array, $default_array = Array()) {
+$pieces = preg_split('/(\{\$[a-zA-Z0-9_.:\/-]+\})/', $template,
+-1, PREG_SPLIT_DELIM_CAPTURE);
+if (count($pieces) <= 1)
+return $template;
+$result = Array();
+$is_an_insert = false;
+foreach ($pieces as $piece) {
+if (!$is_an_insert) {
+$result[] = $piece;
+}
+else if (!preg_match('/\{\$([a-zA-Z0-9_:-]+)((?:\\.[a-zA-Z0-9_:-]+)*)(?:\/([a-zA-Z0-9_:-]+))?\}/', $piece, $matches)) {
+$result[] = $piece;
+}
+else {
+if (isset($insert_array[$matches[1]]))
+$value = @$insert_array[$matches[1]];
+else $value = @$default_array[$matches[1]];
+if (strlen(@$matches[2])) {
+foreach (split(".", substr($matches[2], 1)) as $index) {
+if (is_array($value))
+$value = @$value[$index];
+else if (is_object($value)) {
+$value = (array)$value;
+$value = @$value[$index];
+}
+else $value = "";
+}
+}
+switch (gettype($value)) {
+case 'boolean': $value = $value ? "true" : "false"; break;
+case 'integer': $value = (string)$value; break;
+case 'double': $value = (string)$value; break;
+case 'string': break;
+default: $value = ""; break;
+}
+if (strlen(@$matches[3]))
+$flags = array_flip(str_split($matches[3]));
+else $flags = Array();
+if (!isset($flags['v'])) {
+if (isset($flags['w']))
+$value = preg_replace("/[\\x00-\\x09\\x0B-\x0C\x0E-\\x20]+/", " ", $value);
+if (isset($flags['t'])) $value = trim($value);
+if (isset($flags['b'])) $value = basename($value);
+if (isset($flags['e'])) $value = $this->HTMLEncode($value);
+else if (isset($flags['k'])) $value = $this->Wikify($value);
+else if (isset($flags['h'])) $value = htmlspecialchars($value);
+else if (isset($flags['u'])) $value = urlencode($value);
+if (isset($flags['n'])) $value = $this->nl2br($value);
+}
+$result[] = $value;
+}
+$is_an_insert = !$is_an_insert;
+}
+return implode("", $result);
+}
+function Internal_CollectText($array, $start = 0) {
+ob_start();
+for ($start = intval($start), $end = count($array); $start < $end; $start++)
+print $array[$start][BBCODE_STACK_TEXT];
+$output = ob_get_contents();
+ob_end_clean();
+return $output;
+}
+function Internal_CollectTextReverse($array, $start = 0, $end = 0) {
+ob_start();
+for ($start = intval($start); $start >= $end; $start--)
+print $array[$start][BBCODE_STACK_TEXT];
+$output = ob_get_contents();
+ob_end_clean();
+return $output;
+}
+function Internal_GenerateOutput($pos) {
+$output = Array();
+while (count($this->stack) > $pos) {
+$token = array_pop($this->stack);
+if ($token[BBCODE_STACK_TOKEN] != BBCODE_TAG) {
+$output[] = $token;
+}
+else {
+$name = @$token[BBCODE_STACK_TAG]['_name'];
+$rule = @$this->tag_rules[$name];
+$end_tag = @$rule['end_tag'];
+if (!isset($rule['end_tag'])) $end_tag = BBCODE_REQUIRED;
+else $end_tag = $rule['end_tag'];
+array_pop($this->start_tags[$name]);
+if ($end_tag == BBCODE_PROHIBIT) {
+$output[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_TEXT => $token[BBCODE_STACK_TEXT],
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+else {
+if ($end_tag == BBCODE_REQUIRED)
+@$this->lost_start_tags[$name] += 1;
+$end = $this->Internal_CleanupWSByIteratingPointer(@$rule['before_endtag'], 0, $output);
+$this->Internal_CleanupWSByPoppingStack(@$rule['after_tag'], $output);
+$tag_body = $this->Internal_CollectTextReverse($output, count($output)-1, $end);
+$this->Internal_CleanupWSByPoppingStack(@$rule['before_tag'], $this->stack);
+$this->Internal_UpdateParamsForMissingEndTag(@$token[BBCODE_STACK_TAG]);
+$tag_output = $this->DoTag(BBCODE_OUTPUT, $name,
+@$token[BBCODE_STACK_TAG]['_default'], @$token[BBCODE_STACK_TAG], $tag_body);
+$output = Array(Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_TEXT => $tag_output,
+BBCODE_STACK_CLASS => $this->current_class
+));
+}
+}
+}
+$this->Internal_ComputeCurrentClass();
+return $output;
+}
+function Internal_RewindToClass($class_list) {
+$pos = count($this->stack) - 1;
+while ($pos >= 0 && !in_array($this->stack[$pos][BBCODE_STACK_CLASS], $class_list))
+$pos--;
+if ($pos < 0) {
+if (!in_array($this->root_class, $class_list))
+return false;
+}
+$output = $this->Internal_GenerateOutput($pos+1);
+while (count($output)) {
+$token = array_pop($output);
+$token[BBCODE_STACK_CLASS] = $this->current_class;
+$this->stack[] = $token;
+}
+return true;
+}
+function Internal_FinishTag($tag_name) {
+if (strlen($tag_name) <= 0)
+return false;
+if (isset($this->start_tags[$tag_name])
+&& count($this->start_tags[$tag_name]))
+$pos = array_pop($this->start_tags[$tag_name]);
+else $pos = -1;
+if ($pos < 0) return false;
+$newpos = $this->Internal_CleanupWSByIteratingPointer(@$this->tag_rules[$tag_name]['after_tag'],
+$pos+1, $this->stack);
+$delta = $newpos - ($pos+1);
+$output = $this->Internal_GenerateOutput($newpos);
+$newend = $this->Internal_CleanupWSByIteratingPointer(@$this->tag_rules[$tag_name]['before_endtag'],
+0, $output);
+$output = $this->Internal_CollectTextReverse($output, count($output) - 1, $newend);
+while ($delta-- > 0)
+array_pop($this->stack);
+$this->Internal_ComputeCurrentClass();
+return $output;
+}
+function Internal_ComputeCurrentClass() {
+if (count($this->stack) > 0)
+$this->current_class = $this->stack[count($this->stack)-1][BBCODE_STACK_CLASS];
+else $this->current_class = $this->root_class;
+}
+function Internal_DumpStack($array = false, $raw = false) {
+if (!$raw) $string = "<span style='color: #00C;'>";
+else $string = "";
+if ($array === false)
+$array = $this->stack;
+foreach ($array as $item) {
+switch (@$item[BBCODE_STACK_TOKEN]) {
+case BBCODE_TEXT:
+$string .= "\"" . htmlspecialchars(@$item[BBCODE_STACK_TEXT]) . "\" ";
+break;
+case BBCODE_WS:
+$string .= "WS ";
+break;
+case BBCODE_NL:
+$string .= "NL ";
+break;
+case BBCODE_TAG:
+$string .= "[" . htmlspecialchars(@$item[BBCODE_STACK_TAG]['_name']) . "] ";
+break;
+default:
+$string .= "unknown ";
+break;
+}
+}
+if (!$raw) $string .= "</span>";
+return $string;
+}
+function Internal_CleanupWSByPoppingStack($pattern, &$array) {
+if (strlen($pattern) <= 0) return;
+$oldlen = count($array);
+foreach (str_split($pattern) as $char) {
+switch ($char) {
+case 's':
+while (count($array) > 0 && $array[count($array)-1][BBCODE_STACK_TOKEN] == BBCODE_WS)
+array_pop($array);
+break;
+case 'n':
+if (count($array) > 0 && $array[count($array)-1][BBCODE_STACK_TOKEN] == BBCODE_NL)
+array_pop($array);
+break;
+case 'a':
+while (count($array) > 0
+&& (($token = $array[count($array)-1][BBCODE_STACK_TOKEN]) == BBCODE_WS
+|| $token == BBCODE_NL))
+array_pop($array);
+break;
+}
+}
+if (count($array) != $oldlen) {
+$this->Internal_ComputeCurrentClass();
+}
+}
+function Internal_CleanupWSByEatingInput($pattern) {
+if (strlen($pattern) <= 0) return;
+foreach (str_split($pattern) as $char) {
+switch ($char) {
+case 's':
+$token_type = $this->lexer->NextToken();
+while ($token_type == BBCODE_WS) {
+$token_type = $this->lexer->NextToken();
+}
+$this->lexer->UngetToken();
+break;
+case 'n':
+$token_type = $this->lexer->NextToken();
+if ($token_type != BBCODE_NL)
+$this->lexer->UngetToken();
+break;
+case 'a':
+$token_type = $this->lexer->NextToken();
+while ($token_type == BBCODE_WS || $token_type == BBCODE_NL) {
+$token_type = $this->lexer->NextToken();
+}
+$this->lexer->UngetToken();
+break;
+}
+}
+}
+function Internal_CleanupWSByIteratingPointer($pattern, $pos, $array) {
+if (strlen($pattern) <= 0) return $pos;
+foreach (str_split($pattern) as $char) {
+switch ($char) {
+case 's':
+while ($pos < count($array) && $array[$pos][BBCODE_STACK_TOKEN] == BBCODE_WS)
+$pos++;
+break;
+case 'n':
+if ($pos < count($array) && $array[$pos][BBCODE_STACK_TOKEN] == BBCODE_NL)
+$pos++;
+break;
+case 'a':
+while ($pos < count($array)
+&& (($token = $array[$pos][BBCODE_STACK_TOKEN]) == BBCODE_WS || $token == BBCODE_NL))
+$pos++;
+break;
+}
+}
+return $pos;
+}
+function Internal_LimitText($string, $limit) {
+$chunks = preg_split("/([\\x00-\\x20]+)/", $string, -1, PREG_SPLIT_DELIM_CAPTURE);
+$output = "";
+foreach ($chunks as $chunk) {
+if (strlen($output) + strlen($chunk) > $limit)
+break;
+$output .= $chunk;
+}
+$output = rtrim($output);
+return $output;
+}
+function Internal_DoLimit() {
+$this->Internal_CleanupWSByPoppingStack("a", $this->stack);
+if (strlen($this->limit_tail) > 0) {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->limit_tail,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+$this->was_limited = true;
+}
+function DoTag($action, $tag_name, $default_value, $params, $contents) {
+$tag_rule = @$this->tag_rules[$tag_name];
+switch ($action) {
+case BBCODE_CHECK:
+if (isset($tag_rule['allow'])) {
+foreach ($tag_rule['allow'] as $param => $pattern) {
+if ($param == '_content') $value = $contents;
+else if ($param == '_defaultcontent') {
+if (strlen($default_value))
+$value = $default_value;
+else $value = $contents;
+}
+else {
+if (isset($params[$param]))
+$value = $params[$param];
+else $value = @$tag_rule['default'][$param];
+}
+if (!preg_match($pattern, $value)) {
+return false;
+}
+}
+return true;
+}
+switch (@$tag_rule['mode']) {
+default:
+case BBCODE_MODE_SIMPLE:
+$result = true;
+break;
+case BBCODE_MODE_ENHANCED:
+$result = true;
+break;
+case BBCODE_MODE_INTERNAL:
+$result = @call_user_func(Array($this, @$tag_rule['method']), BBCODE_CHECK,
+$tag_name, $default_value, $params, $contents);
+break;
+case BBCODE_MODE_LIBRARY:
+$result = @call_user_func(Array($this->defaults, @$tag_rule['method']), $this, BBCODE_CHECK,
+$tag_name, $default_value, $params, $contents);
+break;
+case BBCODE_MODE_CALLBACK:
+$result = @call_user_func(@$tag_rule['method'], $this, BBCODE_CHECK,
+$tag_name, $default_value, $params, $contents);
+break;
+}
+return $result;
+case BBCODE_OUTPUT:
+if ($this->plain_mode) {
+if (!isset($tag_rule['plain_content']))
+$plain_content = Array('_content');
+else $plain_content = $tag_rule['plain_content'];
+$result = $possible_content = "";
+foreach ($plain_content as $possible_content) {
+if ($possible_content == '_content'
+&& strlen($contents) > 0) {
+$result = $contents;
+break;
+}
+if (isset($params[$possible_content])
+&& strlen($params[$possible_content]) > 0) {
+$result = htmlspecialchars($params[$possible_content]);
+break;
+}
+}
+$start = @$tag_rule['plain_start'];
+$end = @$tag_rule['plain_end'];
+if (isset($tag_rule['plain_link'])) {
+$link = $possible_content = "";
+foreach ($tag_rule['plain_link'] as $possible_content) {
+if ($possible_content == '_content'
+&& strlen($contents) > 0) {
+$link = $this->UnHTMLEncode(strip_tags($contents));
+break;
+}
+if (isset($params[$possible_content])
+&& strlen($params[$possible_content]) > 0) {
+$link = $params[$possible_content];
+break;
+}
+}
+$params = @parse_url($link);
+if (!is_array($params)) $params = Array();
+$params['link'] = $link;
+$params['url'] = $link;
+$start = $this->FillTemplate($start, $params);
+$end = $this->FillTemplate($end, $params);
+}
+return $start . $result . $end;
+}
+switch (@$tag_rule['mode']) {
+default:
+case BBCODE_MODE_SIMPLE:
+$result = @$tag_rule['simple_start'] . $contents . @$tag_rule['simple_end'];
+break;
+case BBCODE_MODE_ENHANCED:
+$result = $this->Internal_DoEnhancedTag($tag_rule, $params, $contents);
+break;
+case BBCODE_MODE_INTERNAL:
+$result = @call_user_func(Array($this, @$tag_rule['method']), BBCODE_OUTPUT,
+$tag_name, $default_value, $params, $contents);
+break;
+case BBCODE_MODE_LIBRARY:
+$result = @call_user_func(Array($this->defaults, @$tag_rule['method']), $this, BBCODE_OUTPUT,
+$tag_name, $default_value, $params, $contents);
+break;
+case BBCODE_MODE_CALLBACK:
+$result = @call_user_func(@$tag_rule['method'], $this, BBCODE_OUTPUT,
+$tag_name, $default_value, $params, $contents);
+break;
+}
+return $result;
+default:
+return false;
+}
+}
+function Internal_DoEnhancedTag($tag_rule, $params, $contents) {
+$params['_content'] = $contents;
+$params['_defaultcontent'] = strlen(@$params['_default']) ? $params['_default'] : $contents;
+return $this->FillTemplate(@$tag_rule['template'], $params, @$tag_rule['default']);
+}
+function Internal_UpdateParamsForMissingEndTag(&$params) {
+switch ($this->tag_marker) {
+case '[': $tail_marker = ']'; break;
+case '<': $tail_marker = '>'; break;
+case '{': $tail_marker = '}'; break;
+case '(': $tail_marker = ')'; break;
+default: $tail_marker = $this->tag_marker; break;
+}
+$params['_endtag'] = $this->tag_marker . '/' . $params['_name'] . $tail_marker;
+}
+function Internal_ProcessIsolatedTag($tag_name, $tag_params, $tag_rule) {
+if (!$this->DoTag(BBCODE_CHECK, $tag_name, @$tag_params['_default'], $tag_params, "")) {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+return;
+}
+$this->Internal_CleanupWSByPoppingStack(@$tag_rule['before_tag'], $this->stack);
+$output = $this->DoTag(BBCODE_OUTPUT, $tag_name, @$tag_params['_default'], $tag_params, "");
+$this->Internal_CleanupWSByEatingInput(@$tag_rule['after_tag']);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $output,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+function Internal_ProcessVerbatimTag($tag_name, $tag_params, $tag_rule) {
+$state = $this->lexer->SaveState();
+$end_tag = $this->lexer->tagmarker . "/" . $tag_name . $this->lexer->end_tagmarker;
+$start = count($this->stack);
+$this->lexer->verbatim = true;
+while (($token_type = $this->lexer->NextToken()) != BBCODE_EOI) {
+if ($this->lexer->text == $end_tag) {
+$end_tag_params = $this->lexer->tag;
+break;
+}
+if ($this->output_limit > 0
+&& $this->text_length + strlen($this->lexer->text) >= $this->output_limit) {
+$text = $this->Internal_LimitText($this->lexer->text,
+$this->output_limit - $this->text_length);
+if (strlen($text) > 0) {
+$this->text_length += strlen($text);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+$this->Internal_DoLimit();
+break;
+}
+$this->text_length += strlen($this->lexer->text);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => $token_type,
+BBCODE_STACK_TEXT => htmlspecialchars($this->lexer->text),
+BBCODE_STACK_TAG => $this->lexer->tag,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+$this->lexer->verbatim = false;
+if ($token_type == BBCODE_EOI) {
+$this->lexer->RestoreState($state);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+return;
+}
+$newstart = $this->Internal_CleanupWSByIteratingPointer(@$tag_rule['after_tag'], $start, $this->stack);
+$this->Internal_CleanupWSByPoppingStack(@$tag_rule['before_endtag'], $this->stack);
+$this->Internal_CleanupWSByEatingInput(@$tag_rule['after_endtag']);
+$content = $this->Internal_CollectText($this->stack, $newstart);
+array_splice($this->stack, $start);
+$this->Internal_ComputeCurrentClass();
+$this->Internal_CleanupWSByPoppingStack(@$tag_rule['before_tag'], $this->stack);
+$tag_params['_endtag'] = $end_tag_params['_tag'];
+$tag_params['_hasend'] = true;
+$output = $this->DoTag(BBCODE_OUTPUT, $tag_name,
+@$tag_params['_default'], $tag_params, $content);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $output,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+function Internal_ParseStartTagToken() {
+$tag_params = $this->lexer->tag;
+$tag_name = @$tag_params['_name'];
+if (!isset($this->tag_rules[$tag_name])) {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+return;
+}
+$tag_rule = $this->tag_rules[$tag_name];
+$allow_in = is_array($tag_rule['allow_in'])
+? $tag_rule['allow_in'] : Array($this->root_class);
+if (!in_array($this->current_class, $allow_in)) {
+if (!$this->Internal_RewindToClass($allow_in)) {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+return;
+}
+}
+$end_tag = isset($tag_rule['end_tag']) ? $tag_rule['end_tag'] : BBCODE_REQUIRED;
+if ($end_tag == BBCODE_PROHIBIT) {
+$this->Internal_ProcessIsolatedTag($tag_name, $tag_params, $tag_rule);
+return;
+}
+if (!$this->DoTag(BBCODE_CHECK, $tag_name, @$tag_params['_default'], $tag_params, "")) {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+return;
+}
+if (@$tag_rule['content'] == BBCODE_VERBATIM) {
+$this->Internal_ProcessVerbatimTag($tag_name, $tag_params, $tag_rule);
+return;
+}
+if (isset($tag_rule['class']))
+$newclass = $tag_rule['class'];
+else $newclass = $this->root_class;
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => $this->lexer->token,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => $this->lexer->tag,
+BBCODE_STACK_CLASS => ($this->current_class = $newclass),
+);
+if (!isset($this->start_tags[$tag_name]))
+$this->start_tags[$tag_name] = Array(count($this->stack)-1);
+else $this->start_tags[$tag_name][] = count($this->stack)-1;
+}
+function Internal_ParseEndTagToken() {
+$tag_params = $this->lexer->tag;
+$tag_name = @$tag_params['_name'];
+$contents = $this->Internal_FinishTag($tag_name);
+if ($contents === false) {
+if (@$this->lost_start_tags[$tag_name] > 0) {
+$this->lost_start_tags[$tag_name]--;
+}
+else {
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+return;
+}
+$start_tag_node = array_pop($this->stack);
+$start_tag_params = $start_tag_node[BBCODE_STACK_TAG];
+$this->Internal_ComputeCurrentClass();
+$this->Internal_CleanupWSByPoppingStack(@$this->tag_rules[$tag_name]['before_tag'], $this->stack);
+$start_tag_params['_endtag'] = $tag_params['_tag'];
+$start_tag_params['_hasend'] = true;
+$output = $this->DoTag(BBCODE_OUTPUT, $tag_name, @$start_tag_params['_default'],
+$start_tag_params, $contents);
+$this->Internal_CleanupWSByEatingInput(@$this->tag_rules[$tag_name]['after_endtag']);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $output,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+function Parse($string) {
+$this->lexer = new BBCodeLexer($string, $this->tag_marker);
+$this->lexer->debug = $this->debug;
+$old_output_limit = $this->output_limit;
+if ($this->output_limit > 0) {
+if (strlen($string) < $this->output_limit) {
+$this->output_limit = 0;
+}
+else if ($this->limit_precision > 0) {
+$guess_length = $this->lexer->GuessTextLength();
+if ($guess_length < $this->output_limit * ($this->limit_precision + 1.0)) {
+$this->output_limit = 0;
+}
+else {
+}
+}
+}
+$this->stack = Array();
+$this->start_tags = Array();
+$this->lost_start_tags = Array();
+$this->text_length = 0;
+$this->was_limited = false;
+if (strlen($this->pre_trim) > 0)
+$this->Internal_CleanupWSByEatingInput($this->pre_trim);
+$newline = $this->plain_mode ? "\n" : "<br />\n";
+while (true) {
+if (($token_type = $this->lexer->NextToken()) == BBCODE_EOI) {
+break;
+}
+switch ($token_type) {
+case BBCODE_TEXT:
+if ($this->output_limit > 0
+&& $this->text_length + strlen($this->lexer->text) >= $this->output_limit) {
+$text = $this->Internal_LimitText($this->lexer->text,
+$this->output_limit - $this->text_length);
+if (strlen($text) > 0) {
+$this->text_length += strlen($text);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+$this->Internal_DoLimit();
+break 2;
+}
+$this->text_length += strlen($this->lexer->text);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_TEXT,
+BBCODE_STACK_TEXT => $this->FixupOutput($this->lexer->text),
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+break;
+case BBCODE_WS:
+if ($this->output_limit > 0
+&& $this->text_length + strlen($this->lexer->text) >= $this->output_limit) {
+$this->Internal_DoLimit();
+break 2;
+}
+$this->text_length += strlen($this->lexer->text);
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_WS,
+BBCODE_STACK_TEXT => $this->lexer->text,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+break;
+case BBCODE_NL:
+if ($this->ignore_newlines) {
+if ($this->output_limit > 0
+&& $this->text_length + 1 >= $this->output_limit) {
+$this->Internal_DoLimit();
+break 2;
+}
+$this->text_length += 1;
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_WS,
+BBCODE_STACK_TEXT => "\n",
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+}
+else {
+$this->Internal_CleanupWSByPoppingStack("s", $this->stack);
+if ($this->output_limit > 0
+&& $this->text_length + 1 >= $this->output_limit) {
+$this->Internal_DoLimit();
+break 2;
+}
+$this->text_length += 1;
+$this->stack[] = Array(
+BBCODE_STACK_TOKEN => BBCODE_NL,
+BBCODE_STACK_TEXT => $newline,
+BBCODE_STACK_TAG => false,
+BBCODE_STACK_CLASS => $this->current_class,
+);
+$this->Internal_CleanupWSByEatingInput("s");
+}
+break;
+case BBCODE_TAG:
+$this->Internal_ParseStartTagToken();
+break;
+case BBCODE_ENDTAG:
+$this->Internal_ParseEndTagToken();
+break;
+default:
+break;
+}
+}
+if (strlen($this->post_trim) > 0)
+$this->Internal_CleanupWSByPoppingStack($this->post_trim, $this->stack);
+$result = $this->Internal_GenerateOutput(0);
+$result = $this->Internal_CollectTextReverse($result, count($result) - 1);
+$this->output_limit = $old_output_limit;
+if ($this->plain_mode) {
+$result = preg_replace("/[\\x00-\\x09\\x0B-\\x20]+/", " ", $result);
+$result = preg_replace("/(?:[\\x20]*\\n){2,}[\\x20]*/", "\n\n", $result);
+$result = trim($result);
+}
+return $result;
+}
+}
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/replies.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,955 @@
+<?php
+
+/**
+ * bbPress Replies Admin Class
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Replies_Admin' ) ) :
+/**
+ * Loads bbPress replies admin area
+ *
+ * @package bbPress
+ * @subpackage Administration
+ * @since bbPress (r2464)
+ */
+class BBP_Replies_Admin {
+
+	/** Variables *************************************************************/
+
+	/**
+	 * @var The post type of this admin component
+	 */
+	private $post_type = '';
+
+	/** Functions *************************************************************/
+
+	/**
+	 * The main bbPress admin loader
+	 *
+	 * @since bbPress (r2515)
+	 *
+	 * @uses BBP_Replies_Admin::setup_globals() Setup the globals needed
+	 * @uses BBP_Replies_Admin::setup_actions() Setup the hooks and actions
+	 * @uses BBP_Replies_Admin::setup_actions() Setup the help text
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the admin hooks, actions and filters
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 * @uses add_filter() To add various filters
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 */
+	private function setup_actions() {
+
+		// Add some general styling to the admin area
+		add_action( 'bbp_admin_head',        array( $this, 'admin_head'       ) );
+
+		// Messages
+		add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
+
+		// Reply column headers.
+		add_filter( 'manage_' . $this->post_type . '_posts_columns',  array( $this, 'replies_column_headers' ) );
+
+		// Reply columns (in post row)
+		add_action( 'manage_' . $this->post_type . '_posts_custom_column',  array( $this, 'replies_column_data' ), 10, 2 );
+		add_filter( 'post_row_actions',                                     array( $this, 'replies_row_actions' ), 10, 2 );
+
+		// Reply metabox actions
+		add_action( 'add_meta_boxes', array( $this, 'reply_attributes_metabox'      ) );
+		add_action( 'save_post',      array( $this, 'reply_attributes_metabox_save' ) );
+
+		// Check if there are any bbp_toggle_reply_* requests on admin_init, also have a message displayed
+		add_action( 'load-edit.php',  array( $this, 'toggle_reply'        ) );
+		add_action( 'admin_notices',  array( $this, 'toggle_reply_notice' ) );
+
+		// Anonymous metabox actions
+		add_action( 'add_meta_boxes', array( $this, 'author_metabox'      ) );
+		add_action( 'save_post',      array( $this, 'author_metabox_save' ) );
+
+		// Add ability to filter topics and replies per forum
+		add_filter( 'restrict_manage_posts', array( $this, 'filter_dropdown'  ) );
+		add_filter( 'bbp_request',           array( $this, 'filter_post_rows' ) );
+
+		// Contextual Help
+		add_action( 'load-edit.php',     array( $this, 'edit_help' ) );
+		add_action( 'load-post-new.php', array( $this, 'new_help'  ) );
+	}
+
+	/**
+	 * Should we bail out of this method?
+	 *
+	 * @since bbPress (r4067)
+	 * @return boolean
+	 */
+	private function bail() {
+		if ( !isset( get_current_screen()->post_type ) || ( $this->post_type != get_current_screen()->post_type ) )
+			return true;
+
+		return false;
+	}
+
+	/**
+	 * Admin globals
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 */
+	private function setup_globals() {
+		$this->post_type = bbp_get_reply_post_type();
+	}
+
+	/** Contextual Help *******************************************************/
+
+	/**
+	 * Contextual help for bbPress reply edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function edit_help() {
+
+		if ( $this->bail() ) return;
+
+		// Overview
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'overview',
+			'title'		=> __( 'Overview', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'This screen provides access to all of your replies. You can customize the display of this screen to suit your workflow.', 'bbpress' ) . '</p>'
+		) );
+
+		// Screen Content
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'screen-content',
+			'title'		=> __( 'Screen Content', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can customize the display of this screen&#8217;s contents in a number of ways:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( 'You can hide/display columns based on your needs and decide how many replies to list per screen using the Screen Options tab.',                                                                                                                                                                          'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can filter the list of replies by reply status using the text links in the upper left to show All, Published, Draft, or Trashed replies. The default view is to show all replies.',                                                                                                                   'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can view replies in a simple title list or with an excerpt. Choose the view you prefer by clicking on the icons at the top of the list on the right.',                                                                                                                                             'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can refine the list to show only replies in a specific category or from a specific month by using the dropdown menus above the replies list. Click the Filter button after making your selection. You also can refine the list by clicking on the reply author, category or tag in the replies list.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Available Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'action-links',
+			'title'		=> __( 'Available Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'Hovering over a row in the replies list will display action links that allow you to manage your reply. You can perform the following actions:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Edit</strong> takes you to the editing screen for that reply. You can also reach that screen by clicking on the reply title.',                                                                                 'bbpress' ) . '</li>' .
+					//'<li>' . __( '<strong>Quick Edit</strong> provides inline access to the metadata of your reply, allowing you to update reply details without leaving this screen.',                                                                  'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Trash</strong> removes your reply from this list and places it in the trash, from which you can permanently delete it.',                                                                                       'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Spam</strong> removes your reply from this list and places it in the spam queue, from which you can permanently delete it.',                                                                                   'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Preview</strong> will show you what your draft reply will look like if you publish it. View will take you to your live site to view the reply. Which link is available depends on your reply&#8217;s status.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Bulk Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'bulk-actions',
+			'title'		=> __( 'Bulk Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can also edit or move multiple replies to the trash at once. Select the replies you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.',           'bbpress' ) . '</p>' .
+				'<p>' . __( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected replies at once. To remove a reply from the grouping, just click the x next to its name in the Bulk Edit area that appears.', 'bbpress' ) . '</p>'
+		) );
+
+		// Help Sidebar
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Contextual help for bbPress reply edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function new_help() {
+
+		if ( $this->bail() ) return;
+
+		$customize_display = '<p>' . __( 'The title field and the big reply editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.', 'bbpress' ) . '</p>';
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'customize-display',
+			'title'   => __( 'Customizing This Display', 'bbpress' ),
+			'content' => $customize_display,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'title-reply-editor',
+			'title'   => __( 'Title and Reply Editor', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Title</strong> - Enter a title for your reply. After you enter a title, you&#8217;ll see the permalink below, which you can edit.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Reply Editor</strong> - Enter the text for your reply. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your reply text. You can insert media files by clicking the icons above the reply editor and following the directions. You can go to the distraction-free writing screen via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular reply editor.', 'bbpress' ) . '</p>'
+		) );
+
+		$publish_box = '<p>' . __( '<strong>Publish</strong> - You can set the terms of publishing your reply in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a reply or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a reply to be published in the future or backdate a reply.', 'bbpress' ) . '</p>';
+
+		if ( current_theme_supports( 'reply-formats' ) && reply_type_supports( 'reply', 'reply-formats' ) ) {
+			$publish_box .= '<p>' . __( '<strong>reply Format</strong> - This designates how your theme will display a specific reply. For example, you could have a <em>standard</em> blog reply with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Please refer to the Codex for <a href="http://codex.wordpress.org/Post_Formats#Supported_Formats">descriptions of each reply format</a>. Your theme could enable all or some of 10 possible formats.', 'bbpress' ) . '</p>';
+		}
+
+		if ( current_theme_supports( 'reply-thumbnails' ) && reply_type_supports( 'reply', 'thumbnail' ) ) {
+			$publish_box .= '<p>' . __( '<strong>Featured Image</strong> - This allows you to associate an image with your reply without inserting it. This is usually useful only if your theme makes use of the featured image as a reply thumbnail on the home page, a custom header, etc.', 'bbpress' ) . '</p>';
+		}
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'reply-attributes',
+			'title'   => __( 'Reply Attributes', 'bbpress' ),
+			'content' =>
+				'<p>' . __( 'Select the attributes that your reply should have:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Forum</strong> dropdown determines the parent forum that the reply belongs to. Select the forum, or leave the default (Use Forum of Topic) to post the reply in forum of the topic.', 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Topic</strong> determines the parent topic that the reply belongs to.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'publish-box',
+			'title'   => __( 'Publish Box', 'bbpress' ),
+			'content' => $publish_box,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'discussion-settings',
+			'title'   => __( 'Discussion Settings', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Send Trackbacks</strong> - Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they&#8217;ll be notified automatically using pingbacks, and this field is unnecessary.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Discussion</strong> - You can turn comments and pings on or off, and if there are comments on the reply, you can see them here and moderate them.', 'bbpress' ) . '</p>'
+		) );
+
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Add the reply attributes metabox
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses add_meta_box() To add the metabox
+	 * @uses do_action() Calls 'bbp_reply_attributes_metabox'
+	 */
+	public function reply_attributes_metabox() {
+
+		if ( $this->bail() ) return;
+
+		add_meta_box (
+			'bbp_reply_attributes',
+			__( 'Reply Attributes', 'bbpress' ),
+			'bbp_reply_metabox',
+			$this->post_type,
+			'side',
+			'high'
+		);
+
+		do_action( 'bbp_reply_attributes_metabox' );
+	}
+
+	/**
+	 * Pass the reply attributes for processing
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param int $reply_id Reply id
+	 * @uses current_user_can() To check if the current user is capable of
+	 *                           editing the reply
+	 * @uses do_action() Calls 'bbp_reply_attributes_metabox_save' with the
+	 *                    reply id and parent id
+	 * @return int Parent id
+	 */
+	public function reply_attributes_metabox_save( $reply_id ) {
+
+		if ( $this->bail() ) return $reply_id;
+
+		// Bail if doing an autosave
+		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
+			return $reply_id;
+
+		// Bail if not a post request
+		if ( 'POST' != strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return $reply_id;
+
+		// Check action exists
+		if ( empty( $_POST['action'] ) )
+			return $reply_id;
+
+		// Nonce check
+		if ( empty( $_POST['bbp_reply_metabox'] ) || !wp_verify_nonce( $_POST['bbp_reply_metabox'], 'bbp_reply_metabox_save' ) )
+			return $reply_id;
+
+		// Current user cannot edit this reply
+		if ( !current_user_can( 'edit_reply', $reply_id ) )
+			return $reply_id;
+
+		// Get the reply meta post values
+		$topic_id = !empty( $_POST['parent_id']    ) ? (int) $_POST['parent_id']    : 0;
+		$forum_id = !empty( $_POST['bbp_forum_id'] ) ? (int) $_POST['bbp_forum_id'] : bbp_get_topic_forum_id( $topic_id );
+
+		// Formally update the reply
+		bbp_update_reply( $reply_id, $topic_id, $forum_id );
+
+		// Allow other fun things to happen
+		do_action( 'bbp_reply_attributes_metabox_save', $reply_id, $topic_id, $forum_id );
+
+		return $reply_id;
+	}
+
+	/**
+	 * Add the author info metabox
+	 *
+	 * Allows editing of information about an author
+	 *
+	 * @since bbPress (r2828)
+	 *
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses add_meta_box() To add the metabox
+	 * @uses do_action() Calls 'bbp_author_metabox' with the topic/reply
+	 *                    id
+	 */
+	public function author_metabox() {
+
+		if ( $this->bail() ) return;
+
+		// Bail if post_type is not a reply
+		if ( empty( $_GET['action'] ) || ( 'edit' != $_GET['action'] ) )
+			return;
+
+		// Add the metabox
+		add_meta_box(
+			'bbp_author_metabox',
+			__( 'Author Information', 'bbpress' ),
+			'bbp_author_metabox',
+			$this->post_type,
+			'side',
+			'high'
+		);
+
+		do_action( 'bbp_author_metabox', get_the_ID() );
+	}
+
+	/**
+	 * Save the author information for the topic/reply
+	 *
+	 * @since bbPress (r2828)
+	 *
+	 * @param int $post_id Topic or reply id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           topic or reply
+	 * @uses bbp_filter_anonymous_post_data() To filter the anonymous user data
+	 * @uses update_post_meta() To update the anonymous user data
+	 * @uses do_action() Calls 'bbp_author_metabox_save' with the reply id and
+	 *                    anonymous data
+	 * @return int Topic or reply id
+	 */
+	public function author_metabox_save( $post_id ) {
+
+		if ( $this->bail() ) return $post_id;
+
+		// Bail if no post_id
+		if ( empty( $post_id ) )
+			return $post_id;
+
+		// Bail if not a post request
+		if ( 'POST' != strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return $post_id;
+
+		// Bail if doing an autosave
+		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
+			return $post_id;
+
+		// Bail if user cannot edit replies or reply is not anonymous
+		if ( !current_user_can( 'edit_reply', $post_id ) )
+			return $post_id;
+
+		$anonymous_data = bbp_filter_anonymous_post_data();
+
+		update_post_meta( $post_id, '_bbp_anonymous_name',    $anonymous_data['bbp_anonymous_name']    );
+		update_post_meta( $post_id, '_bbp_anonymous_email',   $anonymous_data['bbp_anonymous_email']   );
+		update_post_meta( $post_id, '_bbp_anonymous_website', $anonymous_data['bbp_anonymous_website'] );
+
+		do_action( 'bbp_author_metabox_save', $post_id, $anonymous_data );
+
+		return $post_id;
+	}
+
+	/**
+	 * Add some general styling to the admin area
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses sanitize_html_class() To sanitize the classes
+	 * @uses do_action() Calls 'bbp_admin_head'
+	 */
+	public function admin_head() {
+
+		if ( $this->bail() ) return;
+
+		?>
+
+		<style type="text/css" media="screen">
+		/*<![CDATA[*/
+
+			strong.label {
+				display: inline-block;
+				width: 60px;
+			}
+
+			.column-bbp_forum_topic_count,
+			.column-bbp_forum_reply_count,
+			.column-bbp_topic_reply_count,
+			.column-bbp_topic_voice_count {
+				width: 8% !important;
+			}
+
+			.column-author,
+			.column-bbp_reply_author,
+			.column-bbp_topic_author {
+				width: 10% !important;
+			}
+
+			.column-bbp_topic_forum,
+			.column-bbp_reply_forum,
+			.column-bbp_reply_topic {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_freshness,
+			.column-bbp_topic_freshness {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_created,
+			.column-bbp_topic_created,
+			.column-bbp_reply_created {
+				width: 15% !important;
+			}
+
+			.status-closed {
+				background-color: #eaeaea;
+			}
+
+			.status-spam {
+				background-color: #faeaea;
+			}
+
+		/*]]>*/
+		</style>
+
+		<?php
+	}
+
+	/**
+	 * Toggle reply
+	 *
+	 * Handles the admin-side spamming/unspamming of replies
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the user is capable of editing
+	 *                           the reply
+	 * @uses wp_die() To die if the user isn't capable or the post wasn't
+	 *                 found
+	 * @uses check_admin_referer() To verify the nonce and check referer
+	 * @uses bbp_is_reply_spam() To check if the reply is marked as spam
+	 * @uses bbp_unspam_reply() To unmark the reply as spam
+	 * @uses bbp_spam_reply() To mark the reply as spam
+	 * @uses do_action() Calls 'bbp_toggle_reply_admin' with success, post
+	 *                    data, action and message
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_safe_redirect() Redirect the page to custom url
+	 */
+	public function toggle_reply() {
+
+		if ( $this->bail() ) return;
+
+		// Only proceed if GET is a reply toggle action
+		if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'bbp_toggle_reply_spam' ) ) && !empty( $_GET['reply_id'] ) ) {
+			$action    = $_GET['action'];            // What action is taking place?
+			$reply_id  = (int) $_GET['reply_id'];    // What's the reply id?
+			$success   = false;                      // Flag
+			$post_data = array( 'ID' => $reply_id ); // Prelim array
+
+			// Get reply and die if empty
+			$reply = bbp_get_reply( $reply_id );
+			if ( empty( $reply ) ) // Which reply?
+				wp_die( __( 'The reply was not found!', 'bbpress' ) );
+
+			if ( !current_user_can( 'moderate', $reply->ID ) ) // What is the user doing here?
+				wp_die( __( 'You do not have the permission to do that!', 'bbpress' ) );
+
+			switch ( $action ) {
+				case 'bbp_toggle_reply_spam' :
+					check_admin_referer( 'spam-reply_' . $reply_id );
+
+					$is_spam = bbp_is_reply_spam( $reply_id );
+					$message = $is_spam ? 'unspammed' : 'spammed';
+					$success = $is_spam ? bbp_unspam_reply( $reply_id ) : bbp_spam_reply( $reply_id );
+
+					break;
+			}
+
+			$success = wp_update_post( $post_data );
+			$message = array( 'bbp_reply_toggle_notice' => $message, 'reply_id' => $reply->ID );
+
+			if ( false == $success || is_wp_error( $success ) )
+				$message['failed'] = '1';
+
+			// Do additional reply toggle actions (admin side)
+			do_action( 'bbp_toggle_reply_admin', $success, $post_data, $action, $message );
+
+			// Redirect back to the reply
+			$redirect = add_query_arg( $message, remove_query_arg( array( 'action', 'reply_id' ) ) );
+			wp_safe_redirect( $redirect );
+
+			// For good measure
+			exit();
+		}
+	}
+
+	/**
+	 * Toggle reply notices
+	 *
+	 * Display the success/error notices from
+	 * {@link BBP_Admin::toggle_reply()}
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses bbp_get_reply_title() To get the reply title of the reply
+	 * @uses esc_html() To sanitize the reply title
+	 * @uses apply_filters() Calls 'bbp_toggle_reply_notice_admin' with
+	 *                        message, reply id, notice and is it a failure
+	 */
+	public function toggle_reply_notice() {
+
+		if ( $this->bail() ) return;
+
+		// Only proceed if GET is a reply toggle action
+		if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['bbp_reply_toggle_notice'] ) && in_array( $_GET['bbp_reply_toggle_notice'], array( 'spammed', 'unspammed' ) ) && !empty( $_GET['reply_id'] ) ) {
+			$notice     = $_GET['bbp_reply_toggle_notice'];         // Which notice?
+			$reply_id   = (int) $_GET['reply_id'];                  // What's the reply id?
+			$is_failure = !empty( $_GET['failed'] ) ? true : false; // Was that a failure?
+
+			// Empty? No reply?
+			if ( empty( $notice ) || empty( $reply_id ) )
+				return;
+
+			// Get reply and bail if empty
+			$reply = bbp_get_reply( $reply_id );
+			if ( empty( $reply ) )
+				return;
+
+			$reply_title = esc_html( bbp_get_reply_title( $reply->ID ) );
+
+			switch ( $notice ) {
+				case 'spammed' :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem marking the reply "%1$s" as spam.', 'bbpress' ), $reply_title ) : sprintf( __( 'Reply "%1$s" successfully marked as spam.', 'bbpress' ), $reply_title );
+					break;
+
+				case 'unspammed' :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem unmarking the reply "%1$s" as spam.', 'bbpress' ), $reply_title ) : sprintf( __( 'Reply "%1$s" successfully unmarked as spam.', 'bbpress' ), $reply_title );
+					break;
+			}
+
+			// Do additional reply toggle notice filters (admin side)
+			$message = apply_filters( 'bbp_toggle_reply_notice_admin', $message, $reply->ID, $notice, $is_failure );
+
+			?>
+
+			<div id="message" class="<?php echo $is_failure == true ? 'error' : 'updated'; ?> fade">
+				<p style="line-height: 150%"><?php echo $message; ?></p>
+			</div>
+
+			<?php
+		}
+	}
+
+	/**
+	 * Manage the column headers for the replies page
+	 *
+	 * @since bbPress (r2577)
+	 *
+	 * @param array $columns The columns
+	 * @uses apply_filters() Calls 'bbp_admin_replies_column_headers' with
+	 *                        the columns
+	 * @return array $columns bbPress reply columns
+	 */
+	public function replies_column_headers( $columns ) {
+
+		if ( $this->bail() ) return $columns;
+
+		$columns = array(
+			'cb'                => '<input type="checkbox" />',
+			'title'             => __( 'Title',   'bbpress' ),
+			'bbp_reply_forum'   => __( 'Forum',   'bbpress' ),
+			'bbp_reply_topic'   => __( 'Topic',   'bbpress' ),
+			'bbp_reply_author'  => __( 'Author',  'bbpress' ),
+			'bbp_reply_created' => __( 'Created', 'bbpress' ),
+		);
+
+		return apply_filters( 'bbp_admin_replies_column_headers', $columns );
+	}
+
+	/**
+	 * Print extra columns for the replies page
+	 *
+	 * @since bbPress (r2577)
+	 *
+	 * @param string $column Column
+	 * @param int $reply_id reply id
+	 * @uses bbp_get_reply_topic_id() To get the topic id of the reply
+	 * @uses bbp_topic_title() To output the reply's topic title
+	 * @uses apply_filters() Calls 'reply_topic_row_actions' with an array
+	 *                        of reply topic actions
+	 * @uses bbp_get_topic_permalink() To get the topic permalink
+	 * @uses bbp_get_topic_forum_id() To get the forum id of the topic of
+	 *                                 the reply
+	 * @uses bbp_get_forum_permalink() To get the forum permalink
+	 * @uses admin_url() To get the admin url of post.php
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'reply_topic_forum_row_actions' with an
+	 *                        array of reply topic forum actions
+	 * @uses bbp_reply_author_display_name() To output the reply author name
+	 * @uses get_the_date() Get the reply creation date
+	 * @uses get_the_time() Get the reply creation time
+	 * @uses esc_attr() To sanitize the reply creation time
+	 * @uses bbp_get_reply_last_active_time() To get the time when the reply was
+	 *                                    last active
+	 * @uses do_action() Calls 'bbp_admin_replies_column_data' with the
+	 *                    column and reply id
+	 */
+	public function replies_column_data( $column, $reply_id ) {
+
+		if ( $this->bail() ) return;
+
+		// Get topic ID
+		$topic_id = bbp_get_reply_topic_id( $reply_id );
+
+		// Populate Column Data
+		switch ( $column ) {
+
+			// Topic
+			case 'bbp_reply_topic' :
+
+				// Output forum name
+				if ( !empty( $topic_id ) ) {
+
+					// Topic Title
+					$topic_title = bbp_get_topic_title( $topic_id );
+					if ( empty( $topic_title ) ) {
+						$topic_title = __( 'No Topic', 'bbpress' );
+					}
+
+					// Output the title
+					echo $topic_title;
+
+				// Reply has no topic
+				} else {
+					_e( 'No Topic', 'bbpress' );
+				}
+
+				break;
+
+			// Forum
+			case 'bbp_reply_forum' :
+
+				// Get Forum ID's
+				$reply_forum_id = bbp_get_reply_forum_id( $reply_id );
+				$topic_forum_id = bbp_get_topic_forum_id( $topic_id );
+
+				// Output forum name
+				if ( !empty( $reply_forum_id ) ) {
+
+					// Forum Title
+					$forum_title = bbp_get_forum_title( $reply_forum_id );
+					if ( empty( $forum_title ) ) {
+						$forum_title = __( 'No Forum', 'bbpress' );
+					}
+
+					// Alert capable users of reply forum mismatch
+					if ( $reply_forum_id != $topic_forum_id ) {
+						if ( current_user_can( 'edit_others_replies' ) || current_user_can( 'moderate' ) ) {
+							$forum_title .= '<div class="attention">' . __( '(Mismatch)', 'bbpress' ) . '</div>';
+						}
+					}
+
+					// Output the title
+					echo $forum_title;
+
+				// Reply has no forum
+				} else {
+					_e( 'No Forum', 'bbpress' );
+				}
+
+				break;
+
+			// Author
+			case 'bbp_reply_author' :
+				bbp_reply_author_display_name ( $reply_id );
+				break;
+
+			// Freshness
+			case 'bbp_reply_created':
+
+				// Output last activity time and date
+				printf( __( '%1$s <br /> %2$s', 'bbpress' ),
+					get_the_date(),
+					esc_attr( get_the_time() )
+				);
+
+				break;
+
+			// Do action for anything else
+			default :
+				do_action( 'bbp_admin_replies_column_data', $column, $reply_id );
+				break;
+		}
+	}
+
+	/**
+	 * Reply Row actions
+	 *
+	 * Remove the quick-edit action link under the reply title and add the
+	 * content and spam link
+	 *
+	 * @since bbPress (r2577)
+	 *
+	 * @param array $actions Actions
+	 * @param array $reply Reply object
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses bbp_reply_content() To output reply content
+	 * @uses bbp_get_reply_permalink() To get the reply link
+	 * @uses bbp_get_reply_title() To get the reply title
+	 * @uses current_user_can() To check if the current user can edit or
+	 *                           delete the reply
+	 * @uses bbp_is_reply_spam() To check if the reply is marked as spam
+	 * @uses get_post_type_object() To get the reply post type object
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses remove_query_arg() To remove custom args from the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses get_delete_post_link() To get the delete post link of the reply
+	 * @return array $actions Actions
+	 */
+	public function replies_row_actions( $actions, $reply ) {
+
+		if ( $this->bail() ) return $actions;
+
+		unset( $actions['inline hide-if-no-js'] );
+
+		// Reply view links to topic
+		$actions['view'] = '<a href="' . bbp_get_reply_url( $reply->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'bbpress' ), bbp_get_reply_title( $reply->ID ) ) ) . '" rel="permalink">' . __( 'View', 'bbpress' ) . '</a>';
+
+		// User cannot view replies in trash
+		if ( ( bbp_get_trash_status_id() == $reply->post_status ) && !current_user_can( 'view_trash' ) )
+			unset( $actions['view'] );
+
+		// Only show the actions if the user is capable of viewing them
+		if ( current_user_can( 'moderate', $reply->ID ) ) {
+			if ( in_array( $reply->post_status, array( bbp_get_public_status_id(), bbp_get_spam_status_id() ) ) ) {
+				$spam_uri  = esc_url( wp_nonce_url( add_query_arg( array( 'reply_id' => $reply->ID, 'action' => 'bbp_toggle_reply_spam' ), remove_query_arg( array( 'bbp_reply_toggle_notice', 'reply_id', 'failed', 'super' ) ) ), 'spam-reply_'  . $reply->ID ) );
+				if ( bbp_is_reply_spam( $reply->ID ) ) {
+					$actions['spam'] = '<a href="' . $spam_uri . '" title="' . esc_attr__( 'Mark the reply as not spam', 'bbpress' ) . '">' . __( 'Not spam', 'bbpress' ) . '</a>';
+				} else {
+					$actions['spam'] = '<a href="' . $spam_uri . '" title="' . esc_attr__( 'Mark this reply as spam',    'bbpress' ) . '">' . __( 'Spam',     'bbpress' ) . '</a>';
+				}
+			}
+		}
+
+		// Trash
+		if ( current_user_can( 'delete_reply', $reply->ID ) ) {
+			if ( bbp_get_trash_status_id() == $reply->post_status ) {
+				$post_type_object = get_post_type_object( bbp_get_reply_post_type() );
+				$actions['untrash'] = "<a title='" . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . "' href='" . add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_reply_post_type() ), admin_url( 'edit.php' ) ) ), wp_nonce_url( admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $reply->ID ) ), 'untrash-' . $reply->post_type . '_' . $reply->ID ) ) . "'>" . __( 'Restore', 'bbpress' ) . "</a>";
+			} elseif ( EMPTY_TRASH_DAYS ) {
+				$actions['trash'] = "<a class='submitdelete' title='" . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . "' href='" . add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_reply_post_type() ), admin_url( 'edit.php' ) ) ), get_delete_post_link( $reply->ID ) ) . "'>" . __( 'Trash', 'bbpress' ) . "</a>";
+			}
+
+			if ( bbp_get_trash_status_id() == $reply->post_status || !EMPTY_TRASH_DAYS ) {
+				$actions['delete'] = "<a class='submitdelete' title='" . esc_attr__( 'Delete this item permanently', 'bbpress' ) . "' href='" . add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_reply_post_type() ), admin_url( 'edit.php' ) ) ), get_delete_post_link( $reply->ID, '', true ) ) . "'>" . __( 'Delete Permanently', 'bbpress' ) . "</a>";
+			} elseif ( bbp_get_spam_status_id() == $reply->post_status ) {
+				unset( $actions['trash'] );
+			}
+		}
+
+		return $actions;
+	}
+
+	/**
+	 * Add forum dropdown to topic and reply list table filters
+	 *
+	 * @since bbPress (r2991)
+	 *
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_dropdown() To generate a forum dropdown
+	 * @return bool False. If post type is not topic or reply
+	 */
+	public function filter_dropdown() {
+
+		if ( $this->bail() ) return;
+
+		// Add Empty Spam button
+		if ( !empty( $_GET['post_status'] ) && ( bbp_get_spam_status_id() == $_GET['post_status'] ) && current_user_can( 'moderate' ) ) {
+			wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );
+			$title = esc_attr__( 'Empty Spam', 'bbpress' );
+			submit_button( $title, 'button-secondary apply', 'delete_all', false );
+		}
+
+		// Get which forum is selected
+		$selected = !empty( $_GET['bbp_forum_id'] ) ? $_GET['bbp_forum_id'] : '';
+
+		// Show the forums dropdown
+		bbp_dropdown( array(
+			'selected'  => $selected,
+			'show_none' => __( 'In all forums', 'bbpress' )
+		) );
+	}
+
+	/**
+	 * Adjust the request query and include the forum id
+	 *
+	 * @since bbPress (r2991)
+	 *
+	 * @param array $query_vars Query variables from {@link WP_Query}
+	 * @uses is_admin() To check if it's the admin section
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @return array Processed Query Vars
+	 */
+	public function filter_post_rows( $query_vars ) {
+
+		if ( $this->bail() ) return $query_vars;
+
+		// Add post_parent query_var if one is present
+		if ( !empty( $_GET['bbp_forum_id'] ) ) {
+			$query_vars['meta_key']   = '_bbp_forum_id';
+			$query_vars['meta_value'] = $_GET['bbp_forum_id'];
+		}
+
+		// Return manipulated query_vars
+		return $query_vars;
+	}
+
+	/**
+	 * Custom user feedback messages for reply post type
+	 *
+	 * @since bbPress (r3080)
+	 *
+	 * @global int $post_ID
+	 * @uses bbp_get_topic_permalink()
+	 * @uses wp_post_revision_title()
+	 * @uses esc_url()
+	 * @uses add_query_arg()
+	 *
+	 * @param array $messages
+	 *
+	 * @return array
+	 */
+	public function updated_messages( $messages ) {
+		global $post_ID;
+
+		if ( $this->bail() ) return $messages;
+
+		// URL for the current topic
+		$topic_url = bbp_get_topic_permalink( bbp_get_reply_topic_id( $post_ID ) );
+
+		// Current reply's post_date
+		$post_date = bbp_get_global_post_field( 'post_date', 'raw' );
+
+		// Messages array
+		$messages[$this->post_type] = array(
+			0 =>  '', // Left empty on purpose
+
+			// Updated
+			1 =>  sprintf( __( 'Reply updated. <a href="%s">View topic</a>', 'bbpress' ), $topic_url ),
+
+			// Custom field updated
+			2 => __( 'Custom field updated.', 'bbpress' ),
+
+			// Custom field deleted
+			3 => __( 'Custom field deleted.', 'bbpress' ),
+
+			// Reply updated
+			4 => __( 'Reply updated.', 'bbpress' ),
+
+			// Restored from revision
+			// translators: %s: date and time of the revision
+			5 => isset( $_GET['revision'] )
+					? sprintf( __( 'Reply restored to revision from %s', 'bbpress' ), wp_post_revision_title( (int) $_GET['revision'], false ) )
+					: false,
+
+			// Reply created
+			6 => sprintf( __( 'Reply created. <a href="%s">View topic</a>', 'bbpress' ), $topic_url ),
+
+			// Reply saved
+			7 => __( 'Reply saved.', 'bbpress' ),
+
+			// Reply submitted
+			8 => sprintf( __( 'Reply submitted. <a target="_blank" href="%s">Preview topic</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $topic_url ) ) ),
+
+			// Reply scheduled
+			9 => sprintf( __( 'Reply scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview topic</a>', 'bbpress' ),
+					// translators: Publish box date format, see http://php.net/date
+					date_i18n( __( 'M j, Y @ G:i', 'bbpress' ),
+					strtotime( $post_date ) ),
+					$topic_url ),
+
+			// Reply draft updated
+			10 => sprintf( __( 'Reply draft updated. <a target="_blank" href="%s">Preview topic</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $topic_url ) ) ),
+		);
+
+		return $messages;
+	}
+}
+endif; // class_exists check
+
+/**
+ * Setup bbPress Replies Admin
+ *
+ * This is currently here to make hooking and unhooking of the admin UI easy.
+ * It could use dependency injection in the future, but for now this is easier.
+ *
+ * @since bbPress (r2596)
+ *
+ * @uses BBP_Replies_Admin
+ */
+function bbp_admin_replies() {
+	bbpress()->admin->replies = new BBP_Replies_Admin();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/settings.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1494 @@
+<?php
+
+/**
+ * bbPress Admin Settings
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Sections ******************************************************************/
+
+/**
+ * Get the Forums settings sections.
+ *
+ * @since bbPress (r4001)
+ * @return array
+ */
+function bbp_admin_get_settings_sections() {
+	return (array) apply_filters( 'bbp_admin_get_settings_sections', array(
+		'bbp_settings_main' => array(
+			'title'    => __( 'Main Settings', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_main_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_theme_compat' => array(
+			'title'    => __( 'Theme Packages', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_subtheme_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_per_page' => array(
+			'title'    => __( 'Per Page', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_per_page_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_per_rss_page' => array(
+			'title'    => __( 'Per RSS Page', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_per_rss_page_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_root_slugs' => array(
+			'title'    => __( 'Archive Slugs', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_root_slug_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_single_slugs' => array(
+			'title'    => __( 'Single Slugs', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_single_slug_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_buddypress' => array(
+			'title'    => __( 'BuddyPress', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_buddypress_section',
+			'page'     => 'bbpress',
+		),
+		'bbp_settings_akismet' => array(
+			'title'    => __( 'Akismet', 'bbpress' ),
+			'callback' => 'bbp_admin_setting_callback_akismet_section',
+			'page'     => 'bbpress'
+		)
+	) );
+}
+
+/**
+ * Get all of the settings fields.
+ *
+ * @since bbPress (r4001)
+ * @return type
+ */
+function bbp_admin_get_settings_fields() {
+	return (array) apply_filters( 'bbp_admin_get_settings_fields', array(
+
+		/** Main Section ******************************************************/
+
+		'bbp_settings_main' => array(
+
+			// Edit lock setting
+			'_bbp_edit_lock' => array(
+				'title'             => __( 'Disallow editing after', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_editlock',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Throttle setting
+			'_bbp_throttle_time' => array(
+				'title'             => __( 'Throttle posting every', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_throttle',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow topic and reply revisions
+			'_bbp_allow_revisions' => array(
+				'title'             => __( 'Revisions', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_revisions',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow favorites setting
+			'_bbp_enable_favorites' => array(
+				'title'             => __( 'Favorites', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_favorites',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow subscriptions setting
+			'_bbp_enable_subscriptions' => array(
+				'title'             => __( 'Subscriptions', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_subscriptions',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow topic tags
+			'_bbp_allow_topic_tags' => array(
+				'title'             => __( 'Topic tags', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topic_tags',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow anonymous posting setting
+			'_bbp_allow_anonymous' => array(
+				'title'             => __( 'Anonymous posting', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_anonymous',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow global access (on multisite)
+			'_bbp_default_role' => array(
+				'title'             => __( 'Default user role', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_default_role',
+				'sanitize_callback' => 'sanitize_text_field',
+				'args'              => array()
+			),
+
+			// Allow global access (on multisite)
+			'_bbp_allow_global_access' => array(
+				'title'             => __( 'Auto role', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_global_access',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Allow fancy editor setting
+			'_bbp_use_wp_editor' => array(
+				'title'             => __( 'Fancy editor', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_use_wp_editor',
+				'args'              => array(),
+				'sanitize_callback' => 'intval'
+			),
+
+			// Allow auto embedding setting
+			'_bbp_use_autoembed' => array(
+				'title'             => __( 'Auto-embed links', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_use_autoembed',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			)
+		),
+
+		/** Theme Packages ****************************************************/
+
+		'bbp_settings_theme_compat' => array(
+
+			// Replies per page setting
+			'_bbp_theme_package_id' => array(
+				'title'             => __( 'Current Package', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_subtheme_id',
+				'sanitize_callback' => 'esc_sql',
+				'args'              => array()
+			)
+		),
+
+		/** Per Page Section **************************************************/
+
+		'bbp_settings_per_page' => array(
+
+			// Replies per page setting
+			'_bbp_topics_per_page' => array(
+				'title'             => __( 'Topics', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topics_per_page',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Replies per page setting
+			'_bbp_replies_per_page' => array(
+				'title'             => __( 'Replies', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_replies_per_page',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			)
+		),
+
+		/** Per RSS Page Section **********************************************/
+
+		'bbp_settings_per_rss_page' => array(
+
+			// Replies per page setting
+			'_bbp_topics_per_rss_page' => array(
+				'title'             => __( 'Topics', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topics_per_rss_page',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Replies per page setting
+			'_bbp_replies_per_rss_page' => array(
+				'title'             => __( 'Replies', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_replies_per_rss_page',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			)
+		),
+
+		/** Front Slugs *******************************************************/
+
+		'bbp_settings_root_slugs' => array(
+
+			// Root slug setting
+			'_bbp_root_slug' => array(
+				'title'             => __( 'Forums base', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_root_slug',
+				'sanitize_callback' => 'esc_sql',
+				'args'              => array()
+			),
+
+			// Topic archive setting
+			'_bbp_topic_archive_slug' => array(
+				'title'             => __( 'Topics base', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topic_archive_slug',
+				'sanitize_callback' => 'esc_sql',
+				'args'              => array()
+			)
+		),
+
+		/** Single Slugs ******************************************************/
+
+		'bbp_settings_single_slugs' => array(
+
+			// Include root setting
+			'_bbp_include_root' => array(
+				'title'             => __( 'Forum Prefix', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_include_root',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Forum slug setting
+			'_bbp_forum_slug' => array(
+				'title'             => __( 'Forum slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_forum_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			),
+
+			// Topic slug setting
+			'_bbp_topic_slug' => array(
+				'title'             => __( 'Topic slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topic_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			),
+
+			// Topic tag slug setting
+			'_bbp_topic_tag_slug' => array(
+				'title'             => __( 'Topic tag slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_topic_tag_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			),
+
+			// Reply slug setting
+			'_bbp_reply_slug' => array(
+				'title'             => __( 'Reply slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_reply_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			),
+
+			// User slug setting
+			'_bbp_user_slug' => array(
+				'title'             => __( 'User slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_user_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			),
+
+			// View slug setting
+			'_bbp_view_slug' => array(
+				'title'             => __( 'Topic view slug', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_view_slug',
+				'sanitize_callback' => 'sanitize_title',
+				'args'              => array()
+			)
+		),
+
+		/** BuddyPress ********************************************************/
+
+		'bbp_settings_buddypress' => array(
+
+			// Are group forums enabled?
+			'_bbp_enable_group_forums' => array(
+				'title'             => __( 'Enable Group Forums', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_group_forums',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			),
+
+			// Group forums parent forum ID
+			'_bbp_group_forums_root_id' => array(
+				'title'             => __( 'Group Forums Parent', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_group_forums_root_id',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			)
+		),
+
+		/** Akismet ***********************************************************/
+
+		'bbp_settings_akismet' => array(
+
+			// Should we use Akismet
+			'_bbp_enable_akismet' => array(
+				'title'             => __( 'Use Akismet', 'bbpress' ),
+				'callback'          => 'bbp_admin_setting_callback_akismet',
+				'sanitize_callback' => 'intval',
+				'args'              => array()
+			)
+		)
+	) );
+}
+
+/**
+ * Get settings fields by section.
+ *
+ * @since bbPress (r4001)
+ * @param string $section_id
+ * @return mixed False if section is invalid, array of fields otherwise.
+ */
+function bbp_admin_get_settings_fields_for_section( $section_id = '' ) {
+
+	// Bail if section is empty
+	if ( empty( $section_id ) )
+		return false;
+
+	$fields = bbp_admin_get_settings_fields();
+	$retval = isset( $fields[$section_id] ) ? $fields[$section_id] : false;
+
+	return (array) apply_filters( 'bbp_admin_get_settings_fields_for_section', $retval, $section_id );
+}
+
+/** Main Section **************************************************************/
+
+/**
+ * Main settings section description for the settings page
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_main_section() {
+?>
+
+	<p><?php _e( 'Main forum settings for enabling features and setting time limits', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit lock setting field
+ *
+ * @since bbPress (r2737)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_editlock() {
+?>
+
+	<input name="_bbp_edit_lock" type="number" min="0" step="1" id="_bbp_edit_lock" value="<?php bbp_form_option( '_bbp_edit_lock', '5' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_edit_lock' ); ?> />
+	<label for="_bbp_edit_lock"><?php _e( 'minutes', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Throttle setting field
+ *
+ * @since bbPress (r2737)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_throttle() {
+?>
+
+	<input name="_bbp_throttle_time" type="number" min="0" step="1" id="_bbp_throttle_time" value="<?php bbp_form_option( '_bbp_throttle_time', '10' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_throttle_time' ); ?> />
+	<label for="_bbp_throttle_time"><?php _e( 'seconds', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow favorites setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_favorites() {
+?>
+
+	<input id="_bbp_enable_favorites" name="_bbp_enable_favorites" type="checkbox" id="_bbp_enable_favorites" value="1" <?php checked( bbp_is_favorites_active( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_enable_favorites' ); ?> />
+	<label for="_bbp_enable_favorites"><?php _e( 'Allow users to mark topics as favorites', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow subscriptions setting field
+ *
+ * @since bbPress (r2737)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_subscriptions() {
+?>
+
+	<input id="_bbp_enable_subscriptions" name="_bbp_enable_subscriptions" type="checkbox" id="_bbp_enable_subscriptions" value="1" <?php checked( bbp_is_subscriptions_active( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_enable_subscriptions' ); ?> />
+	<label for="_bbp_enable_subscriptions"><?php _e( 'Allow users to subscribe to topics', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow topic tags setting field
+ *
+ * @since bbPress (r####)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_topic_tags() {
+?>
+
+	<input id="_bbp_allow_topic_tags" name="_bbp_allow_topic_tags" type="checkbox" id="_bbp_allow_topic_tags" value="1" <?php checked( bbp_allow_topic_tags( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_allow_topic_tags' ); ?> />
+	<label for="_bbp_allow_topic_tags"><?php _e( 'Allow topics to have tags', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow topic and reply revisions
+ *
+ * @since bbPress (r3412)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_revisions() {
+?>
+
+	<input id="_bbp_allow_revisions" name="_bbp_allow_revisions" type="checkbox" id="_bbp_allow_revisions" value="1" <?php checked( bbp_allow_revisions( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_allow_revisions' ); ?> />
+	<label for="_bbp_allow_revisions"><?php _e( 'Allow topic and reply revision logging', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow anonymous posting setting field
+ *
+ * @since bbPress (r2737)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_anonymous() {
+?>
+
+	<input id="_bbp_allow_anonymous" name="_bbp_allow_anonymous" type="checkbox" id="_bbp_allow_anonymous" value="1" <?php checked( bbp_allow_anonymous( false ) ); bbp_maybe_admin_setting_disabled( '_bbp_allow_anonymous' ); ?> />
+	<label for="_bbp_allow_anonymous"><?php _e( 'Allow guest users without accounts to create topics and replies', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Allow global access setting field
+ *
+ * @since bbPress (r3378)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_global_access() {
+?>
+
+	<input id="_bbp_allow_global_access" name="_bbp_allow_global_access" type="checkbox" id="_bbp_allow_global_access" value="1" <?php checked( bbp_allow_global_access( false ) ); bbp_maybe_admin_setting_disabled( '_bbp_allow_global_access' ); ?> />
+	<label for="_bbp_allow_global_access"><?php _e( 'Automatically assign default role to new, registered users upon visiting the site.', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Output forum role selector (for user edit)
+ *
+ * @since bbPress (r4284)
+ */
+function bbp_admin_setting_callback_default_role() {
+
+	$default_role = bbp_get_default_role(); ?>
+
+	<select name="_bbp_default_role" id="_bbp_default_role" <?php bbp_maybe_admin_setting_disabled( '_bbp_default_role' ); ?>>
+
+		<?php foreach ( bbp_get_dynamic_roles() as $role => $details ) : ?>
+
+			<option <?php selected( $default_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo translate_user_role( $details['name'] ); ?></option>
+
+		<?php endforeach; ?>
+
+	</select>
+
+	<?php
+}
+
+/**
+ * Use the WordPress editor setting field
+ *
+ * @since bbPress (r3586)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_use_wp_editor() {
+?>
+
+	<input id="_bbp_use_wp_editor" name="_bbp_use_wp_editor" type="checkbox" id="_bbp_use_wp_editor" value="1" <?php checked( bbp_use_wp_editor( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_use_wp_editor' ); ?> />
+	<label for="_bbp_use_wp_editor"><?php _e( 'Use the fancy WordPress editor to create and edit topics and replies', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Main subtheme section
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_subtheme_section() {
+?>
+
+	<p><?php _e( 'How your forum content is displayed within your existing theme.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Use the WordPress editor setting field
+ *
+ * @since bbPress (r3586)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_subtheme_id() {
+
+	// Declare locale variable
+	$theme_options   = '';
+	$current_package = bbp_get_theme_package_id( 'default' );
+
+	// Note: This should never be empty. /templates/ is the
+	// canonical backup if no other packages exist. If there's an error here,
+	// something else is wrong.
+	//
+	// @see bbPress::register_theme_packages()
+	foreach ( (array) bbpress()->theme_compat->packages as $id => $theme ) {
+		$theme_options .= '<option value="' . esc_attr( $id ) . '"' . selected( $theme->id, $current_package, false ) . '>' . sprintf( __( '%1$s - %2$s', 'bbpress' ), esc_html( $theme->name ), esc_html( str_replace( WP_CONTENT_DIR, '', $theme->dir ) ) )  . '</option>';
+	}
+
+	if ( !empty( $theme_options ) ) : ?>
+
+		<select name="_bbp_theme_package_id" id="_bbp_theme_package_id" <?php bbp_maybe_admin_setting_disabled( '_bbp_theme_package_id' ); ?>><?php echo $theme_options ?></select>
+		<label for="_bbp_theme_package_id"><?php _e( 'will serve all bbPress templates', 'bbpress' ); ?></label>
+
+	<?php else : ?>
+
+		<p><?php _e( 'No template packages available.', 'bbpress' ); ?></p>
+
+	<?php endif;
+}
+
+/**
+ * Allow oEmbed in replies
+ *
+ * @since bbPress (r3752)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_use_autoembed() {
+?>
+
+	<input id="_bbp_use_autoembed" name="_bbp_use_autoembed" type="checkbox" id="_bbp_use_autoembed" value="1" <?php checked( bbp_use_autoembed( true ) ); bbp_maybe_admin_setting_disabled( '_bbp_use_autoembed' ); ?> />
+	<label for="_bbp_use_autoembed"><?php _e( 'Embed media (YouTube, Twitter, Flickr, etc...) directly into topics and replies', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/** Per Page Section **********************************************************/
+
+/**
+ * Per page settings section description for the settings page
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_per_page_section() {
+?>
+
+	<p><?php _e( 'How many topics and replies to show per page', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Topics per page setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_topics_per_page() {
+?>
+
+	<input name="_bbp_topics_per_page" type="number" min="1" step="1" id="_bbp_topics_per_page" value="<?php bbp_form_option( '_bbp_topics_per_page', '15' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_topics_per_page' ); ?> />
+	<label for="_bbp_topics_per_page"><?php _e( 'per page', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Replies per page setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_replies_per_page() {
+?>
+
+	<input name="_bbp_replies_per_page" type="number" min="1" step="1" id="_bbp_replies_per_page" value="<?php bbp_form_option( '_bbp_replies_per_page', '15' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_replies_per_page' ); ?> />
+	<label for="_bbp_replies_per_page"><?php _e( 'per page', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/** Per RSS Page Section ******************************************************/
+
+/**
+ * Per page settings section description for the settings page
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_per_rss_page_section() {
+?>
+
+	<p><?php _e( 'How many topics and replies to show per RSS page', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Topics per RSS page setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_topics_per_rss_page() {
+?>
+
+	<input name="_bbp_topics_per_rss_page" type="number" min="1" step="1" id="_bbp_topics_per_rss_page" value="<?php bbp_form_option( '_bbp_topics_per_rss_page', '25' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_topics_per_rss_page' ); ?> />
+	<label for="_bbp_topics_per_rss_page"><?php _e( 'per page', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Replies per RSS page setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_replies_per_rss_page() {
+?>
+
+	<input name="_bbp_replies_per_rss_page" type="number" min="1" step="1" id="_bbp_replies_per_rss_page" value="<?php bbp_form_option( '_bbp_replies_per_rss_page', '25' ); ?>" class="small-text"<?php bbp_maybe_admin_setting_disabled( '_bbp_replies_per_rss_page' ); ?> />
+	<label for="_bbp_replies_per_rss_page"><?php _e( 'per page', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/** Slug Section **************************************************************/
+
+/**
+ * Slugs settings section description for the settings page
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_root_slug_section() {
+
+	// Flush rewrite rules when this section is saved
+	if ( isset( $_GET['settings-updated'] ) && isset( $_GET['page'] ) )
+		flush_rewrite_rules(); ?>
+
+	<p><?php printf( __( 'Custom root slugs to prefix your forums and topics with. These can be partnered with WordPress pages to allow more flexibility.', 'bbpress' ), get_admin_url( null, 'options-permalink.php' ) ); ?></p>
+
+<?php
+}
+
+/**
+ * Root slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_root_slug() {
+?>
+
+		<input name="_bbp_root_slug" type="text" id="_bbp_root_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_root_slug', 'forums', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_root_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_root_slug', 'forums' );
+}
+
+/**
+ * Topic archive slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_topic_archive_slug() {
+?>
+
+	<input name="_bbp_topic_archive_slug" type="text" id="_bbp_topic_archive_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_topic_archive_slug', 'topics', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_topic_archive_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_topic_archive_slug', 'topics' );
+}
+
+/** Single Slugs **************************************************************/
+
+/**
+ * Slugs settings section description for the settings page
+ *
+ * @since bbPress (r2786)
+ */
+function bbp_admin_setting_callback_single_slug_section() {
+?>
+
+	<p><?php printf( __( 'Custom slugs for single forums, topics, replies, tags, users, and views here. If you change these, existing permalinks will also change.', 'bbpress' ), get_admin_url( null, 'options-permalink.php' ) ); ?></p>
+
+<?php
+}
+
+/**
+ * Include root slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_include_root() {
+?>
+
+	<input id="_bbp_include_root" name="_bbp_include_root" type="checkbox" id="_bbp_include_root" value="1" <?php checked( get_option( '_bbp_include_root', true ) ); bbp_maybe_admin_setting_disabled( '_bbp_include_root' ); ?> />
+	<label for="_bbp_include_root"><?php _e( 'Prefix your forum area with the Forum Base slug (Recommended)', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Forum slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_forum_slug() {
+?>
+
+	<input name="_bbp_forum_slug" type="text" id="_bbp_forum_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_forum_slug', 'forum', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_forum_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_forum_slug', 'forum' );
+}
+
+/**
+ * Topic slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_topic_slug() {
+?>
+
+	<input name="_bbp_topic_slug" type="text" id="_bbp_topic_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_topic_slug', 'topic', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_topic_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_topic_slug', 'topic' );
+}
+
+/**
+ * Reply slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_reply_slug() {
+?>
+
+	<input name="_bbp_reply_slug" type="text" id="_bbp_reply_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_reply_slug', 'reply', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_reply_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_reply_slug', 'reply' );
+}
+
+/**
+ * Topic tag slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_topic_tag_slug() {
+?>
+
+	<input name="_bbp_topic_tag_slug" type="text" id="_bbp_topic_tag_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_topic_tag_slug', 'topic-tag', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_topic_tag_slug' ); ?> />
+
+<?php
+
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_topic_tag_slug', 'topic-tag' );
+}
+
+/** Other Slugs ***************************************************************/
+
+/**
+ * User slug setting field
+ *
+ * @since bbPress (r2786)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_user_slug() {
+?>
+
+	<input name="_bbp_user_slug" type="text" id="_bbp_user_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_user_slug', 'users', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_user_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_user_slug', 'users' );
+}
+
+/**
+ * View slug setting field
+ *
+ * @since bbPress (r2789)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_view_slug() {
+?>
+
+	<input name="_bbp_view_slug" type="text" id="_bbp_view_slug" class="regular-text code" value="<?php bbp_form_option( '_bbp_view_slug', 'view', true ); ?>"<?php bbp_maybe_admin_setting_disabled( '_bbp_view_slug' ); ?> />
+
+<?php
+	// Slug Check
+	bbp_form_slug_conflict_check( '_bbp_view_slug', 'view' );
+}
+
+/** BuddyPress ****************************************************************/
+
+/**
+ * Extension settings section description for the settings page
+ *
+ * @since bbPress (r3575)
+ */
+function bbp_admin_setting_callback_buddypress_section() {
+?>
+
+	<p><?php _e( 'Forum settings for BuddyPress', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Allow BuddyPress group forums setting field
+ *
+ * @since bbPress (r3575)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_group_forums() {
+?>
+
+	<input id="_bbp_enable_group_forums" name="_bbp_enable_group_forums" type="checkbox" id="_bbp_enable_group_forums" value="1" <?php checked( bbp_is_group_forums_active( true ) );  bbp_maybe_admin_setting_disabled( '_bbp_enable_group_forums' ); ?> />
+	<label for="_bbp_enable_group_forums"><?php _e( 'Allow BuddyPress Groups to have their own forums', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Replies per page setting field
+ *
+ * @since bbPress (r3575)
+ *
+ * @uses bbp_form_option() To output the option value
+ */
+function bbp_admin_setting_callback_group_forums_root_id() {
+
+	// Output the dropdown for all forums
+	bbp_dropdown( array(
+		'selected'           => bbp_get_group_forums_root_id(),
+		'show_none'          => __( '&mdash; Forum root &mdash;', 'bbpress' ),
+		'orderby'            => 'title',
+		'order'              => 'ASC',
+		'select_id'          => '_bbp_group_forums_root_id',
+		'disable_categories' => false,
+		'disabled'           => '_bbp_group_forums_root_id'
+	) ); ?>
+
+	<label for="_bbp_group_forums_root_id"><?php _e( 'is the parent for all group forums', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'Using the Forum Root is not recommended. Changing this does not move existing forums.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/** Akismet *******************************************************************/
+
+/**
+ * Extension settings section description for the settings page
+ *
+ * @since bbPress (r3575)
+ */
+function bbp_admin_setting_callback_akismet_section() {
+?>
+
+	<p><?php _e( 'Forum settings for Akismet', 'bbpress' ); ?></p>
+
+<?php
+}
+
+
+/**
+ * Allow Akismet setting field
+ *
+ * @since bbPress (r3575)
+ *
+ * @uses checked() To display the checked attribute
+ */
+function bbp_admin_setting_callback_akismet() {
+?>
+
+	<input id="_bbp_enable_akismet" name="_bbp_enable_akismet" type="checkbox" id="_bbp_enable_akismet" value="1" <?php checked( bbp_is_akismet_active( true ) );  bbp_maybe_admin_setting_disabled( '_bbp_enable_akismet' ); ?> />
+	<label for="_bbp_enable_akismet"><?php _e( 'Allow Akismet to actively prevent forum spam.', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/** Settings Page *************************************************************/
+
+/**
+ * The main settings page
+ *
+ * @since bbPress (r2643)
+ *
+ * @uses screen_icon() To display the screen icon
+ * @uses settings_fields() To output the hidden fields for the form
+ * @uses do_settings_sections() To output the settings sections
+ */
+function bbp_admin_settings() {
+?>
+
+	<div class="wrap">
+
+		<?php screen_icon(); ?>
+
+		<h2><?php _e( 'Forums Settings', 'bbpress' ) ?></h2>
+
+		<form action="options.php" method="post">
+
+			<?php settings_fields( 'bbpress' ); ?>
+
+			<?php do_settings_sections( 'bbpress' ); ?>
+
+			<p class="submit">
+				<input type="submit" name="submit" class="button-primary" value="<?php esc_attr_e( 'Save Changes', 'bbpress' ); ?>" />
+			</p>
+		</form>
+	</div>
+
+<?php
+}
+
+
+/** Converter Section *********************************************************/
+
+/**
+ * Main settings section description for the settings page
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_main_section() {
+?>
+
+	<p><?php _e( 'Information about your previous forums database so that they can be converted. <strong>Backup your database before proceeding.</strong>', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Platform setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_platform() {
+
+	$platform_options = '';
+	$curdir           = opendir( bbpress()->admin->admin_dir . 'converters/' );
+
+	// Bail if no directory was found (how did this happen?)
+	if ( empty( $curdir ) )
+		return;
+
+	// Loop through files in the converters folder and assemble some options
+	while ( $file = readdir( $curdir ) ) {
+		if ( ( stristr( $file, '.php' ) ) && ( stristr( $file, 'index' ) === false ) ) {
+			$file              = preg_replace( '/.php/', '', $file );
+			$platform_options .= '<option value="' . $file . '">' . $file . '</option>';
+		}
+	}
+
+	closedir( $curdir ); ?>
+
+	<select name="_bbp_converter_platform" id="_bbp_converter_platform" /><?php echo $platform_options ?></select>
+	<label for="_bbp_converter_platform"><?php _e( 'is the previous forum software', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Database Server setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbserver() {
+?>
+
+	<input name="_bbp_converter_db_server" type="text" id="_bbp_converter_db_server" value="<?php bbp_form_option( '_bbp_converter_db_server', 'localhost' ); ?>" class="medium-text" />
+	<label for="_bbp_converter_db_server"><?php _e( 'IP or hostname', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Database Server Port setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbport() {
+?>
+
+	<input name="_bbp_converter_db_port" type="text" id="_bbp_converter_db_port" value="<?php bbp_form_option( '_bbp_converter_db_port', '3306' ); ?>" class="small-text" />
+	<label for="_bbp_converter_db_port"><?php _e( 'Use default 3306 if unsure', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Database User setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbuser() {
+?>
+
+	<input name="_bbp_converter_db_user" type="text" id="_bbp_converter_db_user" value="<?php bbp_form_option( '_bbp_converter_db_user' ); ?>" class="medium-text" />
+	<label for="_bbp_converter_db_user"><?php _e( 'User for your database connection', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Database Pass setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbpass() {
+?>
+
+	<input name="_bbp_converter_db_pass" type="password" id="_bbp_converter_db_pass" value="<?php bbp_form_option( '_bbp_converter_db_pass' ); ?>" class="medium-text" />
+	<label for="_bbp_converter_db_pass"><?php _e( 'Password to access the database', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Database Name setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbname() {
+?>
+
+	<input name="_bbp_converter_db_name" type="text" id="_bbp_converter_db_name" value="<?php bbp_form_option( '_bbp_converter_db_name' ); ?>" class="medium-text" />
+	<label for="_bbp_converter_db_name"><?php _e( 'Name of the database with your old forum data', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Main settings section description for the settings page
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_options_section() {
+?>
+
+	<p><?php _e( 'Some optional parameters to help tune the conversion process.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Table Prefix setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_dbprefix() {
+?>
+
+	<input name="_bbp_converter_db_prefix" type="text" id="_bbp_converter_db_prefix" value="<?php bbp_form_option( '_bbp_converter_db_prefix' ); ?>" class="medium-text" />
+	<label for="_bbp_converter_db_prefix"><?php _e( '(If converting from BuddyPress Forums, use "wp_bb_" or your custom prefix)', 'bbpress' ); ?></label>
+
+<?php
+}
+
+/**
+ * Edit Rows Limit setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_rows() {
+?>
+
+	<input name="_bbp_converter_rows" type="text" id="_bbp_converter_rows" value="<?php bbp_form_option( '_bbp_converter_rows', '100' ); ?>" class="small-text" />
+	<label for="_bbp_converter_rows"><?php _e( 'rows to process at a time', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'Keep this low if you experience out-of-memory issues.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Delay Time setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_delay_time() {
+?>
+
+	<input name="_bbp_converter_delay_time" type="text" id="_bbp_converter_delay_time" value="<?php bbp_form_option( '_bbp_converter_delay_time', '1' ); ?>" class="small-text" />
+	<label for="_bbp_converter_delay_time"><?php _e( 'second(s) delay between each group of rows', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'Keep this high to prevent too-many-connection issues.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Restart setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_restart() {
+?>
+
+	<input id="_bbp_converter_restart" name="_bbp_converter_restart" type="checkbox" id="_bbp_converter_restart" value="1" <?php checked( get_option( '_bbp_converter_restart', false ) ); ?> />
+	<label for="_bbp_converter_restart"><?php _e( 'Start a fresh conversion from the beginning', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'You should clean old conversion information before starting over.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Clean setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_clean() {
+?>
+
+	<input id="_bbp_converter_clean" name="_bbp_converter_clean" type="checkbox" id="_bbp_converter_clean" value="1" <?php checked( get_option( '_bbp_converter_clean', false ) ); ?> />
+	<label for="_bbp_converter_clean"><?php _e( 'Purge all information from a previously attempted import', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'Use this if an import failed and you want to remove that incomplete data.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/**
+ * Edit Convert Users setting field
+ *
+ * @since bbPress (r3813)
+ */
+function bbp_converter_setting_callback_convert_users() {
+?>
+
+	<input id="_bbp_converter_convert_users" name="_bbp_converter_convert_users" type="checkbox" id="_bbp_converter_convert_users" value="1" <?php checked( get_option( '_bbp_converter_convert_users', false ) ); ?> />
+	<label for="_bbp_converter_convert_users"><?php _e( 'Attempt to import user accounts from previous forums', 'bbpress' ); ?></label>
+	<p class="description"><?php _e( 'Non-bbPress passwords cannot be automatically converted. They will be converted as each user logs in.', 'bbpress' ); ?></p>
+
+<?php
+}
+
+/** Converter Page ************************************************************/
+
+/**
+ * The main settings page
+ *
+ * @uses screen_icon() To display the screen icon
+ * @uses settings_fields() To output the hidden fields for the form
+ * @uses do_settings_sections() To output the settings sections
+ */
+function bbp_converter_settings() {
+?>
+
+	<div class="wrap">
+
+		<?php screen_icon( 'tools' ); ?>
+
+		<h2 class="nav-tab-wrapper"><?php bbp_tools_admin_tabs( __( 'Import Forums', 'bbpress' ) ); ?></h2>
+
+		<form action="#" method="post" id="bbp-converter-settings">
+
+			<?php settings_fields( 'bbpress_converter' ); ?>
+
+			<?php do_settings_sections( 'bbpress_converter' ); ?>
+
+			<p class="submit">
+				<input type="button" name="submit" class="button-primary" id="bbp-converter-start" value="<?php esc_attr_e( 'Start', 'bbpress' ); ?>" onclick="bbconverter_start()" />
+				<input type="button" name="submit" class="button-primary" id="bbp-converter-stop" value="<?php esc_attr_e( 'Stop', 'bbpress' ); ?>" onclick="bbconverter_stop()" />
+				<img id="bbp-converter-progress" src="">
+			</p>
+
+			<div class="bbp-converter-updated" id="bbp-converter-message"></div>
+		</form>
+	</div>
+
+<?php
+}
+
+/** Helpers *******************************************************************/
+
+/**
+ * Contextual help for Forums settings page
+ *
+ * @since bbPress (r3119)
+ * @uses get_current_screen()
+ */
+function bbp_admin_settings_help() {
+
+	$current_screen = get_current_screen();
+
+	// Bail if current screen could not be found
+	if ( empty( $current_screen ) )
+		return;
+
+	// Overview
+	$current_screen->add_help_tab( array(
+		'id'      => 'overview',
+		'title'   => __( 'Overview', 'bbpress' ),
+		'content' => '<p>' . __( 'This screen provides access to all of the Forums settings.',                          'bbpress' ) . '</p>' .
+					 '<p>' . __( 'Please see the additional help tabs for more information on each indiviual section.', 'bbpress' ) . '</p>'
+	) );
+
+	// Main Settings
+	$current_screen->add_help_tab( array(
+		'id'      => 'main_settings',
+		'title'   => __( 'Main Settings', 'bbpress' ),
+		'content' => '<p>' . __( 'In the Main Settings you have a number of options:', 'bbpress' ) . '</p>' .
+					 '<p>' .
+						'<ul>' .
+							'<li>' . __( 'You can choose to lock a post after a certain number of minutes. "Locking post editing" will prevent the author from editing some amount of time after saving a post.',              'bbpress' ) . '</li>' .
+							'<li>' . __( '"Throttle time" is the amount of time required between posts from a single author. The higher the throttle time, the longer a user will need to wait between posting to the forum.', 'bbpress' ) . '</li>' .
+							'<li>' . __( 'Favorites are a way for users to save and later return to topics they favor. This is enabled by default.',                                                                           'bbpress' ) . '</li>' .
+							'<li>' . __( 'Subscriptions allow users to subscribe for notifications to topics that interest them. This is enabled by default.',                                                                 'bbpress' ) . '</li>' .
+							'<li>' . __( 'Topic-Tags allow users to filter topics between forums. This is enabled by default.',                                                                                                'bbpress' ) . '</li>' .
+							'<li>' . __( '"Anonymous Posting" allows guest users who do not have accounts on your site to both create topics as well as replies.',                                                             'bbpress' ) . '</li>' .
+							'<li>' . __( 'The Fancy Editor brings the luxury of the Visual editor and HTML editor from the traditional WordPress dashboard into your theme.',                                                  'bbpress' ) . '</li>' .
+							'<li>' . __( 'Auto-embed will embed the media content from a URL directly into the replies. For example: links to Flickr and YouTube.',                                                            'bbpress' ) . '</li>' .
+						'</ul>' .
+					'</p>' .
+					'<p>' . __( 'You must click the Save Changes button at the bottom of the screen for new settings to take effect.', 'bbpress' ) . '</p>'
+	) );
+
+	// Per Page
+	$current_screen->add_help_tab( array(
+		'id'      => 'per_page',
+		'title'   => __( 'Per Page', 'bbpress' ),
+		'content' => '<p>' . __( 'Per Page settings allow you to control the number of topics and replies appear on each page.',                                                    'bbpress' ) . '</p>' .
+					 '<p>' . __( 'This is comparable to the WordPress "Reading Settings" page, where you can set the number of posts that should show on blog pages and in feeds.', 'bbpress' ) . '</p>' .
+					 '<p>' . __( 'These are broken up into two separate groups: one for what appears in your theme, another for RSS feeds.',                                        'bbpress' ) . '</p>'
+	) );
+
+	// Slugs
+	$current_screen->add_help_tab( array(
+		'id'      => 'slus',
+		'title'   => __( 'Slugs', 'bbpress' ),
+		'content' => '<p>' . __( 'The Slugs section allows you to control the permalink structure for your forums.',                                                                                                            'bbpress' ) . '</p>' .
+					 '<p>' . __( '"Archive Slugs" are used as the "root" for your forums and topics. If you combine these values with existing page slugs, bbPress will attempt to output the most correct title and content.', 'bbpress' ) . '</p>' .
+					 '<p>' . __( '"Single Slugs" are used as a prefix when viewing an individual forum, topic, reply, user, or view.',                                                                                          'bbpress' ) . '</p>' .
+					 '<p>' . __( 'In the event of a slug collision with WordPress or BuddyPress, a warning will appear next to the problem slug(s).', 'bbpress' ) . '</p>'
+	) );
+
+	// Help Sidebar
+	$current_screen->set_help_sidebar(
+		'<p><strong>' . __( 'For more information:' ) . '</strong></p>' .
+		'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+		'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+	);
+}
+
+/**
+ * Disable a settings field if the value is forcibly set in bbPress's global
+ * options array.
+ *
+ * @since bbPress (r4347)
+ *
+ * @param string $option_key
+ */
+function bbp_maybe_admin_setting_disabled( $option_key = '' ) {
+	disabled( isset( bbpress()->options[$option_key] ) );
+}
+
+/**
+ * Output settings API option
+ *
+ * @since bbPress (r3203)
+ *
+ * @uses bbp_get_bbp_form_option()
+ *
+ * @param string $option
+ * @param string $default
+ * @param bool $slug
+ */
+function bbp_form_option( $option, $default = '' , $slug = false ) {
+	echo bbp_get_form_option( $option, $default, $slug );
+}
+	/**
+	 * Return settings API option
+	 *
+	 * @since bbPress (r3203)
+	 *
+	 * @uses get_option()
+	 * @uses esc_attr()
+	 * @uses apply_filters()
+	 *
+	 * @param string $option
+	 * @param string $default
+	 * @param bool $slug
+	 */
+	function bbp_get_form_option( $option, $default = '', $slug = false ) {
+
+		// Get the option and sanitize it
+		$value = get_option( $option, $default );
+
+		// Slug?
+		if ( true === $slug ) {
+			$value = esc_attr( apply_filters( 'editable_slug', $value ) );
+
+		// Not a slug
+		} else {
+			$value = esc_attr( $value );
+		}
+
+		// Fallback to default
+		if ( empty( $value ) )
+			$value = $default;
+
+		// Allow plugins to further filter the output
+		return apply_filters( 'bbp_get_form_option', $value, $option );
+	}
+
+/**
+ * Used to check if a bbPress slug conflicts with an existing known slug.
+ *
+ * @since bbPress (r3306)
+ *
+ * @param string $slug
+ * @param string $default
+ *
+ * @uses bbp_get_form_option() To get a sanitized slug string
+ */
+function bbp_form_slug_conflict_check( $slug, $default ) {
+
+	// Only set the slugs once ver page load
+	static $the_core_slugs = array();
+
+	// Get the form value
+	$this_slug = bbp_get_form_option( $slug, $default, true );
+
+	if ( empty( $the_core_slugs ) ) {
+
+		// Slugs to check
+		$core_slugs = apply_filters( 'bbp_slug_conflict_check', array(
+
+			/** WordPress Core ****************************************************/
+
+			// Core Post Types
+			'post_base'       => array( 'name' => __( 'Posts',         'bbpress' ), 'default' => 'post',          'context' => 'WordPress' ),
+			'page_base'       => array( 'name' => __( 'Pages',         'bbpress' ), 'default' => 'page',          'context' => 'WordPress' ),
+			'revision_base'   => array( 'name' => __( 'Revisions',     'bbpress' ), 'default' => 'revision',      'context' => 'WordPress' ),
+			'attachment_base' => array( 'name' => __( 'Attachments',   'bbpress' ), 'default' => 'attachment',    'context' => 'WordPress' ),
+			'nav_menu_base'   => array( 'name' => __( 'Menus',         'bbpress' ), 'default' => 'nav_menu_item', 'context' => 'WordPress' ),
+
+			// Post Tags
+			'tag_base'        => array( 'name' => __( 'Tag base',      'bbpress' ), 'default' => 'tag',           'context' => 'WordPress' ),
+
+			// Post Categories
+			'category_base'   => array( 'name' => __( 'Category base', 'bbpress' ), 'default' => 'category',      'context' => 'WordPress' ),
+
+			/** bbPress Core ******************************************************/
+
+			// Forum archive slug
+			'_bbp_root_slug'          => array( 'name' => __( 'Forums base', 'bbpress' ), 'default' => 'forums', 'context' => 'bbPress' ),
+
+			// Topic archive slug
+			'_bbp_topic_archive_slug' => array( 'name' => __( 'Topics base', 'bbpress' ), 'default' => 'topics', 'context' => 'bbPress' ),
+
+			// Forum slug
+			'_bbp_forum_slug'         => array( 'name' => __( 'Forum slug',  'bbpress' ), 'default' => 'forum',  'context' => 'bbPress' ),
+
+			// Topic slug
+			'_bbp_topic_slug'         => array( 'name' => __( 'Topic slug',  'bbpress' ), 'default' => 'topic',  'context' => 'bbPress' ),
+
+			// Reply slug
+			'_bbp_reply_slug'         => array( 'name' => __( 'Reply slug',  'bbpress' ), 'default' => 'reply',  'context' => 'bbPress' ),
+
+			// User profile slug
+			'_bbp_user_slug'          => array( 'name' => __( 'User base',   'bbpress' ), 'default' => 'users',  'context' => 'bbPress' ),
+
+			// View slug
+			'_bbp_view_slug'          => array( 'name' => __( 'View base',   'bbpress' ), 'default' => 'view',   'context' => 'bbPress' ),
+
+			// Topic tag slug
+			'_bbp_topic_tag_slug'     => array( 'name' => __( 'Topic tag slug', 'bbpress' ), 'default' => 'topic-tag', 'context' => 'bbPress' ),
+		) );
+
+		/** BuddyPress Core *******************************************************/
+
+		if ( defined( 'BP_VERSION' ) ) {
+			$bp = buddypress();
+
+			// Loop through root slugs and check for conflict
+			if ( !empty( $bp->pages ) ) {
+				foreach ( $bp->pages as $page => $page_data ) {
+					$page_base    = $page . '_base';
+					$page_title   = sprintf( __( '%s page', 'bbpress' ), $page_data->title );
+					$core_slugs[$page_base] = array( 'name' => $page_title, 'default' => $page_data->slug, 'context' => 'BuddyPress' );
+				}
+			}
+		}
+
+		// Set the static
+		$the_core_slugs = apply_filters( 'bbp_slug_conflict', $core_slugs );
+	}
+
+	// Loop through slugs to check
+	foreach( $the_core_slugs as $key => $value ) {
+
+		// Get the slug
+		$slug_check = bbp_get_form_option( $key, $value['default'], true );
+
+		// Compare
+		if ( ( $slug != $key ) && ( $slug_check == $this_slug ) ) : ?>
+
+			<span class="attention"><?php printf( __( 'Possible %1$s conflict: <strong>%2$s</strong>', 'bbpress' ), $value['context'], $value['name'] ); ?></span>
+
+		<?php endif;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/green-34.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2080 @@
+
+
+/*------------------------------------------------------------------------------
+
+
+Howdy! This is the CSS file that controls the
+Green (minty) color style on the WordPress Dashboard.
+
+This file contains both LTR and RTL styles.
+
+
+TABLE OF CONTENTS:
+------------------
+ 1.0 - Left to Right Styles
+ 2.0 - Right to Left Styles
+
+
+------------------------------------------------------------------------------*/
+
+
+/*------------------------------------------------------------------------------
+  1.0 - Left to Right Styles
+------------------------------------------------------------------------------*/
+
+html,
+.wp-dialog {
+	background-color: #fff;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="file"],
+input[type="button"],
+input[type="submit"],
+input[type="reset"],
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="tel"],
+input[type="url"],
+select {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="file"]:focus,
+input[type="button"]:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+select:focus {
+	border-color: #bbb;
+}
+
+kbd,
+code {
+	background: #eaeaea;
+}
+
+input[readonly] {
+	background-color: #eee;
+}
+
+.find-box-search {
+	border-color: #dfdfdf;
+	background-color: #f1f1f1;
+}
+
+.find-box {
+	background-color: #f1f1f1;
+}
+
+.find-box-inside {
+	background-color: #fff;
+}
+
+a.page-numbers:hover {
+	border-color: #999;
+}
+
+body,
+#wpbody,
+.form-table .pre {
+	color: #333;
+}
+
+body > #upload-menu {
+	border-bottom-color: #fff;
+}
+
+#postcustomstuff table,
+#your-profile fieldset,
+#rightnow,
+div.dashboard-widget,
+#dashboard-widgets p.dashboard-widget-links {
+	border-color: #ccc;
+}
+
+#poststuff .inside label.spam,
+#poststuff .inside label.deleted {
+	color: red;
+}
+
+#poststuff .inside label.waiting {
+	color: orange;
+}
+
+#poststuff .inside label.approved {
+	color: green;
+}
+
+#postcustomstuff table {
+	border-color: #dfdfdf;
+	background-color: #F9F9F9;
+}
+
+#postcustomstuff thead th {
+	background-color: #F1F1F1;
+}
+
+.widefat {
+	border-color: #dfdfdf;
+	background-color: #eefcf1;
+}
+textarea.widefat {
+	background-color: #fff;
+}
+
+div.dashboard-widget-error {
+	background-color: #c43;
+}
+
+div.dashboard-widget-notice {
+	background-color: #cfe1ef;
+}
+
+div.dashboard-widget-submit {
+	border-top-color: #ccc;
+}
+
+div.tabs-panel,
+.wp-tab-panel,
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	background-color: #fff;
+}
+
+input.disabled,
+textarea.disabled {
+	background-color: #ccc;
+}
+/* #upload-menu li a.upload-tab-link, */
+#plugin-information .action-button a,
+#plugin-information .action-button a:hover,
+#plugin-information .action-button a:visited {
+	color: #fff;
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3,
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head,
+.sidebar-name,
+#nav-menu-header,
+#nav-menu-footer,
+.menu-item-handle,
+#fullscreen-topbar {
+	background-color: #f1f1f1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3 {
+	border-bottom-color: #dfdfdf;
+	text-shadow: #fff 0 1px 0;
+	-moz-box-shadow: 0 1px 0 #fff;
+	-webkit-box-shadow: 0 1px 0 #fff;
+	box-shadow: 0 1px 0 #fff;
+}
+
+.form-table th,
+.form-wrap label {
+	color: #222;
+	text-shadow: #fff 0 1px 0;
+}
+
+.description,
+.form-wrap p {
+	color: #666;
+}
+
+strong .post-com-count span {
+	background-color: #007700;
+}
+
+.sorthelper {
+	background-color: #ccf3fa;
+}
+
+.ac_match,
+.subsubsub a.current {
+	color: #000;
+}
+
+.wrap h2 {
+	color: #464646;
+}
+
+.wrap .add-new-h2 {
+	background: #f1f1f1;
+}
+
+.subtitle {
+	color: #777;
+}
+
+.ac_over {
+	background-color: #f0f0b8;
+}
+
+.ac_results {
+	background-color: #fff;
+	border-color: #6EB469;
+}
+
+.ac_results li {
+	color: #101010;
+}
+
+.alternate,
+.alt {
+	background-color: #fefefe;
+}
+
+.available-theme a.screenshot {
+	background-color: #f1f1f1;
+	border-color: #ddd;
+}
+
+.bar {
+	background-color: #e8e8e8;
+	border-right-color: #99d;
+}
+
+#media-upload,
+#media-upload .media-item .slidetoggle {
+	background: #fff;
+}
+
+#media-upload .slidetoggle {
+	border-top-color: #dfdfdf;
+}
+
+div.error,
+.login #login_error {
+	background-color: #ffebe8;
+	border-color: #c00;
+}
+
+div.error a {
+	color: #c00;
+}
+
+.form-invalid {
+	background-color: #ffebe8 !important;
+}
+
+.form-invalid input,
+.form-invalid select {
+	border-color: #c00 !important;
+}
+
+.submit {
+	border-color: #DFDFDF;
+}
+
+.highlight {
+	background-color: #e4f2fd;
+	color: #000;
+}
+
+.howto,
+.nonessential,
+#edit-slug-box,
+.form-input-tip,
+.subsubsub {
+	color: #666;
+}
+
+#wpbody-content #media-items .describe {
+	border-top-color: #dfdfdf;
+}
+
+.media-upload-form label.form-help,
+td.help {
+	color: #9a9a9a;
+}
+
+.post-com-count {
+	color: #fff;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+	color: #fff;
+}
+
+.post-com-count:hover span {
+	background-color: #d54e21;
+}
+
+.quicktags, .search {
+	background-color: #ccc;
+	color: #000;
+}
+
+.side-info h5 {
+	border-bottom-color: #dadada;
+}
+
+.side-info ul {
+	color: #666;
+}
+
+.button,
+.button-secondary,
+.submit input,
+input[type=button],
+input[type=submit] {
+	border-color: #bbb;
+	color: #464646;
+}
+
+.button:hover,
+.button-secondary:hover,
+.submit input:hover,
+input[type=button]:hover,
+input[type=submit]:hover {
+	color: #000;
+	border-color: #666;
+}
+
+.button,
+.submit input,
+.button-secondary {
+	background-color: #f2f2f2;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(255,255,255,1) 0 1px 0;
+}
+
+.button:active,
+.submit input:active,
+.button-secondary:active {
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+}
+
+input.button-primary,
+button.button-primary,
+a.button-primary {
+	border-color: #298cba;
+	font-weight: bold;
+	color: #fff;
+	background-image: url('../images/button-grad.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(0,0,0,0.3) 0 -1px 0;
+}
+
+input.button-primary:active,
+button.button-primary:active,
+a.button-primary:active {
+	background-image: url('../images/button-grad-active.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	color: #eaf2fa;
+}
+
+input.button-primary:hover,
+button.button-primary:hover,
+a.button-primary:hover,
+a.button-primary:focus,
+a.button-primary:active {
+	border-color: #13455b;
+	color: #eaf2fa;
+}
+
+.button-disabled,
+.button[disabled],
+.button:disabled,
+.button-secondary[disabled],
+.button-secondary:disabled,
+a.button.disabled {
+	color: #aaa !important;
+	border-color: #ddd !important;
+}
+
+.button-primary-disabled,
+.button-primary[disabled],
+.button-primary:disabled {
+	color: #9FD0D5 !important;
+	background: #298CBA !important;
+}
+
+a:hover,
+a:active,
+a:focus {
+	color: #d54e21;
+}
+
+#adminmenu a:hover,
+#adminmenu li.menu-top > a:focus,
+#adminmenu ul.wp-submenu a:hover,
+#the-comment-list .comment a:hover,
+#rightnow a:hover,
+#media-upload a.del-link:hover,
+div.dashboard-widget-submit input:hover,
+.subsubsub a:hover,
+.subsubsub a.current:hover,
+.ui-tabs-nav a:hover,
+.plugins .inactive a:hover,
+#all-plugins-table .plugins .inactive a:hover,
+#search-plugins-table .plugins .inactive a:hover {
+	color: #d54e21;
+}
+
+#the-comment-list .comment-item,
+#dashboard-widgets #dashboard_quick_press form p.submit {
+	border-color: #dfdfdf;
+}
+
+#side-sortables .category-tabs .tabs a,
+#side-sortables .add-menu-item-tabs .tabs a,
+.wp-tab-bar .wp-tab-active a {
+	color: #333;
+}
+
+#rightnow .rbutton {
+	background-color: #ebebeb;
+	color: #264761;
+}
+
+.submitbox .submit {
+	background-color: #464646;
+	color: #ccc;
+}
+
+.plugins a.delete:hover,
+#all-plugins-table .plugins a.delete:hover,
+#search-plugins-table .plugins a.delete:hover,
+.submitbox .submitdelete {
+	color: #f00;
+	border-bottom-color: #f00;
+}
+
+.submitbox .submitdelete:hover,
+#media-items a.delete:hover {
+	color: #fff;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+#normal-sortables .submitbox .submitdelete:hover {
+	color: #000;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+.tablenav .dots {
+	border-color: transparent;
+}
+
+.tablenav .next,
+.tablenav .prev {
+	border-color: transparent;
+	color: #007700;
+}
+
+.tablenav .next:hover,
+.tablenav .prev:hover {
+	border-color: transparent;
+	color: #d54e21;
+}
+
+div.updated,
+.login .message {
+	background-color: #ffffe0;
+	border-color: #e6db55;
+}
+
+.update-message {
+	color: #000;
+}
+
+a.page-numbers {
+	border-bottom-color: #B8D3E2;
+}
+
+.commentlist li {
+	border-bottom-color: #ccc;
+}
+
+.widefat td,
+.widefat th {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+.widefat th {
+	text-shadow: rgba(255,255,255,0.8) 0 1px 0;
+}
+
+.widefat td {
+	color: #555;
+}
+.widefat p,
+.widefat ol,
+.widefat ul {
+	color: #333;
+}
+
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head {
+	color: #333;
+}
+
+th.sortable a:hover, th.sortable a:active, th.sortable a:focus {
+	color: #333;
+}
+
+h3.dashboard-widget-title small a {
+	color: #d7d7d7;
+}
+
+h3.dashboard-widget-title small a:hover {
+	color: #fff;
+}
+
+a,
+#adminmenu a,
+#the-comment-list p.comment-author strong a,
+#media-upload a.del-link,
+#media-items a.delete,
+.plugins a.delete,
+.ui-tabs-nav a {
+	color: #007700;
+}
+
+#adminmenu .awaiting-mod,
+#adminmenu .update-plugins,
+#sidemenu a .update-plugins,
+#rightnow .reallynow {
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+#plugin-information .action-button {
+	background-color: #d54e21;
+	color: #fff;
+}
+
+#adminmenu li.current a .awaiting-mod,
+#adminmenu	li a.wp-has-current-submenu .update-plugins{
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+
+div#media-upload-header,
+div#plugin-information-header {
+	background-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#currenttheme img {
+	border-color: #666;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	background-color: #eefcf1;
+}
+
+input.readonly, textarea.readonly {
+	background-color: #ddd;
+}
+
+#editable-post-name {
+	background-color: #fffbcc;
+}
+
+#edit-slug-box strong,
+.tablenav .displaying-num,
+#submitted-on,
+.submitted-on {
+	color: #777;
+}
+
+.login #nav a,
+.login #backtoblog a {
+	color: #007700 !important;
+}
+
+.login #nav a:hover,
+.login #backtoblog a:hover {
+	color: #d54e21 !important;
+}
+
+#footer {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#media-items,
+.imgedit-group,
+.media-item {
+	border-color: #dfdfdf;
+}
+
+.checkbox,
+.side-info,
+.plugins tr,
+#your-profile #rich_editing {
+	background-color: #fcfcfc;
+}
+
+.plugins .inactive,
+.plugins .inactive th,
+.plugins .inactive td,
+tr.inactive + tr.plugin-update-tr .plugin-update {
+	background-color: #f4f4f4;
+}
+
+.plugin-update-tr .update-message {
+	background-color: #fffbe4;
+	border-color: #dfdfdf;
+}
+
+.plugins .active,
+.plugins .active th,
+.plugins .active td {
+	color: #000;
+}
+
+.plugins .inactive a {
+	color: #557799;
+}
+
+#the-comment-list tr.undo,
+#the-comment-list div.undo {
+	background-color: #f4f4f4;
+}
+
+#the-comment-list .unapproved {
+	background-color: #ffffe0;
+}
+
+#the-comment-list .approve a {
+	color: #006505;
+}
+
+#the-comment-list .unapprove a {
+	color: #d98500;
+}
+
+table.widefat span.delete a,
+table.widefat span.trash a,
+table.widefat span.spam a,
+#dashboard_recent_comments .delete a,
+#dashboard_recent_comments .trash a,
+#dashboard_recent_comments .spam a {
+	color: #bc0b0b;
+}
+
+.welcome-panel {
+	border-color: #dfdfdf;
+}
+.welcome-panel p {
+	color: #777;
+}
+.welcome-panel-column p {
+	color: #464646;
+}
+.welcome-panel .welcome-panel-close {
+	background: #eee;
+	text-shadow: 1px 1px 1px #eee;
+}
+.welcome-panel h3 {
+	text-shadow: 1px 1px 1px white;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+#titlediv,
+#poststuff .postarea,
+.stuffbox {
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+.menu-item-settings {
+	background-color: #eefcf1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.postbox h3 {
+	color: #464646;
+}
+
+.widget .widget-top {
+	color: #222;
+}
+
+.sidebar-name:hover h3,
+.postbox h3:hover {
+	color: #000;
+}
+
+#quicktags #ed_link {
+	color: #00f;
+}
+
+#rightnow .youhave {
+	background-color: #f0f6fb;
+}
+
+#rightnow a {
+	color: #448abd;
+}
+
+.tagchecklist span a,
+#bulk-titles div a {
+
+	background-repeat: no-repeat;
+}
+
+.tagchecklist span a:hover,
+#bulk-titles div a:hover {
+	background-repeat: no-repeat;
+	background-position: -10px 0;
+}
+
+#update-nag, .update-nag {
+	background-color: #FFFBCC;
+	border-color: #E6DB55;
+	color: #555;
+}
+
+#screen-meta {
+	background-color: #f1f1f1;
+	border-color: #ccc;
+	-webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+	box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+}
+
+.contextual-help-tabs a:hover {
+	color: #333;
+}
+
+.contextual-help-sidebar,
+.contextual-help-tabs .active {
+	border-color: #ccc;
+}
+
+.contextual-help-tabs .active,
+.contextual-help-tabs .active a,
+.contextual-help-tabs .active a:hover {
+	background: #fff;
+	color: #000;
+}
+
+.contextual-help-tabs-wrap {
+	border-color: #ccc;
+	background-color: #fff;
+}
+
+/* screen options and help tabs */
+#screen-options-link-wrap,
+#contextual-help-link-wrap {
+	background-color: #e3e3e3; /* Fallback */
+	border-right: 1px solid transparent;
+	border-left: 1px solid transparent;
+	border-bottom: 1px solid transparent;
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */
+}
+
+#screen-meta-links a.show-settings {
+	color: #777;
+}
+
+#screen-meta-links a.show-settings:hover {
+	color: #000;
+}
+
+#screen-meta-links a.show-settings {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right 3px;
+}
+
+#screen-meta-links a.show-settings.screen-meta-active {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right -33px;
+}
+
+/* end screen options and help tabs */
+
+.login #backtoblog a {
+	color: #464646;
+}
+
+#wphead {
+	border-bottom:#dfdfdf 1px solid;
+}
+
+#wphead h1 a {
+	color: #464646;
+}
+
+#footer a:link,
+#footer a:visited {
+	text-decoration: none;
+}
+
+#footer a:hover {
+	color: #000;
+	text-decoration: underline;
+}
+
+.file-error,
+abbr.required,
+.widget-control-remove:hover,
+table.widefat .delete a:hover,
+table.widefat .trash a:hover,
+table.widefat .spam a:hover,
+#dashboard_recent_comments .delete a:hover,
+#dashboard_recent_comments .trash a:hover
+#dashboard_recent_comments .spam a:hover {
+	color: #f00;
+}
+
+#pass-strength-result {
+	background-color: #eee;
+	border-color: #ddd !important;
+}
+
+#pass-strength-result.bad {
+	background-color: #ffb78c;
+	border-color: #ff853c !important;
+}
+
+#pass-strength-result.good {
+	background-color: #ffec8b;
+	border-color: #fc0 !important;
+}
+
+#pass-strength-result.short {
+	background-color: #ffa0a0;
+	border-color: #f04040 !important;
+}
+
+#pass-strength-result.strong {
+	background-color: #c3ff88;
+	border-color: #8dff1c !important;
+}
+
+#titlediv #title {
+	border-color: #ccc;
+}
+
+#post-status-info {
+	border-color: #dfdfdf #ccc #ccc;
+	background-color: #eaeaea;
+}
+
+.editwidget .widget-inside {
+	border-color: #dfdfdf;
+}
+
+#titlediv #title {
+	background-color: #fff;
+}
+
+#tTips p#tTips_inside {
+	background-color: #ddd;
+	color: #333;
+}
+
+#timestampdiv input,
+#namediv input,
+#poststuff .inside .the-tagcloud {
+	border-color: #ddd;
+}
+
+/* menu */
+#adminmenuback,
+#adminmenuwrap {
+	background-color: #deece1;
+	border-color: #ccc;
+}
+
+#adminmenushadow,
+#adminmenuback {
+	background-position: top right;
+	background-repeat: repeat-y;
+}
+
+#adminmenu li.wp-menu-separator {
+	background: #dfdfdf;
+	border-color: #cfcfcf;
+}
+
+#adminmenu div.separator {
+	border-color: #e1e1e1;
+}
+
+#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -1px 6px;
+}
+
+#adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+#adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -2px 6px;
+}
+
+#adminmenu a.menu-top,
+.folded #adminmenu li.menu-top,
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#adminmenu li.wp-menu-open {
+	border-color: #dfdfdf;
+}
+
+#adminmenu li.menu-top:hover > a,
+#adminmenu li.menu-top.focused > a,
+#adminmenu li.menu-top > a:focus {
+	background-color: #eefcf1;
+	text-shadow: 0 1px 0 rgba( 255, 255, 255, 0.4 );
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top,
+#adminmenu .wp-menu-arrow,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu .wp-menu-arrow div {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(right bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(right bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(right bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, right bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(right bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(right bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+	background: #eefcf1;
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow div {
+	background: #eefcf1;
+	border-color: #ccc;
+}
+
+.folded #adminmenu li.menu-top li:hover a {
+	background-image: none;
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	text-shadow: 0 -1px 0 #333;
+	color: #fff;
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top {
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+#adminmenu .wp-submenu a:hover,
+#adminmenu .wp-submenu a:focus {
+	background-color: #eefcf1;
+	color: #333;
+}
+
+#adminmenu .wp-submenu li.current,
+#adminmenu .wp-submenu li.current a,
+#adminmenu .wp-submenu li.current a:hover {
+	color: #333;
+}
+
+#adminmenu .wp-submenu ul {
+	background-color: #fff;
+}
+
+#adminmenu .wp-submenu-wrap,
+#adminmenu .wp-submenu ul {
+	border-color: #dfdfdf;
+}
+
+#adminmenu .wp-submenu-wrap,
+.folded #adminmenu .wp-has-current-submenu .wp-submenu-wrap {
+	-moz-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+}
+
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: #dfdfdf;
+	background-color: #deece1;
+}
+
+#adminmenu div.wp-submenu {
+	background-color: transparent;
+}
+
+/* collapse menu button */
+#collapse-menu {
+	color: #aaa;
+}
+
+#collapse-menu:hover {
+	color: #999;
+}
+
+#collapse-button {
+	border-color: #ccc;
+	background-color: #f4f4f4; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #fff); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #fff); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #fff); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#fff)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #fff); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #fff); /* proposed W3C Markup */
+}
+#collapse-menu:hover #collapse-button {
+	border-color: #aaa;
+}
+#collapse-button div {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 -72px;
+}
+.folded #collapse-button div {
+	background-position: 0 -108px;
+}
+
+/* menu and screen icons */
+.icon16.icon-dashboard,
+#adminmenu .menu-icon-dashboard div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -33px;
+}
+
+#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -1px;
+}
+
+.icon16.icon-post,
+#adminmenu .menu-icon-post div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+#adminmenu .menu-icon-post:hover div.wp-menu-image,
+#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+.icon16.icon-media,
+#adminmenu .menu-icon-media div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -33px;
+}
+
+#adminmenu .menu-icon-media:hover div.wp-menu-image,
+#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -1px;
+}
+
+.icon16.icon-links,
+#adminmenu .menu-icon-links div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -33px;
+}
+
+#adminmenu .menu-icon-links:hover div.wp-menu-image,
+#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -1px;
+}
+
+.icon16.icon-page,
+#adminmenu .menu-icon-page div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -33px;
+}
+
+#adminmenu .menu-icon-page:hover div.wp-menu-image,
+#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -1px;
+}
+
+.icon16.icon-comments,
+#adminmenu .menu-icon-comments div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -33px;
+}
+
+#adminmenu .menu-icon-comments:hover div.wp-menu-image,
+#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-comments.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -1px;
+}
+
+.icon16.icon-appearance,
+#adminmenu .menu-icon-appearance div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: 0 -33px;
+}
+
+#adminmenu .menu-icon-appearance:hover div.wp-menu-image,
+#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position:  0 -1px;
+}
+
+.icon16.icon-plugins,
+#adminmenu .menu-icon-plugins div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -33px;
+}
+
+#adminmenu .menu-icon-plugins:hover div.wp-menu-image,
+#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -1px;
+}
+
+.icon16.icon-users,
+#adminmenu .menu-icon-users div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -33px;
+}
+
+#adminmenu .menu-icon-users:hover div.wp-menu-image,
+#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-users.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -1px;
+}
+
+.icon16.icon-tools,
+#adminmenu .menu-icon-tools div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -33px;
+}
+
+#adminmenu .menu-icon-tools:hover div.wp-menu-image,
+#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-tools.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -1px;
+}
+
+.icon16.icon-settings,
+#adminmenu .menu-icon-settings div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -33px;
+}
+
+#adminmenu .menu-icon-settings:hover div.wp-menu-image,
+#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -1px;
+}
+
+.icon16.icon-site,
+#adminmenu .menu-icon-site div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -33px;
+}
+
+#adminmenu .menu-icon-site:hover div.wp-menu-image,
+#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -1px;
+}
+/* end menu and screen icons */
+
+/* Screen Icons */
+.icon32.icon-post,
+#icon-edit,
+#icon-post {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -552px -5px;
+}
+
+.icon32.icon-dashboard,
+#icon-index {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -137px -5px;
+}
+
+.icon32.icon-media,
+#icon-upload {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -251px -5px;
+}
+
+.icon32.icon-links,
+#icon-link-manager,
+#icon-link,
+#icon-link-category {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -190px -5px;
+}
+
+.icon32.icon-page,
+#icon-edit-pages,
+#icon-page {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -312px -5px;
+}
+
+.icon32.icon-comments,
+#icon-edit-comments {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -72px -5px;
+}
+
+.icon32.icon-appearance,
+#icon-themes {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -11px -5px;
+}
+
+.icon32.icon-plugins,
+#icon-plugins {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -370px -5px;
+}
+
+.icon32.icon-users,
+#icon-users,
+#icon-profile,
+#icon-user-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -600px -5px;
+}
+
+.icon32.icon-tools,
+#icon-tools,
+#icon-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -432px -5px;
+}
+
+.icon32.icon-settings,
+#icon-options-general {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -492px -5px;
+}
+
+.icon32.icon-site,
+#icon-ms-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -659px -5px;
+}
+/* end screen icons */
+
+
+/* Diff */
+table.diff .diff-deletedline {
+	background-color: #fdd;
+}
+
+table.diff .diff-deletedline del {
+	background-color: #f99;
+}
+
+table.diff .diff-addedline {
+	background-color: #dfd;
+}
+
+table.diff .diff-addedline ins {
+	background-color: #9f9;
+}
+
+#att-info {
+	background-color: #E4F2FD;
+}
+
+/* edit image */
+#sidemenu a {
+	background-color: #eefcf1;
+	border-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#sidemenu a.current {
+	background-color: #fff;
+	border-color: #dfdfdf #dfdfdf #fff;
+	color: #D54E21;
+}
+
+#replyerror {
+	border-color: #ddd;
+	background-color: #eefcf1;
+}
+
+/* table vim shortcuts */
+.vim-current,
+.vim-current th,
+.vim-current td {
+	background-color: #E4F2FD !important;
+}
+
+/* Install Plugins */
+.star-average,
+.star.star-rating {
+	background-color: #fc0;
+}
+
+div.star.select:hover {
+	background-color: #d00;
+}
+
+div.star img {
+	border-left: 1px solid #fff;
+	border-right: 1px solid #fff;
+}
+
+.widefat div.star img {
+	border-left: 1px solid #eefcf1;
+	border-right: 1px solid #eefcf1;
+}
+
+#plugin-information .fyi ul {
+	background-color: #eaf3fa;
+}
+
+#plugin-information .fyi h2.mainheader {
+	background-color: #cee1ef;
+}
+
+#plugin-information pre,
+#plugin-information code {
+	background-color: #ededff;
+}
+
+#plugin-information pre {
+	border: 1px solid #ccc;
+}
+
+/* inline editor */
+.inline-edit-row fieldset input[type="text"],
+.inline-edit-row fieldset textarea,
+#bulk-titles {
+	border-color: #ddd;
+}
+
+.inline-editor div.title {
+	background-color: #EAF3FA;
+}
+
+.inline-editor ul.cat-checklist {
+	background-color: #fff;
+	border-color: #ddd;
+}
+
+.inline-editor .categories .catshow,
+.inline-editor .categories .cathide {
+	color: #007700;
+}
+
+.inline-editor .quick-edit-save {
+	background-color: #f1f1f1;
+}
+
+fieldset.inline-edit-col-right .inline-edit-col {
+	border-color: #dfdfdf;
+}
+
+.attention {
+	color: #D54E21;
+}
+
+.meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.tablenav .tablenav-pages {
+	color: #555;
+}
+
+.tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left -379px;
+}
+
+.tablenav .tablenav-pages a:hover,
+.tablenav .tablenav-pages a:focus {
+	color: #d54e21;
+}
+
+.tablenav .tablenav-pages a.disabled,
+.tablenav .tablenav-pages a.disabled:hover,
+.tablenav .tablenav-pages a.disabled:focus {
+	color: #aaa;
+}
+
+.tablenav .tablenav-pages .current {
+	background: #dfdfdf;
+	border-color: #d3d3d3;
+}
+
+#availablethemes,
+#availablethemes td {
+	border-color: #ddd;
+}
+
+#current-theme img {
+	border-color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link,
+#TB_window #TB_title a.tb-theme-preview-link:visited {
+	color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link:hover,
+#TB_window #TB_title a.tb-theme-preview-link:focus {
+	color: #ccc;
+}
+
+.misc-pub-section {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#minor-publishing {
+	border-bottom-color: #dfdfdf;
+}
+
+#post-body .misc-pub-section {
+	border-right-color: #eee;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+}
+
+.form-table .color-palette td {
+	border-color: #fff;
+}
+
+.sortable-placeholder {
+	border-color: #bbb;
+	background-color: #eefcf1;
+}
+
+#post-body ul.category-tabs li.tabs a,
+#post-body ul.add-menu-item-tabs li.tabs a,
+body.press-this ul.category-tabs li.tabs a {
+	color: #333;
+}
+
+.view-switch #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 0;
+}
+
+.view-switch .current #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -40px 0;
+}
+
+.view-switch #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -20px 0;
+}
+
+.view-switch .current #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -60px 0;
+}
+
+#header-logo {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: center center;
+}
+
+.popular-tags,
+.feature-filter {
+	background-color: #fff;
+	border-color: #DFDFDF;
+}
+
+#theme-information .action-button {
+	border-top-color: #DFDFDF;
+}
+
+.theme-listing br.line {
+	border-bottom-color: #ccc;
+}
+
+div.widgets-sortables,
+#widgets-left .inactive {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-holder {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-description {
+	color: #555;
+}
+
+.sidebar-name {
+	color: #464646;
+	text-shadow: #fff 0 1px 0;
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+.sidebar-name:hover,
+#removing-widget {
+	color: #d54e21;
+}
+
+#removing-widget span {
+	color: black;
+}
+
+.sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.in-widget-title {
+	color: #606060;
+}
+
+.deleting .widget-title * {
+	color: #aaa;
+}
+
+.imgedit-menu div {
+	border-color: #d5d5d5;
+	background-color: #f1f1f1;
+}
+
+.imgedit-menu div:hover {
+	border-color: #c1c1c1;
+	background-color: #eaeaea;
+}
+
+.imgedit-menu div.disabled {
+	border-color: #ccc;
+	background-color: #ddd;
+	filter: alpha(opacity=50);
+	opacity: 0.5;
+}
+
+#dashboard_recent_comments div.undo {
+	border-top-color: #dfdfdf;
+}
+
+.comment-ays,
+.comment-ays th {
+	border-color: #ddd;
+}
+
+.comment-ays th {
+	background-color: #f1f1f1;
+}
+
+/* added from nav-menu.css */
+#menu-management .menu-edit {
+	border-color: #dfdfdf;
+}
+
+#post-body {
+	background: #fff;
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-header {
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-footer {
+	border-top-color: #fff;
+}
+
+#menu-management .nav-tabs-arrow a {
+	color: #C1C1C1;
+}
+
+#menu-management .nav-tabs-arrow a:hover {
+	color: #D54E21;
+}
+
+#menu-management .nav-tabs-arrow a:active {
+	color: #464646;
+}
+
+#menu-management .nav-tab-active {
+	border-color: #dfdfdf;
+}
+
+#menu-management .nav-tab {
+	background: #fbfbfb;
+	border-color: #dfdfdf;
+}
+
+.js .input-with-default-title {
+	color: #aaa;
+}
+
+#cancel-save {
+	color: #ff0000;
+}
+
+#cancel-save:hover {
+	background-color: #FF0000;
+	color: #fff;
+}
+
+.list-container {
+	border-color: #DFDFDF;
+}
+
+.menu-item-handle {
+	border-color: #dfdfdf;
+}
+
+.menu li.deleting .menu-item-handle {
+	background-color: #f66;
+	text-shadow: #ccc;
+}
+
+.item-type { /* Menu item controls */
+	color: #999999;
+}
+
+.item-controls .menu-item-delete:hover {
+	color: #ff0000;
+}
+
+.item-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+	border-bottom-color: #eee;
+}
+
+.item-edit:hover {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+}
+
+.menu-item-settings { /* Menu editing */
+	border-color: #dfdfdf;
+}
+
+.link-to-original {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#cancel-save:hover {
+	color: #fff !important;
+}
+
+#update-menu-item {
+	color: #fff !important;
+}
+
+#update-menu-item:hover,
+#update-menu-item:active,
+#update-menu-item:focus {
+	color: #eaf2fa !important;
+	border-color: #13455b !important;
+}
+
+.submitbox .submitcancel {
+	color: #007700;
+	border-bottom-color: #007700;
+}
+
+.submitbox .submitcancel:hover {
+	background: #007700;
+	color: #fff;
+}
+/* end added from nav-menu.css */
+
+#menu-management .nav-tab-active,
+.menu-item-handle,
+.menu-item-settings {
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+#menu-management .nav-tab-active {
+	background: #eefcf1;
+	border-bottom-color: #eefcf1;
+}
+
+/* custom header & background pages */
+#upload-form label {
+	color: #777;
+}
+/* custom header & background pages */
+
+/* full screen */
+.fullscreen-overlay {
+	background: #fff;
+}
+
+.wp-fullscreen-focus #wp-fullscreen-title,
+.wp-fullscreen-focus #wp-fullscreen-container {
+	border-color: #ccc;
+}
+
+#fullscreen-topbar {
+	border-bottom-color: #DFDFDF;
+}
+
+/* Begin About Pages */
+
+.about-wrap h1 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-text {
+	color: #777;
+}
+
+.wp-badge {
+	color: #fff;
+	text-shadow: 0 -1px 0 #0c3d57;
+	border-color: #2B5173;
+
+	-moz-box-shadow: inset 0 0 0 1px #5F8CA8;
+	-webkit-box-shadow: inset 0 0 0 1px #5F8CA8;
+	box-shadow: inset 0 0 0 1px #5F8CA8;
+
+	background-color: #378aac;
+}
+
+.about-wrap h2 .nav-tab {
+	color: #007700;
+}
+.about-wrap h2 .nav-tab:hover {
+	color: #d54e21;
+}
+.about-wrap h2 .nav-tab-active,
+.about-wrap h2 .nav-tab-active:hover {
+	color: #333;
+}
+.about-wrap h2 .nav-tab-active {
+	text-shadow: 1px 1px 1px white;
+	color: #464646;
+}
+
+.about-wrap h3 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap .feature-section h4 {
+	color: #464646;
+}
+
+.about-wrap .feature-section img {
+	background: #eefcf1;
+	border-color: #dfdfdf;
+
+	-moz-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	-webkit-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+}
+
+.about-wrap h4.wp-people-group {
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap li.wp-person img.gravatar {
+	-moz-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+}
+.about-wrap li.wp-person .title {
+	color: #464646;
+	text-shadow: 1px 1px 1px white;
+}
+
+.freedoms-php .about-wrap ol li {
+	color: #999;
+}
+.freedoms-php .about-wrap ol p {
+	color: #464646;
+}
+
+/* End About Pages */
+
+
+/*------------------------------------------------------------------------------
+  2.0 - Right to Left Styles
+------------------------------------------------------------------------------*/
+
+.rtl .bar {
+	border-right-color: none;
+	border-left-color: #99d;
+}
+
+.rtl #screen-meta-links a.show-settings {
+	background-position: left 3px;
+}
+
+.rtl #screen-meta-links a.show-settings.screen-meta-active {
+	background-position: left -33px;
+}
+
+/* Menu */
+.rtl #adminmenushadow,
+.rtl #adminmenuback {
+	background-position: top left;
+}
+
+.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+.rtl #adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: none;
+	border-left-color: #dfdfdf;
+}
+
+.rtl .folded #adminmenu .wp-submenu-wrap {
+	-moz-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+}
+
+/* Collapse Menu Button */
+.rtl #collapse-button div {
+	background-position: 0 -108px;
+}
+
+.rtl .folded #collapse-button div {
+	background-position: 0 -72px;
+}
+
+/* Edit Image */
+.rtl .meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.rtl .tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: right -379px;
+}
+
+.rtl #post-body .misc-pub-section {
+	border-right-color: none;
+	border-left-color: #eee;
+}
+
+.rtl .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.rtl .sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/green-34.dev.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2080 @@
+
+
+/*------------------------------------------------------------------------------
+
+
+Howdy! This is the CSS file that controls the
+Green (minty) color style on the WordPress Dashboard.
+
+This file contains both LTR and RTL styles.
+
+
+TABLE OF CONTENTS:
+------------------
+ 1.0 - Left to Right Styles
+ 2.0 - Right to Left Styles
+
+
+------------------------------------------------------------------------------*/
+
+
+/*------------------------------------------------------------------------------
+  1.0 - Left to Right Styles
+------------------------------------------------------------------------------*/
+
+html,
+.wp-dialog {
+	background-color: #fff;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="file"],
+input[type="button"],
+input[type="submit"],
+input[type="reset"],
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="tel"],
+input[type="url"],
+select {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="file"]:focus,
+input[type="button"]:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+select:focus {
+	border-color: #bbb;
+}
+
+kbd,
+code {
+	background: #eaeaea;
+}
+
+input[readonly] {
+	background-color: #eee;
+}
+
+.find-box-search {
+	border-color: #dfdfdf;
+	background-color: #f1f1f1;
+}
+
+.find-box {
+	background-color: #f1f1f1;
+}
+
+.find-box-inside {
+	background-color: #fff;
+}
+
+a.page-numbers:hover {
+	border-color: #999;
+}
+
+body,
+#wpbody,
+.form-table .pre {
+	color: #333;
+}
+
+body > #upload-menu {
+	border-bottom-color: #fff;
+}
+
+#postcustomstuff table,
+#your-profile fieldset,
+#rightnow,
+div.dashboard-widget,
+#dashboard-widgets p.dashboard-widget-links {
+	border-color: #ccc;
+}
+
+#poststuff .inside label.spam,
+#poststuff .inside label.deleted {
+	color: red;
+}
+
+#poststuff .inside label.waiting {
+	color: orange;
+}
+
+#poststuff .inside label.approved {
+	color: green;
+}
+
+#postcustomstuff table {
+	border-color: #dfdfdf;
+	background-color: #F9F9F9;
+}
+
+#postcustomstuff thead th {
+	background-color: #F1F1F1;
+}
+
+.widefat {
+	border-color: #dfdfdf;
+	background-color: #eefcf1;
+}
+textarea.widefat {
+	background-color: #fff;
+}
+
+div.dashboard-widget-error {
+	background-color: #c43;
+}
+
+div.dashboard-widget-notice {
+	background-color: #cfe1ef;
+}
+
+div.dashboard-widget-submit {
+	border-top-color: #ccc;
+}
+
+div.tabs-panel,
+.wp-tab-panel,
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	background-color: #fff;
+}
+
+input.disabled,
+textarea.disabled {
+	background-color: #ccc;
+}
+/* #upload-menu li a.upload-tab-link, */
+#plugin-information .action-button a,
+#plugin-information .action-button a:hover,
+#plugin-information .action-button a:visited {
+	color: #fff;
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3,
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head,
+.sidebar-name,
+#nav-menu-header,
+#nav-menu-footer,
+.menu-item-handle,
+#fullscreen-topbar {
+	background-color: #f1f1f1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3 {
+	border-bottom-color: #dfdfdf;
+	text-shadow: #fff 0 1px 0;
+	-moz-box-shadow: 0 1px 0 #fff;
+	-webkit-box-shadow: 0 1px 0 #fff;
+	box-shadow: 0 1px 0 #fff;
+}
+
+.form-table th,
+.form-wrap label {
+	color: #222;
+	text-shadow: #fff 0 1px 0;
+}
+
+.description,
+.form-wrap p {
+	color: #666;
+}
+
+strong .post-com-count span {
+	background-color: #007700;
+}
+
+.sorthelper {
+	background-color: #ccf3fa;
+}
+
+.ac_match,
+.subsubsub a.current {
+	color: #000;
+}
+
+.wrap h2 {
+	color: #464646;
+}
+
+.wrap .add-new-h2 {
+	background: #f1f1f1;
+}
+
+.subtitle {
+	color: #777;
+}
+
+.ac_over {
+	background-color: #f0f0b8;
+}
+
+.ac_results {
+	background-color: #fff;
+	border-color: #6EB469;
+}
+
+.ac_results li {
+	color: #101010;
+}
+
+.alternate,
+.alt {
+	background-color: #fefefe;
+}
+
+.available-theme a.screenshot {
+	background-color: #f1f1f1;
+	border-color: #ddd;
+}
+
+.bar {
+	background-color: #e8e8e8;
+	border-right-color: #99d;
+}
+
+#media-upload,
+#media-upload .media-item .slidetoggle {
+	background: #fff;
+}
+
+#media-upload .slidetoggle {
+	border-top-color: #dfdfdf;
+}
+
+div.error,
+.login #login_error {
+	background-color: #ffebe8;
+	border-color: #c00;
+}
+
+div.error a {
+	color: #c00;
+}
+
+.form-invalid {
+	background-color: #ffebe8 !important;
+}
+
+.form-invalid input,
+.form-invalid select {
+	border-color: #c00 !important;
+}
+
+.submit {
+	border-color: #DFDFDF;
+}
+
+.highlight {
+	background-color: #e4f2fd;
+	color: #000;
+}
+
+.howto,
+.nonessential,
+#edit-slug-box,
+.form-input-tip,
+.subsubsub {
+	color: #666;
+}
+
+#wpbody-content #media-items .describe {
+	border-top-color: #dfdfdf;
+}
+
+.media-upload-form label.form-help,
+td.help {
+	color: #9a9a9a;
+}
+
+.post-com-count {
+	color: #fff;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+	color: #fff;
+}
+
+.post-com-count:hover span {
+	background-color: #d54e21;
+}
+
+.quicktags, .search {
+	background-color: #ccc;
+	color: #000;
+}
+
+.side-info h5 {
+	border-bottom-color: #dadada;
+}
+
+.side-info ul {
+	color: #666;
+}
+
+.button,
+.button-secondary,
+.submit input,
+input[type=button],
+input[type=submit] {
+	border-color: #bbb;
+	color: #464646;
+}
+
+.button:hover,
+.button-secondary:hover,
+.submit input:hover,
+input[type=button]:hover,
+input[type=submit]:hover {
+	color: #000;
+	border-color: #666;
+}
+
+.button,
+.submit input,
+.button-secondary {
+	background-color: #f2f2f2;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(255,255,255,1) 0 1px 0;
+}
+
+.button:active,
+.submit input:active,
+.button-secondary:active {
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+}
+
+input.button-primary,
+button.button-primary,
+a.button-primary {
+	border-color: #298cba;
+	font-weight: bold;
+	color: #fff;
+	background-image: url('../images/button-grad.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(0,0,0,0.3) 0 -1px 0;
+}
+
+input.button-primary:active,
+button.button-primary:active,
+a.button-primary:active {
+	background-image: url('../images/button-grad-active.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	color: #eaf2fa;
+}
+
+input.button-primary:hover,
+button.button-primary:hover,
+a.button-primary:hover,
+a.button-primary:focus,
+a.button-primary:active {
+	border-color: #13455b;
+	color: #eaf2fa;
+}
+
+.button-disabled,
+.button[disabled],
+.button:disabled,
+.button-secondary[disabled],
+.button-secondary:disabled,
+a.button.disabled {
+	color: #aaa !important;
+	border-color: #ddd !important;
+}
+
+.button-primary-disabled,
+.button-primary[disabled],
+.button-primary:disabled {
+	color: #9FD0D5 !important;
+	background: #298CBA !important;
+}
+
+a:hover,
+a:active,
+a:focus {
+	color: #d54e21;
+}
+
+#adminmenu a:hover,
+#adminmenu li.menu-top > a:focus,
+#adminmenu ul.wp-submenu a:hover,
+#the-comment-list .comment a:hover,
+#rightnow a:hover,
+#media-upload a.del-link:hover,
+div.dashboard-widget-submit input:hover,
+.subsubsub a:hover,
+.subsubsub a.current:hover,
+.ui-tabs-nav a:hover,
+.plugins .inactive a:hover,
+#all-plugins-table .plugins .inactive a:hover,
+#search-plugins-table .plugins .inactive a:hover {
+	color: #d54e21;
+}
+
+#the-comment-list .comment-item,
+#dashboard-widgets #dashboard_quick_press form p.submit {
+	border-color: #dfdfdf;
+}
+
+#side-sortables .category-tabs .tabs a,
+#side-sortables .add-menu-item-tabs .tabs a,
+.wp-tab-bar .wp-tab-active a {
+	color: #333;
+}
+
+#rightnow .rbutton {
+	background-color: #ebebeb;
+	color: #264761;
+}
+
+.submitbox .submit {
+	background-color: #464646;
+	color: #ccc;
+}
+
+.plugins a.delete:hover,
+#all-plugins-table .plugins a.delete:hover,
+#search-plugins-table .plugins a.delete:hover,
+.submitbox .submitdelete {
+	color: #f00;
+	border-bottom-color: #f00;
+}
+
+.submitbox .submitdelete:hover,
+#media-items a.delete:hover {
+	color: #fff;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+#normal-sortables .submitbox .submitdelete:hover {
+	color: #000;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+.tablenav .dots {
+	border-color: transparent;
+}
+
+.tablenav .next,
+.tablenav .prev {
+	border-color: transparent;
+	color: #007700;
+}
+
+.tablenav .next:hover,
+.tablenav .prev:hover {
+	border-color: transparent;
+	color: #d54e21;
+}
+
+div.updated,
+.login .message {
+	background-color: #ffffe0;
+	border-color: #e6db55;
+}
+
+.update-message {
+	color: #000;
+}
+
+a.page-numbers {
+	border-bottom-color: #B8D3E2;
+}
+
+.commentlist li {
+	border-bottom-color: #ccc;
+}
+
+.widefat td,
+.widefat th {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+.widefat th {
+	text-shadow: rgba(255,255,255,0.8) 0 1px 0;
+}
+
+.widefat td {
+	color: #555;
+}
+.widefat p,
+.widefat ol,
+.widefat ul {
+	color: #333;
+}
+
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head {
+	color: #333;
+}
+
+th.sortable a:hover, th.sortable a:active, th.sortable a:focus {
+	color: #333;
+}
+
+h3.dashboard-widget-title small a {
+	color: #d7d7d7;
+}
+
+h3.dashboard-widget-title small a:hover {
+	color: #fff;
+}
+
+a,
+#adminmenu a,
+#the-comment-list p.comment-author strong a,
+#media-upload a.del-link,
+#media-items a.delete,
+.plugins a.delete,
+.ui-tabs-nav a {
+	color: #007700;
+}
+
+#adminmenu .awaiting-mod,
+#adminmenu .update-plugins,
+#sidemenu a .update-plugins,
+#rightnow .reallynow {
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+#plugin-information .action-button {
+	background-color: #d54e21;
+	color: #fff;
+}
+
+#adminmenu li.current a .awaiting-mod,
+#adminmenu	li a.wp-has-current-submenu .update-plugins{
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+
+div#media-upload-header,
+div#plugin-information-header {
+	background-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#currenttheme img {
+	border-color: #666;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	background-color: #eefcf1;
+}
+
+input.readonly, textarea.readonly {
+	background-color: #ddd;
+}
+
+#editable-post-name {
+	background-color: #fffbcc;
+}
+
+#edit-slug-box strong,
+.tablenav .displaying-num,
+#submitted-on,
+.submitted-on {
+	color: #777;
+}
+
+.login #nav a,
+.login #backtoblog a {
+	color: #007700 !important;
+}
+
+.login #nav a:hover,
+.login #backtoblog a:hover {
+	color: #d54e21 !important;
+}
+
+#footer {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#media-items,
+.imgedit-group,
+.media-item {
+	border-color: #dfdfdf;
+}
+
+.checkbox,
+.side-info,
+.plugins tr,
+#your-profile #rich_editing {
+	background-color: #fcfcfc;
+}
+
+.plugins .inactive,
+.plugins .inactive th,
+.plugins .inactive td,
+tr.inactive + tr.plugin-update-tr .plugin-update {
+	background-color: #f4f4f4;
+}
+
+.plugin-update-tr .update-message {
+	background-color: #fffbe4;
+	border-color: #dfdfdf;
+}
+
+.plugins .active,
+.plugins .active th,
+.plugins .active td {
+	color: #000;
+}
+
+.plugins .inactive a {
+	color: #557799;
+}
+
+#the-comment-list tr.undo,
+#the-comment-list div.undo {
+	background-color: #f4f4f4;
+}
+
+#the-comment-list .unapproved {
+	background-color: #ffffe0;
+}
+
+#the-comment-list .approve a {
+	color: #006505;
+}
+
+#the-comment-list .unapprove a {
+	color: #d98500;
+}
+
+table.widefat span.delete a,
+table.widefat span.trash a,
+table.widefat span.spam a,
+#dashboard_recent_comments .delete a,
+#dashboard_recent_comments .trash a,
+#dashboard_recent_comments .spam a {
+	color: #bc0b0b;
+}
+
+.welcome-panel {
+	border-color: #dfdfdf;
+}
+.welcome-panel p {
+	color: #777;
+}
+.welcome-panel-column p {
+	color: #464646;
+}
+.welcome-panel .welcome-panel-close {
+	background: #eee;
+	text-shadow: 1px 1px 1px #eee;
+}
+.welcome-panel h3 {
+	text-shadow: 1px 1px 1px white;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+#titlediv,
+#poststuff .postarea,
+.stuffbox {
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+.menu-item-settings {
+	background-color: #eefcf1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.postbox h3 {
+	color: #464646;
+}
+
+.widget .widget-top {
+	color: #222;
+}
+
+.sidebar-name:hover h3,
+.postbox h3:hover {
+	color: #000;
+}
+
+#quicktags #ed_link {
+	color: #00f;
+}
+
+#rightnow .youhave {
+	background-color: #f0f6fb;
+}
+
+#rightnow a {
+	color: #448abd;
+}
+
+.tagchecklist span a,
+#bulk-titles div a {
+
+	background-repeat: no-repeat;
+}
+
+.tagchecklist span a:hover,
+#bulk-titles div a:hover {
+	background-repeat: no-repeat;
+	background-position: -10px 0;
+}
+
+#update-nag, .update-nag {
+	background-color: #FFFBCC;
+	border-color: #E6DB55;
+	color: #555;
+}
+
+#screen-meta {
+	background-color: #f1f1f1;
+	border-color: #ccc;
+	-webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+	box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+}
+
+.contextual-help-tabs a:hover {
+	color: #333;
+}
+
+.contextual-help-sidebar,
+.contextual-help-tabs .active {
+	border-color: #ccc;
+}
+
+.contextual-help-tabs .active,
+.contextual-help-tabs .active a,
+.contextual-help-tabs .active a:hover {
+	background: #fff;
+	color: #000;
+}
+
+.contextual-help-tabs-wrap {
+	border-color: #ccc;
+	background-color: #fff;
+}
+
+/* screen options and help tabs */
+#screen-options-link-wrap,
+#contextual-help-link-wrap {
+	background-color: #e3e3e3; /* Fallback */
+	border-right: 1px solid transparent;
+	border-left: 1px solid transparent;
+	border-bottom: 1px solid transparent;
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */
+}
+
+#screen-meta-links a.show-settings {
+	color: #777;
+}
+
+#screen-meta-links a.show-settings:hover {
+	color: #000;
+}
+
+#screen-meta-links a.show-settings {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right 3px;
+}
+
+#screen-meta-links a.show-settings.screen-meta-active {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right -33px;
+}
+
+/* end screen options and help tabs */
+
+.login #backtoblog a {
+	color: #464646;
+}
+
+#wphead {
+	border-bottom:#dfdfdf 1px solid;
+}
+
+#wphead h1 a {
+	color: #464646;
+}
+
+#footer a:link,
+#footer a:visited {
+	text-decoration: none;
+}
+
+#footer a:hover {
+	color: #000;
+	text-decoration: underline;
+}
+
+.file-error,
+abbr.required,
+.widget-control-remove:hover,
+table.widefat .delete a:hover,
+table.widefat .trash a:hover,
+table.widefat .spam a:hover,
+#dashboard_recent_comments .delete a:hover,
+#dashboard_recent_comments .trash a:hover
+#dashboard_recent_comments .spam a:hover {
+	color: #f00;
+}
+
+#pass-strength-result {
+	background-color: #eee;
+	border-color: #ddd !important;
+}
+
+#pass-strength-result.bad {
+	background-color: #ffb78c;
+	border-color: #ff853c !important;
+}
+
+#pass-strength-result.good {
+	background-color: #ffec8b;
+	border-color: #fc0 !important;
+}
+
+#pass-strength-result.short {
+	background-color: #ffa0a0;
+	border-color: #f04040 !important;
+}
+
+#pass-strength-result.strong {
+	background-color: #c3ff88;
+	border-color: #8dff1c !important;
+}
+
+#titlediv #title {
+	border-color: #ccc;
+}
+
+#post-status-info {
+	border-color: #dfdfdf #ccc #ccc;
+	background-color: #eaeaea;
+}
+
+.editwidget .widget-inside {
+	border-color: #dfdfdf;
+}
+
+#titlediv #title {
+	background-color: #fff;
+}
+
+#tTips p#tTips_inside {
+	background-color: #ddd;
+	color: #333;
+}
+
+#timestampdiv input,
+#namediv input,
+#poststuff .inside .the-tagcloud {
+	border-color: #ddd;
+}
+
+/* menu */
+#adminmenuback,
+#adminmenuwrap {
+	background-color: #deece1;
+	border-color: #ccc;
+}
+
+#adminmenushadow,
+#adminmenuback {
+	background-position: top right;
+	background-repeat: repeat-y;
+}
+
+#adminmenu li.wp-menu-separator {
+	background: #dfdfdf;
+	border-color: #cfcfcf;
+}
+
+#adminmenu div.separator {
+	border-color: #e1e1e1;
+}
+
+#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -1px 6px;
+}
+
+#adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+#adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -2px 6px;
+}
+
+#adminmenu a.menu-top,
+.folded #adminmenu li.menu-top,
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#adminmenu li.wp-menu-open {
+	border-color: #dfdfdf;
+}
+
+#adminmenu li.menu-top:hover > a,
+#adminmenu li.menu-top.focused > a,
+#adminmenu li.menu-top > a:focus {
+	background-color: #eefcf1;
+	text-shadow: 0 1px 0 rgba( 255, 255, 255, 0.4 );
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top,
+#adminmenu .wp-menu-arrow,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu .wp-menu-arrow div {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(right bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(right bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(right bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, right bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(right bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(right bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+	background: #eefcf1;
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow div {
+	background: #eefcf1;
+	border-color: #ccc;
+}
+
+.folded #adminmenu li.menu-top li:hover a {
+	background-image: none;
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	text-shadow: 0 -1px 0 #333;
+	color: #fff;
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top {
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+#adminmenu .wp-submenu a:hover,
+#adminmenu .wp-submenu a:focus {
+	background-color: #eefcf1;
+	color: #333;
+}
+
+#adminmenu .wp-submenu li.current,
+#adminmenu .wp-submenu li.current a,
+#adminmenu .wp-submenu li.current a:hover {
+	color: #333;
+}
+
+#adminmenu .wp-submenu ul {
+	background-color: #fff;
+}
+
+#adminmenu .wp-submenu-wrap,
+#adminmenu .wp-submenu ul {
+	border-color: #dfdfdf;
+}
+
+#adminmenu .wp-submenu-wrap,
+.folded #adminmenu .wp-has-current-submenu .wp-submenu-wrap {
+	-moz-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+}
+
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: #dfdfdf;
+	background-color: #deece1;
+}
+
+#adminmenu div.wp-submenu {
+	background-color: transparent;
+}
+
+/* collapse menu button */
+#collapse-menu {
+	color: #aaa;
+}
+
+#collapse-menu:hover {
+	color: #999;
+}
+
+#collapse-button {
+	border-color: #ccc;
+	background-color: #f4f4f4; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #fff); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #fff); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #fff); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#fff)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #fff); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #fff); /* proposed W3C Markup */
+}
+#collapse-menu:hover #collapse-button {
+	border-color: #aaa;
+}
+#collapse-button div {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 -72px;
+}
+.folded #collapse-button div {
+	background-position: 0 -108px;
+}
+
+/* menu and screen icons */
+.icon16.icon-dashboard,
+#adminmenu .menu-icon-dashboard div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -33px;
+}
+
+#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -1px;
+}
+
+.icon16.icon-post,
+#adminmenu .menu-icon-post div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+#adminmenu .menu-icon-post:hover div.wp-menu-image,
+#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+.icon16.icon-media,
+#adminmenu .menu-icon-media div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -33px;
+}
+
+#adminmenu .menu-icon-media:hover div.wp-menu-image,
+#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -1px;
+}
+
+.icon16.icon-links,
+#adminmenu .menu-icon-links div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -33px;
+}
+
+#adminmenu .menu-icon-links:hover div.wp-menu-image,
+#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -1px;
+}
+
+.icon16.icon-page,
+#adminmenu .menu-icon-page div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -33px;
+}
+
+#adminmenu .menu-icon-page:hover div.wp-menu-image,
+#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -1px;
+}
+
+.icon16.icon-comments,
+#adminmenu .menu-icon-comments div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -33px;
+}
+
+#adminmenu .menu-icon-comments:hover div.wp-menu-image,
+#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-comments.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -1px;
+}
+
+.icon16.icon-appearance,
+#adminmenu .menu-icon-appearance div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: 0 -33px;
+}
+
+#adminmenu .menu-icon-appearance:hover div.wp-menu-image,
+#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position:  0 -1px;
+}
+
+.icon16.icon-plugins,
+#adminmenu .menu-icon-plugins div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -33px;
+}
+
+#adminmenu .menu-icon-plugins:hover div.wp-menu-image,
+#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -1px;
+}
+
+.icon16.icon-users,
+#adminmenu .menu-icon-users div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -33px;
+}
+
+#adminmenu .menu-icon-users:hover div.wp-menu-image,
+#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-users.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -1px;
+}
+
+.icon16.icon-tools,
+#adminmenu .menu-icon-tools div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -33px;
+}
+
+#adminmenu .menu-icon-tools:hover div.wp-menu-image,
+#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-tools.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -1px;
+}
+
+.icon16.icon-settings,
+#adminmenu .menu-icon-settings div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -33px;
+}
+
+#adminmenu .menu-icon-settings:hover div.wp-menu-image,
+#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -1px;
+}
+
+.icon16.icon-site,
+#adminmenu .menu-icon-site div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -33px;
+}
+
+#adminmenu .menu-icon-site:hover div.wp-menu-image,
+#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -1px;
+}
+/* end menu and screen icons */
+
+/* Screen Icons */
+.icon32.icon-post,
+#icon-edit,
+#icon-post {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -552px -5px;
+}
+
+.icon32.icon-dashboard,
+#icon-index {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -137px -5px;
+}
+
+.icon32.icon-media,
+#icon-upload {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -251px -5px;
+}
+
+.icon32.icon-links,
+#icon-link-manager,
+#icon-link,
+#icon-link-category {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -190px -5px;
+}
+
+.icon32.icon-page,
+#icon-edit-pages,
+#icon-page {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -312px -5px;
+}
+
+.icon32.icon-comments,
+#icon-edit-comments {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -72px -5px;
+}
+
+.icon32.icon-appearance,
+#icon-themes {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -11px -5px;
+}
+
+.icon32.icon-plugins,
+#icon-plugins {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -370px -5px;
+}
+
+.icon32.icon-users,
+#icon-users,
+#icon-profile,
+#icon-user-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -600px -5px;
+}
+
+.icon32.icon-tools,
+#icon-tools,
+#icon-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -432px -5px;
+}
+
+.icon32.icon-settings,
+#icon-options-general {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -492px -5px;
+}
+
+.icon32.icon-site,
+#icon-ms-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -659px -5px;
+}
+/* end screen icons */
+
+
+/* Diff */
+table.diff .diff-deletedline {
+	background-color: #fdd;
+}
+
+table.diff .diff-deletedline del {
+	background-color: #f99;
+}
+
+table.diff .diff-addedline {
+	background-color: #dfd;
+}
+
+table.diff .diff-addedline ins {
+	background-color: #9f9;
+}
+
+#att-info {
+	background-color: #E4F2FD;
+}
+
+/* edit image */
+#sidemenu a {
+	background-color: #eefcf1;
+	border-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#sidemenu a.current {
+	background-color: #fff;
+	border-color: #dfdfdf #dfdfdf #fff;
+	color: #D54E21;
+}
+
+#replyerror {
+	border-color: #ddd;
+	background-color: #eefcf1;
+}
+
+/* table vim shortcuts */
+.vim-current,
+.vim-current th,
+.vim-current td {
+	background-color: #E4F2FD !important;
+}
+
+/* Install Plugins */
+.star-average,
+.star.star-rating {
+	background-color: #fc0;
+}
+
+div.star.select:hover {
+	background-color: #d00;
+}
+
+div.star img {
+	border-left: 1px solid #fff;
+	border-right: 1px solid #fff;
+}
+
+.widefat div.star img {
+	border-left: 1px solid #eefcf1;
+	border-right: 1px solid #eefcf1;
+}
+
+#plugin-information .fyi ul {
+	background-color: #eaf3fa;
+}
+
+#plugin-information .fyi h2.mainheader {
+	background-color: #cee1ef;
+}
+
+#plugin-information pre,
+#plugin-information code {
+	background-color: #ededff;
+}
+
+#plugin-information pre {
+	border: 1px solid #ccc;
+}
+
+/* inline editor */
+.inline-edit-row fieldset input[type="text"],
+.inline-edit-row fieldset textarea,
+#bulk-titles {
+	border-color: #ddd;
+}
+
+.inline-editor div.title {
+	background-color: #EAF3FA;
+}
+
+.inline-editor ul.cat-checklist {
+	background-color: #fff;
+	border-color: #ddd;
+}
+
+.inline-editor .categories .catshow,
+.inline-editor .categories .cathide {
+	color: #007700;
+}
+
+.inline-editor .quick-edit-save {
+	background-color: #f1f1f1;
+}
+
+fieldset.inline-edit-col-right .inline-edit-col {
+	border-color: #dfdfdf;
+}
+
+.attention {
+	color: #D54E21;
+}
+
+.meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.tablenav .tablenav-pages {
+	color: #555;
+}
+
+.tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left -379px;
+}
+
+.tablenav .tablenav-pages a:hover,
+.tablenav .tablenav-pages a:focus {
+	color: #d54e21;
+}
+
+.tablenav .tablenav-pages a.disabled,
+.tablenav .tablenav-pages a.disabled:hover,
+.tablenav .tablenav-pages a.disabled:focus {
+	color: #aaa;
+}
+
+.tablenav .tablenav-pages .current {
+	background: #dfdfdf;
+	border-color: #d3d3d3;
+}
+
+#availablethemes,
+#availablethemes td {
+	border-color: #ddd;
+}
+
+#current-theme img {
+	border-color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link,
+#TB_window #TB_title a.tb-theme-preview-link:visited {
+	color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link:hover,
+#TB_window #TB_title a.tb-theme-preview-link:focus {
+	color: #ccc;
+}
+
+.misc-pub-section {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#minor-publishing {
+	border-bottom-color: #dfdfdf;
+}
+
+#post-body .misc-pub-section {
+	border-right-color: #eee;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+}
+
+.form-table .color-palette td {
+	border-color: #fff;
+}
+
+.sortable-placeholder {
+	border-color: #bbb;
+	background-color: #eefcf1;
+}
+
+#post-body ul.category-tabs li.tabs a,
+#post-body ul.add-menu-item-tabs li.tabs a,
+body.press-this ul.category-tabs li.tabs a {
+	color: #333;
+}
+
+.view-switch #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 0;
+}
+
+.view-switch .current #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -40px 0;
+}
+
+.view-switch #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -20px 0;
+}
+
+.view-switch .current #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -60px 0;
+}
+
+#header-logo {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: center center;
+}
+
+.popular-tags,
+.feature-filter {
+	background-color: #fff;
+	border-color: #DFDFDF;
+}
+
+#theme-information .action-button {
+	border-top-color: #DFDFDF;
+}
+
+.theme-listing br.line {
+	border-bottom-color: #ccc;
+}
+
+div.widgets-sortables,
+#widgets-left .inactive {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-holder {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-description {
+	color: #555;
+}
+
+.sidebar-name {
+	color: #464646;
+	text-shadow: #fff 0 1px 0;
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+.sidebar-name:hover,
+#removing-widget {
+	color: #d54e21;
+}
+
+#removing-widget span {
+	color: black;
+}
+
+.sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.in-widget-title {
+	color: #606060;
+}
+
+.deleting .widget-title * {
+	color: #aaa;
+}
+
+.imgedit-menu div {
+	border-color: #d5d5d5;
+	background-color: #f1f1f1;
+}
+
+.imgedit-menu div:hover {
+	border-color: #c1c1c1;
+	background-color: #eaeaea;
+}
+
+.imgedit-menu div.disabled {
+	border-color: #ccc;
+	background-color: #ddd;
+	filter: alpha(opacity=50);
+	opacity: 0.5;
+}
+
+#dashboard_recent_comments div.undo {
+	border-top-color: #dfdfdf;
+}
+
+.comment-ays,
+.comment-ays th {
+	border-color: #ddd;
+}
+
+.comment-ays th {
+	background-color: #f1f1f1;
+}
+
+/* added from nav-menu.css */
+#menu-management .menu-edit {
+	border-color: #dfdfdf;
+}
+
+#post-body {
+	background: #fff;
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-header {
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-footer {
+	border-top-color: #fff;
+}
+
+#menu-management .nav-tabs-arrow a {
+	color: #C1C1C1;
+}
+
+#menu-management .nav-tabs-arrow a:hover {
+	color: #D54E21;
+}
+
+#menu-management .nav-tabs-arrow a:active {
+	color: #464646;
+}
+
+#menu-management .nav-tab-active {
+	border-color: #dfdfdf;
+}
+
+#menu-management .nav-tab {
+	background: #fbfbfb;
+	border-color: #dfdfdf;
+}
+
+.js .input-with-default-title {
+	color: #aaa;
+}
+
+#cancel-save {
+	color: #ff0000;
+}
+
+#cancel-save:hover {
+	background-color: #FF0000;
+	color: #fff;
+}
+
+.list-container {
+	border-color: #DFDFDF;
+}
+
+.menu-item-handle {
+	border-color: #dfdfdf;
+}
+
+.menu li.deleting .menu-item-handle {
+	background-color: #f66;
+	text-shadow: #ccc;
+}
+
+.item-type { /* Menu item controls */
+	color: #999999;
+}
+
+.item-controls .menu-item-delete:hover {
+	color: #ff0000;
+}
+
+.item-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+	border-bottom-color: #eee;
+}
+
+.item-edit:hover {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+}
+
+.menu-item-settings { /* Menu editing */
+	border-color: #dfdfdf;
+}
+
+.link-to-original {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#cancel-save:hover {
+	color: #fff !important;
+}
+
+#update-menu-item {
+	color: #fff !important;
+}
+
+#update-menu-item:hover,
+#update-menu-item:active,
+#update-menu-item:focus {
+	color: #eaf2fa !important;
+	border-color: #13455b !important;
+}
+
+.submitbox .submitcancel {
+	color: #007700;
+	border-bottom-color: #007700;
+}
+
+.submitbox .submitcancel:hover {
+	background: #007700;
+	color: #fff;
+}
+/* end added from nav-menu.css */
+
+#menu-management .nav-tab-active,
+.menu-item-handle,
+.menu-item-settings {
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+#menu-management .nav-tab-active {
+	background: #eefcf1;
+	border-bottom-color: #eefcf1;
+}
+
+/* custom header & background pages */
+#upload-form label {
+	color: #777;
+}
+/* custom header & background pages */
+
+/* full screen */
+.fullscreen-overlay {
+	background: #fff;
+}
+
+.wp-fullscreen-focus #wp-fullscreen-title,
+.wp-fullscreen-focus #wp-fullscreen-container {
+	border-color: #ccc;
+}
+
+#fullscreen-topbar {
+	border-bottom-color: #DFDFDF;
+}
+
+/* Begin About Pages */
+
+.about-wrap h1 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-text {
+	color: #777;
+}
+
+.wp-badge {
+	color: #fff;
+	text-shadow: 0 -1px 0 #0c3d57;
+	border-color: #2B5173;
+
+	-moz-box-shadow: inset 0 0 0 1px #5F8CA8;
+	-webkit-box-shadow: inset 0 0 0 1px #5F8CA8;
+	box-shadow: inset 0 0 0 1px #5F8CA8;
+
+	background-color: #378aac;
+}
+
+.about-wrap h2 .nav-tab {
+	color: #007700;
+}
+.about-wrap h2 .nav-tab:hover {
+	color: #d54e21;
+}
+.about-wrap h2 .nav-tab-active,
+.about-wrap h2 .nav-tab-active:hover {
+	color: #333;
+}
+.about-wrap h2 .nav-tab-active {
+	text-shadow: 1px 1px 1px white;
+	color: #464646;
+}
+
+.about-wrap h3 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap .feature-section h4 {
+	color: #464646;
+}
+
+.about-wrap .feature-section img {
+	background: #eefcf1;
+	border-color: #dfdfdf;
+
+	-moz-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	-webkit-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+}
+
+.about-wrap h4.wp-people-group {
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap li.wp-person img.gravatar {
+	-moz-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+}
+.about-wrap li.wp-person .title {
+	color: #464646;
+	text-shadow: 1px 1px 1px white;
+}
+
+.freedoms-php .about-wrap ol li {
+	color: #999;
+}
+.freedoms-php .about-wrap ol p {
+	color: #464646;
+}
+
+/* End About Pages */
+
+
+/*------------------------------------------------------------------------------
+  2.0 - Right to Left Styles
+------------------------------------------------------------------------------*/
+
+.rtl .bar {
+	border-right-color: none;
+	border-left-color: #99d;
+}
+
+.rtl #screen-meta-links a.show-settings {
+	background-position: left 3px;
+}
+
+.rtl #screen-meta-links a.show-settings.screen-meta-active {
+	background-position: left -33px;
+}
+
+/* Menu */
+.rtl #adminmenushadow,
+.rtl #adminmenuback {
+	background-position: top left;
+}
+
+.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+.rtl #adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: none;
+	border-left-color: #dfdfdf;
+}
+
+.rtl .folded #adminmenu .wp-submenu-wrap {
+	-moz-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+}
+
+/* Collapse Menu Button */
+.rtl #collapse-button div {
+	background-position: 0 -108px;
+}
+
+.rtl .folded #collapse-button div {
+	background-position: 0 -72px;
+}
+
+/* Edit Image */
+.rtl .meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.rtl .tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: right -379px;
+}
+
+.rtl #post-body .misc-pub-section {
+	border-right-color: none;
+	border-left-color: #eee;
+}
+
+.rtl .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.rtl .sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/green-34.min.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1 @@
+html,.wp-dialog{background-color:#fff}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="url"],select{border-color:#dfdfdf;background-color:#fff}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="file"]:focus,input[type="button"]:focus,input[type="submit"]:focus,input[type="reset"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="url"]:focus,select:focus{border-color:#bbb}kbd,code{background:#eaeaea}input[readonly]{background-color:#eee}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1}.find-box{background-color:#f1f1f1}.find-box-inside{background-color:#fff}a.page-numbers:hover{border-color:#999}body,#wpbody,.form-table .pre{color:#333}body>#upload-menu{border-bottom-color:#fff}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links{border-color:#ccc}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red}#poststuff .inside label.waiting{color:orange}#poststuff .inside label.approved{color:green}#postcustomstuff table{border-color:#dfdfdf;background-color:#f9f9f9}#postcustomstuff thead th{background-color:#f1f1f1}.widefat{border-color:#dfdfdf;background-color:#eefcf1}textarea.widefat{background-color:#fff}div.dashboard-widget-error{background-color:#c43}div.dashboard-widget-notice{background-color:#cfe1ef}div.dashboard-widget-submit{border-top-color:#ccc}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff}input.disabled,textarea.disabled{background-color:#ccc}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#eefcf1,#deece1);background-image:-moz-linear-gradient(top,#eefcf1,#deece1);background-image:-o-linear-gradient(top,#eefcf1,#deece1);background-image:-webkit-gradient(linear,left top,left bottom,from(#eefcf1),to(#deece1));background-image:-webkit-linear-gradient(top,#eefcf1,#deece1);background-image:linear-gradient(top,#eefcf1,#deece1)}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0}.description,.form-wrap p{color:#666}strong .post-com-count span{background-color:#070}.sorthelper{background-color:#ccf3fa}.ac_match,.subsubsub a.current{color:#000}.wrap h2{color:#464646}.wrap .add-new-h2{background:#f1f1f1}.subtitle{color:#777}.ac_over{background-color:#f0f0b8}.ac_results{background-color:#fff;border-color:#6eb469}.ac_results li{color:#101010}.alternate,.alt{background-color:#fefefe}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd}.bar{background-color:#e8e8e8;border-right-color:#99d}#media-upload,#media-upload .media-item .slidetoggle{background:#fff}#media-upload .slidetoggle{border-top-color:#dfdfdf}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00}div.error a{color:#c00}.form-invalid{background-color:#ffebe8!important}.form-invalid input,.form-invalid select{border-color:#c00!important}.submit{border-color:#dfdfdf}.highlight{background-color:#e4f2fd;color:#000}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666}#wpbody-content #media-items .describe{border-top-color:#dfdfdf}.media-upload-form label.form-help,td.help{color:#9a9a9a}.post-com-count{color:#fff}.post-com-count span{background-color:#bbb;color:#fff}.post-com-count:hover span{background-color:#d54e21}.quicktags,.search{background-color:#ccc;color:#000}.side-info h5{border-bottom-color:#dadada}.side-info ul{color:#666}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666}.button,.submit input,.button-secondary{background-color:#f2f2f2;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;text-shadow:rgba(255,255,255,1) 0 1px 0}.button:active,.submit input:active,.button-secondary:active{background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:left top}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background-image:url('../images/button-grad.png');background-color:#070;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0}input.button-primary:active,button.button-primary:active,a.button-primary:active{background-image:url('../images/button-grad-active.png');background-color:#070;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;color:#eaf2fa}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9fd0d5!important;background:#298cba!important}a:hover,a:active,a:focus{color:#d54e21}#adminmenu a:hover,#adminmenu li.menu-top>a:focus,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333}#rightnow .rbutton{background-color:#ebebeb;color:#264761}.submitbox .submit{background-color:#464646;color:#ccc}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00}.tablenav .dots{border-color:transparent}.tablenav .next,.tablenav .prev{border-color:transparent;color:#070}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55}.update-message{color:#000}a.page-numbers{border-bottom-color:#b8d3e2}.commentlist li{border-bottom-color:#ccc}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0}.widefat td{color:#555}.widefat p,.widefat ol,.widefat ul{color:#333}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333}h3.dashboard-widget-title small a{color:#d7d7d7}h3.dashboard-widget-title small a:hover{color:#fff}a,#adminmenu a,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#070}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0}#plugin-information .action-button{background-color:#d54e21;color:#fff}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0}div#media-upload-header,div#plugin-information-header{background-color:#eefcf1;border-bottom-color:#dfdfdf}#currenttheme img{border-color:#666}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#eefcf1}input.readonly,textarea.readonly{background-color:#ddd}#editable-post-name{background-color:#fffbcc}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777}.login #nav a,.login #backtoblog a{color:#070!important}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important}#footer{color:#777;border-color:#dfdfdf}#media-items,.imgedit-group,.media-item{border-color:#dfdfdf}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf}.plugins .active,.plugins .active th,.plugins .active td{color:#000}.plugins .inactive a{color:#579}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4}#the-comment-list .unapproved{background-color:#ffffe0}#the-comment-list .approve a{color:#006505}#the-comment-list .unapprove a{color:#d98500}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b}.welcome-panel{border-color:#dfdfdf}.welcome-panel p{color:#777}.welcome-panel-column p{color:#464646}.welcome-panel .welcome-panel-close{background:#eee;text-shadow:1px 1px 1px #eee}.welcome-panel h3{text-shadow:1px 1px 1px white}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#eefcf1;background-image:-ms-linear-gradient(top,#eefcf1,#deece1);background-image:-moz-linear-gradient(top,#eefcf1,#deece1);background-image:-o-linear-gradient(top,#eefcf1,#deece1);background-image:-webkit-gradient(linear,left top,left bottom,from(#eefcf1),to(#deece1));background-image:-webkit-linear-gradient(top,#eefcf1,#deece1);background-image:linear-gradient(top,#eefcf1,#deece1)}.postbox h3{color:#464646}.widget .widget-top{color:#222}.sidebar-name:hover h3,.postbox h3:hover{color:#000}#quicktags #ed_link{color:#00f}#rightnow .youhave{background-color:#f0f6fb}#rightnow a{color:#448abd}.tagchecklist span a,#bulk-titles div a{background-repeat:no-repeat}.tagchecklist span a:hover,#bulk-titles div a:hover{background-repeat:no-repeat;background-position:-10px 0}#update-nag,.update-nag{background-color:#fffbcc;border-color:#e6db55;color:#555}#screen-meta{background-color:#f1f1f1;border-color:#ccc;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.05);box-shadow:0 1px 3px rgba(0,0,0,0.05)}.contextual-help-tabs a:hover{color:#333}.contextual-help-sidebar,.contextual-help-tabs .active{border-color:#ccc}.contextual-help-tabs .active,.contextual-help-tabs .active a,.contextual-help-tabs .active a:hover{background:#fff;color:#000}.contextual-help-tabs-wrap{border-color:#ccc;background-color:#fff}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1)}#screen-meta-links a.show-settings{color:#777}#screen-meta-links a.show-settings:hover{color:#000}#screen-meta-links a.show-settings{background-color:transparent;background-repeat:no-repeat;background-position:right 3px}#screen-meta-links a.show-settings.screen-meta-active{background-color:transparent;background-repeat:no-repeat;background-position:right -33px}.login #backtoblog a{color:#464646}#wphead{border-bottom:#dfdfdf 1px solid}#wphead h1 a{color:#464646}#footer a:link,#footer a:visited{text-decoration:none}#footer a:hover{color:#000;text-decoration:underline}.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00}#pass-strength-result{background-color:#eee;border-color:#ddd!important}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important}#titlediv #title{border-color:#ccc}#post-status-info{border-color:#dfdfdf #ccc #ccc;background-color:#eaeaea}.editwidget .widget-inside{border-color:#dfdfdf}#titlediv #title{background-color:#fff}#tTips p#tTips_inside{background-color:#ddd;color:#333}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd}#adminmenuback,#adminmenuwrap{background-color:#deece1;border-color:#ccc}#adminmenushadow,#adminmenuback{background-position:top right;background-repeat:repeat-y}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf}#adminmenu div.separator{border-color:#e1e1e1}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:-1px 6px}#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:-2px 6px}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#eefcf1;border-bottom-color:#dfdfdf}#adminmenu li.wp-menu-open{border-color:#dfdfdf}#adminmenu li.menu-top:hover>a,#adminmenu li.menu-top.focused>a,#adminmenu li.menu-top>a:focus{background-color:#eefcf1;text-shadow:0 1px 0 rgba(255,255,255,0.4)}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#060,#6eb469);background-image:-moz-linear-gradient(bottom,#060,#6eb469);background-image:-o-linear-gradient(bottom,#060,#6eb469);background-image:-webkit-gradient(linear,left bottom,left top,from(#060),to(#6eb469));background-image:-webkit-linear-gradient(bottom,#060,#6eb469);background-image:linear-gradient(bottom,#060,#6eb469)}#adminmenu .wp-menu-arrow div{background-color:#777;background-image:-ms-linear-gradient(right bottom,#060,#6eb469);background-image:-moz-linear-gradient(right bottom,#060,#6eb469);background-image:-o-linear-gradient(right bottom,#060,#6eb469);background-image:-webkit-gradient(linear,right bottom,left top,from(#060),to(#6eb469));background-image:-webkit-linear-gradient(right bottom,#060,#6eb469);background-image:linear-gradient(right bottom,#060,#6eb469)}#adminmenu li.wp-not-current-submenu .wp-menu-arrow{border-top-color:#eefcf1;border-bottom-color:#dfdfdf;background:#eefcf1}#adminmenu li.wp-not-current-submenu .wp-menu-arrow div{background:#eefcf1;border-color:#ccc}.folded #adminmenu li.menu-top li:hover a{background-image:none}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#6eb469;border-bottom-color:#060}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#6eb469;border-bottom-color:#060}#adminmenu .wp-submenu a:hover,#adminmenu .wp-submenu a:focus{background-color:#eefcf1;color:#333}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333}#adminmenu .wp-submenu ul{background-color:#fff}#adminmenu .wp-submenu-wrap,#adminmenu .wp-submenu ul{border-color:#dfdfdf}#adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-has-current-submenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4)}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#deece1}#adminmenu div.wp-submenu{background-color:transparent}#collapse-menu{color:#aaa}#collapse-menu:hover{color:#999}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff)}#collapse-menu:hover #collapse-button{border-color:#aaa}#collapse-button div{background-color:transparent;background-repeat:no-repeat;background-position:0 -72px}.folded #collapse-button div{background-position:0 -108px}.icon16.icon-dashboard,#adminmenu .menu-icon-dashboard div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-60px -33px}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-60px -1px}.icon16.icon-post,#adminmenu .menu-icon-post div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-271px -33px}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-271px -33px}.icon16.icon-media,#adminmenu .menu-icon-media div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-120px -33px}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-120px -1px}.icon16.icon-links,#adminmenu .menu-icon-links div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-90px -33px}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-90px -1px}.icon16.icon-page,#adminmenu .menu-icon-page div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-150px -33px}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-150px -1px}.icon16.icon-comments,#adminmenu .menu-icon-comments div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-30px -33px}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-30px -1px}.icon16.icon-appearance,#adminmenu .menu-icon-appearance div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:0 -33px}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:0 -1px}.icon16.icon-plugins,#adminmenu .menu-icon-plugins div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-180px -33px}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-180px -1px}.icon16.icon-users,#adminmenu .menu-icon-users div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-300px -33px}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-300px -1px}.icon16.icon-tools,#adminmenu .menu-icon-tools div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-210px -33px}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-210px -1px}.icon16.icon-settings,#adminmenu .menu-icon-settings div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-240px -33px}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-240px -1px}.icon16.icon-site,#adminmenu .menu-icon-site div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-360px -33px}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-360px -1px}.icon32.icon-post,#icon-edit,#icon-post{background-color:transparent;background-repeat:no-repeat;background-position:-552px -5px}.icon32.icon-dashboard,#icon-index{background-color:transparent;background-repeat:no-repeat;background-position:-137px -5px}.icon32.icon-media,#icon-upload{background-color:transparent;background-repeat:no-repeat;background-position:-251px -5px}.icon32.icon-links,#icon-link-manager,#icon-link,#icon-link-category{background-color:transparent;background-repeat:no-repeat;background-position:-190px -5px}.icon32.icon-page,#icon-edit-pages,#icon-page{background-color:transparent;background-repeat:no-repeat;background-position:-312px -5px}.icon32.icon-comments,#icon-edit-comments{background-color:transparent;background-repeat:no-repeat;background-position:-72px -5px}.icon32.icon-appearance,#icon-themes{background-color:transparent;background-repeat:no-repeat;background-position:-11px -5px}.icon32.icon-plugins,#icon-plugins{background-color:transparent;background-repeat:no-repeat;background-position:-370px -5px}.icon32.icon-users,#icon-users,#icon-profile,#icon-user-edit{background-color:transparent;background-repeat:no-repeat;background-position:-600px -5px}.icon32.icon-tools,#icon-tools,#icon-admin{background-color:transparent;background-repeat:no-repeat;background-position:-432px -5px}.icon32.icon-settings,#icon-options-general{background-color:transparent;background-repeat:no-repeat;background-position:-492px -5px}.icon32.icon-site,#icon-ms-admin{background-color:transparent;background-repeat:no-repeat;background-position:-659px -5px}table.diff .diff-deletedline{background-color:#fdd}table.diff .diff-deletedline del{background-color:#f99}table.diff .diff-addedline{background-color:#dfd}table.diff .diff-addedline ins{background-color:#9f9}#att-info{background-color:#e4f2fd}#sidemenu a{background-color:#eefcf1;border-color:#eefcf1;border-bottom-color:#dfdfdf}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#d54e21}#replyerror{border-color:#ddd;background-color:#eefcf1}.vim-current,.vim-current th,.vim-current td{background-color:#e4f2fd!important}.star-average,.star.star-rating{background-color:#fc0}div.star.select:hover{background-color:#d00}div.star img{border-left:1px solid #fff;border-right:1px solid #fff}.widefat div.star img{border-left:1px solid #eefcf1;border-right:1px solid #eefcf1}#plugin-information .fyi ul{background-color:#eaf3fa}#plugin-information .fyi h2.mainheader{background-color:#cee1ef}#plugin-information pre,#plugin-information code{background-color:#ededff}#plugin-information pre{border:1px solid #ccc}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles{border-color:#ddd}.inline-editor div.title{background-color:#eaf3fa}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#070}.inline-editor .quick-edit-save{background-color:#f1f1f1}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf}.attention{color:#d54e21}.meta-box-sortables .postbox:hover .handlediv{background-color:transparent;background-repeat:no-repeat;background-position:6px 7px}.tablenav .tablenav-pages{color:#555}.tablenav .tablenav-pages a{border-color:#e3e3e3;background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:left -379px}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3}#availablethemes,#availablethemes td{border-color:#ddd}#current-theme img{border-color:#999}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf}#minor-publishing{border-bottom-color:#dfdfdf}#post-body .misc-pub-section{border-right-color:#eee}.post-com-count span{background-color:#bbb}.form-table .color-palette td{border-color:#fff}.sortable-placeholder{border-color:#bbb;background-color:#eefcf1}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333}.view-switch #view-switch-list{background-color:transparent;background-repeat:no-repeat;background-position:0 0}.view-switch .current #view-switch-list{background-color:transparent;background-repeat:no-repeat;background-position:-40px 0}.view-switch #view-switch-excerpt{background-color:transparent;background-repeat:no-repeat;background-position:-20px 0}.view-switch .current #view-switch-excerpt{background-color:transparent;background-repeat:no-repeat;background-position:-60px 0}#header-logo{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:center center}.popular-tags,.feature-filter{background-color:#fff;border-color:#dfdfdf}#theme-information .action-button{border-top-color:#dfdfdf}.theme-listing br.line{border-bottom-color:#ccc}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf}#available-widgets .widget-description{color:#555}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.sidebar-name:hover,#removing-widget{color:#d54e21}#removing-widget span{color:black}.sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.sidebar-name:hover .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.in-widget-title{color:#606060}.deleting .widget-title *{color:#aaa}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf}.comment-ays,.comment-ays th{border-color:#ddd}.comment-ays th{background-color:#f1f1f1}#menu-management .menu-edit{border-color:#dfdfdf}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf}#nav-menu-header{border-bottom-color:#dfdfdf}#nav-menu-footer{border-top-color:#fff}#menu-management .nav-tabs-arrow a{color:#c1c1c1}#menu-management .nav-tabs-arrow a:hover{color:#d54e21}#menu-management .nav-tabs-arrow a:active{color:#464646}#menu-management .nav-tab-active{border-color:#dfdfdf}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf}.js .input-with-default-title{color:#aaa}#cancel-save{color:#f00}#cancel-save:hover{background-color:#f00;color:#fff}.list-container{border-color:#dfdfdf}.menu-item-handle{border-color:#dfdfdf}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc}.item-type{color:#999}.item-controls .menu-item-delete:hover{color:#f00}.item-edit{background-color:transparent;background-repeat:no-repeat;background-position:8px 10px;border-bottom-color:#eee}.item-edit:hover{background-color:transparent;background-repeat:no-repeat;background-position:8px 10px}.menu-item-settings{border-color:#dfdfdf}.link-to-original{color:#777;border-color:#dfdfdf}#cancel-save:hover{color:#fff!important}#update-menu-item{color:#fff!important}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important}.submitbox .submitcancel{color:#070;border-bottom-color:#070}.submitbox .submitcancel:hover{background:#070;color:#fff}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}#menu-management .nav-tab-active{background:#eefcf1;border-bottom-color:#eefcf1}#upload-form label{color:#777}.fullscreen-overlay{background:#fff}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc}#fullscreen-topbar{border-bottom-color:#dfdfdf}.about-wrap h1{color:#333;text-shadow:1px 1px 1px white}.about-text{color:#777}.wp-badge{color:#fff;text-shadow:0 -1px 0 #0c3d57;border-color:#2b5173;-moz-box-shadow:inset 0 0 0 1px #5f8ca8;-webkit-box-shadow:inset 0 0 0 1px #5f8ca8;box-shadow:inset 0 0 0 1px #5f8ca8;background-color:#378aac}.about-wrap h2 .nav-tab{color:#070}.about-wrap h2 .nav-tab:hover{color:#d54e21}.about-wrap h2 .nav-tab-active,.about-wrap h2 .nav-tab-active:hover{color:#333}.about-wrap h2 .nav-tab-active{text-shadow:1px 1px 1px white;color:#464646}.about-wrap h3{color:#333;text-shadow:1px 1px 1px white}.about-wrap .feature-section h4{color:#464646}.about-wrap .feature-section img{background:#eefcf1;border-color:#dfdfdf;-moz-box-shadow:0 0 6px rgba(0,0,0,0.3);-webkit-box-shadow:0 0 6px rgba(0,0,0,0.3);box-shadow:0 0 6px rgba(0,0,0,0.3)}.about-wrap h4.wp-people-group{text-shadow:1px 1px 1px white}.about-wrap li.wp-person img.gravatar{-moz-box-shadow:0 0 4px rgba(0,0,0,0.4);-webkit-box-shadow:0 0 4px rgba(0,0,0,0.4);box-shadow:0 0 4px rgba(0,0,0,0.4)}.about-wrap li.wp-person .title{color:#464646;text-shadow:1px 1px 1px white}.freedoms-php .about-wrap ol li{color:#999}.freedoms-php .about-wrap ol p{color:#464646}.rtl .bar{border-right-color:none;border-left-color:#99d}.rtl #screen-meta-links a.show-settings{background-position:left 3px}.rtl #screen-meta-links a.show-settings.screen-meta-active{background-position:left -33px}.rtl #adminmenushadow,.rtl #adminmenuback{background-position:top left}.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:8px 6px}.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,.rtl #adminmenu .wp-menu-open .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:8px 6px}.rtl #adminmenu .wp-submenu .wp-submenu-head{border-right-color:none;border-left-color:#dfdfdf}.rtl .folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);box-shadow:-2px 2px 5px rgba(0,0,0,0.4)}.rtl #collapse-button div{background-position:0 -108px}.rtl .folded #collapse-button div{background-position:0 -72px}.rtl .meta-box-sortables .postbox:hover .handlediv{background-color:transparent;background-repeat:no-repeat;background-position:6px 7px}.rtl .tablenav .tablenav-pages a{border-color:#e3e3e3;background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:right -379px}.rtl #post-body .misc-pub-section{border-right-color:none;border-left-color:#eee}.rtl .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.rtl .sidebar-name:hover .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/green.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2086 @@
+/*------------------------------------------------------------------------------
+
+
+Howdy! This is the CSS file that controls the
+Green (minty) color style on the WordPress Dashboard.
+
+This file contains both LTR and RTL styles.
+
+
+TABLE OF CONTENTS:
+------------------
+ 1.0 - Left to Right Styles
+ 2.0 - Right to Left Styles
+
+
+------------------------------------------------------------------------------*/
+
+
+/*------------------------------------------------------------------------------
+  1.0 - Left to Right Styles
+------------------------------------------------------------------------------*/
+
+html,
+.wp-dialog {
+	background-color: #fff;
+}
+
+textarea,
+input[type="text"],
+input[type="password"],
+input[type="file"],
+input[type="button"],
+input[type="submit"],
+input[type="reset"],
+input[type="email"],
+input[type="number"],
+input[type="search"],
+input[type="tel"],
+input[type="url"],
+select {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+textarea:focus,
+input[type="text"]:focus,
+input[type="password"]:focus,
+input[type="file"]:focus,
+input[type="button"]:focus,
+input[type="submit"]:focus,
+input[type="reset"]:focus,
+input[type="email"]:focus,
+input[type="number"]:focus,
+input[type="search"]:focus,
+input[type="tel"]:focus,
+input[type="url"]:focus,
+select:focus {
+	border-color: #bbb;
+}
+
+kbd,
+code {
+	background: #eaeaea;
+}
+
+input[readonly] {
+	background-color: #eee;
+}
+
+.find-box-search {
+	border-color: #dfdfdf;
+	background-color: #f1f1f1;
+}
+
+.find-box {
+	background-color: #f1f1f1;
+}
+
+.find-box-inside {
+	background-color: #fff;
+}
+
+a.page-numbers:hover {
+	border-color: #999;
+}
+
+body,
+#wpbody,
+.form-table .pre {
+	color: #555;
+}
+
+body > #upload-menu {
+	border-bottom-color: #fff;
+}
+
+#postcustomstuff table,
+#your-profile fieldset,
+#rightnow,
+div.dashboard-widget,
+#dashboard-widgets p.dashboard-widget-links {
+	border-color: #ccc;
+}
+
+#poststuff .inside label.spam,
+#poststuff .inside label.deleted {
+	color: red;
+}
+
+#poststuff .inside label.waiting {
+	color: orange;
+}
+
+#poststuff .inside label.approved {
+	color: green;
+}
+
+#postcustomstuff table {
+	border-color: #dfdfdf;
+	background-color: #F9F9F9;
+}
+
+#postcustomstuff thead th {
+	background-color: #F1F1F1;
+}
+
+.widefat {
+	border-color: #dfdfdf;
+	background-color: #eefcf1;
+}
+textarea.widefat {
+	background-color: #fff;
+}
+
+div.dashboard-widget-error {
+	background-color: #c43;
+}
+
+div.dashboard-widget-notice {
+	background-color: #cfe1ef;
+}
+
+div.dashboard-widget-submit {
+	border-top-color: #ccc;
+}
+
+div.tabs-panel,
+.wp-tab-panel,
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	border-color: #dfdfdf;
+	background-color: #fff;
+}
+
+ul.category-tabs li.tabs,
+ul.add-menu-item-tabs li.tabs,
+.wp-tab-active {
+	background-color: #fff;
+}
+
+input.disabled,
+textarea.disabled {
+	background-color: #ccc;
+}
+/* #upload-menu li a.upload-tab-link, */
+#plugin-information .action-button a,
+#plugin-information .action-button a:hover,
+#plugin-information .action-button a:visited {
+	color: #fff;
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3,
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head,
+.sidebar-name,
+#nav-menu-header,
+#nav-menu-footer,
+.menu-item-handle,
+#fullscreen-topbar {
+	background-color: #f1f1f1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.widget .widget-top,
+.postbox h3,
+.stuffbox h3 {
+	border-bottom-color: #dfdfdf;
+	text-shadow: #fff 0 1px 0;
+	-moz-box-shadow: 0 1px 0 #fff;
+	-webkit-box-shadow: 0 1px 0 #fff;
+	box-shadow: 0 1px 0 #fff;
+}
+
+.form-table th,
+.form-wrap label {
+	color: #222;
+	text-shadow: #fff 0 1px 0;
+}
+
+.description,
+.form-wrap p {
+	color: #666;
+}
+
+strong .post-com-count span {
+	background-color: #007700;
+}
+
+.sorthelper {
+	background-color: #ccf3fa;
+}
+
+.ac_match,
+.subsubsub a.current {
+	color: #000;
+}
+
+.wrap h2 {
+	color: #464646;
+}
+
+.wrap .add-new-h2 {
+	background: #f1f1f1;
+}
+
+.subtitle {
+	color: #777;
+}
+
+.ac_over {
+	background-color: #f0f0b8;
+}
+
+.ac_results {
+	background-color: #fff;
+	border-color: #6EB469;
+}
+
+.ac_results li {
+	color: #101010;
+}
+
+.alternate,
+.alt {
+	background-color: #fefefe;
+}
+
+.available-theme a.screenshot {
+	background-color: #f1f1f1;
+	border-color: #ddd;
+}
+
+.bar {
+	background-color: #e8e8e8;
+	border-right-color: #99d;
+}
+
+#media-upload,
+#media-upload .media-item .slidetoggle {
+	background: #fff;
+}
+
+#media-upload .slidetoggle {
+	border-top-color: #dfdfdf;
+}
+
+div.error,
+.login #login_error {
+	background-color: #ffebe8;
+	border-color: #c00;
+}
+
+div.error a {
+	color: #c00;
+}
+
+.form-invalid {
+	background-color: #ffebe8 !important;
+}
+
+.form-invalid input,
+.form-invalid select {
+	border-color: #c00 !important;
+}
+
+.submit {
+	border-color: #DFDFDF;
+}
+
+.highlight {
+	background-color: #e4f2fd;
+	color: #000;
+}
+
+.howto,
+.nonessential,
+#edit-slug-box,
+.form-input-tip,
+.subsubsub {
+	color: #666;
+}
+
+#wpbody-content #media-items .describe {
+	border-top-color: #dfdfdf;
+}
+
+.media-upload-form label.form-help,
+td.help {
+	color: #9a9a9a;
+}
+
+.post-com-count {
+	color: #fff;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+	color: #fff;
+}
+
+.post-com-count:hover span {
+	background-color: #d54e21;
+}
+
+.quicktags, .search {
+	background-color: #ccc;
+	color: #000;
+}
+
+.side-info h5 {
+	border-bottom-color: #dadada;
+}
+
+.side-info ul {
+	color: #666;
+}
+
+.button,
+.button-secondary,
+.submit input,
+input[type=button],
+input[type=submit] {
+	border-color: #bbb;
+	color: #464646;
+}
+
+.button:hover,
+.button-secondary:hover,
+.submit input:hover,
+input[type=button]:hover,
+input[type=submit]:hover {
+	color: #000;
+	border-color: #666;
+}
+
+.button,
+.submit input,
+.button-secondary {
+	background-color: #f2f2f2;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(255,255,255,1) 0 1px 0;
+}
+
+.button:active,
+.submit input:active,
+.button-secondary:active {
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+}
+
+input.button-primary,
+button.button-primary,
+a.button-primary {
+	border-color: #298cba;
+	font-weight: bold;
+	color: #fff;
+	background-image: url('../images/button-grad.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	text-shadow: rgba(0,0,0,0.3) 0 -1px 0;
+}
+
+input.button-primary:active,
+button.button-primary:active,
+a.button-primary:active {
+	background-image: url('../images/button-grad-active.png');
+	background-color: #007700;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left top;
+	color: #eaf2fa;
+}
+
+input.button-primary:hover,
+button.button-primary:hover,
+a.button-primary:hover,
+a.button-primary:focus,
+a.button-primary:active {
+	border-color: #13455b;
+	color: #eaf2fa;
+}
+
+.button-disabled,
+.button[disabled],
+.button:disabled,
+.button-secondary[disabled],
+.button-secondary:disabled,
+a.button.disabled {
+	color: #aaa !important;
+	border-color: #ddd !important;
+}
+
+.button-primary-disabled,
+.button-primary[disabled],
+.button-primary:disabled {
+	color: #9FD0D5 !important;
+	background: #298CBA !important;
+}
+
+a:hover,
+a:active,
+a:focus {
+	color: #d54e21;
+}
+
+#adminmenu a:hover,
+#adminmenu li.menu-top > a:focus,
+#adminmenu ul.wp-submenu a:hover,
+#the-comment-list .comment a:hover,
+#rightnow a:hover,
+#media-upload a.del-link:hover,
+div.dashboard-widget-submit input:hover,
+.subsubsub a:hover,
+.subsubsub a.current:hover,
+.ui-tabs-nav a:hover,
+.plugins .inactive a:hover,
+#all-plugins-table .plugins .inactive a:hover,
+#search-plugins-table .plugins .inactive a:hover {
+	color: #d54e21;
+}
+
+#the-comment-list .comment-item,
+#dashboard-widgets #dashboard_quick_press form p.submit {
+	border-color: #dfdfdf;
+}
+
+#side-sortables .category-tabs .tabs a,
+#side-sortables .add-menu-item-tabs .tabs a,
+.wp-tab-bar .wp-tab-active a {
+	color: #333;
+}
+
+#rightnow .rbutton {
+	background-color: #ebebeb;
+	color: #264761;
+}
+
+.submitbox .submit {
+	background-color: #464646;
+	color: #ccc;
+}
+
+.plugins a.delete:hover,
+#all-plugins-table .plugins a.delete:hover,
+#search-plugins-table .plugins a.delete:hover,
+.submitbox .submitdelete {
+	color: #f00;
+	border-bottom-color: #f00;
+}
+
+.submitbox .submitdelete:hover,
+#media-items a.delete:hover {
+	color: #fff;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+#normal-sortables .submitbox .submitdelete:hover {
+	color: #000;
+	background-color: #f00;
+	border-bottom-color: #f00;
+}
+
+.tablenav .dots {
+	border-color: transparent;
+}
+
+.tablenav .next,
+.tablenav .prev {
+	border-color: transparent;
+	color: #007700;
+}
+
+.tablenav .next:hover,
+.tablenav .prev:hover {
+	border-color: transparent;
+	color: #d54e21;
+}
+
+div.updated,
+.login .message {
+	background-color: #ffffe0;
+	border-color: #e6db55;
+}
+
+.update-message {
+	color: #000;
+}
+
+a.page-numbers {
+	border-bottom-color: #B8D3E2;
+}
+
+.commentlist li {
+	border-bottom-color: #ccc;
+}
+
+.widefat td,
+.widefat th {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+.widefat th {
+	text-shadow: rgba(255,255,255,0.8) 0 1px 0;
+}
+
+.widefat td {
+	color: #555;
+}
+.widefat p,
+.widefat ol,
+.widefat ul {
+	color: #333;
+}
+
+.widefat thead tr th,
+.widefat tfoot tr th,
+h3.dashboard-widget-title,
+h3.dashboard-widget-title span,
+h3.dashboard-widget-title small,
+.find-box-head {
+	color: #333;
+}
+
+th.sortable a:hover, th.sortable a:active, th.sortable a:focus {
+	color: #333;
+}
+
+h3.dashboard-widget-title small a {
+	color: #d7d7d7;
+}
+
+h3.dashboard-widget-title small a:hover {
+	color: #fff;
+}
+
+a,
+#adminmenu a,
+#the-comment-list p.comment-author strong a,
+#media-upload a.del-link,
+#media-items a.delete,
+.plugins a.delete,
+.ui-tabs-nav a {
+	color: #007700;
+}
+
+#adminmenu .awaiting-mod,
+#adminmenu .update-plugins,
+#sidemenu a .update-plugins,
+#rightnow .reallynow {
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+#plugin-information .action-button {
+	background-color: #d54e21;
+	color: #fff;
+}
+
+#adminmenu li.current a .awaiting-mod,
+#adminmenu	li a.wp-has-current-submenu .update-plugins{
+	background-color: #464646;
+	color: #fff;
+	-moz-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-khtml-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	-webkit-box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+	box-shadow: rgba(255,255,255,0.5) 0 1px 0;
+}
+
+div#media-upload-header,
+div#plugin-information-header {
+	background-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#currenttheme img {
+	border-color: #666;
+}
+
+#dashboard_secondary div.dashboard-widget-content ul li a {
+	background-color: #eefcf1;
+}
+
+input.readonly, textarea.readonly {
+	background-color: #ddd;
+}
+
+#editable-post-name {
+	background-color: #fffbcc;
+}
+
+#edit-slug-box strong,
+.tablenav .displaying-num,
+#submitted-on,
+.submitted-on {
+	color: #777;
+}
+
+.login #nav a,
+.login #backtoblog a {
+	color: #007700 !important;
+}
+
+.login #nav a:hover,
+.login #backtoblog a:hover {
+	color: #d54e21 !important;
+}
+
+#footer {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#media-items,
+.imgedit-group,
+.media-item {
+	border-color: #dfdfdf;
+}
+
+.checkbox,
+.side-info,
+.plugins tr,
+#your-profile #rich_editing {
+	background-color: #fcfcfc;
+}
+
+.plugins .inactive,
+.plugins .inactive th,
+.plugins .inactive td,
+tr.inactive + tr.plugin-update-tr .plugin-update {
+	background-color: #f4f4f4;
+}
+
+.plugin-update-tr .update-message {
+	background-color: #fffbe4;
+	border-color: #dfdfdf;
+}
+
+.plugins .active,
+.plugins .active th,
+.plugins .active td {
+	color: #000;
+}
+
+.plugins .inactive a {
+	color: #557799;
+}
+
+#the-comment-list tr.undo,
+#the-comment-list div.undo {
+	background-color: #f4f4f4;
+}
+
+#the-comment-list .unapproved {
+	background-color: #ffffe0;
+}
+
+#the-comment-list .approve a {
+	color: #006505;
+}
+
+#the-comment-list .unapprove a {
+	color: #d98500;
+}
+
+table.widefat span.delete a,
+table.widefat span.trash a,
+table.widefat span.spam a,
+#dashboard_recent_comments .delete a,
+#dashboard_recent_comments .trash a,
+#dashboard_recent_comments .spam a {
+	color: #bc0b0b;
+}
+
+.welcome-panel {
+	border-color: #dfdfdf;
+}
+.welcome-panel p {
+	color: #777;
+}
+.welcome-panel-column p {
+	color: #464646;
+}
+.welcome-panel .welcome-panel-close {
+	background: #eee;
+	text-shadow: 1px 1px 1px #eee;
+}
+.welcome-panel h3 {
+	text-shadow: 1px 1px 1px white;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+#titlediv,
+#poststuff .postarea,
+.stuffbox {
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;
+	-webkit-border-radius: 3px;
+	border-radius: 3px;
+}
+
+.widget,
+#widget-list .widget-top,
+.postbox,
+.menu-item-settings {
+	background-color: #eefcf1; /* Fallback */
+	background-image: -ms-linear-gradient(top, #eefcf1, #deece1); /* IE10 */
+	background-image: -moz-linear-gradient(top, #eefcf1, #deece1); /* Firefox */
+	background-image: -o-linear-gradient(top, #eefcf1, #deece1); /* Opera */
+	background-image: -webkit-gradient(linear, left top, left bottom, from(#eefcf1), to(#deece1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(top, #eefcf1, #deece1); /* new Webkit */
+	background-image: linear-gradient(top, #eefcf1, #deece1); /* proposed W3C Markup */
+}
+
+.postbox h3 {
+	color: #464646;
+}
+
+.widget .widget-top {
+	color: #222;
+}
+
+.sidebar-name:hover h3,
+.postbox h3:hover {
+	color: #000;
+}
+
+#quicktags #ed_link {
+	color: #00f;
+}
+
+#rightnow .youhave {
+	background-color: #f0f6fb;
+}
+
+#rightnow a {
+	color: #448abd;
+}
+
+.tagchecklist span a,
+#bulk-titles div a {
+
+	background-repeat: no-repeat;
+}
+
+.tagchecklist span a:hover,
+#bulk-titles div a:hover {
+	background-repeat: no-repeat;
+	background-position: -10px 0;
+}
+
+#update-nag, .update-nag {
+	background-color: #FFFBCC;
+	border-color: #E6DB55;
+	color: #555;
+}
+
+#screen-meta {
+	background-color: #f1f1f1;
+	border-color: #ccc;
+	-webkit-box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+	box-shadow: 0 1px 3px rgba( 0, 0, 0, 0.05 );
+}
+
+.contextual-help-tabs a:hover {
+	color: #333;
+}
+
+.contextual-help-sidebar,
+.contextual-help-tabs .active {
+	border-color: #ccc;
+}
+
+.contextual-help-tabs .active,
+.contextual-help-tabs .active a,
+.contextual-help-tabs .active a:hover {
+	background: #fff;
+	color: #000;
+}
+
+.contextual-help-tabs-wrap {
+	border-color: #ccc;
+	background-color: #fff;
+}
+
+/* screen options and help tabs */
+#screen-options-link-wrap,
+#contextual-help-link-wrap {
+	background-color: #e3e3e3; /* Fallback */
+	border-right: 1px solid transparent;
+	border-left: 1px solid transparent;
+	border-bottom: 1px solid transparent;
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#f1f1f1)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #f1f1f1); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #f1f1f1); /* proposed W3C Markup */
+}
+
+#screen-meta-links a.show-settings {
+	color: #777;
+}
+
+#screen-meta-links a.show-settings:hover {
+	color: #000;
+}
+
+#screen-meta-links a.show-settings {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right 3px;
+}
+
+#screen-meta-links a.show-settings.screen-meta-active {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: right -33px;
+}
+
+/* end screen options and help tabs */
+
+.login #backtoblog a {
+	color: #464646;
+}
+
+#wphead {
+	border-bottom:#dfdfdf 1px solid;
+}
+
+#wphead h1 a {
+	color: #464646;
+}
+
+#footer a:link,
+#footer a:visited {
+	text-decoration: none;
+}
+
+#footer a:hover {
+	color: #000;
+	text-decoration: underline;
+}
+
+.file-error,
+abbr.required,
+.widget-control-remove:hover,
+table.widefat .delete a:hover,
+table.widefat .trash a:hover,
+table.widefat .spam a:hover,
+#dashboard_recent_comments .delete a:hover,
+#dashboard_recent_comments .trash a:hover
+#dashboard_recent_comments .spam a:hover {
+	color: #f00;
+}
+
+#pass-strength-result {
+	background-color: #eee;
+	border-color: #ddd !important;
+}
+
+#pass-strength-result.bad {
+	background-color: #ffb78c;
+	border-color: #ff853c !important;
+}
+
+#pass-strength-result.good {
+	background-color: #ffec8b;
+	border-color: #fc0 !important;
+}
+
+#pass-strength-result.short {
+	background-color: #ffa0a0;
+	border-color: #f04040 !important;
+}
+
+#pass-strength-result.strong {
+	background-color: #c3ff88;
+	border-color: #8dff1c !important;
+}
+
+#titlediv #title {
+	border-color: #ccc;
+}
+
+#post-status-info {
+	border-color: #dfdfdf #ccc #ccc;
+	background-color: #eaeaea;
+}
+
+.editwidget .widget-inside {
+	border-color: #dfdfdf;
+}
+
+#titlediv #title {
+	background-color: #fff;
+}
+
+#tTips p#tTips_inside {
+	background-color: #ddd;
+	color: #333;
+}
+
+#timestampdiv input,
+#namediv input,
+#poststuff .inside .the-tagcloud {
+	border-color: #ddd;
+}
+
+/* menu */
+#adminmenuback,
+#adminmenuwrap {
+	background-color: #deece1;
+	border-color: #ccc;
+}
+
+#adminmenushadow,
+#adminmenuback {
+	background-position: top right;
+	background-repeat: repeat-y;
+}
+
+#adminmenu li.wp-menu-separator {
+	background: #dfdfdf;
+	border-color: #cfcfcf;
+}
+
+#adminmenu div.separator {
+	border-color: #e1e1e1;
+}
+
+#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+#adminmenu li.wp-has-current-submenu.opensub .wp-menu-toggle,
+#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -1px 6px;
+}
+
+#adminmenu .wp-has-submenu.opensub .wp-menu-toggle,
+#adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+#adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -2px 6px;
+}
+
+#adminmenu a.menu-top,
+.folded #adminmenu li.menu-top,
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#adminmenu li.wp-menu-open {
+	border-color: #dfdfdf;
+}
+
+#adminmenu li.menu-top.opensub > a,
+#adminmenu li.menu-top:hover > a,
+#adminmenu li.menu-top.focused > a,
+#adminmenu li.menu-top > a:focus {
+	background-color: #eefcf1;
+	text-shadow: 0 1px 0 rgba( 255, 255, 255, 0.4 );
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top,
+#adminmenu .wp-menu-arrow,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu .wp-menu-arrow div {
+	background-color: #777; /* Fallback */
+	background-image: -ms-linear-gradient(right bottom, #060, #6EB469); /* IE10 */
+	background-image: -moz-linear-gradient(right bottom, #060, #6EB469); /* Firefox */
+	background-image: -o-linear-gradient(right bottom, #060, #6EB469); /* Opera */
+	background-image: -webkit-gradient(linear, right bottom, left top, from(#060), to(#6EB469)); /* old Webkit */
+	background-image: -webkit-linear-gradient(right bottom, #060, #6EB469); /* new Webkit */
+	background-image: linear-gradient(right bottom, #060, #6EB469); /* proposed W3C Markup */
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow {
+	border-top-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+	background: #eefcf1;
+}
+
+#adminmenu li.wp-not-current-submenu .wp-menu-arrow div {
+	background: #eefcf1;
+	border-color: #ccc;
+}
+
+.folded #adminmenu li.menu-top li.opensub a,
+.folded #adminmenu li.menu-top li:hover a {
+	background-image: none;
+}
+
+#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,
+#adminmenu li.current a.menu-top,
+#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head {
+	text-shadow: 0 -1px 0 #333;
+	color: #fff;
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+.folded #adminmenu li.wp-has-current-submenu,
+.folded #adminmenu li.current.menu-top {
+	border-top-color: #6EB469;
+	border-bottom-color: #060;
+}
+
+#adminmenu .wp-submenu a:hover,
+#adminmenu .wp-submenu a:focus {
+	background-color: #eefcf1;
+	color: #333;
+}
+
+#adminmenu .wp-submenu li.current,
+#adminmenu .wp-submenu li.current a,
+#adminmenu .wp-submenu li.current a:hover {
+	color: #333;
+}
+
+#adminmenu .wp-submenu ul {
+	background-color: #fff;
+}
+
+#adminmenu .wp-submenu-wrap,
+#adminmenu .wp-submenu ul {
+	border-color: #dfdfdf;
+}
+
+#adminmenu .wp-submenu-wrap,
+.folded #adminmenu .wp-has-current-submenu .wp-submenu-wrap {
+	-moz-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	background: #f9f9f9;
+}
+
+#adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: #dfdfdf;
+	background-color: #deece1;
+}
+
+#adminmenu div.wp-submenu {
+	background-color: transparent;
+}
+
+/* collapse menu button */
+#collapse-menu {
+	color: #aaa;
+	border-color: transparent;
+}
+
+#collapse-menu:hover {
+	color: #999;
+}
+
+#collapse-button {
+	border-color: #ccc;
+	background-color: #f4f4f4; /* Fallback */
+	background-image: -ms-linear-gradient(bottom, #dfdfdf, #fff); /* IE10 */
+	background-image: -moz-linear-gradient(bottom, #dfdfdf, #fff); /* Firefox */
+	background-image: -o-linear-gradient(bottom, #dfdfdf, #fff); /* Opera */
+	background-image: -webkit-gradient(linear, left bottom, left top, from(#dfdfdf), to(#fff)); /* old Webkit */
+	background-image: -webkit-linear-gradient(bottom, #dfdfdf, #fff); /* new Webkit */
+	background-image: linear-gradient(bottom, #dfdfdf, #fff); /* proposed W3C Markup */
+}
+#collapse-menu:hover #collapse-button {
+	border-color: #aaa;
+}
+#collapse-button div {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 -72px;
+}
+.folded #collapse-button div {
+	background-position: 0 -108px;
+}
+
+/* menu and screen icons */
+.icon16.icon-dashboard,
+#adminmenu .menu-icon-dashboard div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -33px;
+}
+
+#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-dashboard.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -60px -1px;
+}
+
+.icon16.icon-post,
+#adminmenu .menu-icon-post div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+#adminmenu .menu-icon-post:hover div.wp-menu-image,
+#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -271px -33px;
+}
+
+.icon16.icon-media,
+#adminmenu .menu-icon-media div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -33px;
+}
+
+#adminmenu .menu-icon-media:hover div.wp-menu-image,
+#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -120px -1px;
+}
+
+.icon16.icon-links,
+#adminmenu .menu-icon-links div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -33px;
+}
+
+#adminmenu .menu-icon-links:hover div.wp-menu-image,
+#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -90px -1px;
+}
+
+.icon16.icon-page,
+#adminmenu .menu-icon-page div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -33px;
+}
+
+#adminmenu .menu-icon-page:hover div.wp-menu-image,
+#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -150px -1px;
+}
+
+.icon16.icon-comments,
+#adminmenu .menu-icon-comments div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -33px;
+}
+
+#adminmenu .menu-icon-comments:hover div.wp-menu-image,
+#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-comments.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -30px -1px;
+}
+
+.icon16.icon-appearance,
+#adminmenu .menu-icon-appearance div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: 0 -33px;
+}
+
+#adminmenu .menu-icon-appearance:hover div.wp-menu-image,
+#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position:  0 -1px;
+}
+
+.icon16.icon-plugins,
+#adminmenu .menu-icon-plugins div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -33px;
+}
+
+#adminmenu .menu-icon-plugins:hover div.wp-menu-image,
+#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -180px -1px;
+}
+
+.icon16.icon-users,
+#adminmenu .menu-icon-users div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -33px;
+}
+
+#adminmenu .menu-icon-users:hover div.wp-menu-image,
+#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-users.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -300px -1px;
+}
+
+.icon16.icon-tools,
+#adminmenu .menu-icon-tools div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -33px;
+}
+
+#adminmenu .menu-icon-tools:hover div.wp-menu-image,
+#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,
+#adminmenu .menu-icon-tools.current div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -210px -1px;
+}
+
+.icon16.icon-settings,
+#adminmenu .menu-icon-settings div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -33px;
+}
+
+#adminmenu .menu-icon-settings:hover div.wp-menu-image,
+#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -240px -1px;
+}
+
+.icon16.icon-site,
+#adminmenu .menu-icon-site div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -33px;
+}
+
+#adminmenu .menu-icon-site:hover div.wp-menu-image,
+#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: -360px -1px;
+}
+/* end menu and screen icons */
+
+/* Screen Icons */
+.icon32.icon-post,
+#icon-edit,
+#icon-post {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -552px -5px;
+}
+
+.icon32.icon-dashboard,
+#icon-index {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -137px -5px;
+}
+
+.icon32.icon-media,
+#icon-upload {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -251px -5px;
+}
+
+.icon32.icon-links,
+#icon-link-manager,
+#icon-link,
+#icon-link-category {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -190px -5px;
+}
+
+.icon32.icon-page,
+#icon-edit-pages,
+#icon-page {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -312px -5px;
+}
+
+.icon32.icon-comments,
+#icon-edit-comments {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -72px -5px;
+}
+
+.icon32.icon-appearance,
+#icon-themes {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -11px -5px;
+}
+
+.icon32.icon-plugins,
+#icon-plugins {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -370px -5px;
+}
+
+.icon32.icon-users,
+#icon-users,
+#icon-profile,
+#icon-user-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -600px -5px;
+}
+
+.icon32.icon-tools,
+#icon-tools,
+#icon-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -432px -5px;
+}
+
+.icon32.icon-settings,
+#icon-options-general {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -492px -5px;
+}
+
+.icon32.icon-site,
+#icon-ms-admin {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -659px -5px;
+}
+/* end screen icons */
+
+
+/* Diff */
+table.diff .diff-deletedline {
+	background-color: #fdd;
+}
+
+table.diff .diff-deletedline del {
+	background-color: #f99;
+}
+
+table.diff .diff-addedline {
+	background-color: #dfd;
+}
+
+table.diff .diff-addedline ins {
+	background-color: #9f9;
+}
+
+#att-info {
+	background-color: #E4F2FD;
+}
+
+/* edit image */
+#sidemenu a {
+	background-color: #eefcf1;
+	border-color: #eefcf1;
+	border-bottom-color: #dfdfdf;
+}
+
+#sidemenu a.current {
+	background-color: #fff;
+	border-color: #dfdfdf #dfdfdf #fff;
+	color: #D54E21;
+}
+
+#replyerror {
+	border-color: #ddd;
+	background-color: #eefcf1;
+}
+
+/* table vim shortcuts */
+.vim-current,
+.vim-current th,
+.vim-current td {
+	background-color: #E4F2FD !important;
+}
+
+/* Install Plugins */
+.star-average,
+.star.star-rating {
+	background-color: #fc0;
+}
+
+div.star.select:hover {
+	background-color: #d00;
+}
+
+div.star img {
+	border-left: 1px solid #fff;
+	border-right: 1px solid #fff;
+}
+
+.widefat div.star img {
+	border-left: 1px solid #eefcf1;
+	border-right: 1px solid #eefcf1;
+}
+
+#plugin-information .fyi ul {
+	background-color: #eaf3fa;
+}
+
+#plugin-information .fyi h2.mainheader {
+	background-color: #cee1ef;
+}
+
+#plugin-information pre,
+#plugin-information code {
+	background-color: #ededff;
+}
+
+#plugin-information pre {
+	border: 1px solid #ccc;
+}
+
+/* inline editor */
+.inline-edit-row fieldset input[type="text"],
+.inline-edit-row fieldset textarea,
+#bulk-titles {
+	border-color: #ddd;
+}
+
+.inline-editor div.title {
+	background-color: #EAF3FA;
+}
+
+.inline-editor ul.cat-checklist {
+	background-color: #fff;
+	border-color: #ddd;
+}
+
+.inline-editor .categories .catshow,
+.inline-editor .categories .cathide {
+	color: #007700;
+}
+
+.inline-editor .quick-edit-save {
+	background-color: #f1f1f1;
+}
+
+fieldset.inline-edit-col-right .inline-edit-col {
+	border-color: #dfdfdf;
+}
+
+.attention {
+	color: #D54E21;
+}
+
+.meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.tablenav .tablenav-pages {
+	color: #555;
+}
+
+.tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: left -379px;
+}
+
+.tablenav .tablenav-pages a:hover,
+.tablenav .tablenav-pages a:focus {
+	color: #d54e21;
+}
+
+.tablenav .tablenav-pages a.disabled,
+.tablenav .tablenav-pages a.disabled:hover,
+.tablenav .tablenav-pages a.disabled:focus {
+	color: #aaa;
+}
+
+.tablenav .tablenav-pages .current {
+	background: #dfdfdf;
+	border-color: #d3d3d3;
+}
+
+#availablethemes,
+#availablethemes td {
+	border-color: #ddd;
+}
+
+#current-theme img {
+	border-color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link,
+#TB_window #TB_title a.tb-theme-preview-link:visited {
+	color: #999;
+}
+
+#TB_window #TB_title a.tb-theme-preview-link:hover,
+#TB_window #TB_title a.tb-theme-preview-link:focus {
+	color: #ccc;
+}
+
+.misc-pub-section {
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#minor-publishing {
+	border-bottom-color: #dfdfdf;
+}
+
+#post-body .misc-pub-section {
+	border-right-color: #eee;
+}
+
+.post-com-count span {
+	background-color: #bbb;
+}
+
+.form-table .color-palette td {
+	border-color: #fff;
+}
+
+.sortable-placeholder {
+	border-color: #bbb;
+	background-color: #eefcf1;
+}
+
+#post-body ul.category-tabs li.tabs a,
+#post-body ul.add-menu-item-tabs li.tabs a,
+body.press-this ul.category-tabs li.tabs a {
+	color: #333;
+}
+
+.view-switch #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 0 0;
+}
+
+.view-switch .current #view-switch-list {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -40px 0;
+}
+
+.view-switch #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -20px 0;
+}
+
+.view-switch .current #view-switch-excerpt {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: -60px 0;
+}
+
+#header-logo {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-attachment: scroll;
+	background-position: center center;
+}
+
+.popular-tags,
+.feature-filter {
+	background-color: #fff;
+	border-color: #DFDFDF;
+}
+
+#theme-information .action-button {
+	border-top-color: #DFDFDF;
+}
+
+.theme-listing br.line {
+	border-bottom-color: #ccc;
+}
+
+div.widgets-sortables,
+#widgets-left .inactive {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-holder {
+	background-color: #fcfcfc;
+	border-color: #dfdfdf;
+}
+
+#available-widgets .widget-description {
+	color: #555;
+}
+
+.sidebar-name {
+	color: #464646;
+	text-shadow: #fff 0 1px 0;
+	border-color: #dfdfdf;
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+.sidebar-name:hover,
+#removing-widget {
+	color: #d54e21;
+}
+
+#removing-widget span {
+	color: black;
+}
+
+.sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.in-widget-title {
+	color: #606060;
+}
+
+.deleting .widget-title * {
+	color: #aaa;
+}
+
+.imgedit-menu div {
+	border-color: #d5d5d5;
+	background-color: #f1f1f1;
+}
+
+.imgedit-menu div:hover {
+	border-color: #c1c1c1;
+	background-color: #eaeaea;
+}
+
+.imgedit-menu div.disabled {
+	border-color: #ccc;
+	background-color: #ddd;
+	filter: alpha(opacity=50);
+	opacity: 0.5;
+}
+
+#dashboard_recent_comments div.undo {
+	border-top-color: #dfdfdf;
+}
+
+.comment-ays,
+.comment-ays th {
+	border-color: #ddd;
+}
+
+.comment-ays th {
+	background-color: #f1f1f1;
+}
+
+/* added from nav-menu.css */
+#menu-management .menu-edit {
+	border-color: #dfdfdf;
+}
+
+#post-body {
+	background: #fff;
+	border-top-color: #fff;
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-header {
+	border-bottom-color: #dfdfdf;
+}
+
+#nav-menu-footer {
+	border-top-color: #fff;
+}
+
+#menu-management .nav-tabs-arrow a {
+	color: #C1C1C1;
+}
+
+#menu-management .nav-tabs-arrow a:hover {
+	color: #D54E21;
+}
+
+#menu-management .nav-tabs-arrow a:active {
+	color: #464646;
+}
+
+#menu-management .nav-tab-active {
+	border-color: #dfdfdf;
+}
+
+#menu-management .nav-tab {
+	background: #fbfbfb;
+	border-color: #dfdfdf;
+}
+
+.js .input-with-default-title {
+	color: #aaa;
+}
+
+#cancel-save {
+	color: #ff0000;
+}
+
+#cancel-save:hover {
+	background-color: #FF0000;
+	color: #fff;
+}
+
+.list-container {
+	border-color: #DFDFDF;
+}
+
+.menu-item-handle {
+	border-color: #dfdfdf;
+}
+
+.menu li.deleting .menu-item-handle {
+	background-color: #f66;
+	text-shadow: #ccc;
+}
+
+.item-type { /* Menu item controls */
+	color: #999999;
+}
+
+.item-controls .menu-item-delete:hover {
+	color: #ff0000;
+}
+
+.item-edit {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+	border-bottom-color: #eee;
+}
+
+.item-edit:hover {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 10px;
+}
+
+.menu-item-settings { /* Menu editing */
+	border-color: #dfdfdf;
+}
+
+.link-to-original {
+	color: #777;
+	border-color: #dfdfdf;
+}
+
+#cancel-save:hover {
+	color: #fff !important;
+}
+
+#update-menu-item {
+	color: #fff !important;
+}
+
+#update-menu-item:hover,
+#update-menu-item:active,
+#update-menu-item:focus {
+	color: #eaf2fa !important;
+	border-color: #13455b !important;
+}
+
+.submitbox .submitcancel {
+	color: #007700;
+	border-bottom-color: #007700;
+}
+
+.submitbox .submitcancel:hover {
+	background: #007700;
+	color: #fff;
+}
+/* end added from nav-menu.css */
+
+#menu-management .nav-tab-active,
+.menu-item-handle,
+.menu-item-settings {
+	-moz-box-shadow: inset 0 1px 0 #fff;
+	-webkit-box-shadow: inset 0 1px 0 #fff;
+	box-shadow: inset 0 1px 0 #fff;
+}
+
+#menu-management .nav-tab-active {
+	background: #eefcf1;
+	border-bottom-color: #eefcf1;
+}
+
+/* custom header & background pages */
+#upload-form label {
+	color: #777;
+}
+/* custom header & background pages */
+
+/* full screen */
+.fullscreen-overlay {
+	background: #fff;
+}
+
+.wp-fullscreen-focus #wp-fullscreen-title,
+.wp-fullscreen-focus #wp-fullscreen-container {
+	border-color: #ccc;
+}
+
+#fullscreen-topbar {
+	border-bottom-color: #DFDFDF;
+}
+
+/* Begin About Pages */
+
+.about-wrap h1 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-text {
+	color: #777;
+}
+
+.wp-badge {
+	color: #fff;
+	text-shadow: 0 -1px 0 #0c3d57;
+	border-color: #2B5173;
+
+	-moz-box-shadow: inset 0 0 0 1px #5F8CA8;
+	-webkit-box-shadow: inset 0 0 0 1px #5F8CA8;
+	box-shadow: inset 0 0 0 1px #5F8CA8;
+
+	background-color: #378aac;
+}
+
+.about-wrap h2 .nav-tab {
+	color: #007700;
+}
+.about-wrap h2 .nav-tab:hover {
+	color: #d54e21;
+}
+.about-wrap h2 .nav-tab-active,
+.about-wrap h2 .nav-tab-active:hover {
+	color: #333;
+}
+.about-wrap h2 .nav-tab-active {
+	text-shadow: 1px 1px 1px white;
+	color: #464646;
+}
+
+.about-wrap h3 {
+	color: #333;
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap .feature-section h4 {
+	color: #464646;
+}
+
+.about-wrap .feature-section img {
+	background: #eefcf1;
+	border-color: #dfdfdf;
+
+	-moz-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	-webkit-box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+	box-shadow: 0 0 6px rgba( 0, 0, 0, 0.3 );
+}
+
+.about-wrap h4.wp-people-group {
+	text-shadow: 1px 1px 1px white;
+}
+
+.about-wrap li.wp-person img.gravatar {
+	-moz-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+	box-shadow: 0 0 4px rgba( 0, 0, 0, 0.4 );
+}
+.about-wrap li.wp-person .title {
+	color: #464646;
+	text-shadow: 1px 1px 1px white;
+}
+
+.freedoms-php .about-wrap ol li {
+	color: #999;
+}
+.freedoms-php .about-wrap ol p {
+	color: #464646;
+}
+
+/* End About Pages */
+
+
+/*------------------------------------------------------------------------------
+  2.0 - Right to Left Styles
+------------------------------------------------------------------------------*/
+
+.rtl .bar {
+	border-right-color: none;
+	border-left-color: #99d;
+}
+
+.rtl #screen-meta-links a.show-settings {
+	background-position: left 3px;
+}
+
+.rtl #screen-meta-links a.show-settings.screen-meta-active {
+	background-position: left -33px;
+}
+
+/* Menu */
+.rtl #adminmenushadow,
+.rtl #adminmenuback {
+	background-position: top left;
+}
+
+.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,
+.rtl #adminmenu li.wp-has-current-submenu.opensub .wp-menu-toggle,
+.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-has-submenu.opensub .wp-menu-toggle,
+.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,
+.rtl #adminmenu .wp-menu-open .wp-menu-toggle {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 8px 6px;
+}
+
+.rtl #adminmenu .wp-submenu .wp-submenu-head {
+	border-right-color: none;
+	border-left-color: #dfdfdf;
+}
+
+.rtl .folded #adminmenu .wp-submenu-wrap {
+	-moz-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	-webkit-box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+	box-shadow: -2px 2px 5px rgba( 0, 0, 0, 0.4 );
+}
+
+/* Collapse Menu Button */
+.rtl #collapse-button div {
+	background-position: 0 -108px;
+}
+
+.rtl .folded #collapse-button div {
+	background-position: 0 -72px;
+}
+
+/* Edit Image */
+.rtl .meta-box-sortables .postbox:hover .handlediv {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 6px 7px;
+}
+
+.rtl .tablenav .tablenav-pages a {
+	border-color: #e3e3e3;
+	background-color: #eee;
+	background-repeat: repeat-x;
+	background-attachment: scroll;
+	background-position: right -379px;
+}
+
+.rtl #post-body .misc-pub-section {
+	border-right-color: none;
+	border-left-color: #eee;
+}
+
+.rtl .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
+
+.rtl .sidebar-name:hover .sidebar-name-arrow {
+	background-color: transparent;
+	background-repeat: no-repeat;
+	background-position: 5px 9px;
+}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/green.min.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1 @@
+html,.wp-dialog{background-color:#fff}textarea,input[type="text"],input[type="password"],input[type="file"],input[type="button"],input[type="submit"],input[type="reset"],input[type="email"],input[type="number"],input[type="search"],input[type="tel"],input[type="url"],select{border-color:#dfdfdf;background-color:#fff}textarea:focus,input[type="text"]:focus,input[type="password"]:focus,input[type="file"]:focus,input[type="button"]:focus,input[type="submit"]:focus,input[type="reset"]:focus,input[type="email"]:focus,input[type="number"]:focus,input[type="search"]:focus,input[type="tel"]:focus,input[type="url"]:focus,select:focus{border-color:#bbb}kbd,code{background:#eaeaea}input[readonly]{background-color:#eee}.find-box-search{border-color:#dfdfdf;background-color:#f1f1f1}.find-box{background-color:#f1f1f1}.find-box-inside{background-color:#fff}a.page-numbers:hover{border-color:#999}body,#wpbody,.form-table .pre{color:#555}body>#upload-menu{border-bottom-color:#fff}#postcustomstuff table,#your-profile fieldset,#rightnow,div.dashboard-widget,#dashboard-widgets p.dashboard-widget-links{border-color:#ccc}#poststuff .inside label.spam,#poststuff .inside label.deleted{color:red}#poststuff .inside label.waiting{color:orange}#poststuff .inside label.approved{color:green}#postcustomstuff table{border-color:#dfdfdf;background-color:#f9f9f9}#postcustomstuff thead th{background-color:#f1f1f1}.widefat{border-color:#dfdfdf;background-color:#eefcf1}textarea.widefat{background-color:#fff}div.dashboard-widget-error{background-color:#c43}div.dashboard-widget-notice{background-color:#cfe1ef}div.dashboard-widget-submit{border-top-color:#ccc}div.tabs-panel,.wp-tab-panel,ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{border-color:#dfdfdf;background-color:#fff}ul.category-tabs li.tabs,ul.add-menu-item-tabs li.tabs,.wp-tab-active{background-color:#fff}input.disabled,textarea.disabled{background-color:#ccc}#plugin-information .action-button a,#plugin-information .action-button a:hover,#plugin-information .action-button a:visited{color:#fff}.widget .widget-top,.postbox h3,.stuffbox h3,.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head,.sidebar-name,#nav-menu-header,#nav-menu-footer,.menu-item-handle,#fullscreen-topbar{background-color:#f1f1f1;background-image:-ms-linear-gradient(top,#eefcf1,#deece1);background-image:-moz-linear-gradient(top,#eefcf1,#deece1);background-image:-o-linear-gradient(top,#eefcf1,#deece1);background-image:-webkit-gradient(linear,left top,left bottom,from(#eefcf1),to(#deece1));background-image:-webkit-linear-gradient(top,#eefcf1,#deece1);background-image:linear-gradient(top,#eefcf1,#deece1)}.widget .widget-top,.postbox h3,.stuffbox h3{border-bottom-color:#dfdfdf;text-shadow:#fff 0 1px 0;-moz-box-shadow:0 1px 0 #fff;-webkit-box-shadow:0 1px 0 #fff;box-shadow:0 1px 0 #fff}.form-table th,.form-wrap label{color:#222;text-shadow:#fff 0 1px 0}.description,.form-wrap p{color:#666}strong .post-com-count span{background-color:#070}.sorthelper{background-color:#ccf3fa}.ac_match,.subsubsub a.current{color:#000}.wrap h2{color:#464646}.wrap .add-new-h2{background:#f1f1f1}.subtitle{color:#777}.ac_over{background-color:#f0f0b8}.ac_results{background-color:#fff;border-color:#6eb469}.ac_results li{color:#101010}.alternate,.alt{background-color:#fefefe}.available-theme a.screenshot{background-color:#f1f1f1;border-color:#ddd}.bar{background-color:#e8e8e8;border-right-color:#99d}#media-upload,#media-upload .media-item .slidetoggle{background:#fff}#media-upload .slidetoggle{border-top-color:#dfdfdf}div.error,.login #login_error{background-color:#ffebe8;border-color:#c00}div.error a{color:#c00}.form-invalid{background-color:#ffebe8!important}.form-invalid input,.form-invalid select{border-color:#c00!important}.submit{border-color:#dfdfdf}.highlight{background-color:#e4f2fd;color:#000}.howto,.nonessential,#edit-slug-box,.form-input-tip,.subsubsub{color:#666}#wpbody-content #media-items .describe{border-top-color:#dfdfdf}.media-upload-form label.form-help,td.help{color:#9a9a9a}.post-com-count{color:#fff}.post-com-count span{background-color:#bbb;color:#fff}.post-com-count:hover span{background-color:#d54e21}.quicktags,.search{background-color:#ccc;color:#000}.side-info h5{border-bottom-color:#dadada}.side-info ul{color:#666}.button,.button-secondary,.submit input,input[type=button],input[type=submit]{border-color:#bbb;color:#464646}.button:hover,.button-secondary:hover,.submit input:hover,input[type=button]:hover,input[type=submit]:hover{color:#000;border-color:#666}.button,.submit input,.button-secondary{background-color:#f2f2f2;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;text-shadow:rgba(255,255,255,1) 0 1px 0}.button:active,.submit input:active,.button-secondary:active{background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:left top}input.button-primary,button.button-primary,a.button-primary{border-color:#298cba;font-weight:bold;color:#fff;background-image:url('../images/button-grad.png');background-color:#070;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;text-shadow:rgba(0,0,0,0.3) 0 -1px 0}input.button-primary:active,button.button-primary:active,a.button-primary:active{background-image:url('../images/button-grad-active.png');background-color:#070;background-repeat:repeat-x;background-attachment:scroll;background-position:left top;color:#eaf2fa}input.button-primary:hover,button.button-primary:hover,a.button-primary:hover,a.button-primary:focus,a.button-primary:active{border-color:#13455b;color:#eaf2fa}.button-disabled,.button[disabled],.button:disabled,.button-secondary[disabled],.button-secondary:disabled,a.button.disabled{color:#aaa!important;border-color:#ddd!important}.button-primary-disabled,.button-primary[disabled],.button-primary:disabled{color:#9fd0d5!important;background:#298cba!important}a:hover,a:active,a:focus{color:#d54e21}#adminmenu a:hover,#adminmenu li.menu-top>a:focus,#adminmenu ul.wp-submenu a:hover,#the-comment-list .comment a:hover,#rightnow a:hover,#media-upload a.del-link:hover,div.dashboard-widget-submit input:hover,.subsubsub a:hover,.subsubsub a.current:hover,.ui-tabs-nav a:hover,.plugins .inactive a:hover,#all-plugins-table .plugins .inactive a:hover,#search-plugins-table .plugins .inactive a:hover{color:#d54e21}#the-comment-list .comment-item,#dashboard-widgets #dashboard_quick_press form p.submit{border-color:#dfdfdf}#side-sortables .category-tabs .tabs a,#side-sortables .add-menu-item-tabs .tabs a,.wp-tab-bar .wp-tab-active a{color:#333}#rightnow .rbutton{background-color:#ebebeb;color:#264761}.submitbox .submit{background-color:#464646;color:#ccc}.plugins a.delete:hover,#all-plugins-table .plugins a.delete:hover,#search-plugins-table .plugins a.delete:hover,.submitbox .submitdelete{color:#f00;border-bottom-color:#f00}.submitbox .submitdelete:hover,#media-items a.delete:hover{color:#fff;background-color:#f00;border-bottom-color:#f00}#normal-sortables .submitbox .submitdelete:hover{color:#000;background-color:#f00;border-bottom-color:#f00}.tablenav .dots{border-color:transparent}.tablenav .next,.tablenav .prev{border-color:transparent;color:#070}.tablenav .next:hover,.tablenav .prev:hover{border-color:transparent;color:#d54e21}div.updated,.login .message{background-color:#ffffe0;border-color:#e6db55}.update-message{color:#000}a.page-numbers{border-bottom-color:#b8d3e2}.commentlist li{border-bottom-color:#ccc}.widefat td,.widefat th{border-top-color:#fff;border-bottom-color:#dfdfdf}.widefat th{text-shadow:rgba(255,255,255,0.8) 0 1px 0}.widefat td{color:#555}.widefat p,.widefat ol,.widefat ul{color:#333}.widefat thead tr th,.widefat tfoot tr th,h3.dashboard-widget-title,h3.dashboard-widget-title span,h3.dashboard-widget-title small,.find-box-head{color:#333}th.sortable a:hover,th.sortable a:active,th.sortable a:focus{color:#333}h3.dashboard-widget-title small a{color:#d7d7d7}h3.dashboard-widget-title small a:hover{color:#fff}a,#adminmenu a,#the-comment-list p.comment-author strong a,#media-upload a.del-link,#media-items a.delete,.plugins a.delete,.ui-tabs-nav a{color:#070}#adminmenu .awaiting-mod,#adminmenu .update-plugins,#sidemenu a .update-plugins,#rightnow .reallynow{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0}#plugin-information .action-button{background-color:#d54e21;color:#fff}#adminmenu li.current a .awaiting-mod,#adminmenu li a.wp-has-current-submenu .update-plugins{background-color:#464646;color:#fff;-moz-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-khtml-box-shadow:rgba(255,255,255,0.5) 0 1px 0;-webkit-box-shadow:rgba(255,255,255,0.5) 0 1px 0;box-shadow:rgba(255,255,255,0.5) 0 1px 0}div#media-upload-header,div#plugin-information-header{background-color:#eefcf1;border-bottom-color:#dfdfdf}#currenttheme img{border-color:#666}#dashboard_secondary div.dashboard-widget-content ul li a{background-color:#eefcf1}input.readonly,textarea.readonly{background-color:#ddd}#editable-post-name{background-color:#fffbcc}#edit-slug-box strong,.tablenav .displaying-num,#submitted-on,.submitted-on{color:#777}.login #nav a,.login #backtoblog a{color:#070!important}.login #nav a:hover,.login #backtoblog a:hover{color:#d54e21!important}#footer{color:#777;border-color:#dfdfdf}#media-items,.imgedit-group,.media-item{border-color:#dfdfdf}.checkbox,.side-info,.plugins tr,#your-profile #rich_editing{background-color:#fcfcfc}.plugins .inactive,.plugins .inactive th,.plugins .inactive td,tr.inactive+tr.plugin-update-tr .plugin-update{background-color:#f4f4f4}.plugin-update-tr .update-message{background-color:#fffbe4;border-color:#dfdfdf}.plugins .active,.plugins .active th,.plugins .active td{color:#000}.plugins .inactive a{color:#579}#the-comment-list tr.undo,#the-comment-list div.undo{background-color:#f4f4f4}#the-comment-list .unapproved{background-color:#ffffe0}#the-comment-list .approve a{color:#006505}#the-comment-list .unapprove a{color:#d98500}table.widefat span.delete a,table.widefat span.trash a,table.widefat span.spam a,#dashboard_recent_comments .delete a,#dashboard_recent_comments .trash a,#dashboard_recent_comments .spam a{color:#bc0b0b}.welcome-panel{border-color:#dfdfdf}.welcome-panel p{color:#777}.welcome-panel-column p{color:#464646}.welcome-panel .welcome-panel-close{background:#eee;text-shadow:1px 1px 1px #eee}.welcome-panel h3{text-shadow:1px 1px 1px white}.widget,#widget-list .widget-top,.postbox,#titlediv,#poststuff .postarea,.stuffbox{border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff;-moz-border-radius:3px;-khtml-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.widget,#widget-list .widget-top,.postbox,.menu-item-settings{background-color:#eefcf1;background-image:-ms-linear-gradient(top,#eefcf1,#deece1);background-image:-moz-linear-gradient(top,#eefcf1,#deece1);background-image:-o-linear-gradient(top,#eefcf1,#deece1);background-image:-webkit-gradient(linear,left top,left bottom,from(#eefcf1),to(#deece1));background-image:-webkit-linear-gradient(top,#eefcf1,#deece1);background-image:linear-gradient(top,#eefcf1,#deece1)}.postbox h3{color:#464646}.widget .widget-top{color:#222}.sidebar-name:hover h3,.postbox h3:hover{color:#000}#quicktags #ed_link{color:#00f}#rightnow .youhave{background-color:#f0f6fb}#rightnow a{color:#448abd}.tagchecklist span a,#bulk-titles div a{background-repeat:no-repeat}.tagchecklist span a:hover,#bulk-titles div a:hover{background-repeat:no-repeat;background-position:-10px 0}#update-nag,.update-nag{background-color:#fffbcc;border-color:#e6db55;color:#555}#screen-meta{background-color:#f1f1f1;border-color:#ccc;-webkit-box-shadow:0 1px 3px rgba(0,0,0,0.05);box-shadow:0 1px 3px rgba(0,0,0,0.05)}.contextual-help-tabs a:hover{color:#333}.contextual-help-sidebar,.contextual-help-tabs .active{border-color:#ccc}.contextual-help-tabs .active,.contextual-help-tabs .active a,.contextual-help-tabs .active a:hover{background:#fff;color:#000}.contextual-help-tabs-wrap{border-color:#ccc;background-color:#fff}#screen-options-link-wrap,#contextual-help-link-wrap{background-color:#e3e3e3;border-right:1px solid transparent;border-left:1px solid transparent;border-bottom:1px solid transparent;background-image:-ms-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-moz-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-o-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#f1f1f1));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#f1f1f1);background-image:linear-gradient(bottom,#dfdfdf,#f1f1f1)}#screen-meta-links a.show-settings{color:#777}#screen-meta-links a.show-settings:hover{color:#000}#screen-meta-links a.show-settings{background-color:transparent;background-repeat:no-repeat;background-position:right 3px}#screen-meta-links a.show-settings.screen-meta-active{background-color:transparent;background-repeat:no-repeat;background-position:right -33px}.login #backtoblog a{color:#464646}#wphead{border-bottom:#dfdfdf 1px solid}#wphead h1 a{color:#464646}#footer a:link,#footer a:visited{text-decoration:none}#footer a:hover{color:#000;text-decoration:underline}.file-error,abbr.required,.widget-control-remove:hover,table.widefat .delete a:hover,table.widefat .trash a:hover,table.widefat .spam a:hover,#dashboard_recent_comments .delete a:hover,#dashboard_recent_comments .trash a:hover #dashboard_recent_comments .spam a:hover{color:#f00}#pass-strength-result{background-color:#eee;border-color:#ddd!important}#pass-strength-result.bad{background-color:#ffb78c;border-color:#ff853c!important}#pass-strength-result.good{background-color:#ffec8b;border-color:#fc0!important}#pass-strength-result.short{background-color:#ffa0a0;border-color:#f04040!important}#pass-strength-result.strong{background-color:#c3ff88;border-color:#8dff1c!important}#titlediv #title{border-color:#ccc}#post-status-info{border-color:#dfdfdf #ccc #ccc;background-color:#eaeaea}.editwidget .widget-inside{border-color:#dfdfdf}#titlediv #title{background-color:#fff}#tTips p#tTips_inside{background-color:#ddd;color:#333}#timestampdiv input,#namediv input,#poststuff .inside .the-tagcloud{border-color:#ddd}#adminmenuback,#adminmenuwrap{background-color:#deece1;border-color:#ccc}#adminmenushadow,#adminmenuback{background-position:top right;background-repeat:repeat-y}#adminmenu li.wp-menu-separator{background:#dfdfdf;border-color:#cfcfcf}#adminmenu div.separator{border-color:#e1e1e1}#adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,#adminmenu li.wp-has-current-submenu.opensub .wp-menu-toggle,#adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:-1px 6px}#adminmenu .wp-has-submenu.opensub .wp-menu-toggle,#adminmenu .wp-has-submenu:hover .wp-menu-toggle,#adminmenu .wp-menu-open .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:-2px 6px}#adminmenu a.menu-top,.folded #adminmenu li.menu-top,#adminmenu .wp-submenu .wp-submenu-head{border-top-color:#eefcf1;border-bottom-color:#dfdfdf}#adminmenu li.wp-menu-open{border-color:#dfdfdf}#adminmenu li.menu-top.opensub>a,#adminmenu li.menu-top:hover>a,#adminmenu li.menu-top.focused>a,#adminmenu li.menu-top>a:focus{background-color:#eefcf1;text-shadow:0 1px 0 rgba(255,255,255,0.4)}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top,#adminmenu .wp-menu-arrow,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{background-color:#777;background-image:-ms-linear-gradient(bottom,#060,#6eb469);background-image:-moz-linear-gradient(bottom,#060,#6eb469);background-image:-o-linear-gradient(bottom,#060,#6eb469);background-image:-webkit-gradient(linear,left bottom,left top,from(#060),to(#6eb469));background-image:-webkit-linear-gradient(bottom,#060,#6eb469);background-image:linear-gradient(bottom,#060,#6eb469)}#adminmenu .wp-menu-arrow div{background-color:#777;background-image:-ms-linear-gradient(right bottom,#060,#6eb469);background-image:-moz-linear-gradient(right bottom,#060,#6eb469);background-image:-o-linear-gradient(right bottom,#060,#6eb469);background-image:-webkit-gradient(linear,right bottom,left top,from(#060),to(#6eb469));background-image:-webkit-linear-gradient(right bottom,#060,#6eb469);background-image:linear-gradient(right bottom,#060,#6eb469)}#adminmenu li.wp-not-current-submenu .wp-menu-arrow{border-top-color:#eefcf1;border-bottom-color:#dfdfdf;background:#eefcf1}#adminmenu li.wp-not-current-submenu .wp-menu-arrow div{background:#eefcf1;border-color:#ccc}.folded #adminmenu li.menu-top li.opensub a,.folded #adminmenu li.menu-top li:hover a{background-image:none}#adminmenu li.wp-has-current-submenu a.wp-has-current-submenu,#adminmenu li.current a.menu-top,#adminmenu .wp-has-current-submenu .wp-submenu .wp-submenu-head{text-shadow:0 -1px 0 #333;color:#fff;border-top-color:#6eb469;border-bottom-color:#060}.folded #adminmenu li.wp-has-current-submenu,.folded #adminmenu li.current.menu-top{border-top-color:#6eb469;border-bottom-color:#060}#adminmenu .wp-submenu a:hover,#adminmenu .wp-submenu a:focus{background-color:#eefcf1;color:#333}#adminmenu .wp-submenu li.current,#adminmenu .wp-submenu li.current a,#adminmenu .wp-submenu li.current a:hover{color:#333}#adminmenu .wp-submenu ul{background-color:#fff}#adminmenu .wp-submenu-wrap,#adminmenu .wp-submenu ul{border-color:#dfdfdf}#adminmenu .wp-submenu-wrap,.folded #adminmenu .wp-has-current-submenu .wp-submenu-wrap{-moz-box-shadow:2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:2px 2px 5px rgba(0,0,0,0.4);box-shadow:2px 2px 5px rgba(0,0,0,0.4);background:#f9f9f9}#adminmenu .wp-submenu .wp-submenu-head{border-right-color:#dfdfdf;background-color:#deece1}#adminmenu div.wp-submenu{background-color:transparent}#collapse-menu{color:#aaa;border-color:transparent}#collapse-menu:hover{color:#999}#collapse-button{border-color:#ccc;background-color:#f4f4f4;background-image:-ms-linear-gradient(bottom,#dfdfdf,#fff);background-image:-moz-linear-gradient(bottom,#dfdfdf,#fff);background-image:-o-linear-gradient(bottom,#dfdfdf,#fff);background-image:-webkit-gradient(linear,left bottom,left top,from(#dfdfdf),to(#fff));background-image:-webkit-linear-gradient(bottom,#dfdfdf,#fff);background-image:linear-gradient(bottom,#dfdfdf,#fff)}#collapse-menu:hover #collapse-button{border-color:#aaa}#collapse-button div{background-color:transparent;background-repeat:no-repeat;background-position:0 -72px}.folded #collapse-button div{background-position:0 -108px}.icon16.icon-dashboard,#adminmenu .menu-icon-dashboard div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-60px -33px}#adminmenu .menu-icon-dashboard:hover div.wp-menu-image,#adminmenu .menu-icon-dashboard.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-dashboard.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-60px -1px}.icon16.icon-post,#adminmenu .menu-icon-post div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-271px -33px}#adminmenu .menu-icon-post:hover div.wp-menu-image,#adminmenu .menu-icon-post.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-271px -33px}.icon16.icon-media,#adminmenu .menu-icon-media div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-120px -33px}#adminmenu .menu-icon-media:hover div.wp-menu-image,#adminmenu .menu-icon-media.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-120px -1px}.icon16.icon-links,#adminmenu .menu-icon-links div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-90px -33px}#adminmenu .menu-icon-links:hover div.wp-menu-image,#adminmenu .menu-icon-links.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-90px -1px}.icon16.icon-page,#adminmenu .menu-icon-page div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-150px -33px}#adminmenu .menu-icon-page:hover div.wp-menu-image,#adminmenu .menu-icon-page.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-150px -1px}.icon16.icon-comments,#adminmenu .menu-icon-comments div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-30px -33px}#adminmenu .menu-icon-comments:hover div.wp-menu-image,#adminmenu .menu-icon-comments.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-comments.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-30px -1px}.icon16.icon-appearance,#adminmenu .menu-icon-appearance div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:0 -33px}#adminmenu .menu-icon-appearance:hover div.wp-menu-image,#adminmenu .menu-icon-appearance.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:0 -1px}.icon16.icon-plugins,#adminmenu .menu-icon-plugins div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-180px -33px}#adminmenu .menu-icon-plugins:hover div.wp-menu-image,#adminmenu .menu-icon-plugins.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-180px -1px}.icon16.icon-users,#adminmenu .menu-icon-users div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-300px -33px}#adminmenu .menu-icon-users:hover div.wp-menu-image,#adminmenu .menu-icon-users.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-users.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-300px -1px}.icon16.icon-tools,#adminmenu .menu-icon-tools div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-210px -33px}#adminmenu .menu-icon-tools:hover div.wp-menu-image,#adminmenu .menu-icon-tools.wp-has-current-submenu div.wp-menu-image,#adminmenu .menu-icon-tools.current div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-210px -1px}.icon16.icon-settings,#adminmenu .menu-icon-settings div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-240px -33px}#adminmenu .menu-icon-settings:hover div.wp-menu-image,#adminmenu .menu-icon-settings.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-240px -1px}.icon16.icon-site,#adminmenu .menu-icon-site div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-360px -33px}#adminmenu .menu-icon-site:hover div.wp-menu-image,#adminmenu .menu-icon-site.wp-has-current-submenu div.wp-menu-image{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:-360px -1px}.icon32.icon-post,#icon-edit,#icon-post{background-color:transparent;background-repeat:no-repeat;background-position:-552px -5px}.icon32.icon-dashboard,#icon-index{background-color:transparent;background-repeat:no-repeat;background-position:-137px -5px}.icon32.icon-media,#icon-upload{background-color:transparent;background-repeat:no-repeat;background-position:-251px -5px}.icon32.icon-links,#icon-link-manager,#icon-link,#icon-link-category{background-color:transparent;background-repeat:no-repeat;background-position:-190px -5px}.icon32.icon-page,#icon-edit-pages,#icon-page{background-color:transparent;background-repeat:no-repeat;background-position:-312px -5px}.icon32.icon-comments,#icon-edit-comments{background-color:transparent;background-repeat:no-repeat;background-position:-72px -5px}.icon32.icon-appearance,#icon-themes{background-color:transparent;background-repeat:no-repeat;background-position:-11px -5px}.icon32.icon-plugins,#icon-plugins{background-color:transparent;background-repeat:no-repeat;background-position:-370px -5px}.icon32.icon-users,#icon-users,#icon-profile,#icon-user-edit{background-color:transparent;background-repeat:no-repeat;background-position:-600px -5px}.icon32.icon-tools,#icon-tools,#icon-admin{background-color:transparent;background-repeat:no-repeat;background-position:-432px -5px}.icon32.icon-settings,#icon-options-general{background-color:transparent;background-repeat:no-repeat;background-position:-492px -5px}.icon32.icon-site,#icon-ms-admin{background-color:transparent;background-repeat:no-repeat;background-position:-659px -5px}table.diff .diff-deletedline{background-color:#fdd}table.diff .diff-deletedline del{background-color:#f99}table.diff .diff-addedline{background-color:#dfd}table.diff .diff-addedline ins{background-color:#9f9}#att-info{background-color:#e4f2fd}#sidemenu a{background-color:#eefcf1;border-color:#eefcf1;border-bottom-color:#dfdfdf}#sidemenu a.current{background-color:#fff;border-color:#dfdfdf #dfdfdf #fff;color:#d54e21}#replyerror{border-color:#ddd;background-color:#eefcf1}.vim-current,.vim-current th,.vim-current td{background-color:#e4f2fd!important}.star-average,.star.star-rating{background-color:#fc0}div.star.select:hover{background-color:#d00}div.star img{border-left:1px solid #fff;border-right:1px solid #fff}.widefat div.star img{border-left:1px solid #eefcf1;border-right:1px solid #eefcf1}#plugin-information .fyi ul{background-color:#eaf3fa}#plugin-information .fyi h2.mainheader{background-color:#cee1ef}#plugin-information pre,#plugin-information code{background-color:#ededff}#plugin-information pre{border:1px solid #ccc}.inline-edit-row fieldset input[type="text"],.inline-edit-row fieldset textarea,#bulk-titles{border-color:#ddd}.inline-editor div.title{background-color:#eaf3fa}.inline-editor ul.cat-checklist{background-color:#fff;border-color:#ddd}.inline-editor .categories .catshow,.inline-editor .categories .cathide{color:#070}.inline-editor .quick-edit-save{background-color:#f1f1f1}fieldset.inline-edit-col-right .inline-edit-col{border-color:#dfdfdf}.attention{color:#d54e21}.meta-box-sortables .postbox:hover .handlediv{background-color:transparent;background-repeat:no-repeat;background-position:6px 7px}.tablenav .tablenav-pages{color:#555}.tablenav .tablenav-pages a{border-color:#e3e3e3;background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:left -379px}.tablenav .tablenav-pages a:hover,.tablenav .tablenav-pages a:focus{color:#d54e21}.tablenav .tablenav-pages a.disabled,.tablenav .tablenav-pages a.disabled:hover,.tablenav .tablenav-pages a.disabled:focus{color:#aaa}.tablenav .tablenav-pages .current{background:#dfdfdf;border-color:#d3d3d3}#availablethemes,#availablethemes td{border-color:#ddd}#current-theme img{border-color:#999}#TB_window #TB_title a.tb-theme-preview-link,#TB_window #TB_title a.tb-theme-preview-link:visited{color:#999}#TB_window #TB_title a.tb-theme-preview-link:hover,#TB_window #TB_title a.tb-theme-preview-link:focus{color:#ccc}.misc-pub-section{border-top-color:#fff;border-bottom-color:#dfdfdf}#minor-publishing{border-bottom-color:#dfdfdf}#post-body .misc-pub-section{border-right-color:#eee}.post-com-count span{background-color:#bbb}.form-table .color-palette td{border-color:#fff}.sortable-placeholder{border-color:#bbb;background-color:#eefcf1}#post-body ul.category-tabs li.tabs a,#post-body ul.add-menu-item-tabs li.tabs a,body.press-this ul.category-tabs li.tabs a{color:#333}.view-switch #view-switch-list{background-color:transparent;background-repeat:no-repeat;background-position:0 0}.view-switch .current #view-switch-list{background-color:transparent;background-repeat:no-repeat;background-position:-40px 0}.view-switch #view-switch-excerpt{background-color:transparent;background-repeat:no-repeat;background-position:-20px 0}.view-switch .current #view-switch-excerpt{background-color:transparent;background-repeat:no-repeat;background-position:-60px 0}#header-logo{background-color:transparent;background-repeat:no-repeat;background-attachment:scroll;background-position:center center}.popular-tags,.feature-filter{background-color:#fff;border-color:#dfdfdf}#theme-information .action-button{border-top-color:#dfdfdf}.theme-listing br.line{border-bottom-color:#ccc}div.widgets-sortables,#widgets-left .inactive{background-color:#fcfcfc;border-color:#dfdfdf}#available-widgets .widget-holder{background-color:#fcfcfc;border-color:#dfdfdf}#available-widgets .widget-description{color:#555}.sidebar-name{color:#464646;text-shadow:#fff 0 1px 0;border-color:#dfdfdf;-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}.sidebar-name:hover,#removing-widget{color:#d54e21}#removing-widget span{color:black}.sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.sidebar-name:hover .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.in-widget-title{color:#606060}.deleting .widget-title *{color:#aaa}.imgedit-menu div{border-color:#d5d5d5;background-color:#f1f1f1}.imgedit-menu div:hover{border-color:#c1c1c1;background-color:#eaeaea}.imgedit-menu div.disabled{border-color:#ccc;background-color:#ddd;filter:alpha(opacity=50);opacity:.5}#dashboard_recent_comments div.undo{border-top-color:#dfdfdf}.comment-ays,.comment-ays th{border-color:#ddd}.comment-ays th{background-color:#f1f1f1}#menu-management .menu-edit{border-color:#dfdfdf}#post-body{background:#fff;border-top-color:#fff;border-bottom-color:#dfdfdf}#nav-menu-header{border-bottom-color:#dfdfdf}#nav-menu-footer{border-top-color:#fff}#menu-management .nav-tabs-arrow a{color:#c1c1c1}#menu-management .nav-tabs-arrow a:hover{color:#d54e21}#menu-management .nav-tabs-arrow a:active{color:#464646}#menu-management .nav-tab-active{border-color:#dfdfdf}#menu-management .nav-tab{background:#fbfbfb;border-color:#dfdfdf}.js .input-with-default-title{color:#aaa}#cancel-save{color:#f00}#cancel-save:hover{background-color:#f00;color:#fff}.list-container{border-color:#dfdfdf}.menu-item-handle{border-color:#dfdfdf}.menu li.deleting .menu-item-handle{background-color:#f66;text-shadow:#ccc}.item-type{color:#999}.item-controls .menu-item-delete:hover{color:#f00}.item-edit{background-color:transparent;background-repeat:no-repeat;background-position:8px 10px;border-bottom-color:#eee}.item-edit:hover{background-color:transparent;background-repeat:no-repeat;background-position:8px 10px}.menu-item-settings{border-color:#dfdfdf}.link-to-original{color:#777;border-color:#dfdfdf}#cancel-save:hover{color:#fff!important}#update-menu-item{color:#fff!important}#update-menu-item:hover,#update-menu-item:active,#update-menu-item:focus{color:#eaf2fa!important;border-color:#13455b!important}.submitbox .submitcancel{color:#070;border-bottom-color:#070}.submitbox .submitcancel:hover{background:#070;color:#fff}#menu-management .nav-tab-active,.menu-item-handle,.menu-item-settings{-moz-box-shadow:inset 0 1px 0 #fff;-webkit-box-shadow:inset 0 1px 0 #fff;box-shadow:inset 0 1px 0 #fff}#menu-management .nav-tab-active{background:#eefcf1;border-bottom-color:#eefcf1}#upload-form label{color:#777}.fullscreen-overlay{background:#fff}.wp-fullscreen-focus #wp-fullscreen-title,.wp-fullscreen-focus #wp-fullscreen-container{border-color:#ccc}#fullscreen-topbar{border-bottom-color:#dfdfdf}.about-wrap h1{color:#333;text-shadow:1px 1px 1px white}.about-text{color:#777}.wp-badge{color:#fff;text-shadow:0 -1px 0 #0c3d57;border-color:#2b5173;-moz-box-shadow:inset 0 0 0 1px #5f8ca8;-webkit-box-shadow:inset 0 0 0 1px #5f8ca8;box-shadow:inset 0 0 0 1px #5f8ca8;background-color:#378aac}.about-wrap h2 .nav-tab{color:#070}.about-wrap h2 .nav-tab:hover{color:#d54e21}.about-wrap h2 .nav-tab-active,.about-wrap h2 .nav-tab-active:hover{color:#333}.about-wrap h2 .nav-tab-active{text-shadow:1px 1px 1px white;color:#464646}.about-wrap h3{color:#333;text-shadow:1px 1px 1px white}.about-wrap .feature-section h4{color:#464646}.about-wrap .feature-section img{background:#eefcf1;border-color:#dfdfdf;-moz-box-shadow:0 0 6px rgba(0,0,0,0.3);-webkit-box-shadow:0 0 6px rgba(0,0,0,0.3);box-shadow:0 0 6px rgba(0,0,0,0.3)}.about-wrap h4.wp-people-group{text-shadow:1px 1px 1px white}.about-wrap li.wp-person img.gravatar{-moz-box-shadow:0 0 4px rgba(0,0,0,0.4);-webkit-box-shadow:0 0 4px rgba(0,0,0,0.4);box-shadow:0 0 4px rgba(0,0,0,0.4)}.about-wrap li.wp-person .title{color:#464646;text-shadow:1px 1px 1px white}.freedoms-php .about-wrap ol li{color:#999}.freedoms-php .about-wrap ol p{color:#464646}.rtl .bar{border-right-color:none;border-left-color:#99d}.rtl #screen-meta-links a.show-settings{background-position:left 3px}.rtl #screen-meta-links a.show-settings.screen-meta-active{background-position:left -33px}.rtl #adminmenushadow,.rtl #adminmenuback{background-position:top left}.rtl #adminmenu li.wp-has-current-submenu.wp-menu-open .wp-menu-toggle,.rtl #adminmenu li.wp-has-current-submenu.opensub .wp-menu-toggle,.rtl #adminmenu li.wp-has-current-submenu:hover .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:8px 6px}.rtl #adminmenu .wp-has-submenu.opensub .wp-menu-toggle,.rtl #adminmenu .wp-has-submenu:hover .wp-menu-toggle,.rtl #adminmenu .wp-menu-open .wp-menu-toggle{background-color:transparent;background-repeat:no-repeat;background-position:8px 6px}.rtl #adminmenu .wp-submenu .wp-submenu-head{border-right-color:none;border-left-color:#dfdfdf}.rtl .folded #adminmenu .wp-submenu-wrap{-moz-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);-webkit-box-shadow:-2px 2px 5px rgba(0,0,0,0.4);box-shadow:-2px 2px 5px rgba(0,0,0,0.4)}.rtl #collapse-button div{background-position:0 -108px}.rtl .folded #collapse-button div{background-position:0 -72px}.rtl .meta-box-sortables .postbox:hover .handlediv{background-color:transparent;background-repeat:no-repeat;background-position:6px 7px}.rtl .tablenav .tablenav-pages a{border-color:#e3e3e3;background-color:#eee;background-repeat:repeat-x;background-attachment:scroll;background-position:right -379px}.rtl #post-body .misc-pub-section{border-right-color:none;border-left-color:#eee}.rtl .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}.rtl .sidebar-name:hover .sidebar-name-arrow{background-color:transparent;background-repeat:no-repeat;background-position:5px 9px}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/styles/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/tools.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1129 @@
+<?php
+
+/**
+ * bbPress Admin Tools Page
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Repair ********************************************************************/
+
+/**
+ * Admin repair page
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_admin_repair_list() To get the recount list
+ * @uses check_admin_referer() To verify the nonce and the referer
+ * @uses wp_cache_flush() To flush the cache
+ * @uses do_action() Calls 'admin_notices' to display the notices
+ * @uses screen_icon() To display the screen icon
+ * @uses wp_nonce_field() To add a hidden nonce field
+ */
+function bbp_admin_repair() {
+?>
+
+	<div class="wrap">
+
+		<?php screen_icon( 'tools' ); ?>
+
+		<h2 class="nav-tab-wrapper"><?php bbp_tools_admin_tabs( __( 'Repair Forums', 'bbpress' ) ); ?></h2>
+
+		<p><?php _e( 'bbPress keeps track of relationships between forums, topics, replies, and topic tags, and users. Occasionally these relationships become out of sync, most often after an import or migration. Use the tools below to manually recalculate these relationships.', 'bbpress' ); ?></p>
+		<p class="description"><?php _e( 'Some of these tools create substantial database overhead. Avoid running more than 1 repair job at a time.', 'bbpress' ); ?></p>
+
+		<form class="settings" method="post" action="">
+			<table class="form-table">
+				<tbody>
+					<tr valign="top">
+						<th scope="row"><?php _e( 'Relationships to Repair:', 'bbpress' ) ?></th>
+						<td>
+							<fieldset>
+								<legend class="screen-reader-text"><span><?php _e( 'Repair', 'bbpress' ) ?></span></legend>
+
+								<?php foreach ( bbp_admin_repair_list() as $item ) : ?>
+
+									<label><input type="checkbox" class="checkbox" name="<?php echo esc_attr( $item[0] ) . '" id="' . esc_attr( str_replace( '_', '-', $item[0] ) ); ?>" value="1" /> <?php echo esc_html( $item[1] ); ?></label><br />
+
+								<?php endforeach; ?>
+
+							</fieldset>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			<fieldset class="submit">
+				<input class="button-primary" type="submit" name="submit" value="<?php esc_attr_e( 'Repair Items', 'bbpress' ); ?>" />
+				<?php wp_nonce_field( 'bbpress-do-counts' ); ?>
+			</fieldset>
+		</form>
+	</div>
+
+<?php
+}
+
+/**
+ * Handle the processing and feedback of the admin tools page
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_admin_repair_list() To get the recount list
+ * @uses check_admin_referer() To verify the nonce and the referer
+ * @uses wp_cache_flush() To flush the cache
+ * @uses do_action() Calls 'admin_notices' to display the notices
+ */
+function bbp_admin_repair_handler() {
+
+	if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) ) {
+		check_admin_referer( 'bbpress-do-counts' );
+
+		// Stores messages
+		$messages = array();
+
+		wp_cache_flush();
+
+		foreach ( (array) bbp_admin_repair_list() as $item ) {
+			if ( isset( $item[2] ) && isset( $_POST[$item[0]] ) && 1 == $_POST[$item[0]] && is_callable( $item[2] ) ) {
+				$messages[] = call_user_func( $item[2] );
+			}
+		}
+
+		if ( count( $messages ) ) {
+			foreach ( $messages as $message ) {
+				bbp_admin_tools_feedback( $message[1] );
+			}
+		}
+	}
+}
+
+/**
+ * Assemble the admin notices
+ *
+ * @since bbPress (r2613)
+ *
+ * @param string|WP_Error $message A message to be displayed or {@link WP_Error}
+ * @param string $class Optional. A class to be added to the message div
+ * @uses WP_Error::get_error_messages() To get the error messages of $message
+ * @uses add_action() Adds the admin notice action with the message HTML
+ * @return string The message HTML
+ */
+function bbp_admin_tools_feedback( $message, $class = false ) {
+	if ( is_string( $message ) ) {
+		$message = '<p>' . $message . '</p>';
+		$class = $class ? $class : 'updated';
+	} elseif ( is_wp_error( $message ) ) {
+		$errors = $message->get_error_messages();
+
+		switch ( count( $errors ) ) {
+			case 0:
+				return false;
+				break;
+
+			case 1:
+				$message = '<p>' . $errors[0] . '</p>';
+				break;
+
+			default:
+				$message = '<ul>' . "\n\t" . '<li>' . join( '</li>' . "\n\t" . '<li>', $errors ) . '</li>' . "\n" . '</ul>';
+				break;
+		}
+
+		$class = $class ? $class : 'error';
+	} else {
+		return false;
+	}
+
+	$message = '<div id="message" class="' . esc_attr( $class ) . '">' . $message . '</div>';
+	$message = str_replace( "'", "\'", $message );
+	$lambda  = create_function( '', "echo '$message';" );
+
+	add_action( 'admin_notices', $lambda );
+
+	return $lambda;
+}
+
+/**
+ * Get the array of the repair list
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses apply_filters() Calls 'bbp_repair_list' with the list array
+ * @return array Repair list of options
+ */
+function bbp_admin_repair_list() {
+	$repair_list = array(
+		0  => array( 'bbp-sync-topic-meta',        __( 'Recalculate the parent topic for each post',          'bbpress' ), 'bbp_admin_repair_topic_meta'               ),
+		5  => array( 'bbp-sync-forum-meta',        __( 'Recalculate the parent forum for each post',          'bbpress' ), 'bbp_admin_repair_forum_meta'               ),
+		10 => array( 'bbp-sync-forum-visibility',  __( 'Recalculate private and hidden forums',               'bbpress' ), 'bbp_admin_repair_forum_visibility'         ),
+		15 => array( 'bbp-sync-all-topics-forums', __( 'Recalculate last activity in each topic and forum',   'bbpress' ), 'bbp_admin_repair_freshness'                ),
+		20 => array( 'bbp-group-forums',           __( 'Repair BuddyPress Group Forum relationships',         'bbpress' ), 'bbp_admin_repair_group_forum_relationship' ),
+		25 => array( 'bbp-forum-topics',           __( 'Count topics in each forum',                          'bbpress' ), 'bbp_admin_repair_forum_topic_count'        ),
+		30 => array( 'bbp-forum-replies',          __( 'Count replies in each forum',                         'bbpress' ), 'bbp_admin_repair_forum_reply_count'        ),
+		35 => array( 'bbp-topic-replies',          __( 'Count replies in each topic',                         'bbpress' ), 'bbp_admin_repair_topic_reply_count'        ),
+		40 => array( 'bbp-topic-voices',           __( 'Count voices in each topic',                          'bbpress' ), 'bbp_admin_repair_topic_voice_count'        ),
+		45 => array( 'bbp-topic-hidden-replies',   __( 'Count spammed & trashed replies in each topic',       'bbpress' ), 'bbp_admin_repair_topic_hidden_reply_count' ),
+		50 => array( 'bbp-user-replies',           __( 'Count topics for each user',                          'bbpress' ), 'bbp_admin_repair_user_topic_count'         ),
+		55 => array( 'bbp-user-topics',            __( 'Count replies for each user',                         'bbpress' ), 'bbp_admin_repair_user_reply_count'         ),
+		60 => array( 'bbp-user-favorites',         __( 'Remove trashed topics from user favorites',           'bbpress' ), 'bbp_admin_repair_user_favorites'           ),
+		65 => array( 'bbp-user-subscriptions',     __( 'Remove trashed topics from user subscriptions',       'bbpress' ), 'bbp_admin_repair_user_subscriptions'       ),
+		70 => array( 'bbp-user-role-map',          __( 'Remap existing users to default forum roles',         'bbpress' ), 'bbp_admin_repair_user_roles'               )
+	);
+	ksort( $repair_list );
+
+	return (array) apply_filters( 'bbp_repair_list', $repair_list );
+}
+
+/**
+ * Recount topic replies
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_topic_reply_count() {
+	global $wpdb;
+
+	$statement = __( 'Counting the number of replies in each topic&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	// Post types and status
+	$tpt = bbp_get_topic_post_type();
+	$rpt = bbp_get_reply_post_type();
+	$pps = bbp_get_public_status_id();
+	$cps = bbp_get_closed_status_id();
+
+	$sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
+			SELECT `topics`.`ID` AS `post_id`, '_bbp_reply_count' AS `meta_key`, COUNT(`replies`.`ID`) As `meta_value`
+				FROM `{$wpdb->posts}` AS `topics`
+					LEFT JOIN `{$wpdb->posts}` as `replies`
+						ON  `replies`.`post_parent` = `topics`.`ID`
+						AND `replies`.`post_status` = '{$pps}'
+						AND `replies`.`post_type`   = '{$rpt}'
+				WHERE `topics`.`post_type` = '{$tpt}'
+					AND `topics`.`post_status` IN ( '{$pps}', '{$cps}' )
+				GROUP BY `topics`.`ID`);";
+
+	if ( is_wp_error( $wpdb->query( $sql ) ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recount topic voices
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_topic_voice_count() {
+	global $wpdb;
+
+	$statement = __( 'Counting the number of voices in each topic&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_voice_count';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	// Post types and status
+	$tpt = bbp_get_topic_post_type();
+	$rpt = bbp_get_reply_post_type();
+	$pps = bbp_get_public_status_id();
+	$cps = bbp_get_closed_status_id();
+
+	$sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (
+			SELECT `postmeta`.`meta_value`, '_bbp_voice_count', COUNT(DISTINCT `post_author`) as `meta_value`
+				FROM `{$wpdb->posts}` AS `posts`
+				LEFT JOIN `{$wpdb->postmeta}` AS `postmeta`
+					ON `posts`.`ID` = `postmeta`.`post_id`
+					AND `postmeta`.`meta_key` = '_bbp_topic_id'
+				WHERE `posts`.`post_type` IN ( '{$tpt}', '{$rpt}' )
+					AND `posts`.`post_status` IN ( '{$pps}', '{$cps}' )
+					AND `posts`.`post_author` != '0'
+				GROUP BY `postmeta`.`meta_value`);";
+
+	if ( is_wp_error( $wpdb->query( $sql ) ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recount topic hidden replies (spammed/trashed)
+ *
+ * @since bbPress (r2747)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_topic_hidden_reply_count() {
+	global $wpdb;
+
+	$statement = __( 'Counting the number of spammed and trashed replies in each topic&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` = '_bbp_reply_count_hidden';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$sql = "INSERT INTO `{$wpdb->postmeta}` (`post_id`, `meta_key`, `meta_value`) (SELECT `post_parent`, '_bbp_reply_count_hidden', COUNT(`post_status`) as `meta_value` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_reply_post_type() . "' AND `post_status` IN ( '" . join( "','", array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ) ) . "') GROUP BY `post_parent`);";
+	if ( is_wp_error( $wpdb->query( $sql ) ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Repair group forum ID mappings after a bbPress 1.1 to bbPress 2.2 conversion
+ *
+ * @since bbPress (r4395)
+ *
+ * @global WPDB $wpdb
+ * @return If a wp_error() occurs and no converted forums are found
+ */
+function bbp_admin_repair_group_forum_relationship() {
+	global $wpdb;
+
+	$statement = __( 'Repairing BuddyPress group-forum relationships&hellip; %s', 'bbpress' );
+	$g_count     = 0;
+	$f_count     = 0;
+
+	// Copy the BuddyPress filter here, incase BuddyPress is not active
+	$prefix    = apply_filters( 'bp_core_get_table_prefix', $wpdb->base_prefix );
+	$tablename = $prefix . 'bp_groups_groupmeta';
+
+	// Get the converted forum IDs
+	$forum_ids = $wpdb->query( "SELECT `forum`.`ID`, `forummeta`.`meta_value`
+								FROM `{$wpdb->posts}` AS `forum`
+									LEFT JOIN `{$wpdb->postmeta}` AS `forummeta`
+										ON `forum`.`ID` = `forummeta`.`post_id`
+										AND `forummeta`.`meta_key` = '_bbp_old_forum_id'
+								WHERE `forum`.`post_type` = 'forum'
+								GROUP BY `forum`.`ID`;" );
+
+	// Bail if forum IDs returned an error
+	if ( is_wp_error( $forum_ids ) || empty( $wpdb->last_result ) )
+		return array( 2, sprintf( $statement, __( 'Failed!', 'bbpress' ) ) );
+
+	// Stash the last results
+	$results = $wpdb->last_result;
+
+	// Update each group forum
+	foreach ( $results as $group_forums ) {
+
+		// Only update if is a converted forum
+		if ( ! isset( $group_forums->meta_value ) )
+			continue;
+
+		// Attempt to update group meta
+		$updated = $wpdb->query( "UPDATE `{$tablename}` SET `meta_value` = '{$group_forums->ID}' WHERE `meta_key` = 'forum_id' AND `meta_value` = '{$group_forums->meta_value}';" );
+
+		// Bump the count
+		if ( !empty( $updated ) && ! is_wp_error( $updated ) ) {
+			++$g_count;
+		}
+
+		// Update group's forum metadata
+		$group_id = (int) $wpdb->get_var( "SELECT `group_id` FROM `{$tablename}` WHERE `meta_key` = 'forum_id' AND `meta_value` = '{$group_forums->ID}';" );
+		if ( !empty( $group_id ) ) {
+			update_post_meta( $group_forums->ID, '_bbp_group_ids', array( $group_id ) );
+			++$f_count;
+		}
+	}
+
+	// Make some logical guesses at the old group root forum
+	if ( function_exists( 'bp_forums_parent_forum_id' ) ) {
+		$old_default_forum_id = bp_forums_parent_forum_id();
+	} elseif ( defined( 'BP_FORUMS_PARENT_FORUM_ID' ) ) {
+		$old_default_forum_id = (int) BP_FORUMS_PARENT_FORUM_ID;
+	} else {
+		$old_default_forum_id = 1;
+	}
+
+	// Try to get the group root forum
+	$posts = get_posts( array(
+		'post_type'   => bbp_get_forum_post_type(),
+		'meta_key'    => '_bbp_old_forum_id',
+		'meta_value'  => $old_default_forum_id,
+		'numberposts' => 1
+	) );
+
+	// Found the group root forum
+	if ( ! empty( $posts ) ) {
+
+		// Rename 'Default Forum'  since it's now visible in sitewide forums
+		if ( 'Default Forum' == $posts[0]->post_title ) {
+			wp_update_post( array(
+				'ID'         => $posts[0]->ID,
+				'post_title' => __( 'Group Forums', 'bbpress' ),
+			) );
+		}
+
+		// Update the group forums root metadata
+		update_option( '_bbp_group_forums_root_id', $posts[0]->ID );
+	}
+
+	// Complete results
+	$result = sprintf( __( 'Complete! %s groups updated; %s forums updated.', 'bbpress' ), bbp_number_format( $g_count ), bbp_number_format( $f_count ) );
+	return array( 0, sprintf( $statement, $result ) );
+}
+
+/**
+ * Recount forum topics
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses get_posts() To get the forums
+ * @uses bbp_update_forum_topic_count() To update the forum topic count
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_forum_topic_count() {
+	global $wpdb;
+
+	$statement = __( 'Counting the number of topics in each forum&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	$sql_delete = "DELETE FROM {$wpdb->postmeta} WHERE meta_key IN ( '_bbp_topic_count', '_bbp_total_topic_count' );";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) );
+	if ( !empty( $forums ) ) {
+		foreach( $forums as $forum ) {
+			bbp_update_forum_topic_count( $forum->ID );
+		}
+	} else {
+		return array( 2, sprintf( $statement, $result ) );
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recount forum replies
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses get_posts() To get the forums
+ * @uses bbp_update_forum_reply_count() To update the forum reply count
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_forum_reply_count() {
+	global $wpdb;
+
+	$statement = __( 'Counting the number of replies in each forum&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `meta_key` IN ( '_bbp_reply_count', '_bbp_total_reply_count' );";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$forums = get_posts( array( 'post_type' => bbp_get_forum_post_type(), 'numberposts' => -1 ) );
+	if ( !empty( $forums ) ) {
+		foreach( $forums as $forum ) {
+			bbp_update_forum_reply_count( $forum->ID );
+		}
+	} else {
+		return array( 2, sprintf( $statement, $result ) );
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recount topics by the users
+ *
+ * @since bbPress (r3889)
+ *
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_user_topic_count() {
+	global $wpdb;
+
+	$statement   = __( 'Counting the number of topics each user has created&hellip; %s', 'bbpress' );
+	$result      = __( 'Failed!', 'bbpress' );
+	$sql_select  = "SELECT `post_author`, COUNT(DISTINCT `ID`) as `_count` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "' GROUP BY `post_author`;";
+	$insert_rows = $wpdb->get_results( $sql_select );
+
+	if ( is_wp_error( $insert_rows ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$key           = $wpdb->prefix . '_bbp_topic_count';
+	$insert_values = array();
+	foreach ( $insert_rows as $insert_row )
+		$insert_values[] = "('{$insert_row->post_author}', '{$key}', '{$insert_row->_count}')";
+
+	if ( !count( $insert_values ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 3, sprintf( $statement, $result ) );
+
+	foreach ( array_chunk( $insert_values, 10000 ) as $chunk ) {
+		$chunk = "\n" . join( ",\n", $chunk );
+		$sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
+
+		if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
+			return array( 4, sprintf( $statement, $result ) );
+		}
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recount topic replied by the users
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_user_reply_count() {
+	global $wpdb;
+
+	$statement   = __( 'Counting the number of topics to which each user has replied&hellip; %s', 'bbpress' );
+	$result      = __( 'Failed!', 'bbpress' );
+	$sql_select  = "SELECT `post_author`, COUNT(DISTINCT `ID`) as `_count` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_reply_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "' GROUP BY `post_author`;";
+	$insert_rows = $wpdb->get_results( $sql_select );
+
+	if ( is_wp_error( $insert_rows ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$key           = $wpdb->prefix . '_bbp_reply_count';
+	$insert_values = array();
+	foreach ( $insert_rows as $insert_row )
+		$insert_values[] = "('{$insert_row->post_author}', '{$key}', '{$insert_row->_count}')";
+
+	if ( !count( $insert_values ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 3, sprintf( $statement, $result ) );
+
+	foreach ( array_chunk( $insert_values, 10000 ) as $chunk ) {
+		$chunk = "\n" . join( ",\n", $chunk );
+		$sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
+
+		if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
+			return array( 4, sprintf( $statement, $result ) );
+		}
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Clean the users' favorites
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_user_favorites() {
+	global $wpdb;
+
+	$statement = __( 'Removing trashed topics from user favorites&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+	$key       = $wpdb->prefix . '_bbp_favorites';
+	$users     = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `favorites` FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';" );
+
+	if ( is_wp_error( $users ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$topics = $wpdb->get_col( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "';" );
+
+	if ( is_wp_error( $topics ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	$values = array();
+	foreach ( $users as $user ) {
+		if ( empty( $user->favorites ) || !is_string( $user->favorites ) )
+			continue;
+
+		$favorites = array_intersect( $topics, (array) explode( ',', $user->favorites ) );
+		if ( empty( $favorites ) || !is_array( $favorites ) )
+			continue;
+
+		$favorites_joined = join( ',', $favorites );
+		$values[]         = "('{$user->user_id}', '{$key}, '{$favorites_joined}')";
+
+		// Cleanup
+		unset( $favorites, $favorites_joined );
+	}
+
+	if ( !count( $values ) ) {
+		$result = __( 'Nothing to remove!', 'bbpress' );
+		return array( 0, sprintf( $statement, $result ) );
+	}
+
+	$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 4, sprintf( $statement, $result ) );
+
+	foreach ( array_chunk( $values, 10000 ) as $chunk ) {
+		$chunk = "\n" . join( ",\n", $chunk );
+		$sql_insert = "INSERT INTO `$wpdb->usermeta` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
+		if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
+			return array( 5, sprintf( $statement, $result ) );
+		}
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Clean the users' subscriptions
+ *
+ * @since bbPress (r2668)
+ *
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_user_subscriptions() {
+	global $wpdb;
+
+	$statement = __( 'Removing trashed topics from user subscriptions&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+	$key       = $wpdb->prefix . '_bbp_subscriptions';
+	$users     = $wpdb->get_results( "SELECT `user_id`, `meta_value` AS `subscriptions` FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';" );
+
+	if ( is_wp_error( $users ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	$topics = $wpdb->get_col( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` = '" . bbp_get_topic_post_type() . "' AND `post_status` = '" . bbp_get_public_status_id() . "';" );
+	if ( is_wp_error( $topics ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	$values = array();
+	foreach ( $users as $user ) {
+		if ( empty( $user->subscriptions ) || !is_string( $user->subscriptions ) )
+			continue;
+
+		$subscriptions = array_intersect( $topics, (array) explode( ',', $user->subscriptions ) );
+		if ( empty( $subscriptions ) || !is_array( $subscriptions ) )
+			continue;
+
+		$subscriptions_joined = join( ',', $subscriptions );
+		$values[]             = "('{$user->user_id}', '{$key}', '{$subscriptions_joined}')";
+
+		// Cleanup
+		unset( $subscriptions, $subscriptions_joined );
+	}
+
+	if ( !count( $values ) ) {
+		$result = __( 'Nothing to remove!', 'bbpress' );
+		return array( 0, sprintf( $statement, $result ) );
+	}
+
+	$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` = '{$key}';";
+	if ( is_wp_error( $wpdb->query( $sql_delete ) ) )
+		return array( 4, sprintf( $statement, $result ) );
+
+	foreach ( array_chunk( $values, 10000 ) as $chunk ) {
+		$chunk = "\n" . join( ",\n", $chunk );
+		$sql_insert = "INSERT INTO `{$wpdb->usermeta}` (`user_id`, `meta_key`, `meta_value`) VALUES $chunk;";
+		if ( is_wp_error( $wpdb->query( $sql_insert ) ) ) {
+			return array( 5, sprintf( $statement, $result ) );
+		}
+	}
+
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * This repair tool will map each user of the current site to their respective
+ * forums role. By default, Admins will be Key Masters, and every other role
+ * will be the default role defined in Settings > Forums (Participant).
+ *
+ * @since bbPress (r4340)
+ *
+ * @uses bbp_get_user_role_map() To get the map of user roles
+ * @uses get_editable_roles() To get the current WordPress roles
+ * @uses get_users() To get the users of each role (limited to ID field)
+ * @uses bbp_set_user_role() To set each user's forums role
+ */
+function bbp_admin_repair_user_roles() {
+
+	$statement    = __( 'Remapping forum role for each user on this site&hellip; %s', 'bbpress' );
+	$changed      = 0;
+	$role_map     = bbp_get_user_role_map();
+	$default_role = bbp_get_default_role();
+
+	// Bail if no role map exists
+	if ( empty( $role_map ) )
+		return array( 1, sprintf( $statement, __( 'Failed!', 'bbpress' ) ) );
+
+	// Iterate through each role...
+	foreach ( array_keys( get_editable_roles() ) as $role ) {
+
+		// Reset the offset
+		$offset = 0;
+
+		// If no role map exists, give the default forum role (bbp-participant)
+		$new_role = isset( $role_map[$role] ) ? $role_map[$role] : $default_role;
+			
+		// Get users of this site, limited to 1000
+		while ( $users = get_users( array(
+				'role'   => $role,
+				'fields' => 'ID',
+				'number' => 1000,
+				'offset' => $offset
+			) ) ) {
+
+			// Iterate through each user of $role and try to set it
+			foreach ( (array) $users as $user_id ) {
+				if ( bbp_set_user_role( $user_id, $new_role ) ) {
+					++$changed; // Keep a count to display at the end
+				}
+			}
+
+			// Bump the offset for the next query iteration
+			$offset = $offset + 1000;
+		}
+	}
+
+	$result = sprintf( __( 'Complete! %s users updated.', 'bbpress' ), bbp_number_format( $changed ) );
+	return array( 0, sprintf( $statement, $result ) );
+}
+
+/**
+ * Recaches the last post in every topic and forum
+ *
+ * @since bbPress (r3040)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_freshness() {
+	global $wpdb;
+
+	$statement = __( 'Recomputing latest post in every topic and forum&hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	// First, delete everything.
+	if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` IN ( '_bbp_last_reply_id', '_bbp_last_topic_id', '_bbp_last_active_id', '_bbp_last_active_time' );" ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `topic`.`ID`, '_bbp_last_reply_id', MAX( `reply`.`ID` )
+			FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
+			WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
+			GROUP BY `topic`.`ID` );" ) ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	// For any remaining topics, give a reply ID of 0.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `ID`, '_bbp_last_reply_id', 0
+			FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
+			ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_reply_id'
+			WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
+		return array( 3, sprintf( $statement, $result ) );
+
+	// Now we give all the forums with topics the ID their last topic.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `forum`.`ID`, '_bbp_last_topic_id', `topic`.`ID`
+			FROM `$wpdb->posts` AS `forum` INNER JOIN `$wpdb->posts` AS `topic` ON `forum`.`ID` = `topic`.`post_parent`
+			WHERE `topic`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `forum`.`post_type` = 'forum' AND `topic`.`post_type` = 'topic'
+			GROUP BY `forum`.`ID` );" ) ) )
+		return array( 4, sprintf( $statement, $result ) );
+
+	// For any remaining forums, give a topic ID of 0.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `ID`, '_bbp_last_topic_id', 0
+			FROM `$wpdb->posts` AS `forum` LEFT JOIN `$wpdb->postmeta` AS `topic`
+			ON `forum`.`ID` = `topic`.`post_id` AND `topic`.`meta_key` = '_bbp_last_topic_id'
+			WHERE `topic`.`meta_id` IS NULL AND `forum`.`post_type` = 'forum' );" ) ) )
+		return array( 5, sprintf( $statement, $result ) );
+
+	// After that, we give all the topics with replies the ID their last reply (again, this time for a different reason).
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `topic`.`ID`, '_bbp_last_active_id', MAX( `reply`.`ID` )
+			FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
+			WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
+			GROUP BY `topic`.`ID` );" ) ) )
+		return array( 6, sprintf( $statement, $result ) );
+
+	// For any remaining topics, give a reply ID of themself.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `ID`, '_bbp_last_active_id', `ID`
+			FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
+			ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_id'
+			WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
+		return array( 7, sprintf( $statement, $result ) );
+
+	// Give topics with replies their last update time.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `topic`.`ID`, '_bbp_last_active_time', MAX( `reply`.`post_date` )
+			FROM `$wpdb->posts` AS `topic` INNER JOIN `$wpdb->posts` AS `reply` ON `topic`.`ID` = `reply`.`post_parent`
+			WHERE `reply`.`post_status` IN ( '" . bbp_get_public_status_id() . "' ) AND `topic`.`post_type` = 'topic' AND `reply`.`post_type` = 'reply'
+			GROUP BY `topic`.`ID` );" ) ) )
+		return array( 8, sprintf( $statement, $result ) );
+
+	// Give topics without replies their last update time.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `ID`, '_bbp_last_active_time', `post_date`
+			FROM `$wpdb->posts` AS `topic` LEFT JOIN `$wpdb->postmeta` AS `reply`
+			ON `topic`.`ID` = `reply`.`post_id` AND `reply`.`meta_key` = '_bbp_last_active_time'
+			WHERE `reply`.`meta_id` IS NULL AND `topic`.`post_type` = 'topic' );" ) ) )
+		return array( 9, sprintf( $statement, $result ) );
+
+	// Forums need to know what their last active item is as well. Now it gets a bit more complex to do in the database.
+	$forums = $wpdb->get_col( "SELECT `ID` FROM `$wpdb->posts` WHERE `post_type` = 'forum' and `post_status` != 'auto-draft';" );
+	if ( is_wp_error( $forums ) )
+		return array( 10, sprintf( $statement, $result ) );
+
+ 	// Loop through forums
+ 	foreach ( $forums as $forum_id ) {
+		if ( !bbp_is_forum_category( $forum_id ) ) {
+			bbp_update_forum( array( 'forum_id' => $forum_id ) );
+		}
+	}
+
+	// Loop through categories when forums are done
+	foreach ( $forums as $forum_id ) {
+		if ( bbp_is_forum_category( $forum_id ) ) {
+			bbp_update_forum( array( 'forum_id' => $forum_id ) );
+		}
+	}
+
+	// Complete results
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recaches the private and hidden forums
+ *
+ * @since bbPress (r4104)
+ *
+ * @uses delete_option() to delete private and hidden forum pointers
+ * @uses WP_Query() To query post IDs
+ * @uses is_wp_error() To return if error occurred
+ * @uses update_option() To update the private and hidden post ID pointers
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_forum_visibility() {
+
+	$statement = __( 'Recalculating forum visibility &hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	// First, delete everything.
+	delete_option( '_bbp_private_forums' );
+	delete_option( '_bbp_hidden_forums'  );
+
+	// Next, get all the private and hidden forums
+	$private_forums = new WP_Query( array(
+		'suppress_filters' => true,
+		'nopaging'         => true,
+		'post_type'        => bbp_get_forum_post_type(),
+		'post_status'      => bbp_get_private_status_id(),
+		'fields'           => 'ids'
+	) );
+	$hidden_forums = new WP_Query( array(
+		'suppress_filters' => true,
+		'nopaging'         => true,
+		'post_type'        => bbp_get_forum_post_type(),
+		'post_status'      => bbp_get_hidden_status_id(),
+		'fields'           => 'ids'
+	) );
+
+	// Bail if queries returned errors
+	if ( is_wp_error( $private_forums ) || is_wp_error( $hidden_forums ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	update_option( '_bbp_private_forums', $private_forums->posts ); // Private forums
+	update_option( '_bbp_hidden_forums',  $hidden_forums->posts  ); // Hidden forums
+
+	// Reset the $post global
+	wp_reset_postdata();
+
+	// Complete results
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recaches the forum for each post
+ *
+ * @since bbPress (r3876)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_forum_meta() {
+	global $wpdb;
+
+	$statement = __( 'Recalculating the forum for each post &hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	// First, delete everything.
+	if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` = '_bbp_forum_id';" ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `forum`.`ID`, '_bbp_forum_id', `forum`.`post_parent`
+			FROM `$wpdb->posts`
+				AS `forum`
+			WHERE `forum`.`post_type` = 'forum'
+			GROUP BY `forum`.`ID` );" ) ) )
+		return array( 2, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `topic`.`ID`, '_bbp_forum_id', `topic`.`post_parent`
+			FROM `$wpdb->posts`
+				AS `topic`
+			WHERE `topic`.`post_type` = 'topic'
+			GROUP BY `topic`.`ID` );" ) ) )
+		return array( 3, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `reply`.`ID`, '_bbp_forum_id', `topic`.`post_parent`
+			FROM `$wpdb->posts`
+				AS `reply`
+			INNER JOIN `$wpdb->posts`
+				AS `topic`
+				ON `reply`.`post_parent` = `topic`.`ID`
+			WHERE `topic`.`post_type` = 'topic'
+				AND `reply`.`post_type` = 'reply'
+			GROUP BY `reply`.`ID` );" ) ) )
+		return array( 4, sprintf( $statement, $result ) );
+
+	// Complete results
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/**
+ * Recaches the topic for each post
+ *
+ * @since bbPress (r3876)
+ *
+ * @uses wpdb::query() To run our recount sql queries
+ * @uses is_wp_error() To check if the executed query returned {@link WP_Error}
+ * @return array An array of the status code and the message
+ */
+function bbp_admin_repair_topic_meta() {
+	global $wpdb;
+
+	$statement = __( 'Recalculating the topic for each post &hellip; %s', 'bbpress' );
+	$result    = __( 'Failed!', 'bbpress' );
+
+	// First, delete everything.
+	if ( is_wp_error( $wpdb->query( "DELETE FROM `$wpdb->postmeta` WHERE `meta_key` = '_bbp_topic_id';" ) ) )
+		return array( 1, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `topic`.`ID`, '_bbp_topic_id', `topic`.`ID`
+			FROM `$wpdb->posts`
+				AS `topic`
+			WHERE `topic`.`post_type` = 'topic'
+			GROUP BY `topic`.`ID` );" ) ) )
+		return array( 3, sprintf( $statement, $result ) );
+
+	// Next, give all the topics with replies the ID their last reply.
+	if ( is_wp_error( $wpdb->query( "INSERT INTO `$wpdb->postmeta` (`post_id`, `meta_key`, `meta_value`)
+			( SELECT `reply`.`ID`, '_bbp_topic_id', `topic`.`ID`
+			FROM `$wpdb->posts`
+				AS `reply`
+			INNER JOIN `$wpdb->posts`
+				AS `topic`
+				ON `reply`.`post_parent` = `topic`.`ID`
+			WHERE `topic`.`post_type` = 'topic'
+				AND `reply`.`post_type` = 'reply'
+			GROUP BY `reply`.`ID` );" ) ) )
+		return array( 4, sprintf( $statement, $result ) );
+
+	// Complete results
+	return array( 0, sprintf( $statement, __( 'Complete!', 'bbpress' ) ) );
+}
+
+/** Reset ********************************************************************/
+
+/**
+ * Admin reset page
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses check_admin_referer() To verify the nonce and the referer
+ * @uses do_action() Calls 'admin_notices' to display the notices
+ * @uses screen_icon() To display the screen icon
+ * @uses wp_nonce_field() To add a hidden nonce field
+ */
+function bbp_admin_reset() {
+?>
+
+	<div class="wrap">
+
+		<?php screen_icon( 'tools' ); ?>
+
+		<h2 class="nav-tab-wrapper"><?php bbp_tools_admin_tabs( __( 'Reset Forums', 'bbpress' ) ); ?></h2>
+		<p><?php _e( 'This will revert your forums back to a brand new installation. This process cannot be undone. <strong>Backup your database before proceeding</strong>.', 'bbpress' ); ?></p>
+
+		<form class="settings" method="post" action="">
+			<table class="form-table">
+				<tbody>
+					<tr valign="top">
+						<th scope="row"><?php _e( 'The following data will be removed:', 'bbpress' ) ?></th>
+						<td>
+							<?php _e( 'All Forums',           'bbpress' ); ?><br />
+							<?php _e( 'All Topics',           'bbpress' ); ?><br />
+							<?php _e( 'All Replies',          'bbpress' ); ?><br />
+							<?php _e( 'All Topic Tags',       'bbpress' ); ?><br />
+							<?php _e( 'Related Meta Data',    'bbpress' ); ?><br />
+							<?php _e( 'Forum Settings',       'bbpress' ); ?><br />
+							<?php _e( 'Forum Activity',       'bbpress' ); ?><br />
+							<?php _e( 'Forum User Roles',     'bbpress' ); ?><br />
+							<?php _e( 'Importer Helper Data', 'bbpress' ); ?><br />
+						</td>
+					</tr>
+					<tr valign="top">
+						<th scope="row"><?php _e( 'Are you sure you want to do this?', 'bbpress' ) ?></th>
+						<td>
+							<fieldset>
+								<legend class="screen-reader-text"><span><?php _e( "Say it ain't so!", 'bbpress' ) ?></span></legend>
+								<label><input type="checkbox" class="checkbox" name="bbpress-are-you-sure" id="bbpress-are-you-sure" value="1" /> <?php _e( 'This process cannot be undone.', 'bbpress' ); ?></label>
+							</fieldset>
+						</td>
+					</tr>
+				</tbody>
+			</table>
+
+			<fieldset class="submit">
+				<input class="button-primary" type="submit" name="submit" value="<?php esc_attr_e( 'Reset bbPress', 'bbpress' ); ?>" />
+				<?php wp_nonce_field( 'bbpress-reset' ); ?>
+			</fieldset>
+		</form>
+	</div>
+
+<?php
+}
+
+/**
+ * Handle the processing and feedback of the admin tools page
+ *
+ * @since bbPress (r2613)
+ *
+ * @uses check_admin_referer() To verify the nonce and the referer
+ * @uses wp_cache_flush() To flush the cache
+ */
+function bbp_admin_reset_handler() {
+	if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && !empty( $_POST['bbpress-are-you-sure'] ) ) {
+		check_admin_referer( 'bbpress-reset' );
+
+		global $wpdb;
+
+		// Stores messages
+		$messages = array();
+		$failed   = __( 'Failed',   'bbpress' );
+		$success  = __( 'Success!', 'bbpress' );
+
+		// Flush the cache; things are about to get ugly.
+		wp_cache_flush();
+
+		/** Posts *************************************************************/
+
+		$statement  = __( 'Deleting Posts&hellip; %s', 'bbpress' );
+		$sql_posts  = $wpdb->get_results( "SELECT `ID` FROM `{$wpdb->posts}` WHERE `post_type` IN ('forum', 'topic', 'reply')", OBJECT_K );
+		$sql_delete = "DELETE FROM `{$wpdb->posts}` WHERE `post_type` IN ('forum', 'topic', 'reply')";
+		$result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
+		$messages[] = sprintf( $statement, $result );
+
+
+		/** Post Meta *********************************************************/
+
+		if ( !empty( $sql_posts ) ) {
+			foreach( $sql_posts as $key => $value ) {
+				$sql_meta[] = $key;
+			}
+			$statement  = __( 'Deleting Post Meta&hellip; %s', 'bbpress' );
+			$sql_meta   = implode( "', '", $sql_meta );
+			$sql_delete = "DELETE FROM `{$wpdb->postmeta}` WHERE `post_id` IN ('{$sql_meta}');";
+			$result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
+			$messages[] = sprintf( $statement, $result );
+		}
+
+		/** Topic Tags ********************************************************/
+
+		// @todo
+
+		/** User Meta *********************************************************/
+
+		$statement  = __( 'Deleting User Meta&hellip; %s', 'bbpress' );
+		$sql_delete = "DELETE FROM `{$wpdb->usermeta}` WHERE `meta_key` LIKE '%%_bbp_%%';";
+		$result     = is_wp_error( $wpdb->query( $sql_delete ) ) ? $failed : $success;
+		$messages[] = sprintf( $statement, $result );
+
+		/** Converter *********************************************************/
+
+		$statement  = __( 'Deleting Conversion Table&hellip; %s', 'bbpress' );
+		$table_name = $wpdb->prefix . 'bbp_converter_translator';
+		if ( $wpdb->get_var( "SHOW TABLES LIKE '{$table_name}'" ) == $table_name ) {
+			$wpdb->query( "DROP TABLE {$table_name}" );
+			$result = $success;
+		} else {
+			$result = $failed;
+		}
+		$messages[] = sprintf( $statement, $result );
+
+		/** Options ***********************************************************/
+
+		$statement  = __( 'Deleting Settings&hellip; %s', 'bbpress' );
+		$sql_delete = bbp_delete_options();
+		$messages[] = sprintf( $statement, $success );
+
+		/** Roles *************************************************************/
+
+		$statement  = __( 'Deleting Roles and Capabilities&hellip; %s', 'bbpress' );
+		$sql_delete = bbp_remove_roles();
+		$sql_delete = bbp_remove_caps();
+		$messages[] = sprintf( $statement, $success );
+
+		/** Output ************************************************************/
+
+		if ( count( $messages ) ) {
+			foreach ( $messages as $message ) {
+				bbp_admin_tools_feedback( $message );
+			}
+		}
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/topics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1027 @@
+<?php
+
+/**
+ * bbPress Topics Admin Class
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Topics_Admin' ) ) :
+/**
+ * Loads bbPress topics admin area
+ *
+ * @package bbPress
+ * @subpackage Administration
+ * @since bbPress (r2464)
+ */
+class BBP_Topics_Admin {
+
+	/** Variables *************************************************************/
+
+	/**
+	 * @var The post type of this admin component
+	 */
+	private $post_type = '';
+
+	/** Functions *************************************************************/
+
+	/**
+	 * The main bbPress topics admin loader
+	 *
+	 * @since bbPress (r2515)
+	 *
+	 * @uses BBP_Topics_Admin::setup_globals() Setup the globals needed
+	 * @uses BBP_Topics_Admin::setup_actions() Setup the hooks and actions
+	 * @uses BBP_Topics_Admin::setup_help() Setup the help text
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the admin hooks, actions and filters
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 * @uses add_filter() To add various filters
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 */
+	private function setup_actions() {
+
+		// Add some general styling to the admin area
+		add_action( 'bbp_admin_head',        array( $this, 'admin_head'       ) );
+
+		// Messages
+		add_filter( 'post_updated_messages', array( $this, 'updated_messages' ) );
+
+		// Topic column headers.
+		add_filter( 'manage_' . $this->post_type . '_posts_columns',        array( $this, 'topics_column_headers' ) );
+
+		// Topic columns (in post row)
+		add_action( 'manage_' . $this->post_type . '_posts_custom_column',  array( $this, 'topics_column_data' ), 10, 2 );
+		add_filter( 'post_row_actions',                                     array( $this, 'topics_row_actions' ), 10, 2 );
+
+		// Topic metabox actions
+		add_action( 'add_meta_boxes', array( $this, 'attributes_metabox'      ) );
+		add_action( 'save_post',      array( $this, 'attributes_metabox_save' ) );
+
+		// Check if there are any bbp_toggle_topic_* requests on admin_init, also have a message displayed
+		add_action( 'load-edit.php',  array( $this, 'toggle_topic'        ) );
+		add_action( 'admin_notices',  array( $this, 'toggle_topic_notice' ) );
+
+		// Anonymous metabox actions
+		add_action( 'add_meta_boxes', array( $this, 'author_metabox'      ) );
+		add_action( 'save_post',      array( $this, 'author_metabox_save' ) );
+
+		// Add ability to filter topics and replies per forum
+		add_filter( 'restrict_manage_posts', array( $this, 'filter_dropdown'  ) );
+		add_filter( 'bbp_request',           array( $this, 'filter_post_rows' ) );
+
+		// Contextual Help
+		add_action( 'load-edit.php',     array( $this, 'edit_help' ) );
+		add_action( 'load-post-new.php', array( $this, 'new_help'  ) );
+	}
+
+	/**
+	 * Should we bail out of this method?
+	 *
+	 * @since bbPress (r4067)
+	 * @return boolean
+	 */
+	private function bail() {
+		if ( !isset( get_current_screen()->post_type ) || ( $this->post_type != get_current_screen()->post_type ) )
+			return true;
+
+		return false;
+	}
+
+	/**
+	 * Admin globals
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 */
+	private function setup_globals() {
+		$this->post_type = bbp_get_topic_post_type();
+	}
+
+	/** Contextual Help *******************************************************/
+
+	/**
+	 * Contextual help for bbPress topic edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function edit_help() {
+
+		if ( $this->bail() ) return;
+
+		// Overview
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'overview',
+			'title'		=> __( 'Overview', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'This screen displays the individual topics on your site. You can customize the display of this screen to suit your workflow.', 'bbpress' ) . '</p>'
+		) );
+
+		// Screen Content
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'screen-content',
+			'title'		=> __( 'Screen Content', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can customize the display of this screen&#8217;s contents in a number of ways:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( 'You can hide/display columns based on your needs and decide how many topics to list per screen using the Screen Options tab.',                                                                                                                                'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can filter the list of topics by topic status using the text links in the upper left to show All, Published, or Trashed topics. The default view is to show all topics.',                                                                                 'bbpress' ) . '</li>' .
+					'<li>' . __( 'You can refine the list to show only topics from a specific month by using the dropdown menus above the topics list. Click the Filter button after making your selection. You also can refine the list by clicking on the topic creator in the topics list.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Available Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'action-links',
+			'title'		=> __( 'Available Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'Hovering over a row in the topics list will display action links that allow you to manage your topic. You can perform the following actions:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Edit</strong> takes you to the editing screen for that topic. You can also reach that screen by clicking on the topic title.',                                                                                 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Trash</strong> removes your topic from this list and places it in the trash, from which you can permanently delete it.',                                                                                       'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Spam</strong> removes your topic from this list and places it in the spam queue, from which you can permanently delete it.',                                                                                   'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Preview</strong> will show you what your draft topic will look like if you publish it. View will take you to your live site to view the topic. Which link is available depends on your topic&#8217;s status.', 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Close</strong> will mark the selected topic as &#8217;closed&#8217; and disable the option to post new replies to the topic.',                                                                                 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Stick</strong> will keep the selected topic &#8217;pinned&#8217; to the top the parent forum topic list.',                                                                                                     'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Stick <em>(to front)</em></strong> will keep the selected topic &#8217;pinned&#8217; to the top of ALL forums and be visable in any forums topics list.',                                                      'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		// Bulk Actions
+		get_current_screen()->add_help_tab( array(
+			'id'		=> 'bulk-actions',
+			'title'		=> __( 'Bulk Actions', 'bbpress' ),
+			'content'	=>
+				'<p>' . __( 'You can also edit or move multiple topics to the trash at once. Select the topics you want to act on using the checkboxes, then select the action you want to take from the Bulk Actions menu and click Apply.',           'bbpress' ) . '</p>' .
+				'<p>' . __( 'When using Bulk Edit, you can change the metadata (categories, author, etc.) for all selected topics at once. To remove a topic from the grouping, just click the x next to its name in the Bulk Edit area that appears.', 'bbpress' ) . '</p>'
+		) );
+
+		// Help Sidebar
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',     'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>',  'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Contextual help for bbPress topic edit page
+	 *
+	 * @since bbPress (r3119)
+	 * @uses get_current_screen()
+	 */
+	public function new_help() {
+
+		if ( $this->bail() ) return;
+
+		$customize_display = '<p>' . __( 'The title field and the big topic editing Area are fixed in place, but you can reposition all the other boxes using drag and drop, and can minimize or expand them by clicking the title bar of each box. Use the Screen Options tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, Discussion, Slug, Author) or to choose a 1- or 2-column layout for this screen.', 'bbpress' ) . '</p>';
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'customize-display',
+			'title'   => __( 'Customizing This Display', 'bbpress' ),
+			'content' => $customize_display,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'title-topic-editor',
+			'title'   => __( 'Title and Topic Editor', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Title</strong> - Enter a title for your topic. After you enter a title, you&#8217;ll see the permalink below, which you can edit.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Topic Editor</strong> - Enter the text for your topic. There are two modes of editing: Visual and HTML. Choose the mode by clicking on the appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon in the row to get a second row of controls. The HTML mode allows you to enter raw HTML along with your topic text. You can insert media files by clicking the icons above the topic editor and following the directions. You can go to the distraction-free writing screen via the Fullscreen icon in Visual mode (second to last in the top row) or the Fullscreen button in HTML mode (last in the row). Once there, you can make buttons visible by hovering over the top area. Exit Fullscreen back to the regular topic editor.', 'bbpress' ) . '</p>'
+		) );
+
+		$publish_box = '<p>' . __( '<strong>Publish</strong> - You can set the terms of publishing your topic in the Publish box. For Status, Visibility, and Publish (immediately), click on the Edit link to reveal more options. Visibility includes options for password-protecting a topic or making it stay at the top of your blog indefinitely (sticky). Publish (immediately) allows you to set a future or past date and time, so you can schedule a topic to be published in the future or backdate a topic.', 'bbpress' ) . '</p>';
+
+		if ( current_theme_supports( 'topic-formats' ) && topic_type_supports( 'topic', 'topic-formats' ) ) {
+			$publish_box .= '<p>' . __( '<strong>topic Format</strong> - This designates how your theme will display a specific topic. For example, you could have a <em>standard</em> blog topic with a title and paragraphs, or a short <em>aside</em> that omits the title and contains a short text blurb. Please refer to the Codex for <a href="http://codex.wordpress.org/Post_Formats#Supported_Formats">descriptions of each topic format</a>. Your theme could enable all or some of 10 possible formats.', 'bbpress' ) . '</p>';
+		}
+
+		if ( current_theme_supports( 'topic-thumbnails' ) && topic_type_supports( 'topic', 'thumbnail' ) ) {
+			$publish_box .= '<p>' . __( '<strong>Featured Image</strong> - This allows you to associate an image with your topic without inserting it. This is usually useful only if your theme makes use of the featured image as a topic thumbnail on the home page, a custom header, etc.', 'bbpress' ) . '</p>';
+		}
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'topic-attributes',
+			'title'   => __( 'Topic Attributes', 'bbpress' ),
+			'content' =>
+				'<p>' . __( 'Select the attributes that your topic should have:', 'bbpress' ) . '</p>' .
+				'<ul>' .
+					'<li>' . __( '<strong>Forum</strong> dropdown determines the parent forum that the topic belongs to. Select the forum or category from the dropdown, or leave the default (No Forum) to post the topic without an assigned forum.', 'bbpress' ) . '</li>' .
+					'<li>' . __( '<strong>Topic Type</strong> dropdown indicates the sticky status of the topic. Selecting the super sticky option would stick the topic to the front of your forums, i.e. the topic index, sticky option would stick the topic to its respective forum. Selecting normal would not stick the topic anywhere.', 'bbpress' ) . '</li>' .
+				'</ul>'
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'publish-box',
+			'title'   => __( 'Publish Box', 'bbpress' ),
+			'content' => $publish_box,
+		) );
+
+		get_current_screen()->add_help_tab( array(
+			'id'      => 'discussion-settings',
+			'title'   => __( 'Discussion Settings', 'bbpress' ),
+			'content' =>
+				'<p>' . __( '<strong>Send Trackbacks</strong> - Trackbacks are a way to notify legacy blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to send trackbacks. If you link to other WordPress sites they&#8217;ll be notified automatically using pingbacks, and this field is unnecessary.', 'bbpress' ) . '</p>' .
+				'<p>' . __( '<strong>Discussion</strong> - You can turn comments and pings on or off, and if there are comments on the topic, you can see them here and moderate them.', 'bbpress' ) . '</p>'
+		) );
+
+		get_current_screen()->set_help_sidebar(
+			'<p><strong>' . __( 'For more information:', 'bbpress' ) . '</strong></p>' .
+			'<p>' . __( '<a href="http://codex.bbpress.org" target="_blank">bbPress Documentation</a>',    'bbpress' ) . '</p>' .
+			'<p>' . __( '<a href="http://bbpress.org/forums/" target="_blank">bbPress Support Forums</a>', 'bbpress' ) . '</p>'
+		);
+	}
+
+	/**
+	 * Add the topic attributes metabox
+	 *
+	 * @since bbPress (r2744)
+	 *
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses add_meta_box() To add the metabox
+	 * @uses do_action() Calls 'bbp_topic_attributes_metabox'
+	 */
+	public function attributes_metabox() {
+
+		if ( $this->bail() ) return;
+
+		add_meta_box (
+			'bbp_topic_attributes',
+			__( 'Topic Attributes', 'bbpress' ),
+			'bbp_topic_metabox',
+			$this->post_type,
+			'side',
+			'high'
+		);
+
+		do_action( 'bbp_topic_attributes_metabox' );
+	}
+
+	/**
+	 * Pass the topic attributes for processing
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param int $topic_id Topic id
+	 * @uses current_user_can() To check if the current user is capable of
+	 *                           editing the topic
+	 * @uses do_action() Calls 'bbp_topic_attributes_metabox_save' with the
+	 *                    topic id and parent id
+	 * @return int Parent id
+	 */
+	public function attributes_metabox_save( $topic_id ) {
+
+		if ( $this->bail() ) return $topic_id;
+
+		// Bail if doing an autosave
+		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
+			return $topic_id;
+
+		// Bail if not a post request
+		if ( 'POST' != strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return $topic_id;
+
+		// Nonce check
+		if ( empty( $_POST['bbp_topic_metabox'] ) || !wp_verify_nonce( $_POST['bbp_topic_metabox'], 'bbp_topic_metabox_save' ) )
+			return $topic_id;
+
+		// Bail if current user cannot edit this topic
+		if ( !current_user_can( 'edit_topic', $topic_id ) )
+			return $topic_id;
+
+		// Get the forum ID
+		$forum_id = !empty( $_POST['parent_id'] ) ? (int) $_POST['parent_id'] : 0;
+
+		// Formally update the topic
+		bbp_update_topic( $topic_id, $forum_id );
+
+		// Stickies
+		if ( !empty( $_POST['bbp_stick_topic'] ) && in_array( $_POST['bbp_stick_topic'], array( 'stick', 'super', 'unstick' ) ) ) {
+
+			// What's the haps?
+			switch ( $_POST['bbp_stick_topic'] ) {
+
+				// Sticky in this forum
+				case 'stick'   :
+					bbp_stick_topic( $topic_id );
+					break;
+
+				// Super sticky in all forums
+				case 'super'   :
+					bbp_stick_topic( $topic_id, true );
+					break;
+
+				// Normal
+				case 'unstick' :
+				default        :
+					bbp_unstick_topic( $topic_id );
+					break;
+			}
+		}
+
+		// Allow other fun things to happen
+		do_action( 'bbp_topic_attributes_metabox_save', $topic_id, $forum_id );
+
+		return $topic_id;
+	}
+
+	/**
+	 * Add the author info metabox
+	 *
+	 * @since bbPress (r2828)
+	 *
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses add_meta_box() To add the metabox
+	 * @uses do_action() Calls 'bbp_author_metabox' with the topic/reply
+	 *                    id
+	 */
+	public function author_metabox() {
+
+		if ( $this->bail() ) return;
+
+		// Bail if post_type is not a topic
+		if ( empty( $_GET['action'] ) || ( 'edit' != $_GET['action'] ) )
+			return;
+
+		// Add the metabox
+		add_meta_box(
+			'bbp_author_metabox',
+			__( 'Author Information', 'bbpress' ),
+			'bbp_author_metabox',
+			$this->post_type,
+			'side',
+			'high'
+		);
+
+		do_action( 'bbp_author_metabox', get_the_ID() );
+	}
+
+	/**
+	 * Save the author information for the topic
+	 *
+	 * @since bbPress (r2828)
+	 *
+	 * @param int $post_id Topic or reply id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           topic or reply
+	 * @uses bbp_filter_author_post_data() To filter the author data
+	 * @uses update_post_meta() To update the anonymous user data
+	 * @uses do_action() Calls 'bbp_author_metabox_save' with the topic id and
+	 *                    anonymous data
+	 * @return int Topic or reply id
+	 */
+	public function author_metabox_save( $post_id ) {
+
+		if ( $this->bail() ) return $post_id;
+
+		// Bail if no post_id
+		if ( empty( $post_id ) )
+			return $post_id;
+
+		// Bail if doing an autosave
+		if ( defined( 'DOING_AUTOSAVE' ) && DOING_AUTOSAVE )
+			return $post_id;
+
+		// Bail if not a post request
+		if ( 'POST' != strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return $post_id;
+
+		// Bail if user cannot edit topics
+		if ( !current_user_can( 'edit_topic', $post_id ) )
+			return $post_id;
+
+		$anonymous_data = bbp_filter_anonymous_post_data();
+
+		update_post_meta( $post_id, '_bbp_anonymous_name',    $anonymous_data['bbp_anonymous_name']    );
+		update_post_meta( $post_id, '_bbp_anonymous_email',   $anonymous_data['bbp_anonymous_email']   );
+		update_post_meta( $post_id, '_bbp_anonymous_website', $anonymous_data['bbp_anonymous_website'] );
+
+		do_action( 'bbp_author_metabox_save', $post_id, $anonymous_data );
+
+		return $post_id;
+	}
+
+	/**
+	 * Add some general styling to the admin area
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses sanitize_html_class() To sanitize the classes
+	 * @uses do_action() Calls 'bbp_admin_head'
+	 */
+	public function admin_head() {
+
+		if ( $this->bail() ) return;
+
+		?>
+
+		<style type="text/css" media="screen">
+		/*<![CDATA[*/
+
+			strong.label {
+				display: inline-block;
+				width: 60px;
+			}
+
+			.column-bbp_forum_topic_count,
+			.column-bbp_forum_reply_count,
+			.column-bbp_topic_reply_count,
+			.column-bbp_topic_voice_count {
+				width: 8% !important;
+			}
+
+			.column-author,
+			.column-bbp_reply_author,
+			.column-bbp_topic_author {
+				width: 10% !important;
+			}
+
+			.column-bbp_topic_forum,
+			.column-bbp_reply_forum,
+			.column-bbp_reply_topic {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_freshness,
+			.column-bbp_topic_freshness {
+				width: 10% !important;
+			}
+
+			.column-bbp_forum_created,
+			.column-bbp_topic_created,
+			.column-bbp_reply_created {
+				width: 15% !important;
+			}
+
+			.status-closed {
+				background-color: #eaeaea;
+			}
+
+			.status-spam {
+				background-color: #faeaea;
+			}
+
+		/*]]>*/
+		</style>
+
+		<?php
+	}
+
+	/**
+	 * Toggle topic
+	 *
+	 * Handles the admin-side opening/closing, sticking/unsticking and
+	 * spamming/unspamming of topics
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the user is capable of editing
+	 *                           the topic
+	 * @uses wp_die() To die if the user isn't capable or the post wasn't
+	 *                 found
+	 * @uses check_admin_referer() To verify the nonce and check referer
+	 * @uses bbp_is_topic_open() To check if the topic is open
+	 * @uses bbp_close_topic() To close the topic
+	 * @uses bbp_open_topic() To open the topic
+	 * @uses bbp_is_topic_sticky() To check if the topic is a sticky or
+	 *                              super sticky
+	 * @uses bbp_unstick_topic() To unstick the topic
+	 * @uses bbp_stick_topic() To stick the topic
+	 * @uses bbp_is_topic_spam() To check if the topic is marked as spam
+	 * @uses bbp_unspam_topic() To unmark the topic as spam
+	 * @uses bbp_spam_topic() To mark the topic as spam
+	 * @uses do_action() Calls 'bbp_toggle_topic_admin' with success, post
+	 *                    data, action and message
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_safe_redirect() Redirect the page to custom url
+	 */
+	public function toggle_topic() {
+
+		if ( $this->bail() ) return;
+
+		// Only proceed if GET is a topic toggle action
+		if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['action'] ) && in_array( $_GET['action'], array( 'bbp_toggle_topic_close', 'bbp_toggle_topic_stick', 'bbp_toggle_topic_spam' ) ) && !empty( $_GET['topic_id'] ) ) {
+			$action    = $_GET['action'];            // What action is taking place?
+			$topic_id  = (int) $_GET['topic_id'];    // What's the topic id?
+			$success   = false;                      // Flag
+			$post_data = array( 'ID' => $topic_id ); // Prelim array
+			$topic     = bbp_get_topic( $topic_id );
+
+			// Bail if topic is missing
+			if ( empty( $topic ) )
+				wp_die( __( 'The topic was not found!', 'bbpress' ) );
+
+			if ( !current_user_can( 'moderate', $topic->ID ) ) // What is the user doing here?
+				wp_die( __( 'You do not have the permission to do that!', 'bbpress' ) );
+
+			switch ( $action ) {
+				case 'bbp_toggle_topic_close' :
+					check_admin_referer( 'close-topic_' . $topic_id );
+
+					$is_open = bbp_is_topic_open( $topic_id );
+					$message = true == $is_open ? 'closed' : 'opened';
+					$success = true == $is_open ? bbp_close_topic( $topic_id ) : bbp_open_topic( $topic_id );
+
+					break;
+
+				case 'bbp_toggle_topic_stick' :
+					check_admin_referer( 'stick-topic_' . $topic_id );
+
+					$is_sticky = bbp_is_topic_sticky( $topic_id );
+					$is_super  = ( empty( $is_sticky ) && !empty( $_GET['super'] ) && 1 == (int) $_GET['super'] ) ? true : false;
+					$message   = true == $is_sticky ? 'unsticked'     : 'sticked';
+					$message   = true == $is_super  ? 'super_sticked' : $message;
+					$success   = true == $is_sticky ? bbp_unstick_topic( $topic_id ) : bbp_stick_topic( $topic_id, $is_super );
+
+					break;
+
+				case 'bbp_toggle_topic_spam'  :
+					check_admin_referer( 'spam-topic_' . $topic_id );
+
+					$is_spam = bbp_is_topic_spam( $topic_id );
+					$message = true == $is_spam ? 'unspammed' : 'spammed';
+					$success = true == $is_spam ? bbp_unspam_topic( $topic_id ) : bbp_spam_topic( $topic_id );
+
+					break;
+			}
+
+			$message = array( 'bbp_topic_toggle_notice' => $message, 'topic_id' => $topic->ID );
+
+			if ( false == $success || is_wp_error( $success ) )
+				$message['failed'] = '1';
+
+			// Do additional topic toggle actions (admin side)
+			do_action( 'bbp_toggle_topic_admin', $success, $post_data, $action, $message );
+
+			// Redirect back to the topic
+			$redirect = add_query_arg( $message, remove_query_arg( array( 'action', 'topic_id' ) ) );
+			wp_safe_redirect( $redirect );
+
+			// For good measure
+			exit();
+		}
+	}
+
+	/**
+	 * Toggle topic notices
+	 *
+	 * Display the success/error notices from
+	 * {@link BBP_Admin::toggle_topic()}
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_topic_title() To get the topic title of the topic
+	 * @uses esc_html() To sanitize the topic title
+	 * @uses apply_filters() Calls 'bbp_toggle_topic_notice_admin' with
+	 *                        message, topic id, notice and is it a failure
+	 */
+	public function toggle_topic_notice() {
+
+		if ( $this->bail() ) return;
+
+		// Only proceed if GET is a topic toggle action
+		if ( 'GET' == $_SERVER['REQUEST_METHOD'] && !empty( $_GET['bbp_topic_toggle_notice'] ) && in_array( $_GET['bbp_topic_toggle_notice'], array( 'opened', 'closed', 'super_sticked', 'sticked', 'unsticked', 'spammed', 'unspammed' ) ) && !empty( $_GET['topic_id'] ) ) {
+			$notice     = $_GET['bbp_topic_toggle_notice'];         // Which notice?
+			$topic_id   = (int) $_GET['topic_id'];                  // What's the topic id?
+			$is_failure = !empty( $_GET['failed'] ) ? true : false; // Was that a failure?
+
+			// Bais if no topic_id or notice
+			if ( empty( $notice ) || empty( $topic_id ) )
+				return;
+
+			// Bail if topic is missing
+			$topic = bbp_get_topic( $topic_id );
+			if ( empty( $topic ) )
+				return;
+
+			$topic_title = esc_html( bbp_get_topic_title( $topic->ID ) );
+
+			switch ( $notice ) {
+				case 'opened'    :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem opening the topic "%1$s".',           'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully opened.',           'bbpress' ), $topic_title );
+					break;
+
+				case 'closed'    :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem closing the topic "%1$s".',           'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully closed.',           'bbpress' ), $topic_title );
+					break;
+
+				case 'super_sticked' :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem sticking the topic "%1$s" to front.', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully sticked to front.', 'bbpress' ), $topic_title );
+					break;
+
+				case 'sticked'   :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem sticking the topic "%1$s".',          'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully sticked.',          'bbpress' ), $topic_title );
+					break;
+
+				case 'unsticked' :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem unsticking the topic "%1$s".',        'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully unsticked.',        'bbpress' ), $topic_title );
+					break;
+
+				case 'spammed'   :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem marking the topic "%1$s" as spam.',   'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully marked as spam.',   'bbpress' ), $topic_title );
+					break;
+
+				case 'unspammed' :
+					$message = $is_failure == true ? sprintf( __( 'There was a problem unmarking the topic "%1$s" as spam.', 'bbpress' ), $topic_title ) : sprintf( __( 'Topic "%1$s" successfully unmarked as spam.', 'bbpress' ), $topic_title );
+					break;
+			}
+
+			// Do additional topic toggle notice filters (admin side)
+			$message = apply_filters( 'bbp_toggle_topic_notice_admin', $message, $topic->ID, $notice, $is_failure );
+
+			?>
+
+			<div id="message" class="<?php echo $is_failure == true ? 'error' : 'updated'; ?> fade">
+				<p style="line-height: 150%"><?php echo $message; ?></p>
+			</div>
+
+			<?php
+		}
+	}
+
+	/**
+	 * Manage the column headers for the topics page
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param array $columns The columns
+	 * @uses apply_filters() Calls 'bbp_admin_topics_column_headers' with
+	 *                        the columns
+	 * @return array $columns bbPress topic columns
+	 */
+	public function topics_column_headers( $columns ) {
+
+		if ( $this->bail() ) return $columns;
+
+		$columns = array(
+			'cb'                    => '<input type="checkbox" />',
+			'title'                 => __( 'Topics',    'bbpress' ),
+			'bbp_topic_forum'       => __( 'Forum',     'bbpress' ),
+			'bbp_topic_reply_count' => __( 'Replies',   'bbpress' ),
+			'bbp_topic_voice_count' => __( 'Voices',    'bbpress' ),
+			'bbp_topic_author'      => __( 'Author',    'bbpress' ),
+			'bbp_topic_created'     => __( 'Created',   'bbpress' ),
+			'bbp_topic_freshness'   => __( 'Freshness', 'bbpress' )
+		);
+
+		return apply_filters( 'bbp_admin_topics_column_headers', $columns );
+	}
+
+	/**
+	 * Print extra columns for the topics page
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param string $column Column
+	 * @param int $topic_id Topic id
+	 * @uses bbp_get_topic_forum_id() To get the forum id of the topic
+	 * @uses bbp_forum_title() To output the topic's forum title
+	 * @uses apply_filters() Calls 'topic_forum_row_actions' with an array
+	 *                        of topic forum actions
+	 * @uses bbp_get_forum_permalink() To get the forum permalink
+	 * @uses admin_url() To get the admin url of post.php
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses bbp_topic_reply_count() To output the topic reply count
+	 * @uses bbp_topic_voice_count() To output the topic voice count
+	 * @uses bbp_topic_author_display_name() To output the topic author name
+	 * @uses get_the_date() Get the topic creation date
+	 * @uses get_the_time() Get the topic creation time
+	 * @uses esc_attr() To sanitize the topic creation time
+	 * @uses bbp_get_topic_last_active_time() To get the time when the topic was
+	 *                                    last active
+	 * @uses do_action() Calls 'bbp_admin_topics_column_data' with the
+	 *                    column and topic id
+	 */
+	function topics_column_data( $column, $topic_id ) {
+
+		if ( $this->bail() ) return;
+
+		// Get topic forum ID
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+		// Populate column data
+		switch ( $column ) {
+
+			// Forum
+			case 'bbp_topic_forum' :
+
+				// Output forum name
+				if ( !empty( $forum_id ) ) {
+
+					// Forum Title
+					$forum_title = bbp_get_forum_title( $forum_id );
+					if ( empty( $forum_title ) ) {
+						$forum_title = __( 'No Forum', 'bbpress' );
+					}
+
+					// Output the title
+					echo $forum_title;
+
+				} else {
+					_e( '(No Forum)', 'bbpress' );
+				}
+
+				break;
+
+			// Reply Count
+			case 'bbp_topic_reply_count' :
+				bbp_topic_reply_count( $topic_id );
+				break;
+
+			// Reply Count
+			case 'bbp_topic_voice_count' :
+				bbp_topic_voice_count( $topic_id );
+				break;
+
+			// Author
+			case 'bbp_topic_author' :
+				bbp_topic_author_display_name( $topic_id );
+				break;
+
+			// Freshness
+			case 'bbp_topic_created':
+				printf( __( '%1$s <br /> %2$s', 'bbpress' ),
+					get_the_date(),
+					esc_attr( get_the_time() )
+				);
+
+				break;
+
+			// Freshness
+			case 'bbp_topic_freshness' :
+				$last_active = bbp_get_topic_last_active_time( $topic_id, false );
+				if ( !empty( $last_active ) ) {
+					echo $last_active;
+				} else {
+					_e( 'No Replies', 'bbpress' ); // This should never happen
+				}
+
+				break;
+
+			// Do an action for anything else
+			default :
+				do_action( 'bbp_admin_topics_column_data', $column, $topic_id );
+				break;
+		}
+	}
+
+	/**
+	 * Topic Row actions
+	 *
+	 * Remove the quick-edit action link under the topic title and add the
+	 * content and close/stick/spam links
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param array $actions Actions
+	 * @param array $topic Topic object
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_topic_content() To output topic content
+	 * @uses bbp_get_topic_permalink() To get the topic link
+	 * @uses bbp_get_topic_title() To get the topic title
+	 * @uses current_user_can() To check if the current user can edit or
+	 *                           delete the topic
+	 * @uses bbp_is_topic_open() To check if the topic is open
+	 * @uses bbp_is_topic_spam() To check if the topic is marked as spam
+	 * @uses bbp_is_topic_sticky() To check if the topic is a sticky or a
+	 *                              super sticky
+	 * @uses get_post_type_object() To get the topic post type object
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses remove_query_arg() To remove custom args from the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses get_delete_post_link() To get the delete post link of the topic
+	 * @return array $actions Actions
+	 */
+	public function topics_row_actions( $actions, $topic ) {
+
+		if ( $this->bail() ) return $actions;
+
+		unset( $actions['inline hide-if-no-js'] );
+
+		// Show view link if it's not set, the topic is trashed and the user can view trashed topics
+		if ( empty( $actions['view'] ) && ( bbp_get_trash_status_id() == $topic->post_status ) && current_user_can( 'view_trash' ) )
+			$actions['view'] = '<a href="' . bbp_get_topic_permalink( $topic->ID ) . '" title="' . esc_attr( sprintf( __( 'View &#8220;%s&#8221;', 'bbpress' ), bbp_get_topic_title( $topic->ID ) ) ) . '" rel="permalink">' . __( 'View', 'bbpress' ) . '</a>';
+
+		// Only show the actions if the user is capable of viewing them :)
+		if ( current_user_can( 'moderate', $topic->ID ) ) {
+
+			// Close
+			// Show the 'close' and 'open' link on published and closed posts only
+			if ( in_array( $topic->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) {
+				$close_uri = esc_url( wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_close' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'close-topic_' . $topic->ID ) );
+				if ( bbp_is_topic_open( $topic->ID ) )
+					$actions['closed'] = '<a href="' . $close_uri . '" title="' . esc_attr__( 'Close this topic', 'bbpress' ) . '">' . _x( 'Close', 'Close a Topic', 'bbpress' ) . '</a>';
+				else
+					$actions['closed'] = '<a href="' . $close_uri . '" title="' . esc_attr__( 'Open this topic',  'bbpress' ) . '">' . _x( 'Open',  'Open a Topic',  'bbpress' ) . '</a>';
+			}
+
+			// Dont show sticky if topic links is spam or trash
+			if ( !bbp_is_topic_spam( $topic->ID ) && !bbp_is_topic_trash( $topic->ID ) ) {
+
+				// Sticky
+				$stick_uri  = esc_url( wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'stick-topic_'  . $topic->ID ) );
+				if ( bbp_is_topic_sticky( $topic->ID ) ) {
+					$actions['stick'] = '<a href="' . $stick_uri . '" title="' . esc_attr__( 'Unstick this topic', 'bbpress' ) . '">' . __( 'Unstick', 'bbpress' ) . '</a>';
+				} else {
+					$super_uri        = esc_url( wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_stick', 'super' => '1' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'stick-topic_'  . $topic->ID ) );
+					$actions['stick'] = '<a href="' . $stick_uri . '" title="' . esc_attr__( 'Stick this topic to its forum', 'bbpress' ) . '">' . __( 'Stick', 'bbpress' ) . '</a> (<a href="' . $super_uri . '" title="' . esc_attr__( 'Stick this topic to front', 'bbpress' ) . '">' . __( 'to front', 'bbpress' ) . '</a>)';
+				}
+			}
+
+			// Spam
+			$spam_uri  = esc_url( wp_nonce_url( add_query_arg( array( 'topic_id' => $topic->ID, 'action' => 'bbp_toggle_topic_spam' ), remove_query_arg( array( 'bbp_topic_toggle_notice', 'topic_id', 'failed', 'super' ) ) ), 'spam-topic_'  . $topic->ID ) );
+			if ( bbp_is_topic_spam( $topic->ID ) )
+				$actions['spam'] = '<a href="' . $spam_uri . '" title="' . esc_attr__( 'Mark the topic as not spam', 'bbpress' ) . '">' . __( 'Not spam', 'bbpress' ) . '</a>';
+			else
+				$actions['spam'] = '<a href="' . $spam_uri . '" title="' . esc_attr__( 'Mark this topic as spam',    'bbpress' ) . '">' . __( 'Spam',     'bbpress' ) . '</a>';
+
+		}
+
+		// Do not show trash links for spam topics, or spam links for trashed topics
+		if ( current_user_can( 'delete_topic', $topic->ID ) ) {
+			if ( bbp_get_trash_status_id() == $topic->post_status ) {
+				$post_type_object   = get_post_type_object( bbp_get_topic_post_type() );
+				$actions['untrash'] = "<a title='" . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . "' href='" . wp_nonce_url( add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_topic_post_type() ), admin_url( 'edit.php' ) ) ), admin_url( sprintf( $post_type_object->_edit_link . '&amp;action=untrash', $topic->ID ) ) ), 'untrash-' . $topic->post_type . '_' . $topic->ID ) . "'>" . __( 'Restore', 'bbpress' ) . "</a>";
+			} elseif ( EMPTY_TRASH_DAYS ) {
+				$actions['trash'] = "<a class='submitdelete' title='" . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . "' href='" . add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_topic_post_type() ), admin_url( 'edit.php' ) ) ), get_delete_post_link( $topic->ID ) ) . "'>" . __( 'Trash', 'bbpress' ) . "</a>";
+			}
+
+			if ( bbp_get_trash_status_id() == $topic->post_status || !EMPTY_TRASH_DAYS ) {
+				$actions['delete'] = "<a class='submitdelete' title='" . esc_attr__( 'Delete this item permanently', 'bbpress' ) . "' href='" . add_query_arg( array( '_wp_http_referer' => add_query_arg( array( 'post_type' => bbp_get_topic_post_type() ), admin_url( 'edit.php' ) ) ), get_delete_post_link( $topic->ID, '', true ) ) . "'>" . __( 'Delete Permanently', 'bbpress' ) . "</a>";
+			} elseif ( bbp_get_spam_status_id() == $topic->post_status ) {
+				unset( $actions['trash'] );
+			}
+		}
+
+		return $actions;
+	}
+
+	/**
+	 * Add forum dropdown to topic and reply list table filters
+	 *
+	 * @since bbPress (r2991)
+	 *
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_dropdown() To generate a forum dropdown
+	 * @return bool False. If post type is not topic or reply
+	 */
+	public function filter_dropdown() {
+
+		if ( $this->bail() ) return;
+
+		// Add Empty Spam button
+		if ( !empty( $_GET['post_status'] ) && ( bbp_get_spam_status_id() == $_GET['post_status'] ) && current_user_can( 'moderate' ) ) {
+			wp_nonce_field( 'bulk-destroy', '_destroy_nonce' );
+			$title = esc_attr__( 'Empty Spam', 'bbpress' );
+			submit_button( $title, 'button-secondary apply', 'delete_all', false );
+		}
+
+		// Get which forum is selected
+		$selected = !empty( $_GET['bbp_forum_id'] ) ? $_GET['bbp_forum_id'] : '';
+
+		// Show the forums dropdown
+		bbp_dropdown( array(
+			'selected'  => $selected,
+			'show_none' => __( 'In all forums', 'bbpress' )
+		) );
+	}
+
+	/**
+	 * Adjust the request query and include the forum id
+	 *
+	 * @since bbPress (r2991)
+	 *
+	 * @param array $query_vars Query variables from {@link WP_Query}
+	 * @uses is_admin() To check if it's the admin section
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @return array Processed Query Vars
+	 */
+	function filter_post_rows( $query_vars ) {
+
+		if ( $this->bail() ) return $query_vars;
+
+		// Add post_parent query_var if one is present
+		if ( !empty( $_GET['bbp_forum_id'] ) ) {
+			$query_vars['meta_key']   = '_bbp_forum_id';
+			$query_vars['meta_value'] = $_GET['bbp_forum_id'];
+		}
+
+		// Return manipulated query_vars
+		return $query_vars;
+	}
+
+	/**
+	 * Custom user feedback messages for topic post type
+	 *
+	 * @since bbPress (r3080)
+	 *
+	 * @global int $post_ID
+	 * @uses bbp_get_topic_permalink()
+	 * @uses wp_post_revision_title()
+	 * @uses esc_url()
+	 * @uses add_query_arg()
+	 *
+	 * @param array $messages
+	 *
+	 * @return array
+	 */
+	public function updated_messages( $messages ) {
+		global $post_ID;
+
+		if ( $this->bail() ) return $messages;
+
+		// URL for the current topic
+		$topic_url = bbp_get_topic_permalink( $post_ID );
+
+		// Current topic's post_date
+		$post_date = bbp_get_global_post_field( 'post_date', 'raw' );
+
+		// Messages array
+		$messages[$this->post_type] = array(
+			0 =>  '', // Left empty on purpose
+
+			// Updated
+			1 =>  sprintf( __( 'Topic updated. <a href="%s">View topic</a>', 'bbpress' ), $topic_url ),
+
+			// Custom field updated
+			2 => __( 'Custom field updated.', 'bbpress' ),
+
+			// Custom field deleted
+			3 => __( 'Custom field deleted.', 'bbpress' ),
+
+			// Topic updated
+			4 => __( 'Topic updated.', 'bbpress' ),
+
+			// Restored from revision
+			// translators: %s: date and time of the revision
+			5 => isset( $_GET['revision'] )
+					? sprintf( __( 'Topic restored to revision from %s', 'bbpress' ), wp_post_revision_title( (int) $_GET['revision'], false ) )
+					: false,
+
+			// Topic created
+			6 => sprintf( __( 'Topic created. <a href="%s">View topic</a>', 'bbpress' ), $topic_url ),
+
+			// Topic saved
+			7 => __( 'Topic saved.', 'bbpress' ),
+
+			// Topic submitted
+			8 => sprintf( __( 'Topic submitted. <a target="_blank" href="%s">Preview topic</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $topic_url ) ) ),
+
+			// Topic scheduled
+			9 => sprintf( __( 'Topic scheduled for: <strong>%1$s</strong>. <a target="_blank" href="%2$s">Preview topic</a>', 'bbpress' ),
+					// translators: Publish box date format, see http://php.net/date
+					date_i18n( __( 'M j, Y @ G:i', 'bbpress' ),
+					strtotime( $post_date ) ),
+					$topic_url ),
+
+			// Topic draft updated
+			10 => sprintf( __( 'Topic draft updated. <a target="_blank" href="%s">Preview topic</a>', 'bbpress' ), esc_url( add_query_arg( 'preview', 'true', $topic_url ) ) ),
+		);
+
+		return $messages;
+	}
+}
+endif; // class_exists check
+
+/**
+ * Setup bbPress Topics Admin
+ *
+ * This is currently here to make hooking and unhooking of the admin UI easy.
+ * It could use dependency injection in the future, but for now this is easier.
+ *
+ * @since bbPress (r2596)
+ *
+ * @uses BBP_Forums_Admin
+ */
+function bbp_admin_topics() {
+	bbpress()->admin->topics = new BBP_Topics_Admin();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/admin/users.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,254 @@
+<?php
+
+/**
+ * bbPress Users Admin Class
+ *
+ * @package bbPress
+ * @subpackage Administration
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Users_Admin' ) ) :
+/**
+ * Loads bbPress users admin area
+ *
+ * @package bbPress
+ * @subpackage Administration
+ * @since bbPress (r2464)
+ */
+class BBP_Users_Admin {
+
+	/**
+	 * The bbPress users admin loader
+	 *
+	 * @since bbPress (r2515)
+	 *
+	 * @uses BBP_Users_Admin::setup_globals() Setup the globals needed
+	 * @uses BBP_Users_Admin::setup_actions() Setup the hooks and actions
+	 */
+	public function __construct() {
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the admin hooks, actions and filters
+	 *
+	 * @since bbPress (r2646)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 */
+	function setup_actions() {
+
+		// Bail if in network admin
+		if ( is_network_admin() )
+			return;
+
+		// User profile edit/display actions
+		add_action( 'edit_user_profile', array( $this, 'secondary_role_display' ) );
+
+		// WordPress user screen
+		add_action( 'restrict_manage_users',      array( $this, 'user_role_bulk_dropdown' )        );
+		add_filter( 'manage_users_columns',       array( $this, 'user_role_column'        )        );
+		add_filter( 'manage_users_custom_column', array( $this, 'user_role_row'           ), 10, 3 );
+
+		// Process bulk role change
+		add_action( 'load-users.php',             array( $this, 'user_role_bulk_change'   )        );
+	}
+
+	/**
+	 * Default interface for setting a forum role
+	 *
+	 * @since bbPress (r4285)
+	 *
+	 * @param WP_User $profileuser User data
+	 * @return bool Always false
+	 */
+	public static function secondary_role_display( $profileuser ) {
+
+		// Bail if current user cannot edit users
+		if ( ! current_user_can( 'edit_user', $profileuser->ID ) )
+			return;
+
+		// Get the roles
+		$dynamic_roles = bbp_get_dynamic_roles();
+
+		// Only keymasters can set other keymasters
+		if ( ! current_user_can( 'keep_gate' ) )
+			unset( $dynamic_roles[ bbp_get_keymaster_role() ] ); ?>
+
+		<h3><?php _e( 'Forums', 'bbpress' ); ?></h3>
+
+		<table class="form-table">
+			<tbody>
+				<tr>
+					<th><label for="bbp-forums-role"><?php _e( 'Forum Role', 'bbpress' ); ?></label></th>
+					<td>
+
+						<?php $user_role = bbp_get_user_role( $profileuser->ID ); ?>
+
+						<select name="bbp-forums-role" id="bbp-forums-role">
+
+							<?php if ( ! empty( $user_role ) ) : ?>
+
+								<option value=""><?php _e( '&mdash; No role for this forum &mdash;', 'bbpress' ); ?></option>
+
+							<?php else : ?>
+
+								<option value="" selected="selected"><?php _e( '&mdash; No role for this forum &mdash;', 'bbpress' ); ?></option>
+
+							<?php endif; ?>
+
+							<?php foreach ( $dynamic_roles as $role => $details ) : ?>
+
+								<option <?php selected( $user_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo translate_user_role( $details['name'] ); ?></option>
+
+							<?php endforeach; ?>
+
+						</select>
+					</td>
+				</tr>
+
+			</tbody>
+		</table>
+
+		<?php
+	}
+
+	/**
+	 * Add bulk forums role dropdown to the WordPress users table
+	 *
+	 * @since bbPress (r4360)
+	 */
+	public static function user_role_bulk_dropdown() {
+
+		// Bail if current user cannot promote users 
+		if ( !current_user_can( 'promote_users' ) )
+			return;
+
+		// Get the roles
+		$dynamic_roles = bbp_get_dynamic_roles();
+
+		// Only keymasters can set other keymasters
+		if ( ! current_user_can( 'keep_gate' ) )
+			unset( $dynamic_roles[ bbp_get_keymaster_role() ] ); ?>
+
+		<label class="screen-reader-text" for="bbp-new-role"><?php _e( 'Change forum role to&hellip;', 'bbpress' ) ?></label>
+		<select name="bbp-new-role" id="bbp-new-role" style="display:inline-block; float:none;">
+			<option value=''><?php _e( 'Change forum role to&hellip;', 'bbpress' ) ?></option>
+			<?php foreach ( $dynamic_roles as $role => $details ) : ?>
+
+				<option value="<?php echo esc_attr( $role ); ?>"><?php echo translate_user_role( $details['name'] ); ?></option>
+
+			<?php endforeach; ?>
+		</select>
+
+		<?php submit_button( __( 'Change', 'bbpress' ), 'secondary', 'bbp-change-role', false );
+	}
+
+	/**
+	 * Process bulk dropdown form submission from the WordPress Users
+	 * Table
+	 *
+	 * @uses current_user_can() to check for 'promote users' capability
+	 * @uses bbp_get_dynamic_roles() to get forum roles
+	 * @uses bbp_get_user_role() to get a user's current forums role
+	 * @uses bbp_set_user_role() to set the user's new forums role
+	 * @return bool Always false
+	 */
+	public function user_role_bulk_change() {
+
+		// Bail if current user cannot promote users 
+		if ( !current_user_can( 'promote_users' ) )
+			return;
+
+		// Bail if no users specified
+		if ( empty( $_REQUEST['users'] ) )
+			return;
+
+		// Bail if this isn't a bbPress action
+		if ( empty( $_REQUEST['bbp-new-role'] ) || empty( $_REQUEST['bbp-change-role'] ) )
+			return;
+
+		// Check that the new role exists
+		$dynamic_roles = bbp_get_dynamic_roles();
+		if ( empty( $dynamic_roles[ $_REQUEST['bbp-new-role'] ] ) )
+			return;
+
+		// Get the current user ID
+		$current_user_id = (int) bbp_get_current_user_id();
+
+		// Run through user ids
+		foreach ( (array) $_REQUEST['users'] as $user_id ) {
+			$user_id = (int) $user_id;
+
+			// Don't let a user change their own role
+			if ( $user_id == $current_user_id ) 
+				continue;
+
+			// Set up user and role data
+			$user_role = bbp_get_user_role( $user_id );			
+			$new_role  = sanitize_text_field( $_REQUEST['bbp-new-role'] );
+
+			// Only keymasters can set other keymasters
+			if ( in_array( bbp_get_keymaster_role(), array( $user_role, $new_role ) ) && ! current_user_can( 'keep_gate' ) )
+				continue;
+
+			// Set the new forums role
+			if ( $new_role != $user_role ) {
+				bbp_set_user_role( $user_id, $new_role );
+			}
+		}
+	}
+
+	/**
+	 * Add Forum Role column to the WordPress Users table, and change the
+	 * core role title to "Site Role"
+	 *
+	 * @since bbPress (r4337)
+	 *
+	 * @param array $columns Users table columns
+	 * @return array $columns
+	 */
+	public static function user_role_column( $columns = array() ) {
+		$columns['role']          = __( 'Site Role',  'bbpress' );
+		$columns['bbp_user_role'] = __( 'Forum Role', 'bbpress' );
+
+		return $columns;
+	}
+
+	/**
+	 * Return user's forums role for display in the WordPress Users list table
+	 *
+	 * @since bbPress (r4337)
+	 *
+	 * @param string $retval
+	 * @param string $column_name
+	 * @param int $user_id
+	 *
+	 * @return string Displayable bbPress user role
+	 */
+	public static function user_role_row( $retval = '', $column_name = '', $user_id = 0 ) {
+
+		// Only looking for bbPress's user role column
+		if ( 'bbp_user_role' == $column_name ) {
+
+			// Get the users role
+			$user_role = bbp_get_user_role( $user_id );
+			$retval    = false;
+
+			// Translate user role for display
+			if ( ! empty( $user_role ) ) {
+				$roles  = bbp_get_dynamic_roles();
+				$retval = translate_user_role( $roles[$user_role]['name'] );
+			}
+		}
+
+		// Pass retval through
+		return $retval;
+	}
+}
+new BBP_Users_Admin();
+endif; // class exists
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/classes.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,389 @@
+<?php
+
+/**
+ * bbPress Classes
+ *
+ * @package bbPress
+ * @subpackage Classes
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Component' ) ) :
+/**
+ * bbPress Component Class
+ *
+ * The bbPress component class is responsible for simplifying the creation
+ * of components that share similar behaviors and routines. It is used
+ * internally by bbPress to create forums, topics and replies, but can be
+ * extended to create other really neat things.
+ *
+ * @package bbPress
+ * @subpackage Classes
+ *
+ * @since bbPress (r2688)
+ */
+class BBP_Component {
+
+	/**
+	 * @var string Unique name (for internal identification)
+	 * @internal
+	 */
+	var $name;
+
+	/**
+	 * @var Unique ID (normally for custom post type)
+	 */
+	var $id;
+
+	/**
+	 * @var string Unique slug (used in query string and permalinks)
+	 */
+	var $slug;
+
+	/**
+	 * @var WP_Query The loop for this component
+	 */
+	var $query;
+
+	/**
+	 * @var string The current ID of the queried object
+	 */
+	var $current_id;
+
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * bbPress Component loader
+	 *
+	 * @since bbPress (r2700)
+	 *
+	 * @param mixed $args Required. Supports these args:
+	 *  - name: Unique name (for internal identification)
+	 *  - id: Unique ID (normally for custom post type)
+	 *  - slug: Unique slug (used in query string and permalinks)
+	 *  - query: The loop for this component (WP_Query)
+	 *  - current_id: The current ID of the queried object
+	 * @uses BBP_Component::setup_globals() Setup the globals needed
+	 * @uses BBP_Component::includes() Include the required files
+	 * @uses BBP_Component::setup_actions() Setup the hooks and actions
+	 */
+	public function __construct( $args = '' ) {
+		if ( empty( $args ) )
+			return;
+
+		$this->setup_globals( $args );
+		$this->includes();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Component global variables
+	 *
+	 * @since bbPress (r2700)
+	 * @access private
+	 *
+	 * @uses apply_filters() Calls 'bbp_{@link BBP_Component::name}_id'
+	 * @uses apply_filters() Calls 'bbp_{@link BBP_Component::name}_slug'
+	 */
+	private function setup_globals( $args = '' ) {
+		$this->name = $args['name'];
+		$this->id   = apply_filters( 'bbp_' . $this->name . '_id',   $args['id']   );
+		$this->slug = apply_filters( 'bbp_' . $this->name . '_slug', $args['slug'] );
+	}
+
+	/**
+	 * Include required files
+	 *
+	 * @since bbPress (r2700)
+	 * @access private
+	 *
+	 * @uses do_action() Calls 'bbp_{@link BBP_Component::name}includes'
+	 */
+	private function includes() {
+		do_action( 'bbp_' . $this->name . 'includes' );
+	}
+
+	/**
+	 * Setup the actions
+	 *
+	 * @since bbPress (r2700)
+	 * @access private
+	 *
+	 * @uses add_action() To add various actions
+	 * @uses do_action() Calls
+	 *                    'bbp_{@link BBP_Component::name}setup_actions'
+	 */
+	private function setup_actions() {
+		add_action( 'bbp_register_post_types',    array( $this, 'register_post_types'    ), 10, 2 ); // Register post types
+		add_action( 'bbp_register_taxonomies',    array( $this, 'register_taxonomies'    ), 10, 2 ); // Register taxonomies
+		add_action( 'bbp_add_rewrite_tags',       array( $this, 'add_rewrite_tags'       ), 10, 2 ); // Add the rewrite tags
+		add_action( 'bbp_generate_rewrite_rules', array( $this, 'generate_rewrite_rules' ), 10, 2 ); // Generate rewrite rules
+
+		// Additional actions can be attached here
+		do_action( 'bbp_' . $this->name . 'setup_actions' );
+	}
+
+	/**
+	 * Setup the component post types
+	 *
+	 * @since bbPress (r2700)
+	 *
+	 * @uses do_action() Calls 'bbp_{@link BBP_Component::name}_register_post_types'
+	 */
+	public function register_post_types() {
+		do_action( 'bbp_' . $this->name . '_register_post_types' );
+	}
+
+	/**
+	 * Register component specific taxonomies
+	 *
+	 * @since bbPress (r2700)
+	 *
+	 * @uses do_action() Calls 'bbp_{@link BBP_Component::name}_register_taxonomies'
+	 */
+	public function register_taxonomies() {
+		do_action( 'bbp_' . $this->name . '_register_taxonomies' );
+	}
+
+	/**
+	 * Add any additional rewrite tags
+	 *
+	 * @since bbPress (r2700)
+	 *
+	 * @uses do_action() Calls 'bbp_{@link BBP_Component::name}_add_rewrite_tags'
+	 */
+	public function add_rewrite_tags() {
+		do_action( 'bbp_' . $this->name . '_add_rewrite_tags' );
+	}
+
+	/**
+	 * Generate any additional rewrite rules
+	 *
+	 * @since bbPress (r2700)
+	 *
+	 * @uses do_action() Calls 'bbp_{@link BBP_Component::name}_generate_rewrite_rules'
+	 */
+	public function generate_rewrite_rules( $wp_rewrite ) {
+		do_action_ref_array( 'bbp_' . $this->name . '_generate_rewrite_rules', $wp_rewrite );
+	}
+}
+endif; // BBP_Component
+
+if ( class_exists( 'Walker' ) ) :
+/**
+ * Create HTML list of forums.
+ *
+ * @package bbPress
+ * @subpackage Classes
+ *
+ * @since bbPress (r2514)
+ *
+ * @uses Walker
+ */
+class BBP_Walker_Forum extends Walker {
+
+	/**
+	 * @see Walker::$tree_type
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @var string
+	 */
+	var $tree_type;
+
+	/**
+	 * @see Walker::$db_fields
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @var array
+	 */
+	var $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' );
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * Set the tree_type
+	 *
+	 * @since bbPress (r2514)
+	 */
+	public function __construct() {
+		$this->tree_type = bbp_get_forum_post_type();
+	}
+
+	/**
+	 * @see Walker::start_lvl()
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @param string $output Passed by reference. Used to append additional
+	 *                        content.
+	 * @param int $depth Depth of page. Used for padding.
+	 */
+	public function start_lvl( &$output, $depth ) {
+		$indent  = str_repeat( "\t", $depth );
+		$output .= "\n$indent<ul class='children'>\n";
+	}
+
+	/**
+	 * @see Walker::end_lvl()
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @param string $output Passed by reference. Used to append additional
+	 *                        content.
+	 * @param int $depth Depth of page. Used for padding.
+	 */
+	public function end_lvl( &$output, $depth ) {
+		$indent  = str_repeat( "\t", $depth );
+		$output .= "$indent</ul>\n";
+	}
+
+	/**
+	 * @see Walker::start_el()
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @param string $output Passed by reference. Used to append additional
+	 *                        content.
+	 * @param object $forum Page data object.
+	 * @param int $depth Depth of page. Used for padding.
+	 * @param int $current_forum Page ID.
+	 * @param array $args
+	 */
+	public function start_el( &$output, $forum, $depth, $args, $current_forum ) {
+
+		$indent = $depth ? str_repeat( "\t", $depth ) : '';
+
+		extract( $args, EXTR_SKIP );
+		$css_class = array( 'bbp-forum-item', 'bbp-forum-item-' . $forum->ID );
+
+		if ( !empty( $current_forum ) ) {
+			$_current_page = bbp_get_forum( $current_forum );
+
+			if ( isset( $_current_page->ancestors ) && in_array( $forum->ID, (array) $_current_page->ancestors ) )
+				$css_class[] = 'bbp-current-forum-ancestor';
+
+			if ( $forum->ID == $current_forum )
+				$css_class[] = 'bbp_current_forum_item';
+			elseif ( $_current_page && $forum->ID == $_current_page->post_parent )
+				$css_class[] = 'bbp-current-forum-parent';
+
+		} elseif ( $forum->ID == get_option( 'page_for_posts' ) ) {
+			$css_class[] = 'bbp-current-forum-parent';
+		}
+
+		$css_class = implode( ' ', apply_filters( 'bbp_forum_css_class', $css_class, $forum ) );
+		$output .= $indent . '<li class="' . $css_class . '"><a href="' . bbp_get_forum_permalink( $forum->ID ) . '" title="' . esc_attr( wp_strip_all_tags( apply_filters( 'the_title', $forum->post_title, $forum->ID ) ) ) . '">' . $link_before . apply_filters( 'the_title', $forum->post_title, $forum->ID ) . $link_after . '</a>';
+
+		if ( !empty( $show_date ) ) {
+			$time    = ( 'modified' == $show_date ) ? $forum->post_modified : $time = $forum->post_date;
+			$output .= " " . mysql2date( $date_format, $time );
+		}
+	}
+
+	/**
+	 * @see Walker::end_el()
+	 *
+	 * @since bbPress (r2514)
+	 *
+	 * @param string $output Passed by reference. Used to append additional
+	 *                        content.
+	 * @param object $forum Page data object. Not used.
+	 * @param int $depth Depth of page. Not Used.
+	 */
+	public function end_el( &$output, $forum, $depth ) {
+		$output .= "</li>\n";
+	}
+}
+
+/**
+ * Create HTML dropdown list of bbPress forums/topics.
+ *
+ * @package bbPress
+ * @subpackage Classes
+ *
+ * @since bbPress (r2746)
+ * @uses Walker
+ */
+class BBP_Walker_Dropdown extends Walker {
+
+	/**
+	 * @see Walker::$tree_type
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @var string
+	 */
+	var $tree_type;
+
+	/**
+	 * @see Walker::$db_fields
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @var array
+	 */
+	var $db_fields = array( 'parent' => 'post_parent', 'id' => 'ID' );
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * Set the tree_type
+	 *
+	 * @since bbPress (r2746)
+	 */
+	public function __construct() {
+		$this->tree_type = bbp_get_forum_post_type();
+	}
+
+	/**
+	 * @see Walker::start_el()
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param string $output Passed by reference. Used to append additional
+	 *                        content.
+	 * @param object $_post Post data object.
+	 * @param int $depth Depth of post in reference to parent posts. Used
+	 *                    for padding.
+	 * @param array $args Uses 'selected' argument for selected post to set
+	 *                     selected HTML attribute for option element.
+	 * @uses bbp_is_forum_category() To check if the forum is a category
+	 * @uses current_user_can() To check if the current user can post in
+	 *                           closed forums
+	 * @uses bbp_is_forum_closed() To check if the forum is closed
+	 * @uses apply_filters() Calls 'bbp_walker_dropdown_post_title' with the
+	 *                        title, output, post, depth and args
+	 */
+	public function start_el( &$output, $_post, $depth, $args ) {
+		$pad     = str_repeat( '&nbsp;', $depth * 3 );
+		$output .= '<option class="level-' . $depth . '"';
+
+		// Disable the <option> if:
+		// - we're told to do so
+		// - the post type is a forum
+		// - the forum is a category
+		// - forum is closed
+		if (	( true == $args['disable_categories'] )
+				&& ( bbp_get_forum_post_type() == $_post->post_type )
+				&& ( bbp_is_forum_category( $_post->ID )
+					|| ( !current_user_can( 'edit_forum', $_post->ID ) && bbp_is_forum_closed( $_post->ID )
+				)
+			) ) {
+			$output .= ' disabled="disabled" value=""';
+		} else {
+			$output .= ' value="' . $_post->ID .'"' . selected( $args['selected'], $_post->ID, false );
+		}
+
+		$output .= '>';
+		$title   = apply_filters( 'bbp_walker_dropdown_post_title', $_post->post_title, $output, $_post, $depth, $args );
+		$output .= $pad . esc_html( $title );
+		$output .= "</option>\n";
+	}
+}
+
+endif; // class_exists check
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1669 @@
+<?php
+
+/**
+ * bbPress Common Functions
+ *
+ * Common functions are ones that are used by more than one component, like
+ * forums, topics, replies, users, topic tags, etc...
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Formatting ****************************************************************/
+
+/**
+ * A bbPress specific method of formatting numeric values
+ *
+ * @since bbPress (r2486)
+ *
+ * @param string $number Number to format
+ * @param string $decimals Optional. Display decimals
+ * @uses apply_filters() Calls 'bbp_number_format' with the formatted values,
+ *                        number and display decimals bool
+ * @return string Formatted string
+ */
+function bbp_number_format( $number = 0, $decimals = false, $dec_point = '.', $thousands_sep = ',' ) {
+
+	// If empty, set $number to (int) 0
+	if ( ! is_numeric( $number ) )
+		$number = 0;
+
+	return apply_filters( 'bbp_number_format', number_format( $number, $decimals, $dec_point, $thousands_sep ), $number, $decimals, $dec_point, $thousands_sep );
+}
+
+/**
+ * A bbPress specific method of formatting numeric values
+ *
+ * @since bbPress (r3857)
+ *
+ * @param string $number Number to format
+ * @param string $decimals Optional. Display decimals
+ * @uses apply_filters() Calls 'bbp_number_format' with the formatted values,
+ *                        number and display decimals bool
+ * @return string Formatted string
+ */
+function bbp_number_format_i18n( $number = 0, $decimals = false ) {
+
+	// If empty, set $number to (int) 0
+	if ( ! is_numeric( $number ) )
+		$number = 0;
+
+	return apply_filters( 'bbp_number_format_i18n', number_format_i18n( $number, $decimals ), $number, $decimals );
+}
+
+/**
+ * Convert time supplied from database query into specified date format.
+ *
+ * @since bbPress (r2455)
+ *
+ * @param int|object $post Optional. Default is global post object. A post_id or
+ *                          post object
+ * @param string $d Optional. Default is 'U'. Either 'G', 'U', or php date
+ *                             format
+ * @param bool $translate Optional. Default is false. Whether to translate the
+ *                                   result
+ * @uses mysql2date() To convert the format
+ * @uses apply_filters() Calls 'bbp_convert_date' with the time, date format
+ *                        and translate bool
+ * @return string Returns timestamp
+ */
+function bbp_convert_date( $time, $d = 'U', $translate = false ) {
+	$time = mysql2date( $d, $time, $translate );
+
+	return apply_filters( 'bbp_convert_date', $time, $d, $translate );
+}
+
+/**
+ * Output formatted time to display human readable time difference.
+ *
+ * @since bbPress (r2544)
+ *
+ * @param string $older_date Unix timestamp from which the difference begins.
+ * @param string $newer_date Optional. Unix timestamp from which the
+ *                            difference ends. False for current time.
+ * @uses bbp_get_time_since() To get the formatted time
+ */
+function bbp_time_since( $older_date, $newer_date = false ) {
+	echo bbp_get_time_since( $older_date, $newer_date = false );
+}
+	/**
+	 * Return formatted time to display human readable time difference.
+	 *
+	 * @since bbPress (r2544)
+	 *
+	 * @param string $older_date Unix timestamp from which the difference begins.
+	 * @param string $newer_date Optional. Unix timestamp from which the
+	 *                            difference ends. False for current time.
+	 * @uses current_time() To get the current time in mysql format
+	 * @uses human_time_diff() To get the time differene in since format
+	 * @uses apply_filters() Calls 'bbp_get_time_since' with the time
+	 *                        difference and time
+	 * @return string Formatted time
+	 */
+	function bbp_get_time_since( $older_date, $newer_date = false ) {
+		
+		// Setup the strings
+		$unknown_text   = apply_filters( 'bbp_core_time_since_unknown_text',   __( 'sometime',  'bbpress' ) );
+		$right_now_text = apply_filters( 'bbp_core_time_since_right_now_text', __( 'right now', 'bbpress' ) );
+		$ago_text       = apply_filters( 'bbp_core_time_since_ago_text',       __( '%s ago',    'bbpress' ) );
+
+		// array of time period chunks
+		$chunks = array(
+			array( 60 * 60 * 24 * 365 , __( 'year',   'bbpress' ), __( 'years',   'bbpress' ) ),
+			array( 60 * 60 * 24 * 30 ,  __( 'month',  'bbpress' ), __( 'months',  'bbpress' ) ),
+			array( 60 * 60 * 24 * 7,    __( 'week',   'bbpress' ), __( 'weeks',   'bbpress' ) ),
+			array( 60 * 60 * 24 ,       __( 'day',    'bbpress' ), __( 'days',    'bbpress' ) ),
+			array( 60 * 60 ,            __( 'hour',   'bbpress' ), __( 'hours',   'bbpress' ) ),
+			array( 60 ,                 __( 'minute', 'bbpress' ), __( 'minutes', 'bbpress' ) ),
+			array( 1,                   __( 'second', 'bbpress' ), __( 'seconds', 'bbpress' ) )
+		);
+
+		if ( !empty( $older_date ) && !is_numeric( $older_date ) ) {
+			$time_chunks = explode( ':', str_replace( ' ', ':', $older_date ) );
+			$date_chunks = explode( '-', str_replace( ' ', '-', $older_date ) );
+			$older_date  = gmmktime( (int) $time_chunks[1], (int) $time_chunks[2], (int) $time_chunks[3], (int) $date_chunks[1], (int) $date_chunks[2], (int) $date_chunks[0] );
+		}
+
+		// $newer_date will equal false if we want to know the time elapsed
+		// between a date and the current time. $newer_date will have a value if
+		// we want to work out time elapsed between two known dates.
+		$newer_date = ( !$newer_date ) ? strtotime( current_time( 'mysql' ) ) : $newer_date;
+
+		// Difference in seconds
+		$since = $newer_date - $older_date;
+
+		// Something went wrong with date calculation and we ended up with a negative date.
+		if ( 0 > $since ) {
+			$output = $unknown_text;
+
+		// We only want to output two chunks of time here, eg:
+		//     x years, xx months
+		//     x days, xx hours
+		// so there's only two bits of calculation below:
+		} else {
+
+			// Step one: the first chunk
+			for ( $i = 0, $j = count( $chunks ); $i < $j; ++$i ) {
+				$seconds = $chunks[$i][0];
+
+				// Finding the biggest chunk (if the chunk fits, break)
+				$count = floor( $since / $seconds );
+				if ( 0 != $count ) {
+					break;
+				}
+			}
+
+			// If $i iterates all the way to $j, then the event happened 0 seconds ago
+			if ( !isset( $chunks[$i] ) ) {
+				$output = $right_now_text;
+
+			} else {
+
+				// Set output var
+				$output = ( 1 == $count ) ? '1 '. $chunks[$i][1] : $count . ' ' . $chunks[$i][2];
+
+				// Step two: the second chunk
+				if ( $i + 2 < $j ) {
+					$seconds2 = $chunks[$i + 1][0];
+					$name2    = $chunks[$i + 1][1];
+					$count2   = floor( ( $since - ( $seconds * $count ) ) / $seconds2 );
+
+					// Add to output var
+					if ( 0 != $count2 ) {
+						$output .= ( 1 == $count2 ) ? _x( ',', 'Separator in time since', 'bbpress' ) . ' 1 '. $name2 : _x( ',', 'Separator in time since', 'bbpress' ) . ' ' . $count2 . ' ' . $chunks[$i + 1][2];
+					}
+				}
+
+				// No output, so happened right now
+				if ( ! (int) trim( $output ) ) {
+					$output = $right_now_text;
+				}
+			}
+		}
+
+		// Append 'ago' to the end of time-since if not 'right now'
+		if ( $output != $right_now_text ) {
+			$output = sprintf( $ago_text, $output );
+		}
+
+		return apply_filters( 'bbp_get_time_since', $output, $older_date, $newer_date );
+	}
+
+/**
+ * Formats the reason for editing the topic/reply.
+ *
+ * Does these things:
+ *  - Trimming
+ *  - Removing periods from the end of the string
+ *  - Trimming again
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @return string Status of topic
+ */
+function bbp_format_revision_reason( $reason = '' ) {
+	$reason = (string) $reason;
+
+	// Format reason for proper display
+	if ( empty( $reason ) )
+		return $reason;
+
+	// Trimming
+	$reason = trim( $reason );
+
+	// We add our own full stop.
+	while ( substr( $reason, -1 ) == '.' )
+		$reason = substr( $reason, 0, -1 );
+
+	// Trim again
+	$reason = trim( $reason );
+
+	return $reason;
+}
+
+/** Misc **********************************************************************/
+
+/**
+ * Append 'view=all' to query string if it's already there from referer
+ *
+ * @since bbPress (r3325)
+ *
+ * @param string $original_link Original Link to be modified
+ * @param bool $force Override bbp_get_view_all() check
+ * @uses current_user_can() To check if the current user can moderate
+ * @uses add_query_arg() To add args to the url
+ * @uses apply_filters() Calls 'bbp_add_view_all' with the link and original link
+ * @return string The link with 'view=all' appended if necessary
+ */
+function bbp_add_view_all( $original_link = '', $force = false ) {
+
+	// Are we appending the view=all vars?
+	if ( bbp_get_view_all() || !empty( $force ) )
+		$link = add_query_arg( array( 'view' => 'all' ), $original_link );
+	else
+		$link = $original_link;
+
+	return apply_filters( 'bbp_add_view_all', $link, $original_link );
+}
+
+/**
+ * Remove 'view=all' from query string
+ *
+ * @since bbPress (r3325)
+ *
+ * @param string $original_link Original Link to be modified
+ * @uses current_user_can() To check if the current user can moderate
+ * @uses add_query_arg() To add args to the url
+ * @uses apply_filters() Calls 'bbp_add_view_all' with the link and original link
+ * @return string The link with 'view=all' appended if necessary
+ */
+function bbp_remove_view_all( $original_link = '' ) {
+	return apply_filters( 'bbp_add_view_all', remove_query_arg( 'view', $original_link ), $original_link );
+}
+
+/**
+ * If current user can and is vewing all topics/replies
+ *
+ * @since bbPress (r3325)
+ *
+ * @uses current_user_can() To check if the current user can moderate
+ * @uses apply_filters() Calls 'bbp_get_view_all' with the link and original link
+ * @return bool Whether current user can and is viewing all
+ */
+function bbp_get_view_all( $cap = 'moderate' ) {
+	$retval = ( ( !empty( $_GET['view'] ) && ( 'all' == $_GET['view'] ) && current_user_can( $cap ) ) );
+	return apply_filters( 'bbp_get_view_all', (bool) $retval );
+}
+
+/**
+ * Assist pagination by returning correct page number
+ *
+ * @since bbPress (r2628)
+ *
+ * @uses get_query_var() To get the 'paged' value
+ * @return int Current page number
+ */
+function bbp_get_paged() {
+	global $wp_query;
+
+	// Check the query var
+	if ( get_query_var( 'paged' ) ) {
+		$paged = get_query_var( 'paged' );
+
+	// Check query paged
+	} elseif ( !empty( $wp_query->query['paged'] ) ) {
+		$paged = $wp_query->query['paged'];
+	}
+
+	// Paged found
+	if ( !empty( $paged ) )
+		return (int) $paged;
+
+	// Default to first page
+	return 1;
+}
+
+/**
+ * Fix post author id on post save
+ *
+ * When a logged in user changes the status of an anonymous reply or topic, or
+ * edits it, the post_author field is set to the logged in user's id. This
+ * function fixes that.
+ *
+ * @since bbPress (r2734)
+ *
+ * @param array $data Post data
+ * @param array $postarr Original post array (includes post id)
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_is_topic_anonymous() To check if the topic is by an anonymous user
+ * @uses bbp_is_reply_anonymous() To check if the reply is by an anonymous user
+ * @return array Data
+ */
+function bbp_fix_post_author( $data = array(), $postarr = array() ) {
+
+	// Post is not being updated or the post_author is already 0, return
+	if ( empty( $postarr['ID'] ) || empty( $data['post_author'] ) )
+		return $data;
+
+	// Post is not a topic or reply, return
+	if ( !in_array( $data['post_type'], array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ) ) )
+		return $data;
+
+	// Is the post by an anonymous user?
+	if ( ( bbp_get_topic_post_type() == $data['post_type'] && !bbp_is_topic_anonymous( $postarr['ID'] ) ) ||
+	     ( bbp_get_reply_post_type() == $data['post_type'] && !bbp_is_reply_anonymous( $postarr['ID'] ) ) )
+		return $data;
+
+	// The post is being updated. It is a topic or a reply and is written by an anonymous user.
+	// Set the post_author back to 0
+	$data['post_author'] = 0;
+
+	return $data;
+}
+
+/**
+ * Check the date against the _bbp_edit_lock setting.
+ *
+ * @since bbPress (r3133)
+ *
+ * @param string $post_date_gmt
+ *
+ * @uses get_option() Get the edit lock time
+ * @uses current_time() Get the current time
+ * @uses strtotime() Convert strings to time
+ * @uses apply_filters() Allow output to be manipulated
+ *
+ * @return bool
+ */
+function bbp_past_edit_lock( $post_date_gmt ) {
+
+	// Assume editing is allowed
+	$retval = false;
+
+	// Bail if empty date
+	if ( ! empty( $post_date_gmt ) ) {
+
+		// Period of time
+		$lockable  = '+' . get_option( '_bbp_edit_lock', '5' ) . ' minutes';
+
+		// Now
+		$cur_time  = current_time( 'timestamp', true );
+
+		// Add lockable time to post time
+		$lock_time = strtotime( $lockable, strtotime( $post_date_gmt ) );
+
+		// Compare
+		if ( $cur_time >= $lock_time ) {
+			$retval = true;
+		}
+	}
+
+	return apply_filters( 'bbp_past_edit_lock', (bool) $retval, $cur_time, $lock_time, $post_date_gmt );
+}
+
+/** Statistics ****************************************************************/
+
+/**
+ * Get the forum statistics
+ *
+ * @since bbPress (r2769)
+ *
+ * @param mixed $args Optional. The function supports these arguments (all
+ *                     default to true):
+ *  - count_users: Count users?
+ *  - count_forums: Count forums?
+ *  - count_topics: Count topics? If set to false, private, spammed and trashed
+ *                   topics are also not counted.
+ *  - count_private_topics: Count private topics? (only counted if the current
+ *                           user has read_private_topics cap)
+ *  - count_spammed_topics: Count spammed topics? (only counted if the current
+ *                           user has edit_others_topics cap)
+ *  - count_trashed_topics: Count trashed topics? (only counted if the current
+ *                           user has view_trash cap)
+ *  - count_replies: Count replies? If set to false, private, spammed and
+ *                   trashed replies are also not counted.
+ *  - count_private_replies: Count private replies? (only counted if the current
+ *                           user has read_private_replies cap)
+ *  - count_spammed_replies: Count spammed replies? (only counted if the current
+ *                           user has edit_others_replies cap)
+ *  - count_trashed_replies: Count trashed replies? (only counted if the current
+ *                           user has view_trash cap)
+ *  - count_tags: Count tags? If set to false, empty tags are also not counted
+ *  - count_empty_tags: Count empty tags?
+ * @uses bbp_count_users() To count the number of registered users
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wp_count_posts() To count the number of forums, topics and replies
+ * @uses wp_count_terms() To count the number of topic tags
+ * @uses current_user_can() To check if the user is capable of doing things
+ * @uses number_format_i18n() To format the number
+ * @uses apply_filters() Calls 'bbp_get_statistics' with the statistics and args
+ * @return object Walked forum tree
+ */
+function bbp_get_statistics( $args = '' ) {
+
+	$defaults = array (
+		'count_users'           => true,
+		'count_forums'          => true,
+		'count_topics'          => true,
+		'count_private_topics'  => true,
+		'count_spammed_topics'  => true,
+		'count_trashed_topics'  => true,
+		'count_replies'         => true,
+		'count_private_replies' => true,
+		'count_spammed_replies' => true,
+		'count_trashed_replies' => true,
+		'count_tags'            => true,
+		'count_empty_tags'      => true
+	);
+	$r = bbp_parse_args( $args, $defaults, 'get_statistics' );
+	extract( $r );
+
+	// Users
+	if ( !empty( $count_users ) )
+		$user_count = bbp_get_total_users();
+
+	// Forums
+	if ( !empty( $count_forums ) ) {
+		$forum_count = wp_count_posts( bbp_get_forum_post_type() );
+		$forum_count = $forum_count->publish;
+	}
+
+	// Post statuses
+	$private = bbp_get_private_status_id();
+	$spam    = bbp_get_spam_status_id();
+	$trash   = bbp_get_trash_status_id();
+	$closed  = bbp_get_closed_status_id();
+
+	// Topics
+	if ( !empty( $count_topics ) ) {
+
+		$all_topics  = wp_count_posts( bbp_get_topic_post_type() );
+
+		// Published (publish + closed)
+		$topic_count = $all_topics->publish + $all_topics->{$closed};
+
+		if ( current_user_can( 'read_private_topics' ) || current_user_can( 'edit_others_topics' ) || current_user_can( 'view_trash' ) ) {
+
+			// Private
+			$topics['private'] = ( !empty( $count_private_topics ) && current_user_can( 'read_private_topics' ) ) ? (int) $all_topics->{$private} : 0;
+
+			// Spam
+			$topics['spammed'] = ( !empty( $count_spammed_topics ) && current_user_can( 'edit_others_topics'  ) ) ? (int) $all_topics->{$spam}    : 0;
+
+			// Trash
+			$topics['trashed'] = ( !empty( $count_trashed_topics ) && current_user_can( 'view_trash'          ) ) ? (int) $all_topics->{$trash}   : 0;
+
+			// Total hidden (private + spam + trash)
+			$topic_count_hidden = $topics['private'] + $topics['spammed'] + $topics['trashed'];
+
+			// Generate the hidden topic count's title attribute
+			$topic_titles[] = !empty( $topics['private'] ) ? sprintf( __( 'Private: %s', 'bbpress' ), number_format_i18n( $topics['private'] ) ) : '';
+			$topic_titles[] = !empty( $topics['spammed'] ) ? sprintf( __( 'Spammed: %s', 'bbpress' ), number_format_i18n( $topics['spammed'] ) ) : '';
+			$topic_titles[] = !empty( $topics['trashed'] ) ? sprintf( __( 'Trashed: %s', 'bbpress' ), number_format_i18n( $topics['trashed'] ) ) : '';
+
+			// Compile the hidden topic title
+			$hidden_topic_title = implode( ' | ', array_filter( $topic_titles ) );
+		}
+	}
+
+	// Replies
+	if ( !empty( $count_replies ) ) {
+
+		$all_replies = wp_count_posts( bbp_get_reply_post_type() );
+
+		// Published
+		$reply_count = $all_replies->publish;
+
+		if ( current_user_can( 'read_private_replies' ) || current_user_can( 'edit_others_replies' ) || current_user_can( 'view_trash' ) ) {
+
+			// Private
+			$replies['private'] = ( !empty( $count_private_replies ) && current_user_can( 'read_private_replies' ) ) ? (int) $all_replies->{$private} : 0;
+
+			// Spam
+			$replies['spammed'] = ( !empty( $count_spammed_replies ) && current_user_can( 'edit_others_replies'  ) ) ? (int) $all_replies->{$spam}    : 0;
+
+			// Trash
+			$replies['trashed'] = ( !empty( $count_trashed_replies ) && current_user_can( 'view_trash'           ) ) ? (int) $all_replies->{$trash}   : 0;
+
+			// Total hidden (private + spam + trash)
+			$reply_count_hidden = $replies['private'] + $replies['spammed'] + $replies['trashed'];
+
+			// Generate the hidden topic count's title attribute
+			$reply_titles[] = !empty( $replies['private'] ) ? sprintf( __( 'Private: %s', 'bbpress' ), number_format_i18n( $replies['private'] ) ) : '';
+			$reply_titles[] = !empty( $replies['spammed'] ) ? sprintf( __( 'Spammed: %s', 'bbpress' ), number_format_i18n( $replies['spammed'] ) ) : '';
+			$reply_titles[] = !empty( $replies['trashed'] ) ? sprintf( __( 'Trashed: %s', 'bbpress' ), number_format_i18n( $replies['trashed'] ) ) : '';
+
+			// Compile the hidden replies title
+			$hidden_reply_title = implode( ' | ', array_filter( $reply_titles ) );
+
+		}
+	}
+
+	// Topic Tags
+	if ( !empty( $count_tags ) && bbp_allow_topic_tags() ) {
+
+		// Get the count
+		$topic_tag_count = wp_count_terms( bbp_get_topic_tag_tax_id(), array( 'hide_empty' => true ) );
+
+		// Empty tags
+		if ( !empty( $count_empty_tags ) && current_user_can( 'edit_topic_tags' ) ) {
+			$empty_topic_tag_count = wp_count_terms( bbp_get_topic_tag_tax_id() ) - $topic_tag_count;
+		}
+	}
+
+	// Tally the tallies
+	$statistics = compact( 'user_count', 'forum_count', 'topic_count', 'topic_count_hidden', 'reply_count', 'reply_count_hidden', 'topic_tag_count', 'empty_topic_tag_count' );
+	$statistics = array_map( 'absint',             $statistics );
+	$statistics = array_map( 'number_format_i18n', $statistics );
+
+	// Add the hidden (topic/reply) count title attribute strings because we don't need to run the math functions on these (see above)
+	if ( isset( $hidden_topic_title ) )
+		$statistics['hidden_topic_title'] = $hidden_topic_title;
+
+	if ( isset( $hidden_reply_title ) )
+		$statistics['hidden_reply_title'] = $hidden_reply_title;
+
+	return apply_filters( 'bbp_get_statistics', $statistics, $args );
+}
+
+/** New/edit topic/reply helpers **********************************************/
+
+/**
+ * Filter anonymous post data
+ *
+ * We use REMOTE_ADDR here directly. If you are behind a proxy, you should
+ * ensure that it is properly set, such as in wp-config.php, for your
+ * environment. See {@link http://core.trac.wordpress.org/ticket/9235}
+ *
+ * Note that bbp_pre_anonymous_filters() is responsible for sanitizing each
+ * of the filtered core anonymous values here.
+ *
+ * If there are any errors, those are directly added to {@link bbPress:errors}
+ *
+ * @since bbPress (r2734)
+ *
+ * @param mixed $args Optional. If no args are there, then $_POST values are
+ *                     used.
+ * @uses apply_filters() Calls 'bbp_pre_anonymous_post_author_name' with the
+ *                        anonymous user name
+ * @uses apply_filters() Calls 'bbp_pre_anonymous_post_author_email' with the
+ *                        anonymous user email
+ * @uses apply_filters() Calls 'bbp_pre_anonymous_post_author_website' with the
+ *                        anonymous user website
+ * @return bool|array False on errors, values in an array on success
+ */
+function bbp_filter_anonymous_post_data( $args = '' ) {
+
+	// Assign variables
+	$defaults = array (
+		'bbp_anonymous_name'    => !empty( $_POST['bbp_anonymous_name']    ) ? $_POST['bbp_anonymous_name']    : false,
+		'bbp_anonymous_email'   => !empty( $_POST['bbp_anonymous_email']   ) ? $_POST['bbp_anonymous_email']   : false,
+		'bbp_anonymous_website' => !empty( $_POST['bbp_anonymous_website'] ) ? $_POST['bbp_anonymous_website'] : false,
+	);
+	$r = bbp_parse_args( $args, $defaults, 'filter_anonymous_post_data' );
+	extract( $r );
+
+	// Filter variables and add errors if necessary
+	$bbp_anonymous_name = apply_filters( 'bbp_pre_anonymous_post_author_name',  $bbp_anonymous_name  );
+	if ( empty( $bbp_anonymous_name ) )
+		bbp_add_error( 'bbp_anonymous_name',  __( '<strong>ERROR</strong>: Invalid author name submitted!',   'bbpress' ) );
+
+	$bbp_anonymous_email = apply_filters( 'bbp_pre_anonymous_post_author_email', $bbp_anonymous_email );
+	if ( empty( $bbp_anonymous_email ) )
+		bbp_add_error( 'bbp_anonymous_email', __( '<strong>ERROR</strong>: Invalid email address submitted!', 'bbpress' ) );
+
+	// Website is optional
+	$bbp_anonymous_website = apply_filters( 'bbp_pre_anonymous_post_author_website', $bbp_anonymous_website );
+
+	if ( !bbp_has_errors() )
+		$retval = compact( 'bbp_anonymous_name', 'bbp_anonymous_email', 'bbp_anonymous_website' );
+	else
+		$retval = false;
+
+	// Finally, return sanitized data or false
+	return apply_filters( 'bbp_filter_anonymous_post_data', $retval, $args );
+}
+
+/**
+ * Check for duplicate topics/replies
+ *
+ * Check to make sure that a user is not making a duplicate post
+ *
+ * @since bbPress (r2763)
+ *
+ * @param array $post_data Contains information about the comment
+ * @uses current_user_can() To check if the current user can throttle
+ * @uses get_meta_sql() To generate the meta sql for checking anonymous email
+ * @uses apply_filters() Calls 'bbp_check_for_duplicate_query' with the
+ *                        duplicate check query and post data
+ * @uses wpdb::get_var() To execute our query and get the var back
+ * @uses get_post_meta() To get the anonymous user email post meta
+ * @uses do_action() Calls 'bbp_post_duplicate_trigger' with the post data when
+ *                    it is found that it is a duplicate
+ * @return bool True if it is not a duplicate, false if it is
+ */
+function bbp_check_for_duplicate( $post_data ) {
+
+	// No duplicate checks for those who can throttle
+	if ( current_user_can( 'throttle' ) )
+		return true;
+
+	global $wpdb;
+
+	extract( $post_data, EXTR_SKIP );
+
+	// Check for anonymous post
+	if ( empty( $post_author ) && ( isset( $anonymous_data ) && !empty( $anonymous_data['bbp_anonymous_email'] ) ) ) {
+		$clauses = get_meta_sql( array( array(
+			'key'   => '_bbp_anonymous_email',
+			'value' => $anonymous_data['bbp_anonymous_email']
+		) ), 'post', $wpdb->posts, 'ID' );
+
+		$join    = $clauses['join'];
+		$where   = $clauses['where'];
+	} else{
+		$join    = $where = '';
+	}
+
+	// Simple duplicate check
+	// Expected slashed ($post_type, $post_parent, $post_author, $post_content, $anonymous_data)
+	$status = bbp_get_trash_status_id();
+	$dupe   = "SELECT ID FROM {$wpdb->posts} {$join} WHERE post_type = '{$post_type}' AND post_status != '{$status}' AND post_author = {$post_author} AND post_content = '{$post_content}' {$where}";
+	$dupe  .= !empty( $post_parent ) ? " AND post_parent = '{$post_parent}'" : '';
+	$dupe  .= " LIMIT 1";
+	$dupe   = apply_filters( 'bbp_check_for_duplicate_query', $dupe, $post_data );
+
+	if ( $wpdb->get_var( $dupe ) ) {
+		do_action( 'bbp_check_for_duplicate_trigger', $post_data );
+		return false;
+	}
+
+	return true;
+}
+
+/**
+ * Check for flooding
+ *
+ * Check to make sure that a user is not making too many posts in a short amount
+ * of time.
+ *
+ * @since bbPress (r2734)
+ *
+ * @param false|array $anonymous_data Optional - if it's an anonymous post. Do
+ *                                     not supply if supplying $author_id.
+ *                                     Should have key 'bbp_author_ip'.
+ *                                     Should be sanitized (see
+ *                                     {@link bbp_filter_anonymous_post_data()}
+ *                                     for sanitization)
+ * @param int $author_id Optional. Supply if it's a post by a logged in user.
+ *                        Do not supply if supplying $anonymous_data.
+ * @uses get_option() To get the throttle time
+ * @uses get_transient() To get the last posted transient of the ip
+ * @uses bbp_get_user_last_posted() To get the last posted time of the user
+ * @uses current_user_can() To check if the current user can throttle
+ * @return bool True if there is no flooding, false if there is
+ */
+function bbp_check_for_flood( $anonymous_data = false, $author_id = 0 ) {
+
+	// Option disabled. No flood checks.
+	$throttle_time = get_option( '_bbp_throttle_time' );
+	if ( empty( $throttle_time ) )
+		return true;
+
+	// User is anonymous, so check a transient based on the IP
+	if ( !empty( $anonymous_data ) && is_array( $anonymous_data ) ) {
+		$last_posted = get_transient( '_bbp_' . bbp_current_author_ip() . '_last_posted' );
+
+		if ( !empty( $last_posted ) && time() < $last_posted + $throttle_time ) {
+			return false;
+		}
+		
+	// User is logged in, so check their last posted time
+	} elseif ( !empty( $author_id ) ) {
+		$author_id   = (int) $author_id;
+		$last_posted = bbp_get_user_last_posted( $author_id );
+
+		if ( isset( $last_posted ) && time() < $last_posted + $throttle_time && !current_user_can( 'throttle' ) ) {
+			return false;
+		}
+	} else {
+		return false;
+	}
+
+	return true;
+}
+
+/**
+ * Checks topics and replies against the discussion moderation of blocked keys
+ *
+ * @since bbPress (r3581)
+ *
+ * @param array $anonymous_data Anonymous user data
+ * @param int $author_id Topic or reply author ID
+ * @param string $title The title of the content
+ * @param string $content The content being posted
+ * @uses is_super_admin() Allow super admins to bypass blacklist
+ * @uses bbp_current_author_ip() To get current user IP address
+ * @uses bbp_current_author_ua() To get current user agent
+ * @return bool True if test is passed, false if fail
+ */
+function bbp_check_for_moderation( $anonymous_data = false, $author_id = 0, $title = '', $content = '' ) {
+
+	// Bail if super admin is author
+	if ( is_super_admin( $author_id ) )
+		return true;
+
+	// Define local variable(s)
+	$_post     = array();
+	$match_out = '';
+
+	/** Blacklist *************************************************************/
+
+	// Get the moderation keys
+	$blacklist = trim( get_option( 'moderation_keys' ) );
+
+	// Bail if blacklist is empty
+	if ( empty( $blacklist ) )
+		return true;
+
+	/** User Data *************************************************************/
+
+	// Map anonymous user data
+	if ( !empty( $anonymous_data ) ) {
+		$_post['author'] = $anonymous_data['bbp_anonymous_name'];
+		$_post['email']  = $anonymous_data['bbp_anonymous_email'];
+		$_post['url']    = $anonymous_data['bbp_anonymous_website'];
+
+	// Map current user data
+	} elseif ( !empty( $author_id ) ) {
+
+		// Get author data
+		$user = get_userdata( $author_id );
+
+		// If data exists, map it
+		if ( !empty( $user ) ) {
+			$_post['author'] = $user->display_name;
+			$_post['email']  = $user->user_email;
+			$_post['url']    = $user->user_url;
+		}
+	}
+
+	// Current user IP and user agent
+	$_post['user_ip'] = bbp_current_author_ip();
+	$_post['user_ua'] = bbp_current_author_ua();
+
+	// Post title and content
+	$_post['title']   = $title;
+	$_post['content'] = $content;
+
+	/** Max Links *************************************************************/
+
+	$max_links = get_option( 'comment_max_links' );
+	if ( !empty( $max_links ) ) {
+
+		// How many links?
+		$num_links = preg_match_all( '/<a [^>]*href/i', $content, $match_out );
+
+		// Allow for bumping the max to include the user's URL
+		$num_links = apply_filters( 'comment_max_links_url', $num_links, $_post['url'] );
+
+		// Das ist zu viele links!
+		if ( $num_links >= $max_links ) {
+			return false;
+		}
+	}
+
+	/** Words *****************************************************************/
+
+	// Get words separated by new lines
+	$words = explode( "\n", $blacklist );
+
+	// Loop through words
+	foreach ( (array) $words as $word ) {
+
+		// Trim the whitespace from the word
+		$word = trim( $word );
+
+		// Skip empty lines
+		if ( empty( $word ) ) { continue; }
+
+		// Do some escaping magic so that '#' chars in the
+		// spam words don't break things:
+		$word    = preg_quote( $word, '#' );
+		$pattern = "#$word#i";
+
+		// Loop through post data
+		foreach( $_post as $post_data ) {
+
+			// Check each user data for current word
+			if ( preg_match( $pattern, $post_data ) ) {
+
+				// Post does not pass
+				return false;
+			}
+		}
+	}
+
+	// Check passed successfully
+	return true;
+}
+
+/**
+ * Checks topics and replies against the discussion blacklist of blocked keys
+ *
+ * @since bbPress (r3446)
+ *
+ * @param array $anonymous_data Anonymous user data
+ * @param int $author_id Topic or reply author ID
+ * @param string $title The title of the content
+ * @param string $content The content being posted
+ * @uses is_super_admin() Allow super admins to bypass blacklist
+ * @uses bbp_current_author_ip() To get current user IP address
+ * @uses bbp_current_author_ua() To get current user agent
+ * @return bool True if test is passed, false if fail
+ */
+function bbp_check_for_blacklist( $anonymous_data = false, $author_id = 0, $title = '', $content = '' ) {
+
+	// Bail if super admin is author
+	if ( is_super_admin( $author_id ) )
+		return true;
+
+	// Define local variable
+	$_post = array();
+
+	/** Blacklist *************************************************************/
+
+	// Get the moderation keys
+	$blacklist = trim( get_option( 'blacklist_keys' ) );
+
+	// Bail if blacklist is empty
+	if ( empty( $blacklist ) )
+		return true;
+
+	/** User Data *************************************************************/
+
+	// Map anonymous user data
+	if ( !empty( $anonymous_data ) ) {
+		$_post['author'] = $anonymous_data['bbp_anonymous_name'];
+		$_post['email']  = $anonymous_data['bbp_anonymous_email'];
+		$_post['url']    = $anonymous_data['bbp_anonymous_website'];
+
+	// Map current user data
+	} elseif ( !empty( $author_id ) ) {
+
+		// Get author data
+		$user = get_userdata( $author_id );
+
+		// If data exists, map it
+		if ( !empty( $user ) ) {
+			$_post['author'] = $user->display_name;
+			$_post['email']  = $user->user_email;
+			$_post['url']    = $user->user_url;
+		}
+	}
+
+	// Current user IP and user agent
+	$_post['user_ip'] = bbp_current_author_ip();
+	$_post['user_ua'] = bbp_current_author_ua();
+
+	// Post title and content
+	$_post['title']   = $title;
+	$_post['content'] = $content;
+
+	/** Words *****************************************************************/
+
+	// Get words separated by new lines
+	$words = explode( "\n", $blacklist );
+
+	// Loop through words
+	foreach ( (array) $words as $word ) {
+
+		// Trim the whitespace from the word
+		$word = trim( $word );
+
+		// Skip empty lines
+		if ( empty( $word ) ) { continue; }
+
+		// Do some escaping magic so that '#' chars in the
+		// spam words don't break things:
+		$word    = preg_quote( $word, '#' );
+		$pattern = "#$word#i";
+
+		// Loop through post data
+		foreach( $_post as $post_data ) {
+
+			// Check each user data for current word
+			if ( preg_match( $pattern, $post_data ) ) {
+
+				// Post does not pass
+				return false;
+			}
+		}
+	}
+
+	// Check passed successfully
+	return true;
+}
+
+/** Subscriptions *************************************************************/
+
+/**
+ * Sends notification emails for new posts
+ *
+ * Gets new post's ID and check if there are subscribed users to that topic, and
+ * if there are, send notifications
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $reply_id ID of the newly made reply
+ * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
+ * @uses bbp_get_reply_id() To validate the reply ID
+ * @uses bbp_get_reply() To get the reply
+ * @uses bbp_get_reply_topic_id() To get the topic ID of the reply
+ * @uses bbp_is_reply_published() To make sure the reply is published
+ * @uses bbp_get_topic_id() To validate the topic ID
+ * @uses bbp_get_topic() To get the reply's topic
+ * @uses bbp_is_topic_published() To make sure the topic is published
+ * @uses get_the_author_meta() To get the author's display name
+ * @uses do_action() Calls 'bbp_pre_notify_subscribers' with the reply id and
+ *                    topic id
+ * @uses bbp_get_topic_subscribers() To get the topic subscribers
+ * @uses apply_filters() Calls 'bbp_subscription_mail_message' with the
+ *                        message, reply id, topic id and user id
+ * @uses get_userdata() To get the user data
+ * @uses wp_mail() To send the mail
+ * @uses do_action() Calls 'bbp_post_notify_subscribers' with the reply id
+ *                    and topic id
+ * @return bool True on success, false on failure
+ */
+function bbp_notify_subscribers( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $reply_author = 0 ) {
+
+	// Bail if subscriptions are turned off
+	if ( !bbp_is_subscriptions_active() )
+		return false;
+
+	/** Validation ************************************************************/
+
+	$reply_id = bbp_get_reply_id( $reply_id );
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	/** Reply *****************************************************************/
+
+	// Bail if reply is not published
+	if ( !bbp_is_reply_published( $reply_id ) )
+		return false;
+
+	/** Topic *****************************************************************/
+
+	// Bail if topic is not published
+	if ( !bbp_is_topic_published( $topic_id ) )
+		return false;
+
+	/** User ******************************************************************/
+
+	// Get subscribers and bail if empty
+	$user_ids = bbp_get_topic_subscribers( $topic_id, true );
+	if ( empty( $user_ids ) )
+		return false;
+
+	// Poster name
+	$reply_author_name = bbp_get_reply_author_display_name( $reply_id );
+
+	/** Mail ******************************************************************/
+
+	do_action( 'bbp_pre_notify_subscribers', $reply_id, $topic_id, $user_ids );
+
+	// Remove filters from reply content and topic title to prevent content
+	// from being encoded with HTML entities, wrapped in paragraph tags, etc...
+	remove_all_filters( 'bbp_get_reply_content' );
+	remove_all_filters( 'bbp_get_topic_title'   );
+
+	// Strip tags from text
+	$topic_title   = strip_tags( bbp_get_topic_title( $topic_id ) );
+	$reply_content = strip_tags( bbp_get_reply_content( $reply_id ) );
+	$reply_url     = bbp_get_reply_url( $reply_id );
+	$blog_name     = get_option( 'blogname' );
+
+	// Loop through users
+	foreach ( (array) $user_ids as $user_id ) {
+
+		// Don't send notifications to the person who made the post
+		if ( !empty( $reply_author ) && (int) $user_id == (int) $reply_author )
+			continue;
+
+		// For plugins to filter messages per reply/topic/user
+		$message = sprintf( __( '%1$s wrote:
+
+%2$s
+			
+Post Link: %3$s
+
+-----------
+
+You are receiving this email because you subscribed to a forum topic.
+
+Login and visit the topic to unsubscribe from these emails.', 'bbpress' ),
+				
+			$reply_author_name,
+			$reply_content,
+			$reply_url
+		);
+
+		$message = apply_filters( 'bbp_subscription_mail_message', $message, $reply_id, $topic_id, $user_id );
+		if ( empty( $message ) )
+			continue;
+
+		// For plugins to filter titles per reply/topic/user
+		$subject = apply_filters( 'bbp_subscription_mail_title', '[' . $blog_name . '] ' . $topic_title, $reply_id, $topic_id, $user_id );
+		if ( empty( $subject ) )
+			continue;
+
+		// Custom headers
+		$headers = apply_filters( 'bbp_subscription_mail_headers', array() );
+
+		// Get user data of this user
+		$user = get_userdata( $user_id );
+
+		// Send notification email
+		wp_mail( $user->user_email, $subject, $message, $headers );
+	}
+
+	do_action( 'bbp_post_notify_subscribers', $reply_id, $topic_id, $user_ids );
+
+	return true;
+}
+
+/** Login *********************************************************************/
+
+/**
+ * Return a clean and reliable logout URL
+ *
+ * @param string $url URL
+ * @param string $redirect_to Where to redirect to?
+ * @uses add_query_arg() To add args to the url
+ * @uses apply_filters() Calls 'bbp_logout_url' with the url and redirect to
+ * @return string The url
+ */
+function bbp_logout_url( $url = '', $redirect_to = '' ) {
+
+	// Make sure we are directing somewhere
+	if ( empty( $redirect_to ) && !strstr( $url, 'redirect_to' ) ) {
+
+		// Rejig the $redirect_to
+		if ( !isset( $_SERVER['REDIRECT_URL'] ) || ( $redirect_to != home_url( $_SERVER['REDIRECT_URL'] ) ) ) {
+			$redirect_to = isset( $_SERVER['HTTP_REFERER'] ) ? $_SERVER['HTTP_REFERER'] : '';
+		}
+
+		$redirect_to = ( is_ssl() ? 'https://' : 'http://' ) . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'];
+
+		// Sanitize $redirect_to and add it to full $url
+		$redirect_to = add_query_arg( array( 'loggedout'   => 'true'                    ), esc_url( $redirect_to ) );
+		$url         = add_query_arg( array( 'redirect_to' => urlencode( $redirect_to ) ), $url                    );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_logout_url', $url, $redirect_to );
+}
+
+/** Queries *******************************************************************/
+
+/**
+ * Merge user defined arguments into defaults array.
+ *
+ * This function is used throughout bbPress to allow for either a string or array
+ * to be merged into another array. It is identical to wp_parse_args() except
+ * it allows for arguments to be passively or aggressively filtered using the
+ * optional $filter_key parameter.
+ *
+ * @since bbPress (r3839)
+ *
+ * @param string|array $args Value to merge with $defaults
+ * @param array $defaults Array that serves as the defaults.
+ * @param string $filter_key String to key the filters from
+ * @return array Merged user defined values with defaults.
+ */
+function bbp_parse_args( $args, $defaults = '', $filter_key = '' ) {
+
+	// Setup a temporary array from $args
+	if ( is_object( $args ) )
+		$r = get_object_vars( $args );
+	elseif ( is_array( $args ) )
+		$r =& $args;
+	else
+		wp_parse_str( $args, $r );
+
+	// Passively filter the args before the parse
+	if ( !empty( $filter_key ) )
+		$r = apply_filters( 'bbp_before_' . $filter_key . '_parse_args', $r );
+
+	// Parse
+	if ( is_array( $defaults ) )
+		$r = array_merge( $defaults, $r );
+
+	// Aggressively filter the args after the parse
+	if ( !empty( $filter_key ) )
+		$r = apply_filters( 'bbp_after_' . $filter_key . '_parse_args', $r );
+
+	// Return the parsed results
+	return $r;
+}
+
+/**
+ * Adds ability to include or exclude specific post_parent ID's
+ *
+ * @since bbPress (r2996)
+ *
+ * @global DB $wpdb
+ * @global WP $wp
+ * @param string $where
+ * @param WP_Query $object
+ * @return string
+ */
+function bbp_query_post_parent__in( $where, $object = '' ) {
+	global $wpdb, $wp;
+
+	// Noop if WP core supports this already
+	if ( in_array( 'post_parent__in', $wp->private_query_vars ) )
+		return $where;
+
+	// Bail if no object passed
+	if ( empty( $object ) )
+		return $where;
+
+	// Only 1 post_parent so return $where
+	if ( is_numeric( $object->query_vars['post_parent'] ) )
+		return $where;
+
+	// Including specific post_parent's
+	if ( ! empty( $object->query_vars['post_parent__in'] ) ) {
+		$ids    = implode( ',', array_map( 'absint', $object->query_vars['post_parent__in'] ) );
+		$where .= " AND $wpdb->posts.post_parent IN ($ids)";
+
+	// Excluding specific post_parent's
+	} elseif ( ! empty( $object->query_vars['post_parent__not_in'] ) ) {
+		$ids    = implode( ',', array_map( 'absint', $object->query_vars['post_parent__not_in'] ) );
+		$where .= " AND $wpdb->posts.post_parent NOT IN ($ids)";
+	}
+
+	// Return possibly modified $where
+	return $where;
+}
+
+/**
+ * Query the DB and get the last public post_id that has parent_id as post_parent
+ *
+ * @param int $parent_id Parent id
+ * @param string $post_type Post type. Defaults to 'post'
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wp_cache_get() To check if there is a cache of the last child id
+ * @uses wpdb::prepare() To prepare the query
+ * @uses wpdb::get_var() To get the result of the query in a variable
+ * @uses wp_cache_set() To set the cache for future use
+ * @uses apply_filters() Calls 'bbp_get_public_child_last_id' with the child
+ *                        id, parent id and post type
+ * @return int The last active post_id
+ */
+function bbp_get_public_child_last_id( $parent_id = 0, $post_type = 'post' ) {
+	global $wpdb;
+
+	// Bail if nothing passed
+	if ( empty( $parent_id ) )
+		return false;
+
+	// The ID of the cached query
+	$cache_id    = 'bbp_parent_' . $parent_id . '_type_' . $post_type . '_child_last_id';
+	$post_status = array( bbp_get_public_status_id() );
+
+	// Add closed status if topic post type
+	if ( $post_type == bbp_get_topic_post_type() )
+		$post_status[] = bbp_get_closed_status_id();
+
+	// Join post statuses together
+	$post_status = "'" . join( "', '", $post_status ) . "'";
+
+	// Check for cache and set if needed
+	$child_id = wp_cache_get( $cache_id, 'bbpress' );
+	if ( empty( $child_id ) ) {
+		$child_id = $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC LIMIT 1;", $parent_id, $post_type ) );
+		wp_cache_set( $cache_id, $child_id, 'bbpress' );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_get_public_child_last_id', (int) $child_id, (int) $parent_id, $post_type );
+}
+
+/**
+ * Query the DB and get a count of public children
+ *
+ * @param int $parent_id Parent id
+ * @param string $post_type Post type. Defaults to 'post'
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wp_cache_get() To check if there is a cache of the children count
+ * @uses wpdb::prepare() To prepare the query
+ * @uses wpdb::get_var() To get the result of the query in a variable
+ * @uses wp_cache_set() To set the cache for future use
+ * @uses apply_filters() Calls 'bbp_get_public_child_count' with the child
+ *                        count, parent id and post type
+ * @return int The number of children
+ */
+function bbp_get_public_child_count( $parent_id = 0, $post_type = 'post' ) {
+	global $wpdb;
+
+	// Bail if nothing passed
+	if ( empty( $parent_id ) )
+		return false;
+
+	// The ID of the cached query
+	$cache_id    = 'bbp_parent_' . $parent_id . '_type_' . $post_type . '_child_count';
+	$post_status = array( bbp_get_public_status_id() );
+
+	// Add closed status if topic post type
+	if ( $post_type == bbp_get_topic_post_type() )
+		$post_status[] = bbp_get_closed_status_id();
+
+	// Join post statuses together
+	$post_status = "'" . join( "', '", $post_status ) . "'";
+
+	// Check for cache and set if needed
+	$child_count = wp_cache_get( $cache_id, 'bbpress' );
+	if ( empty( $child_count ) ) {
+		$child_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s';", $parent_id, $post_type ) );
+		wp_cache_set( $cache_id, $child_count, 'bbpress' );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_get_public_child_count', (int) $child_count, (int) $parent_id, $post_type );
+}
+
+/**
+ * Query the DB and get a the child id's of public children
+ *
+ * @param int $parent_id Parent id
+ * @param string $post_type Post type. Defaults to 'post'
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wp_cache_get() To check if there is a cache of the children
+ * @uses wpdb::prepare() To prepare the query
+ * @uses wpdb::get_col() To get the result of the query in an array
+ * @uses wp_cache_set() To set the cache for future use
+ * @uses apply_filters() Calls 'bbp_get_public_child_ids' with the child ids,
+ *                        parent id and post type
+ * @return array The array of children
+ */
+function bbp_get_public_child_ids( $parent_id = 0, $post_type = 'post' ) {
+	global $wpdb;
+
+	// Bail if nothing passed
+	if ( empty( $parent_id ) )
+		return false;
+
+	// The ID of the cached query
+	$cache_id    = 'bbp_parent_public_' . $parent_id . '_type_' . $post_type . '_child_ids';
+	$post_status = array( bbp_get_public_status_id() );
+
+	// Add closed status if topic post type
+	if ( $post_type == bbp_get_topic_post_type() )
+		$post_status[] = bbp_get_closed_status_id();
+
+	// Join post statuses together
+	$post_status = "'" . join( "', '", $post_status ) . "'";
+
+	// Check for cache and set if needed
+	$child_ids = wp_cache_get( $cache_id, 'bbpress' );
+	if ( empty( $child_ids ) ) {
+		$child_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC;", $parent_id, $post_type ) );
+		wp_cache_set( $cache_id, $child_ids, 'bbpress' );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_get_public_child_ids', $child_ids, (int) $parent_id, $post_type );
+}
+/**
+ * Query the DB and get a the child id's of all children
+ *
+ * @param int $parent_id Parent id
+ * @param string $post_type Post type. Defaults to 'post'
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wp_cache_get() To check if there is a cache of the children
+ * @uses wpdb::prepare() To prepare the query
+ * @uses wpdb::get_col() To get the result of the query in an array
+ * @uses wp_cache_set() To set the cache for future use
+ * @uses apply_filters() Calls 'bbp_get_public_child_ids' with the child ids,
+ *                        parent id and post type
+ * @return array The array of children
+ */
+function bbp_get_all_child_ids( $parent_id = 0, $post_type = 'post' ) {
+	global $wpdb;
+
+	// Bail if nothing passed
+	if ( empty( $parent_id ) )
+		return false;
+
+	// The ID of the cached query
+	$cache_id    = 'bbp_parent_all_' . $parent_id . '_type_' . $post_type . '_child_ids';
+	$post_status = array( bbp_get_public_status_id() );
+
+	// Extra post statuses based on post type
+	switch ( $post_type ) {
+
+		// Forum
+		case bbp_get_forum_post_type() :
+			$post_status[] = bbp_get_private_status_id();
+			$post_status[] = bbp_get_hidden_status_id();
+			break;
+
+		// Topic
+		case bbp_get_topic_post_type() :
+			$post_status[] = bbp_get_closed_status_id();
+			$post_status[] = bbp_get_trash_status_id();
+			$post_status[] = bbp_get_spam_status_id();
+			break;
+
+		// Reply
+		case bbp_get_reply_post_type() :
+			$post_status[] = bbp_get_trash_status_id();
+			$post_status[] = bbp_get_spam_status_id();
+			break;
+	}
+
+	// Join post statuses together
+	$post_status = "'" . join( "', '", $post_status ) . "'";
+
+	// Check for cache and set if needed
+	$child_ids = wp_cache_get( $cache_id, 'bbpress' );
+	if ( empty( $child_ids ) ) {
+		$child_ids = $wpdb->get_col( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( {$post_status} ) AND post_type = '%s' ORDER BY ID DESC;", $parent_id, $post_type ) );
+		wp_cache_set( $cache_id, $child_ids, 'bbpress' );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_get_all_child_ids', $child_ids, (int) $parent_id, $post_type );
+}
+
+/** Globals *******************************************************************/
+
+/**
+ * Get the unfiltered value of a global $post's key
+ *
+ * Used most frequently when editing a forum/topic/reply
+ *
+ * @since bbPress (r3694)
+ *
+ * @global WP_Query $post
+ * @param string $field Name of the key
+ * @param string $context How to sanitize - raw|edit|db|display|attribute|js
+ * @return string Field value
+ */
+function bbp_get_global_post_field( $field = 'ID', $context = 'edit' ) {
+	global $post;
+
+	$retval = isset( $post->$field ) ? $post->$field : '';
+	$retval = sanitize_post_field( $field, $retval, $post->ID, $context );
+
+	return apply_filters( 'bbp_get_global_post_field', $retval, $post );
+}
+
+/** Nonces ********************************************************************/
+
+/**
+ * Makes sure the user requested an action from another page on this site.
+ *
+ * To avoid security exploits within the theme.
+ *
+ * @since bbPress (r4022)
+ *
+ * @uses do_action() Calls 'bbp_check_referer' on $action.
+ * @param string $action Action nonce
+ * @param string $query_arg where to look for nonce in $_REQUEST
+ */
+function bbp_verify_nonce_request( $action = '', $query_arg = '_wpnonce' ) {
+
+	// Get the home URL
+	$home_url      = strtolower( home_url() );
+
+	// Build the currently requested URL
+	$scheme        = is_ssl() ? 'https://' : 'http://';
+	$requested_url = strtolower( $scheme . $_SERVER['HTTP_HOST'] . $_SERVER['REQUEST_URI'] );
+
+	// Filter the requested URL, for configurations like reverse proxying
+	$matched_url   = apply_filters( 'bbp_verify_nonce_request_url', $requested_url );
+
+	// Check the nonce
+	$result = isset( $_REQUEST[$query_arg] ) ? wp_verify_nonce( $_REQUEST[$query_arg], $action ) : false;
+
+	// Nonce check failed
+	if ( empty( $result ) || empty( $action ) || ( strpos( $matched_url, $home_url ) !== 0 ) )
+		$result = false;
+
+	// Do extra things
+	do_action( 'bbp_verify_nonce_request', $action, $result );
+
+	return $result;
+}
+
+/** Feeds *********************************************************************/
+
+/**
+ * This function is hooked into the WordPress 'request' action and is
+ * responsible for sniffing out the query vars and serving up RSS2 feeds if
+ * the stars align and the user has requested a feed of any bbPress type.
+ *
+ * @since bbPress (r3171)
+ *
+ * @param array $query_vars
+ * @return array
+ */
+function bbp_request_feed_trap( $query_vars = array() ) {
+
+	// Looking at a feed
+	if ( isset( $query_vars['feed'] ) ) {
+
+		// Forum/Topic/Reply Feed
+		if ( isset( $query_vars['post_type'] ) ) {
+
+			// What bbPress post type are we looking for feeds on?
+			switch ( $query_vars['post_type'] ) {
+
+				// Forum
+				case bbp_get_forum_post_type() :
+
+					// Define local variable(s)
+					$meta_query = array();
+
+					// Single forum
+					if ( isset( $query_vars[bbp_get_forum_post_type()] ) ) {
+
+						// Get the forum by the path
+						$forum    = get_page_by_path( $query_vars[bbp_get_forum_post_type()], OBJECT, bbp_get_forum_post_type() );
+						$forum_id = $forum->ID;
+
+						// Load up our own query
+						query_posts( array(
+							'post_type' => bbp_get_forum_post_type(),
+							'ID'        => $forum_id,
+							'feed'      => true
+						) );
+
+						// Restrict to specific forum ID
+						$meta_query = array( array(
+							'key'     => '_bbp_forum_id',
+							'value'   => $forum_id,
+							'type'    => 'numeric',
+							'compare' => '='
+						) );
+					}
+
+					// Only forum replies
+					if ( !empty( $_GET['type'] ) && ( bbp_get_reply_post_type() == $_GET['type'] ) ) {
+
+						// The query
+						$the_query = array(
+							'author'         => 0,
+							'feed'           => true,
+							'post_type'      => bbp_get_reply_post_type(),
+							'post_parent'    => 'any',
+							'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+							'posts_per_page' => bbp_get_replies_per_rss_page(),
+							'order'          => 'DESC',
+							'meta_query'     => $meta_query
+						);
+
+						// Output the feed
+						bbp_display_replies_feed_rss2( $the_query );
+
+					// Only forum topics
+					} elseif ( !empty( $_GET['type'] ) && ( bbp_get_topic_post_type() == $_GET['type'] ) ) {
+
+						// The query
+						$the_query = array(
+							'author'         => 0,
+							'feed'           => true,
+							'post_type'      => bbp_get_topic_post_type(),
+							'post_parent'    => $forum_id,
+							'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+							'posts_per_page' => bbp_get_topics_per_rss_page(),
+							'order'          => 'DESC'
+						);
+
+						// Output the feed
+						bbp_display_topics_feed_rss2( $the_query );
+
+					// All forum topics and replies
+					} else {
+
+						// Exclude private/hidden forums if not looking at single
+						if ( empty( $query_vars['forum'] ) )
+							$meta_query = array( bbp_exclude_forum_ids( 'meta_query' ) );
+
+						// The query
+						$the_query = array(
+							'author'         => 0,
+							'feed'           => true,
+							'post_type'      => array( bbp_get_reply_post_type(), bbp_get_topic_post_type() ),
+							'post_parent'    => 'any',
+							'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+							'posts_per_page' => bbp_get_replies_per_rss_page(),
+							'order'          => 'DESC',
+							'meta_query'     => $meta_query
+						);
+
+						// Output the feed
+						bbp_display_replies_feed_rss2( $the_query );
+					}
+
+					break;
+
+				// Topic feed - Show replies
+				case bbp_get_topic_post_type() :
+
+					// Single topic
+					if ( isset( $query_vars[bbp_get_topic_post_type()] ) ) {
+
+						// Load up our own query
+						query_posts( array(
+							'post_type' => bbp_get_topic_post_type(),
+							'name'      => $query_vars[bbp_get_topic_post_type()],
+							'feed'      => true
+						) );
+
+						// Output the feed
+						bbp_display_replies_feed_rss2( array( 'feed' => true ) );
+
+					// All topics
+					} else {
+
+						// The query
+						$the_query = array(
+							'author'         => 0,
+							'feed'           => true,
+							'post_parent'    => 'any',
+							'posts_per_page' => bbp_get_topics_per_rss_page(),
+							'show_stickies'  => false
+						);
+
+						// Output the feed
+						bbp_display_topics_feed_rss2( $the_query );
+					}
+
+					break;
+
+				// Replies
+				case bbp_get_reply_post_type() :
+
+					// The query
+					$the_query = array(
+						'posts_per_page' => bbp_get_replies_per_rss_page(),
+						'meta_query'     => array( array( ) ),
+						'feed'           => true
+					);
+
+					// All replies
+					if ( !isset( $query_vars[bbp_get_reply_post_type()] ) ) {
+						bbp_display_replies_feed_rss2( $the_query );
+					}
+
+					break;
+			}
+
+		// Single Topic Vview
+		} elseif ( isset( $query_vars['bbp_view'] ) ) {
+
+			// Get the view
+			$view = $query_vars['bbp_view'];
+
+			// We have a view to display a feed
+			if ( !empty( $view ) ) {
+
+				// Get the view query
+				$the_query = bbp_get_view_query_args( $view );
+
+				// Output the feed
+				bbp_display_topics_feed_rss2( $the_query );
+			}
+		}
+
+		// @todo User profile feeds
+	}
+
+	// No feed so continue on
+	return $query_vars;
+}
+
+/** Templates ******************************************************************/
+
+/**
+ * Used to guess if page exists at requested path
+ *
+ * @since bbPress (r3304)
+ *
+ * @uses get_option() To see if pretty permalinks are enabled
+ * @uses get_page_by_path() To see if page exists at path
+ *
+ * @param string $path
+ * @return mixed False if no page, Page object if true
+ */
+function bbp_get_page_by_path( $path = '' ) {
+
+	// Default to false
+	$retval = false;
+
+	// Path is not empty
+	if ( !empty( $path ) ) {
+
+		// Pretty permalinks are on so path might exist
+		if ( get_option( 'permalink_structure' ) ) {
+			$retval = get_page_by_path( $path );
+		}
+	}
+
+	return apply_filters( 'bbp_get_page_by_path', $retval, $path );
+}
+
+/**
+ * Sets the 404 status.
+ *
+ * Used primarily with topics/replies inside hidden forums.
+ *
+ * @since bbPress (r3051)
+ *
+ * @global WP_Query $wp_query
+ * @uses WP_Query::set_404()
+ */
+function bbp_set_404() {
+	global $wp_query;
+
+	if ( ! isset( $wp_query ) ) {
+		_doing_it_wrong( __FUNCTION__, __( 'Conditional query tags do not work before the query is run. Before then, they always return false.', 'bbpress' ), '3.1' );
+		return false;
+	}
+
+	$wp_query->set_404();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/shortcodes.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,737 @@
+<?php
+
+/**
+ * bbPress Shortcodes
+ *
+ * @package bbPress
+ * @subpackage Shortcodes
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Shortcodes' ) ) :
+/**
+ * bbPress Shortcode Class
+ *
+ * @since bbPress (r3031)
+ */
+class BBP_Shortcodes {
+
+	/** Vars ******************************************************************/
+
+	/**
+	 * @var array Shortcode => function
+	 */
+	public $codes = array();
+
+	/** Functions *************************************************************/
+
+	/**
+	 * Add the register_shortcodes action to bbp_init
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @uses setup_globals()
+	 * @uses add_shortcodes()
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->add_shortcodes();
+	}
+
+	/**
+	 * Shortcode globals
+	 *
+	 * @since bbPress (r3143)
+	 * @access private
+	 *
+	 * @uses apply_filters()
+	 */
+	private function setup_globals() {
+
+		// Setup the shortcodes
+		$this->codes = apply_filters( 'bbp_shortcodes', array(
+
+			/** Forums ********************************************************/
+
+			'bbp-forum-index'      => array( $this, 'display_forum_index'   ), // Forum Index
+			'bbp-forum-form'       => array( $this, 'display_forum_form'    ), // Topic form
+			'bbp-single-forum'     => array( $this, 'display_forum'         ), // Specific forum - pass an 'id' attribute
+
+			/** Topics ********************************************************/
+
+			'bbp-topic-index'      => array( $this, 'display_topic_index'   ), // Topic index
+			'bbp-topic-form'       => array( $this, 'display_topic_form'    ), // Topic form
+			'bbp-single-topic'     => array( $this, 'display_topic'         ), // Specific topic - pass an 'id' attribute
+
+			/** Topic Tags ****************************************************/
+
+			'bbp-topic-tags'       => array( $this, 'display_topic_tags'    ), // All topic tags in a cloud
+			'bbp-single-tag'       => array( $this, 'display_topics_of_tag' ), // Topics of Tag
+
+			/** Replies *******************************************************/
+
+			'bbp-reply-form'       => array( $this, 'display_reply_form'    ), // Reply form
+			'bbp-single-reply'     => array( $this, 'display_reply'         ), // Specific reply - pass an 'id' attribute
+
+			/** Views *********************************************************/
+
+			'bbp-single-view'      => array( $this, 'display_view'          ), // Single view
+
+			/** Account *******************************************************/
+
+			'bbp-login'            => array( $this, 'display_login'         ), // Login
+			'bbp-register'         => array( $this, 'display_register'      ), // Register
+			'bbp-lost-pass'        => array( $this, 'display_lost_pass'     ), // Lost Password
+		) );
+	}
+
+	/**
+	 * Register the bbPress shortcodes
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @uses add_shortcode()
+	 * @uses do_action()
+	 */
+	private function add_shortcodes() {
+		foreach( (array) $this->codes as $code => $function ) {
+			add_shortcode( $code, $function );
+		}
+	}
+
+	/**
+	 * Unset some globals in the $bbp object that hold query related info
+	 *
+	 * @since bbPress (r3034)
+	 */
+	private function unset_globals() {
+		$bbp = bbpress();
+
+		// Unset global queries
+		$bbp->forum_query = new stdClass;
+		$bbp->topic_query = new stdClass;
+		$bbp->reply_query = new stdClass;
+
+		// Unset global ID's
+		$bbp->current_forum_id     = 0;
+		$bbp->current_topic_id     = 0;
+		$bbp->current_reply_id     = 0;
+		$bbp->current_topic_tag_id = 0;
+
+		// Reset the post data
+		wp_reset_postdata();
+	}
+
+	/** Output Buffers ********************************************************/
+
+	/**
+	 * Start an output buffer.
+	 *
+	 * This is used to put the contents of the shortcode into a variable rather
+	 * than outputting the HTML at run-time. This allows shortcodes to appear
+	 * in the correct location in the_content() instead of when it's created.
+	 *
+	 * @since bbPress (r3079)
+	 *
+	 * @param string $query_name
+	 *
+	 * @uses bbp_set_query_name()
+	 * @uses ob_start()
+	 */
+	private function start( $query_name = '' ) {
+
+		// Set query name
+		bbp_set_query_name( $query_name );
+
+		// Remove 'bbp_replace_the_content' filter to prevent infinite loops
+		remove_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// Start output buffer
+		ob_start();
+	}
+
+	/**
+	 * Return the contents of the output buffer and flush its contents.
+	 *
+	 * @since bbPress( r3079)
+	 *
+	 * @uses BBP_Shortcodes::unset_globals() Cleans up global values
+	 * @return string Contents of output buffer.
+	 */
+	private function end() {
+
+		// Put output into usable variable
+		$output = ob_get_contents();
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Flush the output buffer
+		ob_end_clean();
+
+		// Reset the query name
+		bbp_reset_query_name();
+
+		// Add 'bbp_replace_the_content' filter back (@see $this::start())
+		add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		return $output;
+	}
+
+	/** Forum shortcodes ******************************************************/
+
+	/**
+	 * Display an index of all visible root level forums in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses bbp_has_forums()
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_forum_index() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_forum_archive' );
+
+		bbp_get_template_part( 'content', 'archive-forum' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the contents of a specific forum ID in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @uses bbp_single_forum_description()
+	 * @return string
+	 */
+	public function display_forum( $attr, $content = '' ) {
+
+		// Sanity check required info
+		if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) )
+			return $content;
+
+		// Set passed attribute to $forum_id for clarity
+		$forum_id = bbpress()->current_forum_id = $attr['id'];
+
+		// Bail if ID passed is not a forum
+		if ( !bbp_is_forum( $forum_id ) )
+			return $content;
+
+		// Start output buffer
+		$this->start( 'bbp_single_forum' );
+
+		// Check forum caps
+		if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
+			bbp_get_template_part( 'content',  'single-forum' );
+
+		// Forum is private and user does not have caps
+		} elseif ( bbp_is_forum_private( $forum_id, false ) ) {
+			bbp_get_template_part( 'feedback', 'no-access'    );
+		}
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the forum form in an output buffer and return to ensure
+	 * post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3566)
+	 *
+	 * @uses get_template_part()
+	 */
+	public function display_forum_form() {
+
+		// Start output buffer
+		$this->start( 'bbp_forum_form' );
+
+		// Output templates
+		bbp_get_template_part( 'form', 'forum' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Topic shortcodes ******************************************************/
+
+	/**
+	 * Display an index of all visible root level topics in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses bbp_get_hidden_forum_ids()
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_topic_index() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Filter the query
+		if ( ! bbp_is_topic_archive() ) {
+			add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topic_index_query' ) );
+		}
+
+		// Start output buffer
+		$this->start( 'bbp_topic_archive' );
+
+		// Output template
+		bbp_get_template_part( 'content', 'archive-topic' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the contents of a specific topic ID in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_topic( $attr, $content = '' ) {
+
+		// Sanity check required info
+		if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) )
+			return $content;
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Set passed attribute to $forum_id for clarity
+		$topic_id = bbpress()->current_topic_id = $attr['id'];
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+		// Bail if ID passed is not a topic
+		if ( !bbp_is_topic( $topic_id ) )
+			return $content;
+
+		// Reset the queries if not in theme compat
+		if ( !bbp_is_theme_compat_active() ) {
+
+			$bbp = bbpress();
+
+			// Reset necessary forum_query attributes for topics loop to function
+			$bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
+			$bbp->forum_query->in_the_loop             = true;
+			$bbp->forum_query->post                    = get_post( $forum_id );
+
+			// Reset necessary topic_query attributes for topics loop to function
+			$bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
+			$bbp->topic_query->in_the_loop             = true;
+			$bbp->topic_query->post                    = get_post( $topic_id );
+		}
+
+		// Start output buffer
+		$this->start( 'bbp_single_topic' );
+
+		// Check forum caps
+		if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
+			bbp_get_template_part( 'content', 'single-topic' );
+
+		// Forum is private and user does not have caps
+		} elseif ( bbp_is_forum_private( $forum_id, false ) ) {
+			bbp_get_template_part( 'feedback', 'no-access'    );
+		}
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the topic form in an output buffer and return to ensure
+	 * post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @uses get_template_part()
+	 */
+	public function display_topic_form() {
+
+		// Start output buffer
+		$this->start( 'bbp_topic_form' );
+
+		// Output templates
+		bbp_get_template_part( 'form', 'topic' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Replies ***************************************************************/
+
+	/**
+	 * Display the contents of a specific reply ID in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_reply( $attr, $content = '' ) {
+
+		// Sanity check required info
+		if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) )
+			return $content;
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Set passed attribute to $reply_id for clarity
+		$reply_id = bbpress()->current_reply_id = $attr['id'];
+		$forum_id = bbp_get_reply_forum_id( $reply_id );
+
+		// Bail if ID passed is not a reply
+		if ( !bbp_is_reply( $reply_id ) )
+			return $content;
+
+		// Reset the queries if not in theme compat
+		if ( !bbp_is_theme_compat_active() ) {
+
+			$bbp = bbpress();
+
+			// Reset necessary forum_query attributes for replys loop to function
+			$bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
+			$bbp->forum_query->in_the_loop             = true;
+			$bbp->forum_query->post                    = get_post( $forum_id );
+
+			// Reset necessary reply_query attributes for replys loop to function
+			$bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
+			$bbp->reply_query->in_the_loop             = true;
+			$bbp->reply_query->post                    = get_post( $reply_id );
+		}
+
+		// Start output buffer
+		$this->start( 'bbp_single_reply' );
+
+		// Check forum caps
+		if ( bbp_user_can_view_forum( array( 'forum_id' => $forum_id ) ) ) {
+			bbp_get_template_part( 'content',  'single-reply' );
+
+		// Forum is private and user does not have caps
+		} elseif ( bbp_is_forum_private( $forum_id, false ) ) {
+			bbp_get_template_part( 'feedback', 'no-access'    );
+		}
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the reply form in an output buffer and return to ensure
+	 * post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @uses get_template_part()
+	 */
+	public function display_reply_form() {
+
+		// Start output buffer
+		$this->start( 'bbp_reply_form' );
+
+		// Output templates
+		bbp_get_template_part( 'form', 'reply' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Topic Tags ************************************************************/
+
+	/**
+	 * Display a tag cloud of all topic tags in an output buffer and return to
+	 * ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3110)
+	 *
+	 * @return string
+	 */
+	public function display_topic_tags() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_topic_tags' );
+
+		// Output the topic tags
+		wp_tag_cloud( array(
+			'smallest' => 9,
+			'largest'  => 38,
+			'number'   => 80,
+			'taxonomy' => bbp_get_topic_tag_tax_id()
+		) );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the contents of a specific topic tag in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3110)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_topics_of_tag( $attr, $content = '' ) {
+
+		// Sanity check required info
+		if ( !empty( $content ) || ( empty( $attr['id'] ) || !is_numeric( $attr['id'] ) ) )
+			return $content;
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Filter the query
+		if ( ! bbp_is_topic_tag() ) {
+			add_filter( 'bbp_before_has_topics_parse_args', array( $this, 'display_topics_of_tag_query' ) );
+		}
+
+		// Start output buffer
+		$this->start( 'bbp_topic_tag' );
+
+		// Set passed attribute to $ag_id for clarity
+		bbpress()->current_topic_tag_id = $tag_id = $attr['id'];
+
+		// Output template
+		bbp_get_template_part( 'content', 'archive-topic' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display the contents of a specific topic tag in an output buffer
+	 * and return to ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3346)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @return string
+	 */
+	public function display_topic_tag_form() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_topic_tag_edit' );
+
+		// Output template
+		bbp_get_template_part( 'content', 'topic-tag-edit' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Views *****************************************************************/
+
+	/**
+	 * Display the contents of a specific view in an output buffer and return to
+	 * ensure that post/page contents are displayed first.
+	 *
+	 * @since bbPress (r3031)
+	 *
+	 * @param array $attr
+	 * @param string $content
+	 * @uses get_template_part()
+	 * @uses bbp_single_forum_description()
+	 * @return string
+	 */
+	public function display_view( $attr, $content = '' ) {
+
+		// Sanity check required info
+		if ( empty( $attr['id'] ) )
+			return $content;
+
+		// Set passed attribute to $view_id for clarity
+		$view_id = $attr['id'];
+
+		// Start output buffer
+		$this->start( 'bbp_single_view' );
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Load the view
+		bbp_view_query( $view_id );
+
+		// Output template
+		bbp_get_template_part( 'content', 'single-view' );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Account ***************************************************************/
+
+	/**
+	 * Display a login form
+	 *
+	 * @since bbPress (r3302)
+	 *
+	 * @return string
+	 */
+	public function display_login() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_login' );
+
+		// Output templates
+		if ( !is_user_logged_in() )
+			bbp_get_template_part( 'form',     'user-login' );
+		else
+			bbp_get_template_part( 'feedback', 'logged-in'  );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display a register form
+	 *
+	 * @since bbPress (r3302)
+	 *
+	 * @return string
+	 */
+	public function display_register() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_register' );
+
+		// Output templates
+		if ( !is_user_logged_in() )
+			bbp_get_template_part( 'form',     'user-register' );
+		else
+			bbp_get_template_part( 'feedback', 'logged-in'     );
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/**
+	 * Display a lost password form
+	 *
+	 * @since bbPress (r3302)
+	 *
+	 * @return string
+	 */
+	public function display_lost_pass() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start( 'bbp_lost_pass' );
+
+		// Output templates
+		if ( !is_user_logged_in() )
+			bbp_get_template_part( 'form',     'user-lost-pass' );
+		else
+			bbp_get_template_part( 'feedback', 'logged-in'      );
+	
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Other *****************************************************************/
+
+	/**
+	 * Display a breadcrumb
+	 *
+	 * @since bbPress (r3302)
+	 *
+	 * @return string
+	 */
+	public function display_breadcrumb() {
+
+		// Unset globals
+		$this->unset_globals();
+
+		// Start output buffer
+		$this->start();
+
+		// Output breadcrumb
+		bbp_breadcrumb();
+
+		// Return contents of output buffer
+		return $this->end();
+	}
+
+	/** Query Filters *********************************************************/
+
+	/**
+	 * Filter the query for the topic index
+	 *
+	 * @since bbPress (r3637)
+	 *
+	 * @param array $args
+	 * @return array
+	 */
+	public function display_topic_index_query( $args = array() ) {
+		$args['author']        = 0;
+		$args['show_stickies'] = true;
+		$args['order']         = 'DESC';
+		return $args;
+	}
+
+	/**
+	 * Filter the query for topic tags
+	 *
+	 * @since bbPress (r3637)
+	 *
+	 * @param array $args
+	 * @return array
+	 */
+	public function display_topics_of_tag_query( $args = array() ) {
+		$args['tax_query'] = array( array(
+			'taxonomy' => bbp_get_topic_tag_tax_id(),
+			'field'    => 'id',
+			'terms'    => bbpress()->current_topic_tag_id
+		) );
+
+		return $args;
+	}
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/template-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2346 @@
+<?php
+
+/**
+ * bbPress Common Template Tags
+ *
+ * Common template tags are ones that are used by more than one component, like
+ * forums, topics, replies, users, topic tags, etc...
+ *
+ * @package bbPress
+ * @subpackage TemplateTags
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** URLs **********************************************************************/
+
+/**
+ * Ouput the forum URL
+ * 
+ * @since bbPress (r3979)
+ *
+ * @uses bbp_get_forums_url() To get the forums URL
+ * @param string $path Additional path with leading slash
+ */
+function bbp_forums_url( $path = '/' ) {
+	echo bbp_get_forums_url( $path );
+}
+	/**
+	 * Return the forum URL
+	 * 
+	 * @since bbPress (r3979)
+	 *
+	 * @uses home_url() To get the home URL
+	 * @uses bbp_get_root_slug() To get the forum root location
+	 * @param string $path Additional path with leading slash
+	 */
+	function bbp_get_forums_url( $path = '/' ) {
+		return home_url( bbp_get_root_slug() . $path );
+	}
+
+/**
+ * Ouput the forum URL
+ *
+ * @since bbPress (r3979)
+ *
+ * @uses bbp_get_topics_url() To get the topics URL
+ * @param string $path Additional path with leading slash
+ */
+function bbp_topics_url( $path = '/' ) {
+	echo bbp_get_topics_url( $path );
+}
+	/**
+	 * Return the forum URL
+	 *
+	 * @since bbPress (r3979)
+	 *
+	 * @uses home_url() To get the home URL
+	 * @uses bbp_get_topic_archive_slug() To get the topics archive location
+	 * @param string $path Additional path with leading slash
+	 * @return The URL to the topics archive
+	 */
+	function bbp_get_topics_url( $path = '/' ) {
+		return home_url( bbp_get_topic_archive_slug() . $path );
+	}
+
+/** Add-on Actions ************************************************************/
+
+/**
+ * Add our custom head action to wp_head
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses do_action() Calls 'bbp_head'
+*/
+function bbp_head() {
+	do_action( 'bbp_head' );
+}
+
+/**
+ * Add our custom head action to wp_head
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses do_action() Calls 'bbp_footer'
+ */
+function bbp_footer() {
+	do_action( 'bbp_footer' );
+}
+
+/** is_ ***********************************************************************/
+
+/**
+ * Check if current site is public
+ *
+ * @since bbPress (r3398)
+ *
+ * @param int $site_id
+ * @uses get_current_blog_id()
+ * @uses get_blog_option()
+ * @uses apply_filters()
+ * @return bool True if site is public, false if private
+ */
+function bbp_is_site_public( $site_id = 0 ) {
+
+	// Get the current site ID
+	if ( empty( $site_id ) )
+		$site_id = get_current_blog_id();
+
+	// Get the site visibility setting
+	$public = get_blog_option( $site_id, 'blog_public', 1 );
+
+	return (bool) apply_filters( 'bbp_is_site_public', $public, $site_id );
+}
+
+/**
+ * Check if current page is a bbPress forum
+ *
+ * @since bbPress (r2549)
+ *
+ * @param int $post_id Possible post_id to check
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @return bool True if it's a forum page, false if not
+ */
+function bbp_is_forum( $post_id = 0 ) {
+
+	// Assume false
+	$retval = false;
+
+	// Supplied ID is a forum
+	if ( !empty( $post_id ) && ( bbp_get_forum_post_type() == get_post_type( $post_id ) ))
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_forum', $retval, $post_id );
+}
+
+/**
+ * Check if we are viewing a forum archive.
+ *
+ * @since bbPress (r3251)
+ *
+ * @uses is_post_type_archive() To check if we are looking at the forum archive
+ * @uses bbp_get_forum_post_type() To get the forum post type ID
+ *
+ * @return bool
+ */
+function bbp_is_forum_archive() {
+
+	// Default to false
+	$retval = false;
+
+	// In forum archive
+	if ( is_post_type_archive( bbp_get_forum_post_type() ) || bbp_is_query_name( 'bbp_forum_archive' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_forum_archive', $retval );
+}
+
+/**
+ * Viewing a single forum
+ *
+ * @since bbPress (r3338)
+ *
+ * @uses is_single()
+ * @uses bbp_get_forum_post_type()
+ * @uses get_post_type()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_is_single_forum() {
+
+	// Assume false
+	$retval = false;
+
+	// Edit is not a single forum
+	if ( bbp_is_forum_edit() )
+		return false;
+
+	// Single and a match
+	if ( is_singular( bbp_get_forum_post_type() ) || bbp_is_query_name( 'bbp_single_forum' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_forum', $retval );
+}
+
+/**
+ * Check if current page is a forum edit page
+ *
+ * @since bbPress (r3553)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_forum_edit is true
+ * @return bool True if it's the forum edit page, false if not
+ */
+function bbp_is_forum_edit() {
+	global $wp_query, $pagenow;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_forum_edit ) && ( $wp_query->bbp_is_forum_edit == true ) )
+		$retval = true;
+
+	// Editing in admin
+	elseif ( is_admin() && ( 'post.php' == $pagenow ) && ( get_post_type() == bbp_get_forum_post_type() ) && ( !empty( $_GET['action'] ) && ( 'edit' == $_GET['action'] ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_forum_edit', $retval );
+}
+
+/**
+ * Check if current page is a bbPress topic
+ *
+ * @since bbPress (r2549)
+ *
+ * @param int $post_id Possible post_id to check
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses get_post_type() To get the post type of the post id
+ * @return bool True if it's a topic page, false if not
+ */
+function bbp_is_topic( $post_id = 0 ) {
+
+	// Assume false
+	$retval = false;
+
+	// Supplied ID is a topic
+	if ( !empty( $post_id ) && ( bbp_get_topic_post_type() == get_post_type( $post_id ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic', $retval, $post_id );
+}
+
+/**
+ * Viewing a single topic
+ *
+ * @since bbPress (r3338)
+ *
+ * @uses is_single()
+ * @uses bbp_get_topic_post_type()
+ * @uses get_post_type()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_is_single_topic() {
+
+	// Assume false
+	$retval = false;
+
+	// Edit is not a single topic
+	if ( bbp_is_topic_edit() )
+		return false;
+
+	// Single and a match
+	if ( is_singular( bbp_get_topic_post_type() ) || bbp_is_query_name( 'bbp_single_topic' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_topic', $retval );
+}
+
+/**
+ * Check if we are viewing a topic archive.
+ *
+ * @since bbPress (r3251)
+ *
+ * @uses is_post_type_archive() To check if we are looking at the topic archive
+ * @uses bbp_get_topic_post_type() To get the topic post type ID
+ *
+ * @return bool
+ */
+function bbp_is_topic_archive() {
+
+	// Default to false
+	$retval = false;
+
+	// In topic archive
+	if ( is_post_type_archive( bbp_get_topic_post_type() ) || bbp_is_query_name( 'bbp_topic_archive' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic_archive', $retval );
+}
+
+/**
+ * Check if current page is a topic edit page
+ *
+ * @since bbPress (r2753)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_topic_edit is true
+ * @return bool True if it's the topic edit page, false if not
+ */
+function bbp_is_topic_edit() {
+	global $wp_query, $pagenow;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_topic_edit ) && ( $wp_query->bbp_is_topic_edit == true ) )
+		$retval = true;
+
+	// Editing in admin
+	elseif ( is_admin() && ( 'post.php' == $pagenow ) && ( get_post_type() == bbp_get_topic_post_type() ) && ( !empty( $_GET['action'] ) && ( 'edit' == $_GET['action'] ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic_edit', $retval );
+}
+
+/**
+ * Check if current page is a topic merge page
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses bbp_is_topic_edit() To check if it's a topic edit page
+ * @return bool True if it's the topic merge page, false if not
+ */
+function bbp_is_topic_merge() {
+
+	// Assume false
+	$retval = false;
+
+	// Check topic edit and GET params
+	if ( bbp_is_topic_edit() && !empty( $_GET['action'] ) && ( 'merge' == $_GET['action'] ) )
+		return true;
+
+	return (bool) apply_filters( 'bbp_is_topic_merge', $retval );
+}
+
+/**
+ * Check if current page is a topic split page
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses bbp_is_topic_edit() To check if it's a topic edit page
+ * @return bool True if it's the topic split page, false if not
+ */
+function bbp_is_topic_split() {
+
+	// Assume false
+	$retval = false;
+
+	// Check topic edit and GET params
+	if ( bbp_is_topic_edit() && !empty( $_GET['action'] ) && ( 'split' == $_GET['action'] ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic_split', $retval );
+}
+
+/**
+ * Check if the current page is a topic tag
+ *
+ * @since bbPress (r3311)
+ *
+ * @return bool True if it's a topic tag, false if not
+ */
+function bbp_is_topic_tag() {
+
+	// Bail if topic-tags are off
+	if ( ! bbp_allow_topic_tags() )
+		return false;
+
+	// Return false if editing a topic tag
+	if ( bbp_is_topic_tag_edit() )
+		return false;
+
+	// Assume false
+	$retval = false;
+
+	// Check tax and query vars
+	if ( is_tax( bbp_get_topic_tag_tax_id() ) || !empty( bbpress()->topic_query->is_tax ) || get_query_var( 'bbp_topic_tag' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic_tag', $retval );
+}
+
+/**
+ * Check if the current page is editing a topic tag
+ *
+ * @since bbPress (r3346)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_topic_tag_edit is true
+ * @return bool True if editing a topic tag, false if not
+ */
+function bbp_is_topic_tag_edit() {
+	global $wp_query, $pagenow, $taxnow;
+
+	// Bail if topic-tags are off
+	if ( ! bbp_allow_topic_tags() )
+		return false;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_topic_tag_edit ) && ( true == $wp_query->bbp_is_topic_tag_edit ) )
+		$retval = true;
+
+	// Editing in admin
+	elseif ( is_admin() && ( 'edit-tags.php' == $pagenow ) && ( bbp_get_topic_tag_tax_id() == $taxnow ) && ( !empty( $_GET['action'] ) && ( 'edit' == $_GET['action'] ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topic_tag_edit', $retval );
+}
+
+/**
+ * Check if the current post type is one of bbPress's
+ *
+ * @since bbPress (r3311)
+ *
+ * @param mixed $the_post Optional. Post object or post ID.
+ * @uses get_post_type()
+ * @uses bbp_get_forum_post_type()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ *
+ * @return bool
+ */
+function bbp_is_custom_post_type( $the_post = false ) {
+
+	// Assume false
+	$retval = false;
+
+	// Viewing one of the bbPress post types
+	if ( in_array( get_post_type( $the_post ), array(
+		bbp_get_forum_post_type(),
+		bbp_get_topic_post_type(),
+		bbp_get_reply_post_type()
+	) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_custom_post_type', $retval, $the_post );
+}
+
+/**
+ * Check if current page is a bbPress reply
+ *
+ * @since bbPress (r2549)
+ *
+ * @param int $post_id Possible post_id to check
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses get_post_type() To get the post type of the post id
+ * @return bool True if it's a reply page, false if not
+ */
+function bbp_is_reply( $post_id = 0 ) {
+
+	// Assume false
+	$retval = false;
+
+	// Supplied ID is a reply
+	if ( !empty( $post_id ) && ( bbp_get_reply_post_type() == get_post_type( $post_id ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_reply', $retval, $post_id );
+}
+
+/**
+ * Check if current page is a reply edit page
+ *
+ * @since bbPress (r2753)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_reply_edit is true
+ * @return bool True if it's the reply edit page, false if not
+ */
+function bbp_is_reply_edit() {
+	global $wp_query, $pagenow;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_reply_edit ) && ( true == $wp_query->bbp_is_reply_edit ) )
+		$retval = true;
+
+	// Editing in admin
+	elseif ( is_admin() && ( 'post.php' == $pagenow ) && ( get_post_type() == bbp_get_reply_post_type() ) && ( !empty( $_GET['action'] ) && ( 'edit' == $_GET['action'] ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_reply_edit', $retval );
+}
+
+/**
+ * Viewing a single reply
+ *
+ * @since bbPress (r3344)
+ *
+ * @uses is_single()
+ * @uses bbp_get_reply_post_type()
+ * @uses get_post_type()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_is_single_reply() {
+
+	// Assume false
+	$retval = false;
+
+	// Edit is not a single reply
+	if ( bbp_is_reply_edit() )
+		return false;
+
+	// Single and a match
+	if ( is_singular( bbp_get_reply_post_type() ) || ( bbp_is_query_name( 'bbp_single_reply' ) ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_reply', $retval );
+}
+
+/**
+ * Check if current page is a bbPress user's favorites page (profile page)
+ *
+ * @since bbPress (r2652)
+ *
+ * @return bool True if it's the favorites page, false if not
+ */
+function bbp_is_favorites() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_favs ) && ( true == $wp_query->bbp_is_single_user_favs ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_favorites', $retval );
+}
+
+/**
+ * Check if current page is a bbPress user's subscriptions page (profile page)
+ *
+ * @since bbPress (r2652)
+ *
+ * @return bool True if it's the subscriptions page, false if not
+ */
+function bbp_is_subscriptions() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_subs ) && ( true == $wp_query->bbp_is_single_user_subs ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_subscriptions', $retval );
+}
+
+/**
+ * Check if current page shows the topics created by a bbPress user (profile
+ * page)
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses bbp_is_query_name() To get the query name
+ * @return bool True if it's the topics created page, false if not
+ */
+function bbp_is_topics_created() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_topics ) && ( true == $wp_query->bbp_is_single_user_topics ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_topics_created', $retval );
+}
+
+/**
+ * Check if current page shows the topics created by a bbPress user (profile
+ * page)
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses bbp_is_query_name() To get the query name
+ * @return bool True if it's the topics created page, false if not
+ */
+function bbp_is_replies_created() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_replies ) && ( true == $wp_query->bbp_is_single_user_replies ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_replies_created', $retval );
+}
+
+/**
+ * Check if current page is the currently logged in users author page
+ *
+ * @since bbPress (r2688)
+ * @uses bbp_is_single_user() Check query variable
+ * @uses is_user_logged_in() Must be logged in to be home
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_current_user_id()
+ * @return bool True if it's the user's home, false if not
+ */
+function bbp_is_user_home() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_home ) && ( true == $wp_query->bbp_is_single_user_home ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_user_home', $retval );
+}
+
+/**
+ * Check if current page is the currently logged in users author edit page
+ *
+ * @since bbPress (r3918)
+ * @uses bbp_is_single_user_edit() Check query variable
+ * @uses is_user_logged_in() Must be logged in to be home
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_current_user_id()
+ * @return bool True if it's the user's home, false if not
+ */
+function bbp_is_user_home_edit() {
+
+	// Assume false
+	$retval = false;
+
+	if ( bbp_is_user_home() && bbp_is_single_user_edit() )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_user_home_edit', $retval );
+}
+
+/**
+ * Check if current page is a user profile page
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_single_user is set to true
+ * @return bool True if it's a user's profile page, false if not
+ */
+function bbp_is_single_user() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user ) && ( true == $wp_query->bbp_is_single_user ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_user', $retval );
+}
+
+/**
+ * Check if current page is a user profile edit page
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_single_user_edit is set to true
+ * @return bool True if it's a user's profile edit page, false if not
+ */
+function bbp_is_single_user_edit() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_edit ) && ( true == $wp_query->bbp_is_single_user_edit ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_user_edit', $retval );
+}
+
+/**
+ * Check if current page is a user profile page
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_single_user_profile is set to true
+ * @return bool True if it's a user's profile page, false if not
+ */
+function bbp_is_single_user_profile() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_profile ) && ( true == $wp_query->bbp_is_single_user_profile ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_user_profile', $retval );
+}
+
+/**
+ * Check if current page is a user topics created page
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_single_user_topics is set to true
+ * @return bool True if it's a user's topics page, false if not
+ */
+function bbp_is_single_user_topics() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_topics ) && ( true == $wp_query->bbp_is_single_user_topics ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_user_topics', $retval );
+}
+
+/**
+ * Check if current page is a user replies created page
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_single_user_replies is set to true
+ * @return bool True if it's a user's replies page, false if not
+ */
+function bbp_is_single_user_replies() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_single_user_replies ) && ( true == $wp_query->bbp_is_single_user_replies ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_user_replies', $retval );
+}
+
+/**
+ * Check if current page is a view page
+ *
+ * @since bbPress (r2789)
+ *
+ * @global WP_Query $wp_query To check if WP_Query::bbp_is_view is true 
+ * @uses bbp_is_query_name() To get the query name
+ * @return bool Is it a view page?
+ */
+function bbp_is_single_view() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_view ) && ( true == $wp_query->bbp_is_view ) )
+		$retval = true;
+
+	// Check query name
+	if ( empty( $retval ) && bbp_is_query_name( 'bbp_single_view' ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_single_view', $retval );
+}
+
+/**
+ * Check if current page is an edit page
+ *
+ * @since bbPress (r3585)
+ *
+ * @uses WP_Query Checks if WP_Query::bbp_is_edit is true
+ * @return bool True if it's the edit page, false if not
+ */
+function bbp_is_edit() {
+	global $wp_query;
+
+	// Assume false
+	$retval = false;
+
+	// Check query
+	if ( !empty( $wp_query->bbp_is_edit ) && ( $wp_query->bbp_is_edit == true ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_edit', $retval );
+}
+
+/**
+ * Use the above is_() functions to output a body class for each scenario
+ *
+ * @since bbPress (r2926)
+ *
+ * @param array $wp_classes
+ * @param array $custom_classes
+ * @uses bbp_is_single_forum()
+ * @uses bbp_is_single_topic()
+ * @uses bbp_is_topic_edit()
+ * @uses bbp_is_topic_merge()
+ * @uses bbp_is_topic_split()
+ * @uses bbp_is_single_reply()
+ * @uses bbp_is_reply_edit()
+ * @uses bbp_is_reply_edit()
+ * @uses bbp_is_single_view()
+ * @uses bbp_is_single_user_edit()
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_is_subscriptions()
+ * @uses bbp_is_favorites()
+ * @uses bbp_is_topics_created()
+ * @uses bbp_is_forum_archive()
+ * @uses bbp_is_topic_archive()
+ * @uses bbp_is_topic_tag()
+ * @uses bbp_is_topic_tag_edit()
+ * @uses bbp_get_topic_tag_tax_id()
+ * @uses bbp_get_topic_tag_slug()
+ * @uses bbp_get_topic_tag_id()
+ * @return array Body Classes
+ */
+function bbp_body_class( $wp_classes, $custom_classes = false ) {
+
+	$bbp_classes = array();
+
+	/** Archives **************************************************************/
+
+	if ( bbp_is_forum_archive() )
+		$bbp_classes[] = bbp_get_forum_post_type() . '-archive';
+
+	if ( bbp_is_topic_archive() )
+		$bbp_classes[] = bbp_get_topic_post_type() . '-archive';
+
+	/** Topic Tags ************************************************************/
+
+	if ( bbp_is_topic_tag() ) {
+		$bbp_classes[] = bbp_get_topic_tag_tax_id();
+		$bbp_classes[] = bbp_get_topic_tag_tax_id() . '-' . bbp_get_topic_tag_slug();
+		$bbp_classes[] = bbp_get_topic_tag_tax_id() . '-' . bbp_get_topic_tag_id();
+	}
+
+	if ( bbp_is_topic_tag_edit() ) {
+		$bbp_classes[] = bbp_get_topic_tag_tax_id() . '-edit';
+		$bbp_classes[] = bbp_get_topic_tag_tax_id() . '-' . bbp_get_topic_tag_slug() . '-edit';
+		$bbp_classes[] = bbp_get_topic_tag_tax_id() . '-' . bbp_get_topic_tag_id()   . '-edit';
+	}
+
+	/** Components ************************************************************/
+
+	if ( bbp_is_single_forum() )
+		$bbp_classes[] = bbp_get_forum_post_type();
+
+	if ( bbp_is_single_topic() )
+		$bbp_classes[] = bbp_get_topic_post_type();
+
+	if ( bbp_is_single_reply() )
+		$bbp_classes[] = bbp_get_reply_post_type();
+
+	if ( bbp_is_topic_edit() )
+		$bbp_classes[] = bbp_get_topic_post_type() . '-edit';
+
+	if ( bbp_is_topic_merge() )
+		$bbp_classes[] = bbp_get_topic_post_type() . '-merge';
+
+	if ( bbp_is_topic_split() )
+		$bbp_classes[] = bbp_get_topic_post_type() . '-split';
+
+	if ( bbp_is_reply_edit() )
+		$bbp_classes[] = bbp_get_reply_post_type() . '-edit';
+
+	if ( bbp_is_single_view() )
+		$bbp_classes[] = 'bbp-view';
+
+	/** User ******************************************************************/
+
+	if ( bbp_is_single_user_edit() ) {
+		$bbp_classes[] = 'bbp-user-edit';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_single_user() ) {
+		$bbp_classes[] = 'bbp-user-page';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_user_home() ) {
+		$bbp_classes[] = 'bbp-user-home';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_user_home_edit() ) {
+		$bbp_classes[] = 'bbp-user-home-edit';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_topics_created() ) {
+		$bbp_classes[] = 'bbp-topics-created';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_favorites() ) {
+		$bbp_classes[] = 'bbp-favorites';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	if ( bbp_is_subscriptions() ) {
+		$bbp_classes[] = 'bbp-subscriptions';
+		$bbp_classes[] = 'single';
+		$bbp_classes[] = 'singular';
+	}
+
+	/** Clean up **************************************************************/
+
+	// Add bbPress class if we are within a bbPress page
+	if ( !empty( $bbp_classes ) )
+		$bbp_classes[] = 'bbPress';
+
+	// Merge WP classes with bbPress classes and remove any duplicates
+	$classes = array_unique( array_merge( (array) $bbp_classes, (array) $wp_classes ) );
+
+	return apply_filters( 'bbp_get_the_body_class', $classes, $bbp_classes, $wp_classes, $custom_classes );
+}
+
+/**
+ * Use the above is_() functions to return if in any bbPress page
+ *
+ * @since bbPress (r3344)
+ *
+ * @uses bbp_is_single_forum()
+ * @uses bbp_is_single_topic()
+ * @uses bbp_is_topic_edit()
+ * @uses bbp_is_topic_merge()
+ * @uses bbp_is_topic_split()
+ * @uses bbp_is_single_reply()
+ * @uses bbp_is_reply_edit()
+ * @uses bbp_is_reply_edit()
+ * @uses bbp_is_single_view()
+ * @uses bbp_is_single_user_edit()
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_is_subscriptions()
+ * @uses bbp_is_favorites()
+ * @uses bbp_is_topics_created()
+ * @return bool In a bbPress page
+ */
+function is_bbpress() {
+
+	// Defalt to false
+	$retval = false;
+
+	/** Archives **************************************************************/
+
+	if ( bbp_is_forum_archive() )
+		$retval = true;
+
+	elseif ( bbp_is_topic_archive() )
+		$retval = true;
+
+	/** Topic Tags ************************************************************/
+
+	elseif ( bbp_is_topic_tag() )
+		$retval = true;
+
+	elseif ( bbp_is_topic_tag_edit() )
+		$retval = true;
+
+	/** Components ************************************************************/
+
+	elseif ( bbp_is_single_forum() )
+		$retval = true;
+
+	elseif ( bbp_is_single_topic() )
+		$retval = true;
+
+	elseif ( bbp_is_single_reply() )
+		$retval = true;
+
+	elseif ( bbp_is_topic_edit() )
+		$retval = true;
+
+	elseif ( bbp_is_topic_merge() )
+		$retval = true;
+
+	elseif ( bbp_is_topic_split() )
+		$retval = true;
+
+	elseif ( bbp_is_reply_edit() )
+		$retval = true;
+
+	elseif ( bbp_is_single_view() )
+		$retval = true;
+
+	/** User ******************************************************************/
+
+	elseif ( bbp_is_single_user_edit() )
+		$retval = true;
+
+	elseif ( bbp_is_single_user() )
+		$retval = true;
+
+	elseif ( bbp_is_user_home() )
+		$retval = true;
+
+	elseif ( bbp_is_user_home_edit() )
+		$retval = true;
+
+	elseif ( bbp_is_topics_created() )
+		$retval = true;
+
+	elseif ( bbp_is_favorites() )
+		$retval = true;
+
+	elseif ( bbp_is_subscriptions() )
+		$retval = true;
+
+	/** Done ******************************************************************/
+
+	return (bool) apply_filters( 'is_bbpress', $retval );
+}
+
+/** Forms *********************************************************************/
+
+/**
+ * Output the login form action url
+ *
+ * @since bbPress (r2815)
+ *
+ * @param string $url Pass a URL to redirect to
+ * @uses add_query_arg() To add a arg to the url
+ * @uses site_url() Toget the site url
+ * @uses apply_filters() Calls 'bbp_wp_login_action' with the url and args
+ */
+function bbp_wp_login_action( $args = '' ) {
+	$defaults = array (
+		'action'  => '',
+		'context' => ''
+	);
+	$r = bbp_parse_args( $args, $defaults, 'login_action' );
+	extract( $r );
+
+	if ( !empty( $action ) )
+		$login_url = add_query_arg( array( 'action' => $action ), 'wp-login.php' );
+	else
+		$login_url = 'wp-login.php';
+
+	$login_url = site_url( $login_url, $context );
+
+	echo apply_filters( 'bbp_wp_login_action', $login_url, $args );
+}
+
+/**
+ * Output hidden request URI field for user forms.
+ *
+ * The referer link is the current Request URI from the server super global. The
+ * input name is '_wp_http_referer', in case you wanted to check manually.
+ *
+ * @since bbPress (r2815)
+ *
+ * @param string $url Pass a URL to redirect to
+ * @uses wp_get_referer() To get the referer
+ * @uses esc_attr() To escape the url
+ * @uses apply_filters() Calls 'bbp_redirect_to_field' with the referer field
+ *                        and url
+ */
+function bbp_redirect_to_field( $redirect_to = '' ) {
+
+	// Rejig the $redirect_to
+	if ( !isset( $_SERVER['REDIRECT_URL'] ) || ( !$redirect_to == home_url( $_SERVER['REDIRECT_URL'] ) ) )
+		$redirect_to = wp_get_referer();
+
+	// Make sure we are directing somewhere
+	if ( empty( $redirect_to ) )
+		$redirect_to = home_url( isset( $_SERVER['REQUEST_URI'] ) ? $_SERVER['REQUEST_URI'] : '' );
+
+	// Remove loggedout query arg if it's there
+	$redirect_to    = (string) esc_attr( remove_query_arg( 'loggedout', $redirect_to ) );
+	$redirect_field = '<input type="hidden" id="bbp_redirect_to" name="redirect_to" value="' . $redirect_to . '" />';
+
+	echo apply_filters( 'bbp_redirect_to_field', $redirect_field, $redirect_to );
+}
+
+/**
+ * Echo sanitized $_REQUEST value.
+ *
+ * Use the $input_type parameter to properly process the value. This
+ * ensures correct sanitization of the value for the receiving input.
+ *
+ * @since bbPress (r2815)
+ *
+ * @param string $request Name of $_REQUEST to look for
+ * @param string $input_type Type of input. Default: text. Accepts:
+ *                            textarea|password|select|radio|checkbox
+ * @uses bbp_get_sanitize_val() To sanitize the value.
+ */
+function bbp_sanitize_val( $request = '', $input_type = 'text' ) {
+	echo bbp_get_sanitize_val( $request, $input_type );
+}
+	/**
+	 * Return sanitized $_REQUEST value.
+	 *
+	 * Use the $input_type parameter to properly process the value. This
+	 * ensures correct sanitization of the value for the receiving input.
+	 *
+	 * @since bbPress (r2815)
+	 *
+	 * @param string $request Name of $_REQUEST to look for
+	 * @param string $input_type Type of input. Default: text. Accepts:
+	 *                            textarea|password|select|radio|checkbox
+	 * @uses esc_attr() To escape the string
+	 * @uses apply_filters() Calls 'bbp_get_sanitize_val' with the sanitized
+	 *                        value, request and input type
+	 * @return string Sanitized value ready for screen display
+	 */
+	function bbp_get_sanitize_val( $request = '', $input_type = 'text' ) {
+
+		// Check that requested
+		if ( empty( $_REQUEST[$request] ) )
+			return false;
+
+		// Set request varaible
+		$pre_ret_val = $_REQUEST[$request];
+
+		// Treat different kinds of fields in different ways
+		switch ( $input_type ) {
+			case 'text'     :
+			case 'textarea' :
+				$retval = esc_attr( stripslashes( $pre_ret_val ) );
+				break;
+
+			case 'password' :
+			case 'select'   :
+			case 'radio'    :
+			case 'checkbox' :
+			default :
+				$retval = esc_attr( $pre_ret_val );
+				break;
+		}
+
+		return apply_filters( 'bbp_get_sanitize_val', $retval, $request, $input_type );
+	}
+
+/**
+ * Output the current tab index of a given form
+ *
+ * Use this function to handle the tab indexing of user facing forms within a
+ * template file. Calling this function will automatically increment the global
+ * tab index by default.
+ *
+ * @since bbPress (r2810)
+ *
+ * @param int $auto_increment Optional. Default true. Set to false to prevent
+ *                             increment
+ */
+function bbp_tab_index( $auto_increment = true ) {
+	echo bbp_get_tab_index( $auto_increment );
+}
+
+	/**
+	 * Output the current tab index of a given form
+	 *
+	 * Use this function to handle the tab indexing of user facing forms
+	 * within a template file. Calling this function will automatically
+	 * increment the global tab index by default.
+	 *
+	 * @since bbPress (r2810)
+	 *
+	 * @uses apply_filters Allows return value to be filtered
+	 * @param int $auto_increment Optional. Default true. Set to false to
+	 *                             prevent the increment
+	 * @return int $bbp->tab_index The global tab index
+	 */
+	function bbp_get_tab_index( $auto_increment = true ) {
+		$bbp = bbpress();
+
+		if ( true === $auto_increment )
+			++$bbp->tab_index;
+
+		return apply_filters( 'bbp_get_tab_index', (int) $bbp->tab_index );
+	}
+
+/**
+ * Output a select box allowing to pick which forum/topic a new topic/reply
+ * belongs in.
+ *
+ * Can be used for any post type, but is mostly used for topics and forums.
+ *
+ * @since bbPress (r2746)
+ *
+ * @param mixed $args See {@link bbp_get_dropdown()} for arguments
+ */
+function bbp_dropdown( $args = '' ) {
+	echo bbp_get_dropdown( $args );
+}
+	/**
+	 * Output a select box allowing to pick which forum/topic a new
+	 * topic/reply belongs in.
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param mixed $args The function supports these args:
+	 *  - post_type: Post type, defaults to bbp_get_forum_post_type() (bbp_forum)
+	 *  - selected: Selected ID, to not have any value as selected, pass
+	 *               anything smaller than 0 (due to the nature of select
+	 *               box, the first value would of course be selected -
+	 *               though you can have that as none (pass 'show_none' arg))
+	 *  - sort_column: Sort by? Defaults to 'menu_order, post_title'
+	 *  - child_of: Child of. Defaults to 0
+	 *  - post_status: Which all post_statuses to find in? Can be an array
+	 *                  or CSV of publish, category, closed, private, spam,
+	 *                  trash (based on post type) - if not set, these are
+	 *                  automatically determined based on the post_type
+	 *  - posts_per_page: Retrieve all forums/topics. Defaults to -1 to get
+	 *                     all posts
+	 *  - walker: Which walker to use? Defaults to
+	 *             {@link BBP_Walker_Dropdown}
+	 *  - select_id: ID of the select box. Defaults to 'bbp_forum_id'
+	 *  - tab: Tabindex value. False or integer
+	 *  - options_only: Show only <options>? No <select>?
+	 *  - show_none: False or something like __( '(No Forum)', 'bbpress' ),
+	 *                will have value=""
+	 *  - none_found: False or something like
+	 *                 __( 'No forums to post to!', 'bbpress' )
+	 *  - disable_categories: Disable forum categories and closed forums?
+	 *                         Defaults to true. Only for forums and when
+	 *                         the category option is displayed.
+	 * @uses BBP_Walker_Dropdown() As the default walker to generate the
+	 *                              dropdown
+	 * @uses current_user_can() To check if the current user can read
+	 *                           private forums
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses walk_page_dropdown_tree() To generate the dropdown using the
+	 *                                  walker
+	 * @uses apply_filters() Calls 'bbp_get_dropdown' with the dropdown
+	 *                        and args
+	 * @return string The dropdown
+	 */
+	function bbp_get_dropdown( $args = '' ) {
+
+		/** Arguments *********************************************************/
+
+		$defaults = array (
+			'post_type'          => bbp_get_forum_post_type(),
+			'selected'           => 0,
+			'sort_column'        => 'menu_order',
+			'child_of'           => '0',
+			'numberposts'        => -1,
+			'orderby'            => 'menu_order',
+			'order'              => 'ASC',
+			'walker'             => '',
+
+			// Output-related
+			'select_id'          => 'bbp_forum_id',
+			'tab'                => bbp_get_tab_index(),
+			'options_only'       => false,
+			'show_none'          => false,
+			'none_found'         => false,
+			'disable_categories' => true,
+			'disabled'           => ''
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_dropdown' );
+
+		if ( empty( $r['walker'] ) ) {
+			$r['walker']            = new BBP_Walker_Dropdown();
+			$r['walker']->tree_type = $r['post_type'];
+		}
+
+		// Force 0
+		if ( is_numeric( $r['selected'] ) && $r['selected'] < 0 )
+			$r['selected'] = 0;
+
+		extract( $r );
+
+		// Unset the args not needed for WP_Query to avoid any possible conflicts.
+		// Note: walker and disable_categories are not unset
+		unset( $r['select_id'], $r['tab'], $r['options_only'], $r['show_none'], $r['none_found'] );
+
+		/** Post Status *******************************************************/
+
+		// Define local variable(s)
+		$post_stati = array();
+
+		// Public
+		$post_stati[] = bbp_get_public_status_id();
+
+		// Forums
+		if ( bbp_get_forum_post_type() == $post_type ) {
+
+			// Private forums
+			if ( current_user_can( 'read_private_forums' ) ) {
+				$post_stati[] = bbp_get_private_status_id();
+			}
+
+			// Hidden forums
+			if ( current_user_can( 'read_hidden_forums' ) ) {
+				$post_stati[] = bbp_get_hidden_status_id();
+			}
+		}
+
+		// Setup the post statuses
+		$r['post_status'] = implode( ',', $post_stati );
+
+		/** Setup variables ***************************************************/
+
+		$name      = esc_attr( $select_id );
+		$select_id = $name;
+		$tab       = (int) $tab;
+		$retval    = '';
+		$posts     = get_posts( $r );
+		$disabled  = disabled( isset( bbpress()->options[$disabled] ), true, false );
+
+		/** Drop Down *********************************************************/
+
+		// Items found
+		if ( !empty( $posts ) ) {
+			if ( empty( $options_only ) ) {
+				$tab     = !empty( $tab ) ? ' tabindex="' . $tab . '"' : '';
+				$retval .= '<select name="' . $name . '" id="' . $select_id . '"' . $tab  . $disabled . '>' . "\n";
+			}
+
+			$retval .= !empty( $show_none ) ? "\t<option value=\"\" class=\"level-0\">" . $show_none . '</option>' : '';
+			$retval .= walk_page_dropdown_tree( $posts, 0, $r );
+
+			if ( empty( $options_only ) )
+				$retval .= '</select>';
+
+		// No items found - Display feedback if no custom message was passed
+		} elseif ( empty( $none_found ) ) {
+
+			// Switch the response based on post type
+			switch ( $post_type ) {
+
+				// Topics
+				case bbp_get_topic_post_type() :
+					$retval = __( 'No topics available', 'bbpress' );
+					break;
+
+				// Forums
+				case bbp_get_forum_post_type() :
+					$retval = __( 'No forums available', 'bbpress' );
+					break;
+
+				// Any other
+				default :
+					$retval = __( 'None available', 'bbpress' );
+					break;
+			}
+		}
+
+		return apply_filters( 'bbp_get_dropdown', $retval, $args );
+	}
+
+/**
+ * Output the required hidden fields when creating/editing a forum
+ *
+ * @since bbPress (r3553)
+ *
+ * @uses bbp_is_forum_edit() To check if it's the forum edit page
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ * @uses bbp_forum_id() To output the forum id
+ * @uses bbp_is_single_forum() To check if it's a forum page
+ * @uses bbp_forum_id() To output the forum id
+ */
+function bbp_forum_form_fields() {
+
+	if ( bbp_is_forum_edit() ) : ?>
+
+		<input type="hidden" name="action"       id="bbp_post_action" value="bbp-edit-forum" />
+		<input type="hidden" name="bbp_forum_id" id="bbp_forum_id"    value="<?php bbp_forum_id(); ?>" />
+
+		<?php
+
+		if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-forum_' . bbp_get_forum_id(), '_bbp_unfiltered_html_forum', false );
+
+		?>
+
+		<?php wp_nonce_field( 'bbp-edit-forum_' . bbp_get_forum_id() );
+
+	else :
+
+		if ( bbp_is_single_forum() ) : ?>
+
+			<input type="hidden" name="bbp_forum_parent_id" id="bbp_forum_parent_id" value="<?php bbp_forum_parent_id(); ?>" />
+
+		<?php endif; ?>
+
+		<input type="hidden" name="action" id="bbp_post_action" value="bbp-new-forum" />
+
+		<?php
+
+		if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-forum_new', '_bbp_unfiltered_html_forum', false );
+
+		?>
+
+		<?php wp_nonce_field( 'bbp-new-forum' );
+
+	endif;
+}
+
+/**
+ * Output the required hidden fields when creating/editing a topic
+ *
+ * @since bbPress (r2753)
+ *
+ * @uses bbp_is_topic_edit() To check if it's the topic edit page
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ * @uses bbp_topic_id() To output the topic id
+ * @uses bbp_is_single_forum() To check if it's a forum page
+ * @uses bbp_forum_id() To output the forum id
+ */
+function bbp_topic_form_fields() {
+
+	if ( bbp_is_topic_edit() ) : ?>
+
+		<input type="hidden" name="action"       id="bbp_post_action" value="bbp-edit-topic" />
+		<input type="hidden" name="bbp_topic_id" id="bbp_topic_id"    value="<?php bbp_topic_id(); ?>" />
+
+		<?php
+
+		if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-topic_' . bbp_get_topic_id(), '_bbp_unfiltered_html_topic', false );
+
+		?>
+
+		<?php wp_nonce_field( 'bbp-edit-topic_' . bbp_get_topic_id() );
+
+	else :
+
+		if ( bbp_is_single_forum() ) : ?>
+
+			<input type="hidden" name="bbp_forum_id" id="bbp_forum_id" value="<?php bbp_forum_id(); ?>" />
+
+		<?php endif; ?>
+
+		<input type="hidden" name="action" id="bbp_post_action" value="bbp-new-topic" />
+
+		<?php if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-topic_new', '_bbp_unfiltered_html_topic', false ); ?>
+
+		<?php wp_nonce_field( 'bbp-new-topic' );
+
+	endif;
+}
+
+/**
+ * Output the required hidden fields when creating/editing a reply
+ *
+ * @since bbPress (r2753)
+ *
+ * @uses bbp_is_reply_edit() To check if it's the reply edit page
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ * @uses bbp_reply_id() To output the reply id
+ * @uses bbp_topic_id() To output the topic id
+ * @uses bbp_forum_id() To output the forum id
+ */
+function bbp_reply_form_fields() {
+
+	if ( bbp_is_reply_edit() ) : ?>
+
+		<input type="hidden" name="bbp_reply_title" id="bbp_reply_title" value="<?php printf( __( 'Reply To: %s', 'bbpress' ), bbp_get_topic_title() ); ?>" />
+		<input type="hidden" name="bbp_reply_id"    id="bbp_reply_id"    value="<?php bbp_reply_id(); ?>" />
+		<input type="hidden" name="action"          id="bbp_post_action" value="bbp-edit-reply" />
+
+		<?php if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-reply_' . bbp_get_reply_id(), '_bbp_unfiltered_html_reply', false ); ?>
+
+		<?php wp_nonce_field( 'bbp-edit-reply_' . bbp_get_reply_id() );
+
+	else : ?>
+
+		<input type="hidden" name="bbp_reply_title" id="bbp_reply_title" value="<?php printf( __( 'Reply To: %s', 'bbpress' ), bbp_get_topic_title() ); ?>" />
+		<input type="hidden" name="bbp_topic_id"    id="bbp_topic_id"    value="<?php bbp_topic_id(); ?>" />
+		<input type="hidden" name="action"          id="bbp_post_action" value="bbp-new-reply" />
+
+		<?php if ( current_user_can( 'unfiltered_html' ) )
+			wp_nonce_field( 'bbp-unfiltered-html-reply_' . bbp_get_topic_id(), '_bbp_unfiltered_html_reply', false ); ?>
+
+		<?php wp_nonce_field( 'bbp-new-reply' );
+
+		// Show redirect field if not viewing a specific topic
+		if ( bbp_is_query_name( 'bbp_single_topic' ) ) :
+			bbp_redirect_to_field( get_permalink() );
+
+		endif;
+	endif;
+}
+
+/**
+ * Output the required hidden fields when editing a user
+ *
+ * @since bbPress (r2690)
+ *
+ * @uses bbp_displayed_user_id() To output the displayed user id
+ * @uses wp_nonce_field() To generate a hidden nonce field
+ * @uses wp_referer_field() To generate a hidden referer field
+ */
+function bbp_edit_user_form_fields() {
+?>
+
+	<input type="hidden" name="action"  id="bbp_post_action" value="bbp-update-user" />
+	<input type="hidden" name="user_id" id="user_id"         value="<?php bbp_displayed_user_id(); ?>" />
+
+	<?php wp_nonce_field( 'update-user_' . bbp_get_displayed_user_id() );
+}
+
+/**
+ * Merge topic form fields
+ *
+ * Output the required hidden fields when merging a topic
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses wp_nonce_field() To generate a hidden nonce field
+ * @uses bbp_topic_id() To output the topic id
+ */
+function bbp_merge_topic_form_fields() {
+?>
+
+	<input type="hidden" name="action"       id="bbp_post_action" value="bbp-merge-topic" />
+	<input type="hidden" name="bbp_topic_id" id="bbp_topic_id"    value="<?php bbp_topic_id(); ?>" />
+
+	<?php wp_nonce_field( 'bbp-merge-topic_' . bbp_get_topic_id() );
+}
+
+/**
+ * Split topic form fields
+ *
+ * Output the required hidden fields when splitting a topic
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses wp_nonce_field() To generete a hidden nonce field
+ */
+function bbp_split_topic_form_fields() {
+?>
+
+	<input type="hidden" name="action"       id="bbp_post_action" value="bbp-split-topic" />
+	<input type="hidden" name="bbp_reply_id" id="bbp_reply_id"    value="<?php echo absint( $_GET['reply_id'] ); ?>" />
+
+	<?php wp_nonce_field( 'bbp-split-topic_' . bbp_get_topic_id() );
+}
+
+/**
+ * Output a textarea or TinyMCE if enabled
+ *
+ * @since bbPress (r3586)
+ *
+ * @param array $args
+ * @uses bbp_get_the_content() To return the content to output
+ */
+function bbp_the_content( $args = array() ) {
+	echo bbp_get_the_content( $args );
+}
+	/**
+	 * Return a textarea or TinyMCE if enabled
+	 *
+	 * @since bbPress (r3586)
+	 *
+	 * @param array $args
+	 *
+	 * @uses apply_filter() To filter args and output
+	 * @uses wp_parse_pargs() To compare args
+	 * @uses bbp_use_wp_editor() To see if WP editor is in use
+	 * @uses bbp_is_edit() To see if we are editing something
+	 * @uses wp_editor() To output the WordPress editor
+	 *
+	 * @return string HTML from output buffer 
+	 */
+	function bbp_get_the_content( $args = array() ) {
+
+		// Default arguments
+		$defaults = array(
+			'context'       => 'topic',
+			'before'        => '<div class="bbp-the-content-wrapper">',
+			'after'         => '</div>',
+			'wpautop'       => true,
+			'media_buttons' => false,
+			'textarea_rows' => '12',
+			'tabindex'      => bbp_get_tab_index(),
+			'editor_class'  => 'bbp-the-content',
+			'tinymce'       => true,
+			'teeny'         => true,
+			'quicktags'     => true
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_the_content' );
+		extract( $r );
+
+		// Assume we are not editing
+		$post_content = '';
+
+		// Start an output buffor
+		ob_start();
+
+		// Output something before the editor
+		if ( !empty( $before ) )
+			echo $before;
+
+		// Get sanitized content
+		if ( bbp_is_edit() )
+			$post_content = call_user_func( 'bbp_get_form_' . $context . '_content' );
+
+		// Use TinyMCE if available
+		if ( bbp_use_wp_editor() ) :
+			wp_editor( htmlspecialchars_decode( $post_content, ENT_QUOTES ), 'bbp_' . $context . '_content', array(
+				'wpautop'       => $wpautop,
+				'media_buttons' => $media_buttons,
+				'textarea_rows' => $textarea_rows,
+				'tabindex'      => $tabindex,
+				'editor_class'  => $editor_class,
+				'tinymce'       => $tinymce,
+				'teeny'         => $teeny,
+				'quicktags'     => $quicktags
+			) );
+
+		/**
+		 * Fallback to normal textarea.
+		 *
+		 * Note that we do not use esc_textarea() here to prevent double
+		 * escaping the editable output, mucking up existing content.
+		 */
+		else : ?>
+
+			<textarea id="bbp_<?php echo esc_attr( $context ); ?>_content" class="<?php echo esc_attr( $editor_class ); ?>" name="bbp_<?php echo esc_attr( $context ); ?>_content" cols="60" rows="<?php echo esc_attr( $textarea_rows ); ?>" tabindex="<?php echo esc_attr( $tabindex ); ?>"><?php echo $post_content; ?></textarea>
+
+		<?php endif;
+
+		// Output something after the editor
+		if ( !empty( $after ) )
+			echo $after;
+
+		// Put the output into a usable variable
+		$output = ob_get_contents();
+
+		// Flush the output buffer
+		ob_end_clean();
+
+		return apply_filters( 'bbp_get_the_content', $output, $args, $post_content );
+	}
+
+/** Views *********************************************************************/
+
+/**
+ * Output the view id
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view Optional. View id
+ * @uses bbp_get_view_id() To get the view id
+ */
+function bbp_view_id( $view = '' ) {
+	echo bbp_get_view_id( $view );
+}
+
+	/**
+	 * Get the view id
+	 *
+	 * If a view id is supplied, that is used. Otherwise the 'bbp_view'
+	 * query var is checked for.
+	 *
+	 * @since bbPress (r2789)
+	 *
+	 * @param string $view Optional. View id.
+	 * @uses sanitize_title() To sanitize the view id
+	 * @uses get_query_var() To get the view id from query var 'bbp_view'
+	 * @return bool|string ID on success, false on failure
+	 */
+	function bbp_get_view_id( $view = '' ) {
+		$bbp = bbpress();
+
+		$view = !empty( $view ) ? sanitize_title( $view ) : get_query_var( 'bbp_view' );
+
+		if ( array_key_exists( $view, $bbp->views ) )
+			return $view;
+
+		return false;
+	}
+
+/**
+ * Output the view name aka title
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view Optional. View id
+ * @uses bbp_get_view_title() To get the view title
+ */
+function bbp_view_title( $view = '' ) {
+	echo bbp_get_view_title( $view );
+}
+
+	/**
+	 * Get the view name aka title
+	 *
+	 * If a view id is supplied, that is used. Otherwise the bbp_view
+	 * query var is checked for.
+	 *
+	 * @since bbPress (r2789)
+	 *
+	 * @param string $view Optional. View id
+	 * @uses bbp_get_view_id() To get the view id
+	 * @return bool|string Title on success, false on failure
+	 */
+	function bbp_get_view_title( $view = '' ) {
+		$bbp = bbpress();
+
+		$view = bbp_get_view_id( $view );
+		if ( empty( $view ) )
+			return false;
+
+		return $bbp->views[$view]['title'];
+	}
+
+/**
+ * Output the view url
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view Optional. View id
+ * @uses bbp_get_view_url() To get the view url
+ */
+function bbp_view_url( $view = false ) {
+	echo bbp_get_view_url( $view );
+}
+	/**
+	 * Return the view url
+	 *
+	 * @since bbPress (r2789)
+	 *
+	 * @param string $view Optional. View id
+	 * @uses sanitize_title() To sanitize the view id
+	 * @uses home_url() To get blog home url
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_view_url' with the view url,
+	 *                        used view id
+	 * @return string View url (or home url if the view was not found)
+	 */
+	function bbp_get_view_url( $view = false ) {
+		global $wp_rewrite;
+
+		$view = bbp_get_view_id( $view );
+		if ( empty( $view ) )
+			return home_url();
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = $wp_rewrite->root . bbp_get_view_slug() . '/' . $view;
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array( 'bbp_view' => $view ), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_view_link', $url, $view );
+	}
+
+/** Query *********************************************************************/
+
+/**
+ * Check the passed parameter against the current _bbp_query_name
+ *
+ * @since bbPress (r2980)
+ *
+ * @uses bbp_get_query_name() Get the query var '_bbp_query_name'
+ * @return bool True if match, false if not
+ */
+function bbp_is_query_name( $name = '' )  {
+	return (bool) ( bbp_get_query_name() == $name );
+}
+
+/**
+ * Get the '_bbp_query_name' setting
+ *
+ * @since bbPress (r2695)
+ *
+ * @uses get_query_var() To get the query var '_bbp_query_name'
+ * @return string To return the query var value
+ */
+function bbp_get_query_name()  {
+	return get_query_var( '_bbp_query_name' );
+}
+
+/**
+ * Set the '_bbp_query_name' setting to $name
+ *
+ * @since bbPress (r2692)
+ *
+ * @param string $name What to set the query var to
+ * @uses set_query_var() To set the query var '_bbp_query_name'
+ */
+function bbp_set_query_name( $name = '' )  {
+	set_query_var( '_bbp_query_name', $name );
+}
+
+/**
+ * Used to clear the '_bbp_query_name' setting
+ *
+ * @since bbPress (r2692)
+ *
+ * @uses bbp_set_query_name() To set the query var '_bbp_query_name' value to ''
+ */
+function bbp_reset_query_name() {
+	bbp_set_query_name();
+}
+
+/** Breadcrumbs ***************************************************************/
+
+/**
+ * Output the page title as a breadcrumb
+ *
+ * @since bbPress (r2589)
+ *
+ * @param string $sep Separator. Defaults to '&larr;'
+ * @param bool $current_page Include the current item
+ * @param bool $root Include the root page if one exists
+ * @uses bbp_get_breadcrumb() To get the breadcrumb
+ */
+function bbp_title_breadcrumb( $args = array() ) {
+	echo bbp_get_breadcrumb( $args );
+}
+
+/**
+ * Output a breadcrumb
+ *
+ * @since bbPress (r2589)
+ *
+ * @param string $sep Separator. Defaults to '&larr;'
+ * @param bool $current_page Include the current item
+ * @param bool $root Include the root page if one exists
+ * @uses bbp_get_breadcrumb() To get the breadcrumb
+ */
+function bbp_breadcrumb( $args = array() ) {
+	echo bbp_get_breadcrumb( $args );
+}
+	/**
+	 * Return a breadcrumb ( forum -> topic -> reply )
+	 *
+	 * @since bbPress (r2589)
+	 *
+	 * @param string $sep Separator. Defaults to '&larr;'
+	 * @param bool $current_page Include the current item
+	 * @param bool $root Include the root page if one exists
+	 *
+	 * @uses get_post() To get the post
+	 * @uses bbp_get_forum_permalink() To get the forum link
+	 * @uses bbp_get_topic_permalink() To get the topic link
+	 * @uses bbp_get_reply_permalink() To get the reply link
+	 * @uses get_permalink() To get the permalink
+	 * @uses bbp_get_forum_post_type() To get the forum post type
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses bbp_get_forum_title() To get the forum title
+	 * @uses bbp_get_topic_title() To get the topic title
+	 * @uses bbp_get_reply_title() To get the reply title
+	 * @uses get_the_title() To get the title
+	 * @uses apply_filters() Calls 'bbp_get_breadcrumb' with the crumbs
+	 * @return string Breadcrumbs
+	 */
+	function bbp_get_breadcrumb( $args = array() ) {
+
+		// Turn off breadcrumbs
+		if ( apply_filters( 'bbp_no_breadcrumb', is_front_page() ) )
+			return;
+
+		// Define variables
+		$front_id         = $root_id                                 = 0;
+		$ancestors        = $crumbs           = $tag_data            = array();
+		$pre_root_text    = $pre_front_text   = $pre_current_text    = '';
+		$pre_include_root = $pre_include_home = $pre_include_current = true;
+
+		/** Home Text *********************************************************/
+
+		// No custom home text
+		if ( empty( $args['home_text'] ) ) {
+
+			// Set home text to page title
+			$front_id = get_option( 'page_on_front' );
+			if ( !empty( $front_id ) ) {
+				$pre_front_text = get_the_title( $front_id );
+
+			// Default to 'Home'
+			} else {
+				$pre_front_text = __( 'Home', 'bbpress' );
+			}
+		}
+
+		/** Root Text *********************************************************/
+
+		// No custom root text
+		if ( empty( $args['root_text'] ) ) {
+			$page = bbp_get_page_by_path( bbp_get_root_slug() );
+			if ( !empty( $page ) ) {
+				$root_id = $page->ID;
+			}
+			$pre_root_text = bbp_get_forum_archive_title();
+		}
+
+		/** Includes **********************************************************/
+
+		// Root slug is also the front page
+		if ( !empty( $front_id ) && ( $front_id == $root_id ) )
+			$pre_include_root = false;
+
+		// Don't show root if viewing forum archive
+		if ( bbp_is_forum_archive() )
+			$pre_include_root = false;
+
+		// Don't show root if viewing page in place of forum archive
+		if ( !empty( $root_id ) && ( ( is_single() || is_page() ) && ( $root_id == get_the_ID() ) ) )
+			$pre_include_root = false;
+
+		/** Current Text ******************************************************/
+
+		// Forum archive
+		if ( bbp_is_forum_archive() ) {
+			$pre_current_text = bbp_get_forum_archive_title();
+
+		// Topic archive
+		} elseif ( bbp_is_topic_archive() ) {
+			$pre_current_text = bbp_get_topic_archive_title();
+
+		// View
+		} elseif ( bbp_is_single_view() ) {
+			$pre_current_text = bbp_get_view_title();
+
+		// Single Forum
+		} elseif ( bbp_is_single_forum() ) {
+			$pre_current_text = bbp_get_forum_title();
+
+		// Single Topic
+		} elseif ( bbp_is_single_topic() ) {
+			$pre_current_text = bbp_get_topic_title();
+
+		// Single Topic
+		} elseif ( bbp_is_single_reply() ) {
+			$pre_current_text = bbp_get_reply_title();
+
+		// Topic Tag (or theme compat topic tag)
+		} elseif ( bbp_is_topic_tag() || ( get_query_var( 'bbp_topic_tag' ) && !bbp_is_topic_tag_edit() ) ) {
+
+			// Always include the tag name
+			$tag_data[] = bbp_get_topic_tag_name();
+
+			// If capable, include a link to edit the tag
+			if ( current_user_can( 'manage_topic_tags' ) ) {
+				$tag_data[] = '<a href="' . bbp_get_topic_tag_edit_link() . '" class="bbp-edit-topic-tag-link">' . __( '(Edit)', 'bbpress' ) . '</a>';
+			}
+
+			// Implode the results of the tag data
+			$pre_current_text = sprintf( __( 'Topic Tag: %s', 'bbpress' ), implode( ' ', $tag_data ) );
+
+		// Edit Topic Tag
+		} elseif ( bbp_is_topic_tag_edit() ) {
+			$pre_current_text = __( 'Edit', 'bbpress' );
+
+		// Single
+		} else {
+			$pre_current_text = get_the_title();
+		}
+
+		/** Parse Args ********************************************************/
+
+		// Parse args
+		$defaults = array(
+
+			// HTML
+			'before'          => '<div class="bbp-breadcrumb"><p>',
+			'after'           => '</p></div>',
+			
+			// Separator
+			'sep'             => __( '&rsaquo;', 'bbpress' ),
+			'pad_sep'         => 1,
+			'sep_before'      => '<span class="bbp-breadcrumb-sep">',
+			'sep_after'       => '</span>',
+			
+			// Crumbs
+			'crumb_before'    => '',
+			'crumb_after'     => '',
+
+			// Home
+			'include_home'    => $pre_include_home,
+			'home_text'       => $pre_front_text,
+
+			// Forum root
+			'include_root'    => $pre_include_root,
+			'root_text'       => $pre_root_text,
+
+			// Current
+			'include_current' => $pre_include_current,
+			'current_text'    => $pre_current_text,
+			'current_before'  => '<span class="bbp-breadcrumb-current">',
+			'current_after'   => '</span>',
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_breadcrumb' );
+		extract( $r );
+
+		/** Ancestors *********************************************************/
+
+		// Get post ancestors
+		if ( is_page() || is_single() || bbp_is_forum_edit() || bbp_is_topic_edit() || bbp_is_reply_edit() )
+			$ancestors = array_reverse( (array) get_post_ancestors( get_the_ID() ) );
+
+		// Do we want to include a link to home?
+		if ( !empty( $include_home ) || empty( $home_text ) )
+			$crumbs[] = '<a href="' . trailingslashit( home_url() ) . '" class="bbp-breadcrumb-home">' . $home_text . '</a>';
+
+		// Do we want to include a link to the forum root?
+		if ( !empty( $include_root ) || empty( $root_text ) ) {
+
+			// Page exists at root slug path, so use its permalink
+			$page = bbp_get_page_by_path( bbp_get_root_slug() );
+			if ( !empty( $page ) ) {
+				$root_url = get_permalink( $page->ID );
+
+			// Use the root slug
+			} else {
+				$root_url = get_post_type_archive_link( bbp_get_forum_post_type() );
+			}
+
+			// Add the breadcrumb
+			$crumbs[] = '<a href="' . $root_url . '" class="bbp-breadcrumb-root">' . $root_text . '</a>';
+		}
+
+		// Ancestors exist
+		if ( !empty( $ancestors ) ) {
+
+			// Loop through parents
+			foreach( (array) $ancestors as $parent_id ) {
+
+				// Parents
+				$parent = get_post( $parent_id );
+
+				// Switch through post_type to ensure correct filters are applied
+				switch ( $parent->post_type ) {
+
+					// Forum
+					case bbp_get_forum_post_type() :
+						$crumbs[] = '<a href="' . bbp_get_forum_permalink( $parent->ID ) . '" class="bbp-breadcrumb-forum">' . bbp_get_forum_title( $parent->ID ) . '</a>';
+						break;
+
+					// Topic
+					case bbp_get_topic_post_type() :
+						$crumbs[] = '<a href="' . bbp_get_topic_permalink( $parent->ID ) . '" class="bbp-breadcrumb-topic">' . bbp_get_topic_title( $parent->ID ) . '</a>';
+						break;
+
+					// Reply (Note: not in most themes)
+					case bbp_get_reply_post_type() :
+						$crumbs[] = '<a href="' . bbp_get_reply_permalink( $parent->ID ) . '" class="bbp-breadcrumb-reply">' . bbp_get_reply_title( $parent->ID ) . '</a>';
+						break;
+
+					// WordPress Post/Page/Other
+					default :
+						$crumbs[] = '<a href="' . get_permalink( $parent->ID ) . '" class="bbp-breadcrumb-item">' . get_the_title( $parent->ID ) . '</a>';
+						break;
+				}
+			}
+
+		// Edit topic tag
+		} elseif ( bbp_is_topic_tag_edit() ) {
+			$crumbs[] = '<a href="' . get_term_link( bbp_get_topic_tag_id(), bbp_get_topic_tag_tax_id() ) . '" class="bbp-breadcrumb-topic-tag">' . sprintf( __( 'Topic Tag: %s', 'bbpress' ), bbp_get_topic_tag_name() ) . '</a>';
+		}
+
+		/** Current ***********************************************************/
+
+		// Add current page to breadcrumb
+		if ( !empty( $include_current ) || empty( $pre_current_text ) )
+			$crumbs[] = $current_before . $current_text . $current_after;
+
+		/** Separator *********************************************************/
+
+		// Wrap the separator in before/after before padding and filter
+		if ( ! empty( $sep ) )
+			$sep = $sep_before . $sep . $sep_after;
+
+		// Pad the separator
+		if ( !empty( $pad_sep ) )
+			$sep = str_pad( $sep, strlen( $sep ) + ( (int) $pad_sep * 2 ), ' ', STR_PAD_BOTH );
+
+		/** Finish Up *********************************************************/
+
+		// Filter the separator and breadcrumb
+		$sep    = apply_filters( 'bbp_breadcrumb_separator', $sep    );
+		$crumbs = apply_filters( 'bbp_breadcrumbs',          $crumbs );
+
+		// Build the trail
+		$trail = !empty( $crumbs ) ? ( $before . $crumb_before . implode( $sep . $crumb_after . $crumb_before , $crumbs ) . $crumb_after . $after ) : '';
+
+		return apply_filters( 'bbp_get_breadcrumb', $trail, $crumbs, $r );
+	}
+
+/** Topic Tags ***************************************************************/
+
+/**
+ * Output all of the allowed tags in HTML format with attributes.
+ *
+ * This is useful for displaying in the post area, which elements and
+ * attributes are supported. As well as any plugins which want to display it.
+ *
+ * @since bbPress (r2780)
+ *
+ * @uses bbp_get_allowed_tags()
+ */
+function bbp_allowed_tags() {
+	echo bbp_get_allowed_tags();
+}
+	/**
+	 * Display all of the allowed tags in HTML format with attributes.
+	 *
+	 * This is useful for displaying in the post area, which elements and
+	 * attributes are supported. As well as any plugins which want to display it.
+	 *
+	 * @since bbPress (r2780)
+	 *
+	 * @uses allowed_tags() To get the allowed tags
+	 * @uses apply_filters() Calls 'bbp_allowed_tags' with the tags
+	 * @return string HTML allowed tags entity encoded.
+	 */
+	function bbp_get_allowed_tags() {
+		return apply_filters( 'bbp_get_allowed_tags', allowed_tags() );
+	}
+
+/** Errors & Messages *********************************************************/
+
+/**
+ * Display possible errors & messages inside a template file
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses WP_Error bbPress::errors::get_error_codes() To get the error codes
+ * @uses WP_Error bbPress::errors::get_error_data() To get the error data
+ * @uses WP_Error bbPress::errors::get_error_messages() To get the error
+ *                                                       messages
+ * @uses is_wp_error() To check if it's a {@link WP_Error}
+ */
+function bbp_template_notices() {
+
+	// Bail if no notices or errors
+	if ( !bbp_has_errors() )
+		return;
+
+	// Define local variable(s)
+	$errors = $messages = array();
+
+	// Get bbPress
+	$bbp = bbpress();
+
+	// Loop through notices
+	foreach ( $bbp->errors->get_error_codes() as $code ) {
+
+		// Get notice severity
+		$severity = $bbp->errors->get_error_data( $code );
+
+		// Loop through notices and separate errors from messages
+		foreach ( $bbp->errors->get_error_messages( $code ) as $error ) {
+			if ( 'message' == $severity ) {
+				$messages[] = $error;
+			} else {
+				$errors[]   = $error;
+			}
+		}
+	}
+
+	// Display errors first...
+	if ( !empty( $errors ) ) : ?>
+
+		<div class="bbp-template-notice error">
+			<p>
+				<?php echo implode( "</p>\n<p>", $errors ); ?>
+			</p>
+		</div>
+
+	<?php endif;
+
+	// ...and messages last
+	if ( !empty( $messages ) ) : ?>
+
+		<div class="bbp-template-notice">
+			<p>
+				<?php echo implode( "</p>\n<p>", $messages ); ?>
+			</p>
+		</div>
+
+	<?php endif;
+}
+
+/** Login/logout/register/lost pass *******************************************/
+
+/**
+ * Output the logout link
+ *
+ * @since bbPress (r2827)
+ *
+ * @param string $redirect_to Redirect to url
+ * @uses bbp_get_logout_link() To get the logout link
+ */
+function bbp_logout_link( $redirect_to = '' ) {
+	echo bbp_get_logout_link( $redirect_to );
+}
+	/**
+	 * Return the logout link
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @param string $redirect_to Redirect to url
+	 * @uses wp_logout_url() To get the logout url
+	 * @uses apply_filters() Calls 'bbp_get_logout_link' with the logout link and
+	 *                        redirect to url
+	 * @return string The logout link
+	 */
+	function bbp_get_logout_link( $redirect_to = '' ) {
+		return apply_filters( 'bbp_get_logout_link', '<a href="' . wp_logout_url( $redirect_to ) . '" class="button logout-link">' . __( 'Log Out', 'bbpress' ) . '</a>', $redirect_to );
+	}
+
+/** Title *********************************************************************/
+
+/**
+ * Custom page title for bbPress pages
+ *
+ * @since bbPress (r2788)
+ *
+ * @param string $title Optional. The title (not used).
+ * @param string $sep Optional, default is '&raquo;'. How to separate the
+ *                     various items within the page title.
+ * @param string $seplocation Optional. Direction to display title, 'right'.
+ * @uses bbp_is_single_user() To check if it's a user profile page
+ * @uses bbp_is_single_user_edit() To check if it's a user profile edit page
+ * @uses bbp_is_user_home() To check if the profile page is of the current user
+ * @uses get_query_var() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses bbp_is_single_forum() To check if it's a forum
+ * @uses bbp_get_forum_title() To get the forum title
+ * @uses bbp_is_single_topic() To check if it's a topic
+ * @uses bbp_get_topic_title() To get the topic title
+ * @uses bbp_is_single_reply() To check if it's a reply
+ * @uses bbp_get_reply_title() To get the reply title
+ * @uses is_tax() To check if it's the tag page
+ * @uses get_queried_object() To get the queried object
+ * @uses bbp_is_single_view() To check if it's a view
+ * @uses bbp_get_view_title() To get the view title
+ * @uses apply_filters() Calls 'bbp_raw_title' with the title
+ * @uses apply_filters() Calls 'bbp_profile_page_wp_title' with the title,
+ *                        separator and separator location
+ * @return string The tite
+ */
+function bbp_title( $title = '', $sep = '&raquo;', $seplocation = '' ) {
+
+	// Store original title to compare
+	$_title = $title;
+
+	/** Archives **************************************************************/
+
+	// Forum Archive
+	if ( bbp_is_forum_archive() ) {
+		$title = bbp_get_forum_archive_title();
+
+	// Topic Archive
+	} elseif ( bbp_is_topic_archive() ) {
+		$title = bbp_get_topic_archive_title();
+
+	/** Singles ***************************************************************/
+
+	// Forum page
+	} elseif ( bbp_is_single_forum() ) {
+		$title = sprintf( __( 'Forum: %s', 'bbpress' ), bbp_get_forum_title() );
+
+	// Topic page
+	} elseif ( bbp_is_single_topic() ) {
+		$title = sprintf( __( 'Topic: %s', 'bbpress' ), bbp_get_topic_title() );
+
+	// Replies
+	} elseif ( bbp_is_single_reply() ) {
+		$title = bbp_get_reply_title();
+
+	// Topic tag page (or edit)
+	} elseif ( bbp_is_topic_tag() || bbp_is_topic_tag_edit() || get_query_var( 'bbp_topic_tag' ) ) {
+		$term  = get_queried_object();
+		$title = sprintf( __( 'Topic Tag: %s', 'bbpress' ), $term->name );
+
+	/** Users *****************************************************************/
+
+	// Profile page
+	} elseif ( bbp_is_single_user() ) {
+
+		// Current users profile
+		if ( bbp_is_user_home() ) {
+			$title = __( 'Your Profile', 'bbpress' );
+
+		// Other users profile
+		} else {
+			$userdata = get_userdata( bbp_get_user_id() );
+			$title    = sprintf( __( '%s\'s Profile', 'bbpress' ), $userdata->display_name );
+		}
+
+	// Profile edit page
+	} elseif ( bbp_is_single_user_edit() ) {
+
+		// Current users profile
+		if ( bbp_is_user_home_edit() ) {
+			$title = __( 'Edit Your Profile', 'bbpress' );
+
+		// Other users profile
+		} else {
+			$userdata = get_userdata( bbp_get_user_id() );
+			$title    = sprintf( __( 'Edit %s\'s Profile', 'bbpress' ), $userdata->display_name );
+		}
+
+	/** Views *****************************************************************/
+
+	// Views
+	} elseif ( bbp_is_single_view() ) {
+		$title = sprintf( __( 'View: %s', 'bbpress' ), bbp_get_view_title() );
+	}
+
+	// Filter the raw title
+	$title = apply_filters( 'bbp_raw_title', $title, $sep, $seplocation );
+
+	// Compare new title with original title
+	if ( $title == $_title )
+		return $title;
+
+	// Temporary separator, for accurate flipping, if necessary
+	$t_sep  = '%WP_TITILE_SEP%';
+	$prefix = '';
+
+	if ( !empty( $title ) )
+		$prefix = " $sep ";
+
+	// sep on right, so reverse the order
+	if ( 'right' == $seplocation ) {
+		$title_array = array_reverse( explode( $t_sep, $title ) );
+		$title       = implode( " $sep ", $title_array ) . $prefix;
+
+	// sep on left, do not reverse
+	} else {
+		$title_array = explode( $t_sep, $title );
+		$title       = $prefix . implode( " $sep ", $title_array );
+	}
+
+	// Filter and return
+	return apply_filters( 'bbp_title', $title, $sep, $seplocation );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/common/widgets.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,863 @@
+<?php
+
+/**
+ * bbPress Widgets
+ *
+ * Contains the forum list, topic list, reply list and login form widgets.
+ *
+ * @package bbPress
+ * @subpackage Widgets
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * bbPress Login Widget
+ *
+ * Adds a widget which displays the login form
+ *
+ * @since bbPress (r2827)
+ *
+ * @uses WP_Widget
+ */
+class BBP_Login_Widget extends WP_Widget {
+
+	/**
+	 * bbPress Login Widget
+	 *
+	 * Registers the login widget
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @uses apply_filters() Calls 'bbp_login_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_login_widget_options', array(
+			'classname'   => 'bbp_widget_login',
+			'description' => __( 'A simple login form with optional links to sign-up and lost password pages.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Login Widget', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @since bbPress (r3389)
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Login_Widget' );
+	}
+
+	/**
+	 * Displays the output, the login form
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @param mixed $args Arguments
+	 * @param array $instance Instance
+	 * @uses apply_filters() Calls 'bbp_login_widget_title' with the title
+	 * @uses get_template_part() To get the login/logged in form
+	 */
+	public function widget( $args, $instance ) {
+		extract( $args );
+
+		$title    = apply_filters( 'bbp_login_widget_title',    $instance['title']    );
+		$register = apply_filters( 'bbp_login_widget_register', $instance['register'] );
+		$lostpass = apply_filters( 'bbp_login_widget_lostpass', $instance['lostpass'] );
+
+		echo $before_widget;
+
+		if ( !empty( $title ) )
+			echo $before_title . $title . $after_title;
+
+		if ( !is_user_logged_in() ) : ?>
+
+			<form method="post" action="<?php bbp_wp_login_action( array( 'context' => 'login_post' ) ); ?>" class="bbp-login-form">
+				<fieldset>
+					<legend><?php _e( 'Log In', 'bbpress' ); ?></legend>
+
+					<div class="bbp-username">
+						<label for="user_login"><?php _e( 'Username', 'bbpress' ); ?>: </label>
+						<input type="text" name="log" value="<?php bbp_sanitize_val( 'user_login', 'text' ); ?>" size="20" id="user_login" tabindex="<?php bbp_tab_index(); ?>" />
+					</div>
+
+					<div class="bbp-password">
+						<label for="user_pass"><?php _e( 'Password', 'bbpress' ); ?>: </label>
+						<input type="password" name="pwd" value="<?php bbp_sanitize_val( 'user_pass', 'password' ); ?>" size="20" id="user_pass" tabindex="<?php bbp_tab_index(); ?>" />
+					</div>
+
+					<div class="bbp-remember-me">
+						<input type="checkbox" name="rememberme" value="forever" <?php checked( bbp_get_sanitize_val( 'rememberme', 'checkbox' ), true, true ); ?> id="rememberme" tabindex="<?php bbp_tab_index(); ?>" />
+						<label for="rememberme"><?php _e( 'Remember Me', 'bbpress' ); ?></label>
+					</div>
+
+					<div class="bbp-submit-wrapper">
+
+						<?php do_action( 'login_form' ); ?>
+
+						<button type="submit" name="user-submit" id="user-submit" tabindex="<?php bbp_tab_index(); ?>" class="button submit user-submit"><?php _e( 'Log In', 'bbpress' ); ?></button>
+
+						<?php bbp_user_login_fields(); ?>
+
+					</div>
+
+					<?php if ( !empty( $register ) || !empty( $lostpass ) ) : ?>
+
+						<div class="bbp-login-links">
+
+							<?php if ( !empty( $register ) ) : ?>
+
+								<a href="<?php echo esc_url( $register ); ?>" title="<?php esc_attr_e( 'Register', 'bbpress' ); ?>" class="bbp-register-link"><?php _e( 'Register', 'bbpress' ); ?></a>
+
+							<?php endif; ?>
+
+							<?php if ( !empty( $lostpass ) ) : ?>
+
+								<a href="<?php echo esc_url( $lostpass ); ?>" title="<?php esc_attr_e( 'Lost Password', 'bbpress' ); ?>" class="bbp-lostpass-link"><?php _e( 'Lost Password', 'bbpress' ); ?></a>
+
+							<?php endif; ?>
+
+						</div>
+
+					<?php endif; ?>
+
+				</fieldset>
+			</form>
+
+		<?php else : ?>
+
+			<div class="bbp-logged-in">
+				<a href="<?php bbp_user_profile_url( bbp_get_current_user_id() ); ?>" class="submit user-submit"><?php echo get_avatar( bbp_get_current_user_id(), '40' ); ?></a>
+				<h4><?php bbp_user_profile_link( bbp_get_current_user_id() ); ?></h4>
+
+				<?php bbp_logout_link(); ?>
+			</div>
+
+		<?php endif;
+
+		echo $after_widget;
+	}
+
+	/**
+	 * Update the login widget options
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance             = $old_instance;
+		$instance['title']    = strip_tags( $new_instance['title'] );
+		$instance['register'] = esc_url( $new_instance['register'] );
+		$instance['lostpass'] = esc_url( $new_instance['lostpass'] );
+
+		return $instance;
+	}
+
+	/**
+	 * Output the login widget options form
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Login_Widget::get_field_id() To output the field id
+	 * @uses BBP_Login_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+
+		// Form values
+		$title    = !empty( $instance['title'] )    ? esc_attr( $instance['title'] )    : '';
+		$register = !empty( $instance['register'] ) ? esc_attr( $instance['register'] ) : '';
+		$lostpass = !empty( $instance['lostpass'] ) ? esc_attr( $instance['lostpass'] ) : '';
+
+		?>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bbpress' ); ?>
+			<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" /></label>
+		</p>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'register' ); ?>"><?php _e( 'Register URI:', 'bbpress' ); ?>
+			<input class="widefat" id="<?php echo $this->get_field_id( 'register' ); ?>" name="<?php echo $this->get_field_name( 'register' ); ?>" type="text" value="<?php echo $register; ?>" /></label>
+		</p>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'lostpass' ); ?>"><?php _e( 'Lost Password URI:', 'bbpress' ); ?>
+			<input class="widefat" id="<?php echo $this->get_field_id( 'lostpass' ); ?>" name="<?php echo $this->get_field_name( 'lostpass' ); ?>" type="text" value="<?php echo $lostpass; ?>" /></label>
+		</p>
+
+		<?php
+	}
+}
+
+/**
+ * bbPress Views Widget
+ *
+ * Adds a widget which displays the view list
+ *
+ * @since bbPress (r3020)
+ *
+ * @uses WP_Widget
+ */
+class BBP_Views_Widget extends WP_Widget {
+
+	/**
+	 * bbPress View Widget
+	 *
+	 * Registers the view widget
+	 *
+	 * @since bbPress (r3020)
+	 *
+	 * @uses apply_filters() Calls 'bbp_views_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_views_widget_options', array(
+			'classname'   => 'widget_display_views',
+			'description' => __( 'A list of registered optional topic views.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Topic Views List', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @since bbPress (r3389)
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Views_Widget' );
+	}
+
+	/**
+	 * Displays the output, the view list
+	 *
+	 * @since bbPress (r3020)
+	 *
+	 * @param mixed $args Arguments
+	 * @param array $instance Instance
+	 * @uses apply_filters() Calls 'bbp_view_widget_title' with the title
+	 * @uses bbp_get_views() To get the views
+	 * @uses bbp_view_url() To output the view url
+	 * @uses bbp_view_title() To output the view title
+	 */
+	public function widget( $args, $instance ) {
+
+		// Only output widget contents if views exist
+		if ( bbp_get_views() ) :
+
+			extract( $args );
+
+			$title = apply_filters( 'bbp_view_widget_title', $instance['title'] );
+
+			echo $before_widget;
+			echo $before_title . $title . $after_title; ?>
+
+			<ul>
+
+				<?php foreach ( bbp_get_views() as $view => $args ) : ?>
+
+					<li><a class="bbp-view-title" href="<?php bbp_view_url( $view ); ?>" title="<?php bbp_view_title( $view ); ?>"><?php bbp_view_title( $view ); ?></a></li>
+
+				<?php endforeach; ?>
+
+			</ul>
+
+			<?php echo $after_widget;
+
+		endif;
+	}
+
+	/**
+	 * Update the view widget options
+	 *
+	 * @since bbPress (r3020)
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance          = $old_instance;
+		$instance['title'] = strip_tags( $new_instance['title'] );
+
+		return $instance;
+	}
+
+	/**
+	 * Output the view widget options form
+	 *
+	 * @since bbPress (r3020)
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Views_Widget::get_field_id() To output the field id
+	 * @uses BBP_Views_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+		$title = !empty( $instance['title'] ) ? esc_attr( $instance['title'] ) : ''; ?>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bbpress' ); ?>
+				<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
+			</label>
+		</p>
+
+		<?php
+	}
+}
+
+/**
+ * bbPress Forum Widget
+ *
+ * Adds a widget which displays the forum list
+ *
+ * @since bbPress (r2653)
+ *
+ * @uses WP_Widget
+ */
+class BBP_Forums_Widget extends WP_Widget {
+
+	/**
+	 * bbPress Forum Widget
+	 *
+	 * Registers the forum widget
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @uses apply_filters() Calls 'bbp_forums_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_forums_widget_options', array(
+			'classname'   => 'widget_display_forums',
+			'description' => __( 'A list of forums with an option to set the parent.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Forums List', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @since bbPress (r3389)
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Forums_Widget' );
+	}
+
+	/**
+	 * Displays the output, the forum list
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param mixed $args Arguments
+	 * @param array $instance Instance
+	 * @uses apply_filters() Calls 'bbp_forum_widget_title' with the title
+	 * @uses get_option() To get the forums per page option
+	 * @uses current_user_can() To check if the current user can read
+	 *                           private() To resety name
+	 * @uses bbp_has_forums() The main forum loop
+	 * @uses bbp_forums() To check whether there are more forums available
+	 *                     in the loop
+	 * @uses bbp_the_forum() Loads up the current forum in the loop
+	 * @uses bbp_forum_permalink() To display the forum permalink
+	 * @uses bbp_forum_title() To display the forum title
+	 */
+	public function widget( $args, $instance ) {
+		extract( $args );
+
+		$title        = apply_filters( 'bbp_forum_widget_title', $instance['title'] );
+		$parent_forum = !empty( $instance['parent_forum'] ) ? $instance['parent_forum'] : '0';
+
+		// Note: private and hidden forums will be excluded via the
+		// bbp_pre_get_posts_exclude_forums filter and function.
+		$widget_query = new WP_Query( array(
+			'post_parent'    => $parent_forum,
+			'post_type'      => bbp_get_forum_post_type(),
+			'posts_per_page' => get_option( '_bbp_forums_per_page', 50 ),
+			'orderby'        => 'menu_order',
+			'order'          => 'ASC'
+		) );
+
+		if ( $widget_query->have_posts() ) :
+
+			echo $before_widget;
+			echo $before_title . $title . $after_title; ?>
+
+			<ul>
+
+				<?php while ( $widget_query->have_posts() ) : $widget_query->the_post(); ?>
+
+					<li><a class="bbp-forum-title" href="<?php bbp_forum_permalink( $widget_query->post->ID ); ?>" title="<?php bbp_forum_title( $widget_query->post->ID ); ?>"><?php bbp_forum_title( $widget_query->post->ID ); ?></a></li>
+
+				<?php endwhile; ?>
+
+			</ul>
+
+			<?php echo $after_widget;
+
+			// Reset the $post global
+			wp_reset_postdata();
+
+		endif;
+	}
+
+	/**
+	 * Update the forum widget options
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance                 = $old_instance;
+		$instance['title']        = strip_tags( $new_instance['title'] );
+		$instance['parent_forum'] = $new_instance['parent_forum'];
+
+		// Force to any
+		if ( !empty( $instance['parent_forum'] ) && !is_numeric( $instance['parent_forum'] ) ) {
+			$instance['parent_forum'] = 'any';
+		}
+
+		return $instance;
+	}
+
+	/**
+	 * Output the forum widget options form
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Forums_Widget::get_field_id() To output the field id
+	 * @uses BBP_Forums_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+		$title        = !empty( $instance['title']        ) ? esc_attr( $instance['title']        ) : '';
+		$parent_forum = !empty( $instance['parent_forum'] ) ? esc_attr( $instance['parent_forum'] ) : '0'; ?>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'title' ); ?>"><?php _e( 'Title:', 'bbpress' ); ?>
+				<input class="widefat" id="<?php echo $this->get_field_id( 'title' ); ?>" name="<?php echo $this->get_field_name( 'title' ); ?>" type="text" value="<?php echo $title; ?>" />
+			</label>
+		</p>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'parent_forum' ); ?>"><?php _e( 'Parent Forum ID:', 'bbpress' ); ?>
+				<input class="widefat" id="<?php echo $this->get_field_id( 'parent_forum' ); ?>" name="<?php echo $this->get_field_name( 'parent_forum' ); ?>" type="text" value="<?php echo $parent_forum; ?>" />
+			</label>
+
+			<br />
+
+			<small><?php _e( '"0" to show only root - "any" to show all', 'bbpress' ); ?></small>
+		</p>
+
+		<?php
+	}
+}
+
+/**
+ * bbPress Topic Widget
+ *
+ * Adds a widget which displays the topic list
+ *
+ * @since bbPress (r2653)
+ *
+ * @uses WP_Widget
+ */
+class BBP_Topics_Widget extends WP_Widget {
+
+	/**
+	 * bbPress Topic Widget
+	 *
+	 * Registers the topic widget
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @uses apply_filters() Calls 'bbp_topics_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_topics_widget_options', array(
+			'classname'   => 'widget_display_topics',
+			'description' => __( 'A list of recent topics, sorted by popularity or freshness.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Recent Topics', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @since bbPress (r3389)
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Topics_Widget' );
+	}
+
+	/**
+	 * Displays the output, the topic list
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param mixed $args
+	 * @param array $instance
+	 * @uses apply_filters() Calls 'bbp_topic_widget_title' with the title
+	 * @uses bbp_topic_permalink() To display the topic permalink
+	 * @uses bbp_topic_title() To display the topic title
+	 * @uses bbp_get_topic_last_active_time() To get the topic last active
+	 *                                         time
+	 * @uses bbp_get_topic_id() To get the topic id
+	 */
+	public function widget( $args, $instance ) {
+
+		extract( $args );
+
+		$title        = apply_filters( 'bbp_topic_widget_title', $instance['title'] );
+		$max_shown    = !empty( $instance['max_shown']    ) ? (int) $instance['max_shown'] : 5;
+		$show_date    = !empty( $instance['show_date']    ) ? 'on'                         : false;
+		$show_user    = !empty( $instance['show_user']    ) ? 'on'                         : false;
+		$parent_forum = !empty( $instance['parent_forum'] ) ? $instance['parent_forum']    : 'any';
+		$order_by     = !empty( $instance['order_by']     ) ? $instance['order_by']        : false;
+
+		// How do we want to order our results?
+		switch ( $order_by ) {
+
+			// Order by most recent replies
+			case 'freshness' :
+				$topics_query = array(
+					'author'         => 0,
+					'post_type'      => bbp_get_topic_post_type(),
+					'post_parent'    => $parent_forum,
+					'posts_per_page' => $max_shown,
+					'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+					'show_stickes'   => false,
+					'meta_key'       => '_bbp_last_active_time',
+					'orderby'        => 'meta_value',
+					'order'          => 'DESC',
+					'meta_query'     => array( bbp_exclude_forum_ids( 'meta_query' ) )
+				);
+				break;
+
+			// Order by total number of replies
+			case 'popular' :
+				$topics_query = array(
+					'author'         => 0,
+					'post_type'      => bbp_get_topic_post_type(),
+					'post_parent'    => $parent_forum,
+					'posts_per_page' => $max_shown,
+					'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+					'show_stickes'   => false,
+					'meta_key'       => '_bbp_reply_count',
+					'orderby'        => 'meta_value',
+					'order'          => 'DESC',
+					'meta_query'     => array( bbp_exclude_forum_ids( 'meta_query' ) )
+				);			
+				break;
+
+			// Order by which topic was created most recently
+			case 'newness' :
+			default :
+				$topics_query = array(
+					'author'         => 0,
+					'post_type'      => bbp_get_topic_post_type(),
+					'post_parent'    => $parent_forum,
+					'posts_per_page' => $max_shown,
+					'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+					'show_stickes'   => false,
+					'order'          => 'DESC',
+					'meta_query'     => array( bbp_exclude_forum_ids( 'meta_query' ) )
+				);			
+				break;
+		}
+		
+		// Note: private and hidden forums will be excluded via the
+		// bbp_pre_get_posts_exclude_forums filter and function.
+		$widget_query = new WP_Query( $topics_query );
+
+		// Topics exist
+		if ( $widget_query->have_posts() ) : 
+			
+			echo $before_widget;
+			echo $before_title . $title . $after_title; ?>
+
+			<ul>
+
+				<?php while ( $widget_query->have_posts() ) :
+
+					$widget_query->the_post();
+					$topic_id    = bbp_get_topic_id( $widget_query->post->ID ); 
+					$author_link = bbp_get_topic_author_link( array( 'post_id' => $topic_id, 'type' => 'both', 'size' => 14 ) ); ?>
+
+					<li>
+						<a class="bbp-forum-title" href="<?php bbp_topic_permalink( $topic_id ); ?>" title="<?php bbp_topic_title( $topic_id ); ?>"><?php bbp_topic_title( $topic_id ); ?></a>
+
+						<?php if ( 'on' == $show_user ) : ?>
+
+							<?php printf( _x( 'by %1$s', 'widgets', 'bbpress' ), '<span class="topic-author">' . $author_link . '</span>' ); ?>
+
+						<?php endif; ?>
+
+						<?php if ( 'on' == $show_date ) : ?>
+
+							<div><?php bbp_topic_last_active_time( $topic_id ); ?></div>
+
+						<?php endif; ?>
+
+					</li>
+
+				<?php endwhile; ?>
+
+			</ul>
+
+			<?php echo $after_widget;
+
+			// Reset the $post global
+			wp_reset_postdata();
+
+		endif;
+	}
+
+	/**
+	 * Update the topic widget options
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance              = $old_instance;
+		$instance['title']     = strip_tags( $new_instance['title']     );
+		$instance['max_shown'] = strip_tags( $new_instance['max_shown'] );
+		$instance['show_date'] = strip_tags( $new_instance['show_date'] );
+		$instance['show_user'] = strip_tags( $new_instance['show_user'] );
+		$instance['order_by']  = strip_tags( $new_instance['order_by']  );
+
+		return $instance;
+	}
+
+	/**
+	 * Output the topic widget options form
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Topics_Widget::get_field_id() To output the field id
+	 * @uses BBP_Topics_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+		$title     = !empty( $instance['title']     ) ? esc_attr( $instance['title']     ) : '';
+		$max_shown = !empty( $instance['max_shown'] ) ? esc_attr( $instance['max_shown'] ) : '';
+		$show_date = !empty( $instance['show_date'] ) ? esc_attr( $instance['show_date'] ) : '';
+		$show_user = !empty( $instance['show_user'] ) ? esc_attr( $instance['show_user'] ) : '';
+		$order_by  = !empty( $instance['order_by']  ) ? esc_attr( $instance['order_by']  ) : ''; ?>
+
+		<p><label for="<?php echo $this->get_field_id( 'title'     ); ?>"><?php _e( 'Title:',                  'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'title'     ); ?>" name="<?php echo $this->get_field_name( 'title'     ); ?>" type="text" value="<?php echo $title; ?>" /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'max_shown' ); ?>"><?php _e( 'Maximum topics to show:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_shown' ); ?>" name="<?php echo $this->get_field_name( 'max_shown' ); ?>" type="text" value="<?php echo $max_shown; ?>" /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Show post date:',         'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" <?php checked( 'on', $show_date ); ?> /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'show_user' ); ?>"><?php _e( 'Show topic author:',      'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_user' ); ?>" name="<?php echo $this->get_field_name( 'show_user' ); ?>" <?php checked( 'on', $show_user ); ?> /></label></p>
+
+		<p>
+			<label for="<?php echo $this->get_field_id( 'order_by' ); ?>"><?php _e( 'Order By:',        'bbpress' ); ?></label>
+			<select name="<?php echo $this->get_field_name( 'order_by' ); ?>" id="<?php echo $this->get_field_name( 'order_by' ); ?>">
+				<option <?php selected( $order_by, 'newness' );   ?> value="newness"><?php _e( 'Newest Topics',                'bbpress' ); ?></option>
+				<option <?php selected( $order_by, 'popular' );   ?> value="popular"><?php _e( 'Popular Topics',               'bbpress' ); ?></option>
+				<option <?php selected( $order_by, 'freshness' ); ?> value="freshness"><?php _e( 'Topics With Recent Replies', 'bbpress' ); ?></option>
+			</select>
+		</p>
+
+		<?php
+	}
+}
+
+/**
+ * bbPress Replies Widget
+ *
+ * Adds a widget which displays the replies list
+ *
+ * @since bbPress (r2653)
+ *
+ * @uses WP_Widget
+ */
+class BBP_Replies_Widget extends WP_Widget {
+
+	/**
+	 * bbPress Replies Widget
+	 *
+	 * Registers the replies widget
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @uses apply_filters() Calls 'bbp_replies_widget_options' with the
+	 *                        widget options
+	 */
+	public function __construct() {
+		$widget_ops = apply_filters( 'bbp_replies_widget_options', array(
+			'classname'   => 'widget_display_replies',
+			'description' => __( 'A list of the most recent replies.', 'bbpress' )
+		) );
+
+		parent::__construct( false, __( '(bbPress) Recent Replies', 'bbpress' ), $widget_ops );
+	}
+
+	/**
+	 * Register the widget
+	 *
+	 * @since bbPress (r3389)
+	 *
+	 * @uses register_widget()
+	 */
+	public static function register_widget() {
+		register_widget( 'BBP_Replies_Widget' );
+	}
+
+	/**
+	 * Displays the output, the replies list
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param mixed $args
+	 * @param array $instance
+	 * @uses apply_filters() Calls 'bbp_reply_widget_title' with the title
+	 * @uses bbp_get_reply_author_link() To get the reply author link
+	 * @uses bbp_get_reply_author() To get the reply author name
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_url() To get the reply url
+	 * @uses bbp_get_reply_excerpt() To get the reply excerpt
+	 * @uses bbp_get_reply_topic_title() To get the reply topic title
+	 * @uses get_the_date() To get the date of the reply
+	 * @uses get_the_time() To get the time of the reply
+	 */
+	public function widget( $args, $instance ) {
+
+		extract( $args );
+
+		$title      = apply_filters( 'bbp_replies_widget_title', $instance['title'] );
+		$max_shown  = !empty( $instance['max_shown'] ) ? $instance['max_shown'] : '5';
+		$show_date  = !empty( $instance['show_date'] ) ? 'on'                   : false;
+		$show_user  = !empty( $instance['show_user'] ) ? 'on'                   : false;
+		$post_types = !empty( $instance['post_type'] ) ? array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ) : bbp_get_reply_post_type();
+
+		// Note: private and hidden forums will be excluded via the
+		// bbp_pre_get_posts_exclude_forums filter and function.
+		$widget_query = new WP_Query( array(
+			'post_type'      => $post_types,
+			'post_status'    => join( ',', array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ),
+			'posts_per_page' => $max_shown,
+			'meta_query'     => array( bbp_exclude_forum_ids( 'meta_query' ) )
+		) );
+
+		// Get replies and display them
+		if ( $widget_query->have_posts() ) :
+
+			echo $before_widget;
+			echo $before_title . $title . $after_title; ?>
+
+			<ul>
+
+				<?php while ( $widget_query->have_posts() ) : $widget_query->the_post(); ?>
+
+					<li>
+
+						<?php
+
+						$reply_id    = bbp_get_reply_id( $widget_query->post->ID );
+						$author_link = bbp_get_reply_author_link( array( 'post_id' => $reply_id, 'type' => 'both', 'size' => 14 ) );
+						$reply_link  = '<a class="bbp-reply-topic-title" href="' . esc_url( bbp_get_reply_url( $reply_id ) ) . '" title="' . bbp_get_reply_excerpt( $reply_id, 50 ) . '">' . bbp_get_reply_topic_title( $reply_id ) . '</a>';
+
+						// Reply author, link, and timestamp
+						if ( ( 'on' == $show_date ) && ( 'on' == $show_user ) ) :
+
+							// translators: 1: reply author, 2: reply link, 3: reply timestamp
+							printf( _x( '%1$s on %2$s %3$s', 'widgets', 'bbpress' ), $author_link, $reply_link, '<div>' . bbp_get_time_since( get_the_time( 'U' ) ) . '</div>' );
+
+						// Reply link and timestamp
+						elseif ( $show_date == 'on' ) :
+
+							// translators: 1: reply link, 2: reply timestamp
+							printf( _x( '%1$s %2$s',         'widgets', 'bbpress' ), $reply_link,  '<div>' . bbp_get_time_since( get_the_time( 'U' ) ) . '</div>'              );
+
+						// Reply author and title
+						elseif ( $show_user == 'on' ) :
+
+							// translators: 1: reply author, 2: reply link
+							printf( _x( '%1$s on %2$s',      'widgets', 'bbpress' ), $author_link, $reply_link                                                                 );
+
+						// Only the reply title
+						else :
+
+							// translators: 1: reply link
+							printf( _x( '%1$s',              'widgets', 'bbpress' ), $reply_link                                                                               );
+
+						endif;
+
+						?>
+
+					</li>
+
+				<?php endwhile; ?>
+
+			</ul>
+
+			<?php echo $after_widget;
+
+			// Reset the $post global
+			wp_reset_postdata();
+
+		endif;
+	}
+
+	/**
+	 * Update the reply widget options
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param array $new_instance The new instance options
+	 * @param array $old_instance The old instance options
+	 */
+	public function update( $new_instance, $old_instance ) {
+		$instance              = $old_instance;
+		$instance['title']     = strip_tags( $new_instance['title']     );
+		$instance['max_shown'] = strip_tags( $new_instance['max_shown'] );
+		$instance['show_date'] = strip_tags( $new_instance['show_date'] );
+		$instance['show_user'] = strip_tags( $new_instance['show_user'] );
+
+		return $instance;
+	}
+
+	/**
+	 * Output the reply widget options form
+	 *
+	 * @since bbPress (r2653)
+	 *
+	 * @param $instance Instance
+	 * @uses BBP_Replies_Widget::get_field_id() To output the field id
+	 * @uses BBP_Replies_Widget::get_field_name() To output the field name
+	 */
+	public function form( $instance ) {
+		$title     = !empty( $instance['title']     ) ? esc_attr( $instance['title']     ) : '';
+		$max_shown = !empty( $instance['max_shown'] ) ? esc_attr( $instance['max_shown'] ) : '';
+		$show_date = !empty( $instance['show_date'] ) ? esc_attr( $instance['show_date'] ) : '';
+		$show_user = !empty( $instance['show_user'] ) ? esc_attr( $instance['show_user'] ) : ''; ?>
+
+		<p><label for="<?php echo $this->get_field_id( 'title'     ); ?>"><?php _e( 'Title:',                   'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'title'     ); ?>" name="<?php echo $this->get_field_name( 'title'     ); ?>" type="text" value="<?php echo $title; ?>" /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'max_shown' ); ?>"><?php _e( 'Maximum replies to show:', 'bbpress' ); ?> <input class="widefat" id="<?php echo $this->get_field_id( 'max_shown' ); ?>" name="<?php echo $this->get_field_name( 'max_shown' ); ?>" type="text" value="<?php echo $max_shown; ?>" /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'show_date' ); ?>"><?php _e( 'Show post date:',          'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_date' ); ?>" name="<?php echo $this->get_field_name( 'show_date' ); ?>" <?php checked( 'on', $show_date ); ?> /></label></p>
+		<p><label for="<?php echo $this->get_field_id( 'show_user' ); ?>"><?php _e( 'Show reply author:',       'bbpress' ); ?> <input type="checkbox" id="<?php echo $this->get_field_id( 'show_user' ); ?>" name="<?php echo $this->get_field_name( 'show_user' ); ?>" <?php checked( 'on', $show_user ); ?> /></label></p>
+
+		<?php
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/actions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,295 @@
+<?php
+
+/**
+ * bbPress Actions
+ *
+ * @package bbPress
+ * @subpackage Core
+ *
+ * This file contains the actions that are used through-out bbPress. They are
+ * consolidated here to make searching for them easier, and to help developers
+ * understand at a glance the order in which things occur.
+ *
+ * There are a few common places that additional actions can currently be found
+ *
+ *  - bbPress: In {@link bbPress::setup_actions()} in bbpress.php
+ *  - Admin: More in {@link BBP_Admin::setup_actions()} in admin.php
+ *
+ * @see /core/filters.php
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Attach bbPress to WordPress
+ *
+ * bbPress uses its own internal actions to help aid in third-party plugin
+ * development, and to limit the amount of potential future code changes when
+ * updates to WordPress core occur.
+ *
+ * These actions exist to create the concept of 'plugin dependencies'. They
+ * provide a safe way for plugins to execute code *only* when bbPress is
+ * installed and activated, without needing to do complicated guesswork.
+ *
+ * For more information on how this works, see the 'Plugin Dependency' section
+ * near the bottom of this file.
+ *
+ *           v--WordPress Actions        v--bbPress Sub-actions
+ */
+add_action( 'plugins_loaded',           'bbp_loaded',                   10    );
+add_action( 'init',                     'bbp_init',                     0     ); // Early for bbp_register
+add_action( 'parse_query',              'bbp_parse_query',              2     ); // Early for overrides
+add_action( 'widgets_init',             'bbp_widgets_init',             10    );
+add_action( 'generate_rewrite_rules',   'bbp_generate_rewrite_rules',   10    );
+add_action( 'wp_enqueue_scripts',       'bbp_enqueue_scripts',          10    );
+add_action( 'wp_head',                  'bbp_head',                     10    );
+add_action( 'wp_footer',                'bbp_footer',                   10    );
+add_action( 'set_current_user',         'bbp_setup_current_user',       10    );
+add_action( 'setup_theme',              'bbp_setup_theme',              10    );
+add_action( 'after_setup_theme',        'bbp_after_setup_theme',        10    );
+add_action( 'template_redirect',        'bbp_template_redirect',        10    );
+add_action( 'login_form_login',         'bbp_login_form_login',         10    );
+add_action( 'profile_update',           'bbp_profile_update',           10, 2 ); // user_id and old_user_data
+add_action( 'user_register',            'bbp_user_register',            10    );
+
+/**
+ * bbp_loaded - Attached to 'plugins_loaded' above
+ *
+ * Attach various loader actions to the bbp_loaded action.
+ * The load order helps to execute code at the correct time.
+ *                                                         v---Load order
+ */
+add_action( 'bbp_loaded', 'bbp_constants',                 2  );
+add_action( 'bbp_loaded', 'bbp_boot_strap_globals',        4  );
+add_action( 'bbp_loaded', 'bbp_includes',                  6  );
+add_action( 'bbp_loaded', 'bbp_setup_globals',             8  );
+add_action( 'bbp_loaded', 'bbp_setup_option_filters',      10 );
+add_action( 'bbp_loaded', 'bbp_setup_user_option_filters', 12 );
+add_action( 'bbp_loaded', 'bbp_register_theme_packages',   14 );
+add_action( 'bbp_loaded', 'bbp_filter_user_roles_option',  16 );
+
+/**
+ * bbp_init - Attached to 'init' above
+ *
+ * Attach various initialization actions to the init action.
+ * The load order helps to execute code at the correct time.
+ *                                              v---Load order
+ */
+add_action( 'bbp_init', 'bbp_register',         0   );
+add_action( 'bbp_init', 'bbp_load_textdomain',  10  );
+add_action( 'bbp_init', 'bbp_add_rewrite_tags', 20  );
+add_action( 'bbp_init', 'bbp_ready',            999 );
+
+/**
+ * There is no action API for roles to use, so hook in immediately after the
+ * $wp_roles global is set, which is the 'setup_theme' action.
+ *
+ * This is kind of lame, but is all we have for now.
+ */
+add_action( 'bbp_setup_theme', 'bbp_add_forums_roles', 1 );
+
+/**
+ * When switching to a new blog, a users mapped role will get wiped out by
+ * WP_User::for_blog() and WP_User::_init_caps().
+ *
+ * This happens naturally in multisite setups during WP_Admin_Bar::initialize(),
+ * which is annoying because it will happen on each page-load.
+ *
+ * Resetting the role on blog-switch enables us to maintain the user's dynamic
+ * role between sites. Note that if a user already has a role on that site, no
+ * mapping will occur.
+ *
+ * We also hook to 'bbp_setup_current_user' -- naturally.
+ */
+add_action( 'switch_blog',            'bbp_set_current_user_default_role' );
+add_action( 'bbp_setup_current_user', 'bbp_set_current_user_default_role' );
+
+/**
+ * bbp_register - Attached to 'init' above on 0 priority
+ *
+ * Attach various initialization actions early to the init action.
+ * The load order helps to execute code at the correct time.
+ *                                                         v---Load order
+ */
+add_action( 'bbp_register', 'bbp_register_post_types',     2  );
+add_action( 'bbp_register', 'bbp_register_post_statuses',  4  );
+add_action( 'bbp_register', 'bbp_register_taxonomies',     6  );
+add_action( 'bbp_register', 'bbp_register_views',          8  );
+add_action( 'bbp_register', 'bbp_register_shortcodes',     10 );
+
+// Autoembeds
+add_action( 'bbp_init', 'bbp_reply_content_autoembed', 8   );
+add_action( 'bbp_init', 'bbp_topic_content_autoembed', 8   );
+
+/**
+ * bbp_ready - attached to end 'bbp_init' above
+ *
+ * Attach actions to the ready action after bbPress has fully initialized.
+ * The load order helps to execute code at the correct time.
+ *                                                v---Load order
+ */
+add_action( 'bbp_ready',  'bbp_setup_akismet',    2  ); // Spam prevention for topics and replies
+add_action( 'bp_include', 'bbp_setup_buddypress', 10 ); // Social network integration
+
+// Try to load the bbpress-functions.php file from the active themes
+add_action( 'bbp_after_setup_theme', 'bbp_load_theme_functions', 10 );
+
+// Widgets
+add_action( 'bbp_widgets_init', array( 'BBP_Login_Widget',   'register_widget' ), 10 );
+add_action( 'bbp_widgets_init', array( 'BBP_Views_Widget',   'register_widget' ), 10 );
+add_action( 'bbp_widgets_init', array( 'BBP_Forums_Widget',  'register_widget' ), 10 );
+add_action( 'bbp_widgets_init', array( 'BBP_Topics_Widget',  'register_widget' ), 10 );
+add_action( 'bbp_widgets_init', array( 'BBP_Replies_Widget', 'register_widget' ), 10 );
+
+// Template - Head, foot, errors and messages
+add_action( 'bbp_loaded',           'bbp_login_notices'    );
+add_action( 'bbp_head',             'bbp_topic_notices'    );
+add_action( 'bbp_template_notices', 'bbp_template_notices' );
+
+// Always exclude private/hidden forums if needed
+add_action( 'pre_get_posts', 'bbp_pre_get_posts_exclude_forums', 4 );
+
+// Profile Page Messages
+add_action( 'bbp_template_notices', 'bbp_notice_edit_user_success'           );
+add_action( 'bbp_template_notices', 'bbp_notice_edit_user_is_super_admin', 2 );
+
+// Before Delete/Trash/Untrash Topic
+add_action( 'wp_trash_post', 'bbp_trash_forum'   );
+add_action( 'trash_post',    'bbp_trash_forum'   );
+add_action( 'untrash_post',  'bbp_untrash_forum' );
+add_action( 'delete_post',   'bbp_delete_forum'  );
+
+// After Deleted/Trashed/Untrashed Topic
+add_action( 'trashed_post',   'bbp_trashed_forum'   );
+add_action( 'untrashed_post', 'bbp_untrashed_forum' );
+add_action( 'deleted_post',   'bbp_deleted_forum'   );
+
+// Auto trash/untrash/delete a forums topics
+add_action( 'bbp_delete_forum',  'bbp_delete_forum_topics',  10 );
+add_action( 'bbp_trash_forum',   'bbp_trash_forum_topics',   10 );
+add_action( 'bbp_untrash_forum', 'bbp_untrash_forum_topics', 10 );
+
+// New/Edit Forum
+add_action( 'bbp_new_forum',  'bbp_update_forum', 10 );
+add_action( 'bbp_edit_forum', 'bbp_update_forum', 10 );
+
+// Save forum extra metadata
+add_action( 'bbp_new_forum_post_extras',         'bbp_save_forum_extras', 2 );
+add_action( 'bbp_edit_forum_post_extras',        'bbp_save_forum_extras', 2 );
+add_action( 'bbp_forum_attributes_metabox_save', 'bbp_save_forum_extras', 2 );
+
+// New/Edit Reply
+add_action( 'bbp_new_reply',  'bbp_update_reply', 10, 6 );
+add_action( 'bbp_edit_reply', 'bbp_update_reply', 10, 6 );
+
+// Before Delete/Trash/Untrash Reply
+add_action( 'wp_trash_post', 'bbp_trash_reply'   );
+add_action( 'trash_post',    'bbp_trash_reply'   );
+add_action( 'untrash_post',  'bbp_untrash_reply' );
+add_action( 'delete_post',   'bbp_delete_reply'  );
+
+// After Deleted/Trashed/Untrashed Reply
+add_action( 'trashed_post',   'bbp_trashed_reply'   );
+add_action( 'untrashed_post', 'bbp_untrashed_reply' );
+add_action( 'deleted_post',   'bbp_deleted_reply'   );
+
+// New/Edit Topic
+add_action( 'bbp_new_topic',  'bbp_update_topic', 10, 5 );
+add_action( 'bbp_edit_topic', 'bbp_update_topic', 10, 5 );
+
+// Split/Merge Topic
+add_action( 'bbp_merged_topic',     'bbp_merge_topic_count', 1, 3 );
+add_action( 'bbp_post_split_topic', 'bbp_split_topic_count', 1, 3 );
+
+// Before Delete/Trash/Untrash Topic
+add_action( 'wp_trash_post', 'bbp_trash_topic'   );
+add_action( 'trash_post',    'bbp_trash_topic'   );
+add_action( 'untrash_post',  'bbp_untrash_topic' );
+add_action( 'delete_post',   'bbp_delete_topic'  );
+
+// After Deleted/Trashed/Untrashed Topic
+add_action( 'trashed_post',   'bbp_trashed_topic'   );
+add_action( 'untrashed_post', 'bbp_untrashed_topic' );
+add_action( 'deleted_post',   'bbp_deleted_topic'   );
+
+// Favorites
+add_action( 'bbp_trash_topic',  'bbp_remove_topic_from_all_favorites' );
+add_action( 'bbp_delete_topic', 'bbp_remove_topic_from_all_favorites' );
+
+// Subscriptions
+add_action( 'bbp_trash_topic',  'bbp_remove_topic_from_all_subscriptions'      );
+add_action( 'bbp_delete_topic', 'bbp_remove_topic_from_all_subscriptions'      );
+add_action( 'bbp_new_reply',    'bbp_notify_subscribers',                 1, 5 );
+
+// Sticky
+add_action( 'bbp_trash_topic',  'bbp_unstick_topic' );
+add_action( 'bbp_delete_topic', 'bbp_unstick_topic' );
+
+// Update topic branch
+add_action( 'bbp_trashed_topic',   'bbp_update_topic_walker' );
+add_action( 'bbp_untrashed_topic', 'bbp_update_topic_walker' );
+add_action( 'bbp_deleted_topic',   'bbp_update_topic_walker' );
+add_action( 'bbp_spammed_topic',   'bbp_update_topic_walker' );
+add_action( 'bbp_unspammed_topic', 'bbp_update_topic_walker' );
+
+// Update reply branch
+add_action( 'bbp_trashed_reply',   'bbp_update_reply_walker' );
+add_action( 'bbp_untrashed_reply', 'bbp_update_reply_walker' );
+add_action( 'bbp_deleted_reply',   'bbp_update_reply_walker' );
+add_action( 'bbp_spammed_reply',   'bbp_update_reply_walker' );
+add_action( 'bbp_unspammed_reply', 'bbp_update_reply_walker' );
+
+// User status
+// @todo make these sub-actions
+add_action( 'make_ham_user',  'bbp_make_ham_user'  );
+add_action( 'make_spam_user', 'bbp_make_spam_user' );
+
+// User role
+add_action( 'bbp_profile_update', 'bbp_profile_update_role' );
+
+// Hook WordPress admin actions to bbPress profiles on save
+add_action( 'bbp_user_edit_after', 'bbp_user_edit_after' );
+
+// Caches
+add_action( 'bbp_new_forum_pre_extras',  'bbp_clean_post_cache' );
+add_action( 'bbp_new_forum_post_extras', 'bbp_clean_post_cache' );
+add_action( 'bbp_new_topic_pre_extras',  'bbp_clean_post_cache' );
+add_action( 'bbp_new_topic_post_extras', 'bbp_clean_post_cache' );
+add_action( 'bbp_new_reply_pre_extras',  'bbp_clean_post_cache' );
+add_action( 'bbp_new_reply_post_extras', 'bbp_clean_post_cache' );
+
+/**
+ * bbPress needs to redirect the user around in a few different circumstances:
+ *
+ * 1. Form submission within a theme (new and edit)
+ * 2. Accessing private or hidden content (forums/topics/replies)
+ * 3. Editing forums, topics, replies, users, and tags
+ */
+add_action( 'bbp_template_redirect', 'bbp_forum_enforce_blocked',   -1 );
+add_action( 'bbp_template_redirect', 'bbp_forum_enforce_hidden',    -1 );
+add_action( 'bbp_template_redirect', 'bbp_forum_enforce_private',   -1 );
+add_action( 'bbp_template_redirect', 'bbp_new_forum_handler',       10 );
+add_action( 'bbp_template_redirect', 'bbp_new_reply_handler',       10 );
+add_action( 'bbp_template_redirect', 'bbp_new_topic_handler',       10 );
+add_action( 'bbp_template_redirect', 'bbp_edit_topic_tag_handler',  1  );
+add_action( 'bbp_template_redirect', 'bbp_edit_user_handler',       1  );
+add_action( 'bbp_template_redirect', 'bbp_edit_forum_handler',      1  );
+add_action( 'bbp_template_redirect', 'bbp_edit_reply_handler',      1  );
+add_action( 'bbp_template_redirect', 'bbp_edit_topic_handler',      1  );
+add_action( 'bbp_template_redirect', 'bbp_merge_topic_handler',     1  );
+add_action( 'bbp_template_redirect', 'bbp_split_topic_handler',     1  );
+add_action( 'bbp_template_redirect', 'bbp_toggle_topic_handler',    1  );
+add_action( 'bbp_template_redirect', 'bbp_toggle_reply_handler',    1  );
+add_action( 'bbp_template_redirect', 'bbp_favorites_handler',       1  );
+add_action( 'bbp_template_redirect', 'bbp_subscriptions_handler',   1  );
+add_action( 'bbp_template_redirect', 'bbp_check_user_edit',         10 );
+add_action( 'bbp_template_redirect', 'bbp_check_forum_edit',        10 );
+add_action( 'bbp_template_redirect', 'bbp_check_topic_edit',        10 );
+add_action( 'bbp_template_redirect', 'bbp_check_reply_edit',        10 );
+add_action( 'bbp_template_redirect', 'bbp_check_topic_tag_edit',    10 );
+
+// Maybe convert the users password
+add_action( 'bbp_login_form_login', 'bbp_user_maybe_convert_pass' );
+
+add_action( 'bbp_activation', 'bbp_add_activation_redirect' );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/cache.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,168 @@
+<?php
+
+/**
+ * bbPress Cache Helpers
+ *
+ * Helper functions used to communicate with WordPress's various caches. Many
+ * of these functions are used to work around specific WordPress nuances. They
+ * are subject to changes, tweaking, and will need iteration as performance
+ * improvements are made to WordPress core.
+ *
+ * @package bbPress
+ * @subpackage Cache
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Helpers *******************************************************************/
+
+/**
+ * Skip invalidation of child post content when editing a parent.
+ *
+ * This prevents invalidating caches for topics and replies when editing a forum
+ * or a topic. Without this in place, WordPress will attempt to invalidate all
+ * child posts whenever a parent post is modified. This can cause thousands of
+ * cache invalidations to occur on a single edit, which is no good for anyone.
+ *
+ * @since bbPress (r4011)
+ *
+ * @package bbPress
+ * @subpackage Cache
+ */
+class BBP_Skip_Children {
+
+	/**
+	 * @var int Post ID being updated
+	 */
+	private $updating_post = 0;
+
+	/**
+	 * @var bool The original value of $_wp_suspend_cache_invalidation global
+	 */
+	private $original_cache_invalidation = false;
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * Hook into the 'pre_post_update' action.
+	 *
+	 * @since bbPress (r4011)
+	 */
+	public function __construct() {
+		add_action( 'pre_post_update', array( $this, 'pre_post_update' ) );
+	}
+
+	/**
+	 * Only clean post caches for main bbPress posts.
+	 *
+	 * Check that the post being updated is a bbPress post type, saves the
+	 * post ID to be used later, and adds an action to 'clean_post_cache' that
+	 * prevents child post caches from being cleared.
+	 *
+	 * @since bbPress (r4011)
+	 *
+	 * @param int $post_id The post ID being updated
+	 * @return If invalid post data
+	 */
+	public function pre_post_update( $post_id = 0 ) {
+
+		// Bail if post ID is not a bbPress post type
+		if ( empty( $post_id ) || ! bbp_is_custom_post_type( $post_id ) )
+			return;
+
+		// Store the $post_id
+		$this->updating_post = $post_id;
+
+		// Skip related post cache invalidation. This prevents invalidating the
+		// caches of the child posts when there is no reason to do so.
+		add_action( 'clean_post_cache', array( $this, 'skip_related_posts' ) );
+	}
+
+	/**
+	 * Skip cache invalidation of related posts if the post ID being invalidated
+	 * is not the one that was just updated.
+	 *
+	 * @since bbPress (r4011)
+	 *
+	 * @param int $post_id The post ID of the cache being invalidated
+	 * @return If invalid post data
+	 */
+	public function skip_related_posts( $post_id = 0 ) {
+
+		// Bail if this post is not the current bbPress post
+		if ( empty( $post_id ) || ( $this->updating_post !== $post_id ) )
+			return;
+
+		// Stash the current cache invalidation value in a variable, so we can
+		// restore back to it nicely in the future.
+		global $_wp_suspend_cache_invalidation;
+
+		$this->original_cache_invalidation = $_wp_suspend_cache_invalidation;
+
+		// Turn off cache invalidation
+		wp_suspend_cache_invalidation( true );
+
+		// Restore cache invalidation
+		add_action( 'wp_insert_post', array( $this, 'restore_cache_invalidation' ) );
+	}
+
+	/**
+	 * Restore the cache invalidation to its previous value.
+	 *
+	 * @since bbPress (r4011)
+	 * @uses wp_suspend_cache_invalidation()
+	 */
+	public function restore_cache_invalidation() {
+		wp_suspend_cache_invalidation( $this->original_cache_invalidation );
+	}
+}
+new BBP_Skip_Children();
+
+/** General *******************************************************************/
+
+/**
+ * Will clean a post in the cache.
+ *
+ * Will call to clean the term object cache associated with the post ID.
+ *
+ * @since bbPress (r4040)
+ *
+ * @uses do_action() Calls 'bbp_clean_post_cache' on $id
+ * @param object|int $_post The post object or ID to remove from the cache
+ */
+function bbp_clean_post_cache( $_post = '' ) {
+
+	// Bail if no post
+	$_post = get_post( $_post );
+	if ( empty( $_post ) )
+		return;
+
+	wp_cache_delete( $_post->ID, 'posts'     );
+	wp_cache_delete( $_post->ID, 'post_meta' );
+
+	clean_object_term_cache( $_post->ID, $_post->post_type );
+
+	do_action( 'bbp_clean_post_cache', $_post->ID, $_post );
+
+	// Child query types to clean
+	$post_types = array(
+		bbp_get_topic_post_type(),
+		bbp_get_forum_post_type(),
+		bbp_get_reply_post_type()
+	);
+
+	// Loop through query types and clean caches
+	foreach ( $post_types as $post_type ) {
+		wp_cache_delete( 'bbp_get_forum_'     . $_post->ID . '_reply_id',                              'bbpress' );
+		wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_last_id', 'bbpress' );
+		wp_cache_delete( 'bbp_parent_'        . $_post->ID . '_type_' . $post_type . '_child_count',   'bbpress' );
+		wp_cache_delete( 'bbp_parent_public_' . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress' );
+		wp_cache_delete( 'bbp_parent_all_'    . $_post->ID . '_type_' . $post_type . '_child_ids',     'bbpress' );
+	}
+
+	// Invalidate parent caches
+	if ( ! empty( $_post->post_parent ) ) {
+		bbp_clean_post_cache( $_post->post_parent );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,545 @@
+<?php
+
+/**
+ * bbPress Capabilites
+ *
+ * The functions in this file are used primarily as convenient wrappers for
+ * capability output in user profiles. This includes mapping capabilities and
+ * groups to human readable strings,
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Mapping *******************************************************************/
+
+/**
+ * Returns an array of capabilities based on the role that is being requested.
+ *
+ * @since bbPress (r2994)
+ *
+ * @todo Map all of these and deprecate
+ *
+ * @param string $role Optional. Defaults to The role to load caps for
+ * @uses apply_filters() Allow return value to be filtered
+ *
+ * @return array Capabilities for $role
+ */
+function bbp_get_caps_for_role( $role = '' ) {
+
+	// Which role are we looking for?
+	switch ( $role ) {
+
+		// Keymaster
+		case bbp_get_keymaster_role() :
+			$caps = array(
+
+				// Keymasters only
+				'keep_gate'             => true,
+
+				// Primary caps
+				'spectate'              => true,
+				'participate'           => true,
+				'moderate'              => true,
+				'throttle'              => true,
+				'view_trash'            => true,
+
+				// Forum caps
+				'publish_forums'        => true,
+				'edit_forums'           => true,
+				'edit_others_forums'    => true,
+				'delete_forums'         => true,
+				'delete_others_forums'  => true,
+				'read_private_forums'   => true,
+				'read_hidden_forums'    => true,
+
+				// Topic caps
+				'publish_topics'        => true,
+				'edit_topics'           => true,
+				'edit_others_topics'    => true,
+				'delete_topics'         => true,
+				'delete_others_topics'  => true,
+				'read_private_topics'   => true,
+
+				// Reply caps
+				'publish_replies'       => true,
+				'edit_replies'          => true,
+				'edit_others_replies'   => true,
+				'delete_replies'        => true,
+				'delete_others_replies' => true,
+				'read_private_replies'  => true,
+
+				// Topic tag caps
+				'manage_topic_tags'     => true,
+				'edit_topic_tags'       => true,
+				'delete_topic_tags'     => true,
+				'assign_topic_tags'     => true
+			);
+
+			break;
+
+		// Moderator
+		case bbp_get_moderator_role() :
+			$caps = array(
+
+				// Primary caps
+				'spectate'              => true,
+				'participate'           => true,
+				'moderate'              => true,
+				'throttle'              => true,
+				'view_trash'            => false,
+
+				// Forum caps
+				'publish_forums'        => true,
+				'edit_forums'           => true,
+				'edit_others_forums'    => false,
+				'delete_forums'         => false,
+				'delete_others_forums'  => false,
+				'read_private_forums'   => true,
+				'read_hidden_forums'    => true,
+
+				// Topic caps
+				'publish_topics'        => true,
+				'edit_topics'           => true,
+				'edit_others_topics'    => true,
+				'delete_topics'         => true,
+				'delete_others_topics'  => true,
+				'read_private_topics'   => true,
+
+				// Reply caps
+				'publish_replies'       => true,
+				'edit_replies'          => true,
+				'edit_others_replies'   => true,
+				'delete_replies'        => true,
+				'delete_others_replies' => true,
+				'read_private_replies'  => true,
+
+				// Topic tag caps
+				'manage_topic_tags'     => true,
+				'edit_topic_tags'       => true,
+				'delete_topic_tags'     => true,
+				'assign_topic_tags'     => true,
+			);
+
+			break;
+
+		// Spectators can only read
+		case bbp_get_spectator_role()   :
+			$caps = array(
+
+				// Primary caps
+				'spectate'              => true,
+				'participate'           => false,
+				'moderate'              => false,
+				'throttle'              => false,
+				'view_trash'            => false,
+
+				// Forum caps
+				'publish_forums'        => false,
+				'edit_forums'           => false,
+				'edit_others_forums'    => false,
+				'delete_forums'         => false,
+				'delete_others_forums'  => false,
+				'read_private_forums'   => false,
+				'read_hidden_forums'    => false,
+
+				// Topic caps
+				'publish_topics'        => false,
+				'edit_topics'           => false,
+				'edit_others_topics'    => false,
+				'delete_topics'         => false,
+				'delete_others_topics'  => false,
+				'read_private_topics'   => false,
+
+				// Reply caps
+				'publish_replies'       => false,
+				'edit_replies'          => false,
+				'edit_others_replies'   => false,
+				'delete_replies'        => false,
+				'delete_others_replies' => false,
+				'read_private_replies'  => false,
+
+				// Topic tag caps
+				'manage_topic_tags'     => false,
+				'edit_topic_tags'       => false,
+				'delete_topic_tags'     => false,
+				'assign_topic_tags'     => false,
+			);
+
+			break;
+
+		// Explicitly blocked
+		case bbp_get_blocked_role() :
+			$caps = array(
+
+				// Primary caps
+				'spectate'              => false,
+				'participate'           => false,
+				'moderate'              => false,
+				'throttle'              => false,
+				'view_trash'            => false,
+
+				// Forum caps
+				'publish_forums'        => false,
+				'edit_forums'           => false,
+				'edit_others_forums'    => false,
+				'delete_forums'         => false,
+				'delete_others_forums'  => false,
+				'read_private_forums'   => false,
+				'read_hidden_forums'    => false,
+
+				// Topic caps
+				'publish_topics'        => false,
+				'edit_topics'           => false,
+				'edit_others_topics'    => false,
+				'delete_topics'         => false,
+				'delete_others_topics'  => false,
+				'read_private_topics'   => false,
+
+				// Reply caps
+				'publish_replies'       => false,
+				'edit_replies'          => false,
+				'edit_others_replies'   => false,
+				'delete_replies'        => false,
+				'delete_others_replies' => false,
+				'read_private_replies'  => false,
+
+				// Topic tag caps
+				'manage_topic_tags'     => false,
+				'edit_topic_tags'       => false,
+				'delete_topic_tags'     => false,
+				'assign_topic_tags'     => false,
+			);
+
+			break;
+
+		// Participant/Default
+		case bbp_get_participant_role() :
+		default :
+			$caps = array(
+
+				// Primary caps
+				'spectate'              => true,
+				'participate'           => true,
+				'moderate'              => false,
+				'throttle'              => false,
+				'view_trash'            => false,
+
+				// Forum caps
+				'publish_forums'        => false,
+				'edit_forums'           => false,
+				'edit_others_forums'    => false,
+				'delete_forums'         => false,
+				'delete_others_forums'  => false,
+				'read_private_forums'   => true,
+				'read_hidden_forums'    => false,
+
+				// Topic caps
+				'publish_topics'        => true,
+				'edit_topics'           => true,
+				'edit_others_topics'    => false,
+				'delete_topics'         => false,
+				'delete_others_topics'  => false,
+				'read_private_topics'   => false,
+
+				// Reply caps
+				'publish_replies'       => true,
+				'edit_replies'          => true,
+				'edit_others_replies'   => false,
+				'delete_replies'        => false,
+				'delete_others_replies' => false,
+				'read_private_replies'  => false,
+
+				// Topic tag caps
+				'manage_topic_tags'     => false,
+				'edit_topic_tags'       => false,
+				'delete_topic_tags'     => false,
+				'assign_topic_tags'     => true,
+			);
+
+			break;
+	}
+
+	return apply_filters( 'bbp_get_caps_for_role', $caps, $role );
+}
+
+/**
+ * Adds capabilities to WordPress user roles.
+ *
+ * @since bbPress (r2608)
+ */
+function bbp_add_caps() {
+
+	// Loop through available roles and add caps
+	foreach( bbp_get_wp_roles()->role_objects as $role ) {
+		foreach ( bbp_get_caps_for_role( $role->name ) as $cap => $value ) {
+			$role->add_cap( $cap, $value );
+		}
+	}
+
+	do_action( 'bbp_add_caps' );
+}
+
+/**
+ * Removes capabilities from WordPress user roles.
+ *
+ * @since bbPress (r2608)
+ */
+function bbp_remove_caps() {
+
+	// Loop through available roles and remove caps
+	foreach( bbp_get_wp_roles()->role_objects as $role ) {
+		foreach ( array_keys( bbp_get_caps_for_role( $role->name ) ) as $cap ) {
+			$role->remove_cap( $cap );
+		}
+	}
+
+	do_action( 'bbp_remove_caps' );
+}
+
+/**
+ * Get the $wp_roles global without needing to declare it everywhere
+ *
+ * @since bbPress (r4293)
+ *
+ * @global WP_Roles $wp_roles
+ * @return WP_Roles
+ */
+function bbp_get_wp_roles() {
+	global $wp_roles;
+
+	// Load roles if not set
+	if ( ! isset( $wp_roles ) )
+		$wp_roles = new WP_Roles();
+
+	return $wp_roles;
+}
+
+/** Forum Roles ***************************************************************/
+
+/**
+ * Add the bbPress roles to the $wp_roles global.
+ *
+ * We do this to avoid adding these values to the database.
+ *
+ * @since bbPress (r4290)
+ */
+function bbp_add_forums_roles() {
+	$wp_roles = bbp_get_wp_roles();
+
+	foreach( bbp_get_dynamic_roles() as $role_id => $details ) {
+		$wp_roles->roles[$role_id]        = $details;
+		$wp_roles->role_objects[$role_id] = new WP_Role( $details['name'], $details['capabilities'] );
+		$wp_roles->role_names[$role_id]   = $details['name'];
+	}
+}
+
+/**
+ * Helper function to add filter to option_wp_user_roles
+ *
+ * @since bbPress (r4363)
+ *
+ * @see _bbp_reinit_dynamic_roles()
+ *
+ * @global WPDB $wpdb Used to get the database prefix
+ */
+function bbp_filter_user_roles_option() {
+	global $wpdb;
+
+	$role_key = $wpdb->prefix . 'user_roles';
+
+	add_filter( 'option_' . $role_key, '_bbp_reinit_dynamic_roles' );
+}
+
+/**
+ * This is necessary because in a few places (noted below) WordPress initializes
+ * a blog's roles directly from the database option. When this happens, the
+ * $wp_roles global gets flushed, causing a user to magically lose any
+ * dynamically assigned roles or capabilities when $current_user in refreshed.
+ *
+ * Because dynamic multiple roles is a new concept in WordPress, we work around
+ * it here for now, knowing that improvements will come to WordPress core later.
+ *
+ * @see switch_to_blog()
+ * @see restore_current_blog()
+ * @see WP_Roles::_init()
+ *
+ * @since bbPress (r4363)
+ *
+ * @internal Used by bbPress to reinitialize dynamic roles on blog switch
+ *
+ * @param array $roles
+ * @return array Combined array of database roles and dynamic bbPress roles
+ */
+function _bbp_reinit_dynamic_roles( $roles = array() ) {
+	foreach( bbp_get_dynamic_roles() as $role_id => $details ) {
+		$roles[$role_id] = $details;
+	}
+	return $roles;
+}
+
+/**
+ * Fetch a filtered list of forum roles that the current user is
+ * allowed to have.
+ *
+ * Simple function who's main purpose is to allow filtering of the
+ * list of forum roles so that plugins can remove inappropriate ones depending
+ * on the situation or user making edits.
+ *
+ * Specifically because without filtering, anyone with the edit_users
+ * capability can edit others to be administrators, even if they are
+ * only editors or authors. This filter allows admins to delegate
+ * user management.
+ *
+ * @since bbPress (r4284)
+ *
+ * @return array
+ */
+function bbp_get_dynamic_roles() {
+	return (array) apply_filters( 'bbp_get_dynamic_roles', array(
+
+		// Keymaster
+		bbp_get_keymaster_role() => array(
+			'name'         => __( 'Keymaster', 'bbpress' ),
+			'capabilities' => bbp_get_caps_for_role( bbp_get_keymaster_role() )
+		),
+
+		// Moderator
+		bbp_get_moderator_role() => array(
+			'name'         => __( 'Moderator', 'bbpress' ),
+			'capabilities' => bbp_get_caps_for_role( bbp_get_moderator_role() )
+		),
+
+		// Participant
+		bbp_get_participant_role() => array(
+			'name'         => __( 'Participant', 'bbpress' ),
+			'capabilities' => bbp_get_caps_for_role( bbp_get_participant_role() )
+		),
+
+		// Spectator
+		bbp_get_spectator_role() => array(
+			'name'         => __( 'Spectator', 'bbpress' ),
+			'capabilities' => bbp_get_caps_for_role( bbp_get_spectator_role() )
+		),
+
+		// Blocked
+		bbp_get_blocked_role() => array(
+			'name'         => __( 'Blocked', 'bbpress' ),
+			'capabilities' => bbp_get_caps_for_role( bbp_get_blocked_role() )
+		)
+	) );
+}
+
+/**
+ * Removes the bbPress roles from the editable roles array
+ *
+ * This used to use array_diff_assoc() but it randomly broke before 2.2 release.
+ * Need to research what happened, and if there's a way to speed this up.
+ *
+ * @since bbPress (r4303)
+ *
+ * @param array $all_roles All registered roles
+ * @return array 
+ */
+function bbp_filter_blog_editable_roles( $all_roles = array() ) {
+
+	// Loop through bbPress roles
+	foreach ( array_keys( bbp_get_dynamic_roles() ) as $bbp_role ) {
+
+		// Loop through WordPress roles
+		foreach ( array_keys( $all_roles ) as $wp_role ) {
+
+			// If keys match, unset
+			if ( $wp_role == $bbp_role ) {
+				unset( $all_roles[$wp_role] );
+			}
+		}
+	}
+
+	return $all_roles;
+}
+
+/**
+ * The keymaster role for bbPress users
+ *
+ * @since bbPress (r4284)
+ *
+ * @uses apply_filters() Allow override of hardcoded keymaster role
+ * @return string
+ */
+function bbp_get_keymaster_role() {
+	return apply_filters( 'bbp_get_keymaster_role', 'bbp_keymaster' );
+}
+
+/**
+ * The moderator role for bbPress users
+ *
+ * @since bbPress (r3410)
+ *
+ * @uses apply_filters() Allow override of hardcoded moderator role
+ * @return string
+ */
+function bbp_get_moderator_role() {
+	return apply_filters( 'bbp_get_moderator_role', 'bbp_moderator' );
+}
+
+/**
+ * The participant role for registered user that can participate in forums
+ *
+ * @since bbPress (r3410)
+ *
+ * @uses apply_filters() Allow override of hardcoded participant role
+ * @return string
+ */
+function bbp_get_participant_role() {
+	return apply_filters( 'bbp_get_participant_role', 'bbp_participant' );
+}
+
+/**
+ * The spectator role is for registered users without any capabilities
+ *
+ * @since bbPress (r3860)
+ *
+ * @uses apply_filters() Allow override of hardcoded spectator role
+ * @return string
+ */
+function bbp_get_spectator_role() {
+	return apply_filters( 'bbp_get_spectator_role', 'bbp_spectator' );
+}
+
+/**
+ * The blocked role is for registered users that cannot spectate or participate
+ *
+ * @since bbPress (r4284)
+ *
+ * @uses apply_filters() Allow override of hardcoded blocked role
+ * @return string
+ */
+function bbp_get_blocked_role() {
+	return apply_filters( 'bbp_get_blocked_role', 'bbp_blocked' );
+}
+
+/** Deprecated ****************************************************************/
+
+/**
+ * Adds bbPress-specific user roles.
+ *
+ * @since bbPress (r2741)
+ * @deprecated since version 2.2
+ */
+function bbp_add_roles() {
+	_doing_it_wrong( 'bbp_add_roles', __( 'Editable forum roles no longer exist.', 'bbpress' ), '2.2' );
+}
+
+/**
+ * Removes bbPress-specific user roles.
+ *
+ * @since bbPress (r2741)
+ * @deprecated since version 2.2
+ */
+function bbp_remove_roles() {
+	_doing_it_wrong( 'bbp_remove_roles', __( 'Editable forum roles no longer exist.', 'bbpress' ), '2.2' );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/extend.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,69 @@
+<?php
+
+/**
+ * bbPress Extentions
+ *
+ * There's a world of really cool plugins out there, and bbPress comes with
+ * support for some of the most popular ones.
+ *
+ * @package bbPress
+ * @subpackage Extend
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Loads Akismet inside the bbPress global class
+ *
+ * @since bbPress (r3277)
+ *
+ * @return If bbPress is not active
+ */
+function bbp_setup_akismet() {
+
+	// Bail if no akismet
+	if ( !defined( 'AKISMET_VERSION' ) ) return;
+
+	// Bail if Akismet is turned off
+	if ( !bbp_is_akismet_active() ) return;
+
+	// Include the Akismet Component
+	require( bbpress()->includes_dir . 'extend/akismet.php' );
+
+	// Instantiate Akismet for bbPress
+	bbpress()->extend->akismet = new BBP_Akismet();
+}
+
+/**
+ * Requires and creates the BuddyPress extension, and adds component creation
+ * action to bp_init hook. @see bbp_setup_buddypress_component()
+ *
+ * @since bbPress (r3395)
+ * @return If BuddyPress is not active
+ */
+function bbp_setup_buddypress() {
+
+	if ( ! function_exists( 'buddypress' ) ) {
+
+		/**
+		 * Helper for BuddyPress 1.6 and earlier
+		 *
+		 * @since bbPress (r4395)
+		 * @return BuddyPress
+		 */
+		function buddypress() {
+			return isset( $GLOBALS['bp'] ) ? $GLOBALS['bp'] : false;
+		}
+	}
+
+	// Bail if in maintenance mode
+	if ( ! buddypress() || buddypress()->maintenance_mode )
+		return;
+
+	// Include the BuddyPress Component
+	require( bbpress()->includes_dir . 'extend/buddypress/loader.php' );
+
+	// Instantiate BuddyPress for bbPress
+	bbpress()->extend->buddypress = new BBP_Forums_Component();
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/filters.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,274 @@
+<?php
+
+/**
+ * bbPress Filters
+ *
+ * @package bbPress
+ * @subpackage Core
+ *
+ * This file contains the filters that are used through-out bbPress. They are
+ * consolidated here to make searching for them easier, and to help developers
+ * understand at a glance the order in which things occur.
+ *
+ * There are a few common places that additional filters can currently be found
+ *
+ *  - bbPress: In {@link bbPress::setup_actions()} in bbpress.php
+ *  - Admin: More in {@link BBP_Admin::setup_actions()} in admin.php
+ *
+ * @see /core/actions.php
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Attach bbPress to WordPress
+ *
+ * bbPress uses its own internal actions to help aid in third-party plugin
+ * development, and to limit the amount of potential future code changes when
+ * updates to WordPress core occur.
+ *
+ * These actions exist to create the concept of 'plugin dependencies'. They
+ * provide a safe way for plugins to execute code *only* when bbPress is
+ * installed and activated, without needing to do complicated guesswork.
+ *
+ * For more information on how this works, see the 'Plugin Dependency' section
+ * near the bottom of this file.
+ *
+ *           v--WordPress Actions       v--bbPress Sub-actions
+ */
+add_filter( 'request',                 'bbp_request',            10    );
+add_filter( 'template_include',        'bbp_template_include',   10    );
+add_filter( 'wp_title',                'bbp_title',              10, 3 );
+add_filter( 'body_class',              'bbp_body_class',         10, 2 );
+add_filter( 'map_meta_cap',            'bbp_map_meta_caps',      10, 4 );
+add_filter( 'allowed_themes',          'bbp_allowed_themes',     10    );
+add_filter( 'redirect_canonical',      'bbp_redirect_canonical', 10    );
+add_filter( 'login_redirect',          'bbp_redirect_login',     2,  3 );
+add_filter( 'logout_url',              'bbp_logout_url',         2,  2 );
+add_filter( 'plugin_locale',           'bbp_plugin_locale',      10, 2 );
+
+// Fix post author id for anonymous posts (set it back to 0) when the post status is changed
+add_filter( 'wp_insert_post_data', 'bbp_fix_post_author', 30, 2 );
+
+// Force comments_status on bbPress post types
+add_filter( 'comments_open', 'bbp_force_comment_status' );
+
+// Add post_parent__in to posts_where
+add_filter( 'posts_where', 'bbp_query_post_parent__in', 10, 2 );
+
+// Remove forums roles from list of all roles
+add_filter( 'editable_roles', 'bbp_filter_blog_editable_roles' );
+
+/**
+ * Feeds
+ *
+ * bbPress comes with a number of custom RSS2 feeds that get handled outside
+ * the normal scope of feeds that WordPress would normally serve. To do this,
+ * we filter every page request, listen for a feed request, and trap it.
+ */
+add_filter( 'bbp_request', 'bbp_request_feed_trap' );
+
+/**
+ * Template Compatibility
+ *
+ * If you want to completely bypass this and manage your own custom bbPress
+ * template hierarchy, start here by removing this filter, then look at how
+ * bbp_template_include() works and do something similar. :)
+ */
+add_filter( 'bbp_template_include', 'bbp_template_include_theme_supports', 2, 1 );
+add_filter( 'bbp_template_include', 'bbp_template_include_theme_compat',   4, 2 );
+
+// Links
+add_filter( 'paginate_links',            'bbp_add_view_all' );
+add_filter( 'bbp_get_topic_permalink',   'bbp_add_view_all' );
+add_filter( 'bbp_get_reply_permalink',   'bbp_add_view_all' );
+add_filter( 'bbp_get_forum_permalink',   'bbp_add_view_all' );
+
+// wp_filter_kses on new/edit topic/reply title
+add_filter( 'bbp_new_reply_pre_title',     'wp_filter_kses' );
+add_filter( 'bbp_new_topic_pre_title',     'wp_filter_kses' );
+add_filter( 'bbp_edit_reply_pre_title',    'wp_filter_kses' );
+add_filter( 'bbp_edit_topic_pre_title',    'wp_filter_kses' );
+
+// balanceTags, wp_filter_kses and wp_rel_nofollow on new/edit topic/reply text
+add_filter( 'bbp_new_reply_pre_content',  'balanceTags'     );
+add_filter( 'bbp_new_reply_pre_content',  'wp_rel_nofollow' );
+add_filter( 'bbp_new_reply_pre_content',  'wp_filter_kses'  );
+add_filter( 'bbp_new_topic_pre_content',  'balanceTags'     );
+add_filter( 'bbp_new_topic_pre_content',  'wp_rel_nofollow' );
+add_filter( 'bbp_new_topic_pre_content',  'wp_filter_kses'  );
+add_filter( 'bbp_edit_reply_pre_content', 'balanceTags'     );
+add_filter( 'bbp_edit_reply_pre_content', 'wp_rel_nofollow' );
+add_filter( 'bbp_edit_reply_pre_content', 'wp_filter_kses'  );
+add_filter( 'bbp_edit_topic_pre_content', 'balanceTags'     );
+add_filter( 'bbp_edit_topic_pre_content', 'wp_rel_nofollow' );
+add_filter( 'bbp_edit_topic_pre_content', 'wp_filter_kses'  );
+
+// No follow and stripslashes on user profile links
+add_filter( 'bbp_get_reply_author_link',      'wp_rel_nofollow' );
+add_filter( 'bbp_get_reply_author_link',      'stripslashes'    );
+add_filter( 'bbp_get_topic_author_link',      'wp_rel_nofollow' );
+add_filter( 'bbp_get_topic_author_link',      'stripslashes'    );
+add_filter( 'bbp_get_user_favorites_link',    'wp_rel_nofollow' );
+add_filter( 'bbp_get_user_favorites_link',    'stripslashes'    );
+add_filter( 'bbp_get_user_subscribe_link',    'wp_rel_nofollow' );
+add_filter( 'bbp_get_user_subscribe_link',    'stripslashes'    );
+add_filter( 'bbp_get_user_profile_link',      'wp_rel_nofollow' );
+add_filter( 'bbp_get_user_profile_link',      'stripslashes'    );
+add_filter( 'bbp_get_user_profile_edit_link', 'wp_rel_nofollow' );
+add_filter( 'bbp_get_user_profile_edit_link', 'stripslashes'    );
+
+// Run filters on reply content
+add_filter( 'bbp_get_reply_content', 'capital_P_dangit'         );
+add_filter( 'bbp_get_reply_content', 'wptexturize',        3    );
+add_filter( 'bbp_get_reply_content', 'convert_chars',      5    );
+add_filter( 'bbp_get_reply_content', 'make_clickable',     9    );
+add_filter( 'bbp_get_reply_content', 'force_balance_tags', 25   );
+add_filter( 'bbp_get_reply_content', 'convert_smilies',    20   );
+add_filter( 'bbp_get_reply_content', 'wpautop',            30   );
+add_filter( 'bbp_get_reply_content', 'bbp_mention_filter', 40   );
+
+// Run filters on topic content
+add_filter( 'bbp_get_topic_content', 'capital_P_dangit'         );
+add_filter( 'bbp_get_topic_content', 'wptexturize',        3    );
+add_filter( 'bbp_get_topic_content', 'convert_chars',      5    );
+add_filter( 'bbp_get_topic_content', 'make_clickable',     9    );
+add_filter( 'bbp_get_topic_content', 'force_balance_tags', 25   );
+add_filter( 'bbp_get_topic_content', 'convert_smilies',    20   );
+add_filter( 'bbp_get_topic_content', 'wpautop',            30   );
+add_filter( 'bbp_get_topic_content', 'bbp_mention_filter', 40   );
+
+// Add number format filter to functions requiring numeric output
+add_filter( 'bbp_get_user_topic_count',     'bbp_number_format', 10 );
+add_filter( 'bbp_get_user_reply_count',     'bbp_number_format', 10 );
+add_filter( 'bbp_get_user_post_count',      'bbp_number_format', 10 );
+add_filter( 'bbp_get_forum_subforum_count', 'bbp_number_format', 10 );
+add_filter( 'bbp_get_forum_topic_count',    'bbp_number_format', 10 );
+add_filter( 'bbp_get_forum_reply_count',    'bbp_number_format', 10 );
+add_filter( 'bbp_get_forum_post_count',     'bbp_number_format', 10 );
+add_filter( 'bbp_get_topic_voice_count',    'bbp_number_format', 10 );
+add_filter( 'bbp_get_topic_reply_count',    'bbp_number_format', 10 );
+add_filter( 'bbp_get_topic_post_count',     'bbp_number_format', 10 );
+
+// Run wp_kses_data on topic/reply content in admin section
+if ( is_admin() ) {
+	add_filter( 'bbp_get_reply_content', 'wp_kses_data' );
+	add_filter( 'bbp_get_topic_content', 'wp_kses_data' );
+
+// Revisions (only when not in admin)
+} else {
+	add_filter( 'bbp_get_reply_content', 'bbp_reply_content_append_revisions',  1,  2 );
+	add_filter( 'bbp_get_topic_content', 'bbp_topic_content_append_revisions',  1,  2 );
+}
+
+// Suppress private forum details
+add_filter( 'bbp_get_forum_topic_count',    'bbp_suppress_private_forum_meta',  10, 2 );
+add_filter( 'bbp_get_forum_reply_count',    'bbp_suppress_private_forum_meta',  10, 2 );
+add_filter( 'bbp_get_forum_post_count',     'bbp_suppress_private_forum_meta',  10, 2 );
+add_filter( 'bbp_get_forum_freshness_link', 'bbp_suppress_private_forum_meta',  10, 2 );
+add_filter( 'bbp_get_author_link',          'bbp_suppress_private_author_link', 10, 2 );
+add_filter( 'bbp_get_topic_author_link',    'bbp_suppress_private_author_link', 10, 2 );
+add_filter( 'bbp_get_reply_author_link',    'bbp_suppress_private_author_link', 10, 2 );
+
+// Filter bbPress template locations
+add_filter( 'bbp_get_template_part',         'bbp_add_template_locations' );
+add_filter( 'bbp_get_profile_template',      'bbp_add_template_locations' );
+add_filter( 'bbp_get_profileedit_template',  'bbp_add_template_locations' );
+add_filter( 'bbp_get_singleview_template',   'bbp_add_template_locations' );
+add_filter( 'bbp_get_forumedit_template',    'bbp_add_template_locations' );
+add_filter( 'bbp_get_topicedit_template',    'bbp_add_template_locations' );
+add_filter( 'bbp_get_topicsplit_template',   'bbp_add_template_locations' );
+add_filter( 'bbp_get_topicmerge_template',   'bbp_add_template_locations' );
+add_filter( 'bbp_get_topictag_template',     'bbp_add_template_locations' );
+add_filter( 'bbp_get_topictagedit_template', 'bbp_add_template_locations' );
+
+/**
+ * Add filters to anonymous post author data
+ */
+// Post author name
+add_filter( 'bbp_pre_anonymous_post_author_name',    'trim',                10 );
+add_filter( 'bbp_pre_anonymous_post_author_name',    'sanitize_text_field', 10 );
+add_filter( 'bbp_pre_anonymous_post_author_name',    'wp_filter_kses',      10 );
+add_filter( 'bbp_pre_anonymous_post_author_name',    '_wp_specialchars',    30 );
+
+// Save email
+add_filter( 'bbp_pre_anonymous_post_author_email',   'trim',                10 );
+add_filter( 'bbp_pre_anonymous_post_author_email',   'sanitize_email',      10 );
+add_filter( 'bbp_pre_anonymous_post_author_email',   'wp_filter_kses',      10 );
+
+// Save URL
+add_filter( 'bbp_pre_anonymous_post_author_website', 'trim',                10 );
+add_filter( 'bbp_pre_anonymous_post_author_website', 'wp_strip_all_tags',   10 );
+add_filter( 'bbp_pre_anonymous_post_author_website', 'esc_url_raw',         10 );
+add_filter( 'bbp_pre_anonymous_post_author_website', 'wp_filter_kses',      10 );
+
+// Queries
+add_filter( 'posts_request', '_bbp_has_replies_where', 10, 2 );
+
+// Capabilities
+add_filter( 'bbp_map_meta_caps', 'bbp_map_primary_meta_caps',   10, 4 ); // Primary caps
+add_filter( 'bbp_map_meta_caps', 'bbp_map_forum_meta_caps',     10, 4 ); // Forums
+add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_meta_caps',     10, 4 ); // Topics
+add_filter( 'bbp_map_meta_caps', 'bbp_map_reply_meta_caps',     10, 4 ); // Replies
+add_filter( 'bbp_map_meta_caps', 'bbp_map_topic_tag_meta_caps', 10, 4 ); // Topic tags
+
+/** Deprecated ****************************************************************/
+
+/**
+ * The following filters are deprecated.
+ *
+ * These filters were most likely replaced by bbp_parse_args(), which includes
+ * both passive and aggressive filters anywhere parse_args is used to compare
+ * default arguments to passed arguments, without needing to litter the
+ * codebase with _before_ and _after_ filters everywhere.
+ */
+
+/**
+ * Deprecated locale filter
+ *
+ * @since bbPress (r4213)
+ *
+ * @param type $locale
+ * @return type
+ */
+function _bbp_filter_locale( $locale = '' ) {
+	return apply_filters( 'bbpress_locale', $locale );
+}
+add_filter( 'bbp_plugin_locale', '_bbp_filter_locale', 10, 1 );
+
+/**
+ * Deprecated forums query filter
+ *
+ * @since bbPress (r3961)
+ * @param type $args
+ * @return type
+ */
+function _bbp_has_forums_query( $args = array() ) {
+	return apply_filters( 'bbp_has_forums_query', $args );
+}
+add_filter( 'bbp_after_has_forums_parse_args', '_bbp_has_forums_query' );
+
+/**
+ * Deprecated topics query filter
+ *
+ * @since bbPress (r3961)
+ * @param type $args
+ * @return type
+ */
+function _bbp_has_topics_query( $args = array() ) {
+	return apply_filters( 'bbp_has_topics_query', $args );
+}
+add_filter( 'bbp_after_has_topics_parse_args', '_bbp_has_topics_query' );
+
+/**
+ * Deprecated replies query filter
+ *
+ * @since bbPress (r3961)
+ * @param type $args
+ * @return type
+ */
+function _bbp_has_replies_query( $args = array() ) {
+	return apply_filters( 'bbp_has_replies_query', $args );
+}
+add_filter( 'bbp_after_has_replies_parse_args', '_bbp_has_replies_query' );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,505 @@
+<?php
+
+/**
+ * bbPress Core Functions
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Versions ******************************************************************/
+
+/**
+ * Output the bbPress version
+ *
+ * @since bbPress (r3468)
+ * @uses bbp_get_version() To get the bbPress version
+ */
+function bbp_version() {
+	echo bbp_get_version();
+}
+	/**
+	 * Return the bbPress version
+	 *
+	 * @since bbPress (r3468)
+	 * @retrun string The bbPress version
+	 */
+	function bbp_get_version() {
+		return bbpress()->version;
+	}
+
+/**
+ * Output the bbPress database version
+ *
+ * @since bbPress (r3468)
+ * @uses bbp_get_version() To get the bbPress version
+ */
+function bbp_db_version() {
+	echo bbp_get_db_version();
+}
+	/**
+	 * Return the bbPress database version
+	 *
+	 * @since bbPress (r3468)
+	 * @retrun string The bbPress version
+	 */
+	function bbp_get_db_version() {
+		return bbpress()->db_version;
+	}
+
+/**
+ * Output the bbPress database version directly from the database
+ *
+ * @since bbPress (r3468)
+ * @uses bbp_get_version() To get the current bbPress version
+ */
+function bbp_db_version_raw() {
+	echo bbp_get_db_version_raw();
+}
+	/**
+	 * Return the bbPress database version directly from the database
+	 *
+	 * @since bbPress (r3468)
+	 * @retrun string The current bbPress version
+	 */
+	function bbp_get_db_version_raw() {
+		return get_option( '_bbp_db_version', '' );
+	}
+
+/** Post Meta *****************************************************************/
+
+/**
+ * Update a posts forum meta ID
+ *
+ * @since bbPress (r3181)
+ *
+ * @param int $post_id The post to update
+ * @param int $forum_id The forum
+ */
+function bbp_update_forum_id( $post_id, $forum_id ) {
+
+	// Allow the forum ID to be updated 'just in time' before save
+	$forum_id = apply_filters( 'bbp_update_forum_id', $forum_id, $post_id );
+
+	// Update the post meta forum ID
+	update_post_meta( $post_id, '_bbp_forum_id', (int) $forum_id );
+}
+
+/**
+ * Update a posts topic meta ID
+ *
+ * @since bbPress (r3181)
+ *
+ * @param int $post_id The post to update
+ * @param int $forum_id The forum
+ */
+function bbp_update_topic_id( $post_id, $topic_id ) {
+
+	// Allow the topic ID to be updated 'just in time' before save
+	$topic_id = apply_filters( 'bbp_update_topic_id', $topic_id, $post_id );
+
+	// Update the post meta topic ID
+	update_post_meta( $post_id, '_bbp_topic_id', (int) $topic_id );
+}
+
+/**
+ * Update a posts reply meta ID
+ *
+ * @since bbPress (r3181)
+ *
+ * @param int $post_id The post to update
+ * @param int $forum_id The forum
+ */
+function bbp_update_reply_id( $post_id, $reply_id ) {
+
+	// Allow the reply ID to be updated 'just in time' before save
+	$reply_id = apply_filters( 'bbp_update_reply_id', $reply_id, $post_id );
+
+	// Update the post meta reply ID
+	update_post_meta( $post_id, '_bbp_reply_id',(int) $reply_id );
+}
+
+/** Views *********************************************************************/
+
+/**
+ * Get the registered views
+ *
+ * Does nothing much other than return the {@link $bbp->views} variable
+ *
+ * @since bbPress (r2789)
+ *
+ * @return array Views
+ */
+function bbp_get_views() {
+	return bbpress()->views;
+}
+
+/**
+ * Register a bbPress view
+ *
+ * @todo Implement feeds - See {@link http://trac.bbpress.org/ticket/1422}
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view View name
+ * @param string $title View title
+ * @param mixed $query_args {@link bbp_has_topics()} arguments.
+ * @param bool $feed Have a feed for the view? Defaults to true. NOT IMPLEMENTED
+ * @param string $capability Capability that the current user must have
+ * @uses sanitize_title() To sanitize the view name
+ * @uses esc_html() To sanitize the view title
+ * @return array The just registered (but processed) view
+ */
+function bbp_register_view( $view, $title, $query_args = '', $feed = true, $capability = '' ) {
+
+	// Bail if user does not have capability
+	if ( ! empty( $capability ) && ! current_user_can( $capability ) )
+		return false;
+
+	$bbp   = bbpress();
+	$view  = sanitize_title( $view );
+	$title = esc_html( $title );
+
+	if ( empty( $view ) || empty( $title ) )
+		return false;
+
+	$query_args = bbp_parse_args( $query_args, '', 'register_view' );
+
+	// Set show_stickies to false if it wasn't supplied
+	if ( !isset( $query_args['show_stickies'] ) )
+		$query_args['show_stickies'] = false;
+
+	$bbp->views[$view] = array(
+		'title'  => $title,
+		'query'  => $query_args,
+		'feed'   => $feed
+	);
+
+	return $bbp->views[$view];
+}
+
+/**
+ * Deregister a bbPress view
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view View name
+ * @uses sanitize_title() To sanitize the view name
+ * @return bool False if the view doesn't exist, true on success
+ */
+function bbp_deregister_view( $view ) {
+	$bbp  = bbpress();
+	$view = sanitize_title( $view );
+
+	if ( !isset( $bbp->views[$view] ) )
+		return false;
+
+	unset( $bbp->views[$view] );
+
+	return true;
+}
+
+/**
+ * Run the view's query
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view Optional. View id
+ * @param mixed $new_args New arguments. See {@link bbp_has_topics()}
+ * @uses bbp_get_view_id() To get the view id
+ * @uses bbp_get_view_query_args() To get the view query args
+ * @uses sanitize_title() To sanitize the view name
+ * @uses bbp_has_topics() To make the topics query
+ * @return bool False if the view doesn't exist, otherwise if topics are there
+ */
+function bbp_view_query( $view = '', $new_args = '' ) {
+
+	$view = bbp_get_view_id( $view );
+	if ( empty( $view ) )
+		return false;
+
+	$query_args = bbp_get_view_query_args( $view );
+
+	if ( !empty( $new_args ) ) {
+		$new_args   = bbp_parse_args( $new_args, '', 'view_query' );
+		$query_args = array_merge( $query_args, $new_args );
+	}
+
+	return bbp_has_topics( $query_args );
+}
+
+/**
+ * Return the view's query arguments
+ *
+ * @since bbPress (r2789)
+ *
+ * @param string $view View name
+ * @uses bbp_get_view_id() To get the view id
+ * @return array Query arguments
+ */
+function bbp_get_view_query_args( $view ) {
+	$view   = bbp_get_view_id( $view );
+	$retval = !empty( $view ) ? bbpress()->views[$view]['query'] : false;
+
+	return apply_filters( 'bbp_get_view_query_args', $retval, $view );
+}
+
+/** Errors ********************************************************************/
+
+/**
+ * Adds an error message to later be output in the theme
+ *
+ * @since bbPress (r3381)
+ *
+ * @see WP_Error()
+ * @uses WP_Error::add();
+ *
+ * @param string $code Unique code for the error message
+ * @param string $message Translated error message
+ * @param string $data Any additional data passed with the error message
+ */
+function bbp_add_error( $code = '', $message = '', $data = '' ) {
+	bbpress()->errors->add( $code, $message, $data );
+}
+
+/**
+ * Check if error messages exist in queue
+ *
+ * @since bbPress (r3381)
+ *
+ * @see WP_Error()
+ *
+ * @uses is_wp_error()
+ * @usese WP_Error::get_error_codes()
+ */
+function bbp_has_errors() {
+	$has_errors = bbpress()->errors->get_error_codes() ? true : false;
+
+	return apply_filters( 'bbp_has_errors', $has_errors, bbpress()->errors );
+}
+
+/**
+ * Searches through the content to locate usernames, designated by an @ sign.
+ *
+ * @since bbPress (r4323)
+ *
+ * @param string $content The content
+ * @return bool|array $usernames Existing usernames. False if no matches.
+ */
+function bbp_find_mentions( $content = '' ) {
+	$pattern   = '/[@]+([A-Za-z0-9-_\.@]+)\b/';
+	preg_match_all( $pattern, $content, $usernames );
+	$usernames = array_unique( array_filter( $usernames[1] ) );
+
+	// Bail if no usernames
+	if ( empty( $usernames ) )
+		return false;
+
+	return $usernames;
+}
+
+/**
+ * Finds and links @-mentioned users in the content
+ *
+ * @since bbPress (r4323)
+ *
+ * @uses bbp_find_mentions() To get usernames in content areas
+ * @return string $content Content filtered for mentions
+ */
+function bbp_mention_filter( $content = '' ) {
+
+	// Get Usernames and bail if none exist
+	$usernames = bbp_find_mentions( $content );
+	if ( empty( $usernames ) )
+		return $content;
+
+	// Loop through usernames and link to profiles
+	foreach( (array) $usernames as $username ) {
+
+		// Skip if username does not exist or user is not active
+		$user_id = username_exists( $username );
+		if ( empty( $user_id ) || bbp_is_user_inactive( $user_id ) )
+			continue;
+
+		// Replace name in content
+		$content = preg_replace( '/(@' . $username . '\b)/', "<a href='" . bbp_get_user_profile_url( $user_id ) . "' rel='nofollow' class='bbp-mention-link $username'>@$username</a>", $content );
+	}
+
+	// Return modified content
+	return $content;
+}
+
+/** Post Statuses *************************************************************/
+
+/**
+ * Return the public post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_public_status_id() {
+	return bbpress()->public_status_id;
+}
+
+/**
+ * Return the pending post status ID
+ *
+ * @since bbPress (r3581)
+ *
+ * @return string
+ */
+function bbp_get_pending_status_id() {
+	return bbpress()->pending_status_id;
+}
+
+/**
+ * Return the private post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_private_status_id() {
+	return bbpress()->private_status_id;
+}
+
+/**
+ * Return the hidden post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_hidden_status_id() {
+	return bbpress()->hidden_status_id;
+}
+
+/**
+ * Return the closed post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_closed_status_id() {
+	return bbpress()->closed_status_id;
+}
+
+/**
+ * Return the spam post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_spam_status_id() {
+	return bbpress()->spam_status_id;
+}
+
+/**
+ * Return the trash post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_trash_status_id() {
+	return bbpress()->trash_status_id;
+}
+
+/**
+ * Return the orphan post status ID
+ *
+ * @since bbPress (r3504)
+ *
+ * @return string
+ */
+function bbp_get_orphan_status_id() {
+	return bbpress()->orphan_status_id;
+}
+
+/** Rewrite IDs ***************************************************************/
+
+/**
+ * Return the unique ID for user profile rewrite rules
+ *
+ * @since bbPress (r3762)
+ * @return string
+ */
+function bbp_get_user_rewrite_id() {
+	return bbpress()->user_id;
+}
+
+/**
+ * Return the enique ID for all edit rewrite rules (forum|topic|reply|tag|user)
+ *
+ * @since bbPress (r3762)
+ * @return string
+ */
+function bbp_get_edit_rewrite_id() {
+	return bbpress()->edit_id;
+}
+
+/**
+ * Return the unique ID for user topics rewrite rules
+ *
+ * @since bbPress (r4321)
+ * @return string
+ */
+function bbp_get_user_topics_rewrite_id() {
+	return bbpress()->tops_id;
+}
+
+/**
+ * Return the unique ID for user replies rewrite rules
+ *
+ * @since bbPress (r4321)
+ * @return string
+ */
+function bbp_get_user_replies_rewrite_id() {
+	return bbpress()->reps_id;
+}
+
+/**
+ * Return the unique ID for user caps rewrite rules
+ *
+ * @since bbPress (r4181)
+ * @return string
+ */
+function bbp_get_user_favorites_rewrite_id() {
+	return bbpress()->favs_id;
+}
+
+/**
+ * Return the unique ID for user caps rewrite rules
+ *
+ * @since bbPress (r4181)
+ * @return string
+ */
+function bbp_get_user_subscriptions_rewrite_id() {
+	return bbpress()->subs_id;
+}
+
+/**
+ * Return the unique ID for topic view rewrite rules
+ *
+ * @since bbPress (r3762)
+ * @return string
+ */
+function bbp_get_view_rewrite_id() {
+	return bbpress()->view_id;
+}
+
+/**
+ * Delete a blogs rewrite rules, so that they are automatically rebuilt on
+ * the subsequent page load.
+ *
+ * @since bbPress (r4198)
+ */
+function bbp_delete_rewrite_rules() {
+	delete_option( 'rewrite_rules' );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/options.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,514 @@
+<?php
+
+/**
+ * bbPress Options
+ *
+ * @package bbPress
+ * @subpackage Options
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Get the default site options and their values.
+ * 
+ * These option
+ *
+ * @since bbPress (r3421)
+ * @return array Filtered option names and values
+ */
+function bbp_get_default_options() {
+
+	// Default options
+	return apply_filters( 'bbp_get_default_options', array(
+
+		/** DB Version ********************************************************/
+
+		'_bbp_db_version'           => bbpress()->db_version,
+
+		/** Settings **********************************************************/
+
+		'_bbp_edit_lock'            => 5,                          // Lock post editing after 5 minutes
+		'_bbp_throttle_time'        => 10,                         // Throttle post time to 10 seconds
+		'_bbp_enable_favorites'     => 1,                          // Favorites
+		'_bbp_enable_subscriptions' => 1,                          // Subscriptions
+		'_bbp_allow_topic_tags'     => 1,                          // Topic Tags
+		'_bbp_allow_anonymous'      => 0,                          // Allow anonymous posting
+		'_bbp_allow_global_access'  => 1,                          // Users from all sites can post
+		'_bbp_use_wp_editor'        => 1,                          // Use the WordPress editor if available
+		'_bbp_use_autoembed'        => 0,                          // Allow oEmbed in topics and replies
+		'_bbp_theme_package_id'     => 'default',                  // The ID for the current theme package.
+		'_bbp_default_role'         => bbp_get_participant_role(), // Default forums role
+
+		/** Per Page **********************************************************/
+
+		'_bbp_topics_per_page'      => 15,          // Topics per page
+		'_bbp_replies_per_page'     => 15,          // Replies per page
+		'_bbp_forums_per_page'      => 50,          // Forums per page
+		'_bbp_topics_per_rss_page'  => 25,          // Topics per RSS page
+		'_bbp_replies_per_rss_page' => 25,          // Replies per RSS page
+
+		/** Page For **********************************************************/
+
+		'_bbp_page_for_forums'      => 0,           // Page for forums
+		'_bbp_page_for_topics'      => 0,           // Page for forums
+		'_bbp_page_for_login'       => 0,           // Page for login
+		'_bbp_page_for_register'    => 0,           // Page for register
+		'_bbp_page_for_lost_pass'   => 0,           // Page for lost-pass
+
+		/** Archive Slugs *****************************************************/
+
+		'_bbp_root_slug'            => 'forums',    // Forum archive slug
+		'_bbp_topic_archive_slug'   => 'topics',    // Topic archive slug
+
+		/** Single Slugs ******************************************************/
+
+		'_bbp_include_root'         => 1,           // Include forum-archive before single slugs
+		'_bbp_forum_slug'           => 'forum',     // Forum slug
+		'_bbp_topic_slug'           => 'topic',     // Topic slug
+		'_bbp_reply_slug'           => 'reply',     // Reply slug
+		'_bbp_topic_tag_slug'       => 'topic-tag', // Topic tag slug
+
+		/** User Slugs ********************************************************/
+
+		'_bbp_user_slug'            => 'users',         // User profile slug
+		'_bbp_user_favs_slug'       => 'favorites',     // User favorites slug
+		'_bbp_user_subs_slug'       => 'subscriptions', // User subscriptions slug
+
+		/** Other Slugs *******************************************************/
+
+		'_bbp_view_slug'            => 'view',      // View slug
+
+		/** Topics ************************************************************/
+
+		'_bbp_title_max_length'     => 80,          // Title Max Length
+		'_bbp_super_sticky_topics'  => '',          // Super stickies
+
+		/** Forums ************************************************************/
+
+		'_bbp_private_forums'       => '',          // Private forums
+		'_bbp_hidden_forums'        => '',          // Hidden forums
+
+		/** BuddyPress ********************************************************/
+
+		'_bbp_enable_group_forums'  => 1,           // Enable BuddyPress Group Extension
+		'_bbp_group_forums_root_id' => 0,           // Group Forums parent forum id
+
+		/** Akismet ***********************************************************/
+
+		'_bbp_enable_akismet'       => 1            // Users from all sites can post
+
+	) );
+}
+
+/**
+ * Add default options
+ *
+ * Hooked to bbp_activate, it is only called once when bbPress is activated.
+ * This is non-destructive, so existing settings will not be overridden.
+ *
+ * @since bbPress (r3421)
+ * @uses bbp_get_default_options() To get default options
+ * @uses add_option() Adds default options
+ * @uses do_action() Calls 'bbp_add_options'
+ */
+function bbp_add_options() {
+
+	// Add default options
+	foreach ( bbp_get_default_options() as $key => $value )
+		add_option( $key, $value );
+
+	// Allow previously activated plugins to append their own options.
+	do_action( 'bbp_add_options' );
+}
+
+/**
+ * Delete default options
+ *
+ * Hooked to bbp_uninstall, it is only called once when bbPress is uninstalled.
+ * This is destructive, so existing settings will be destroyed.
+ *
+ * @since bbPress (r3421)
+ * @uses bbp_get_default_options() To get default options
+ * @uses delete_option() Removes default options
+ * @uses do_action() Calls 'bbp_delete_options'
+ */
+function bbp_delete_options() {
+
+	// Add default options
+	foreach ( array_keys( bbp_get_default_options() ) as $key )
+		delete_option( $key );
+
+	// Allow previously activated plugins to append their own options.
+	do_action( 'bbp_delete_options' );
+}
+
+/**
+ * Add filters to each bbPress option and allow them to be overloaded from
+ * inside the $bbp->options array.
+ *
+ * @since bbPress (r3451)
+ * @uses bbp_get_default_options() To get default options
+ * @uses add_filter() To add filters to 'pre_option_{$key}'
+ * @uses do_action() Calls 'bbp_add_option_filters'
+ */
+function bbp_setup_option_filters() {
+
+	// Add filters to each bbPress option
+	foreach ( array_keys( bbp_get_default_options() ) as $key )
+		add_filter( 'pre_option_' . $key, 'bbp_pre_get_option' );
+
+	// Allow previously activated plugins to append their own options.
+	do_action( 'bbp_setup_option_filters' );
+}
+
+/**
+ * Filter default options and allow them to be overloaded from inside the
+ * $bbp->options array.
+ *
+ * @since bbPress (r3451)
+ * @param bool $value Optional. Default value false
+ * @return mixed false if not overloaded, mixed if set
+ */
+function bbp_pre_get_option( $value = '' ) {
+
+	// Remove the filter prefix
+	$option = str_replace( 'pre_option_', '', current_filter() );
+
+	// Check the options global for preset value
+	if ( isset( bbpress()->options[$option] ) )
+		$value = bbpress()->options[$option];
+
+	// Always return a value, even if false
+	return $value;
+}
+
+/** Active? *******************************************************************/
+
+/**
+ * Checks if favorites feature is enabled.
+ *
+ * @since bbPress (r2658)
+ * @param $default bool Optional.Default value true
+ * @uses get_option() To get the favorites option
+ * @return bool Is favorites enabled or not
+ */
+function bbp_is_favorites_active( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_is_favorites_active', (bool) get_option( '_bbp_enable_favorites', $default ) );
+}
+
+/**
+ * Checks if subscription feature is enabled.
+ *
+ * @since bbPress (r2658)
+ * @param $default bool Optional.Default value true
+ * @uses get_option() To get the subscriptions option
+ * @return bool Is subscription enabled or not
+ */
+function bbp_is_subscriptions_active( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_is_subscriptions_active', (bool) get_option( '_bbp_enable_subscriptions', $default ) );
+}
+
+/**
+ * Are topic tags allowed
+ *
+ * @since bbPress (r4097)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the allow tags
+ * @return bool Are tags allowed?
+ */
+function bbp_allow_topic_tags( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_allow_topic_tags', (bool) get_option( '_bbp_allow_topic_tags', $default ) );
+}
+
+/**
+ * Are topic and reply revisions allowed
+ *
+ * @since bbPress (r3412)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the allow revisions
+ * @return bool Are revisions allowed?
+ */
+function bbp_allow_revisions( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_allow_revisions', (bool) get_option( '_bbp_allow_revisions', $default ) );
+}
+
+/**
+ * Is the anonymous posting allowed?
+ *
+ * @since bbPress (r2659)
+ * @param $default bool Optional. Default value
+ * @uses get_option() To get the allow anonymous option
+ * @return bool Is anonymous posting allowed?
+ */
+function bbp_allow_anonymous( $default = 0 ) {
+	return apply_filters( 'bbp_allow_anonymous', (bool) get_option( '_bbp_allow_anonymous', $default ) );
+}
+
+/**
+ * Is this forum available to all users on all sites in this installation?
+ *
+ * @since bbPress (r3378)
+ * @param $default bool Optional. Default value false
+ * @uses get_option() To get the global access option
+ * @return bool Is global access allowed?
+ */
+function bbp_allow_global_access( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_allow_global_access', (bool) get_option( '_bbp_allow_global_access', $default ) );
+}
+
+/**
+ * Is this forum available to all users on all sites in this installation?
+ *
+ * @since bbPress (r4294)
+ * @param $default string Optional. Default value empty
+ * @uses get_option() To get the default forums role option
+ * @return string The default forums user role
+ */
+function bbp_get_default_role( $default = 'bbp_participant' ) {
+	return apply_filters( 'bbp_get_default_role', get_option( '_bbp_default_role', $default ) );
+}
+
+/**
+ * Use the WordPress editor if available
+ *
+ * @since bbPress (r3386)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the WP editor option
+ * @return bool Use WP editor?
+ */
+function bbp_use_wp_editor( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_use_wp_editor', (bool) get_option( '_bbp_use_wp_editor', $default ) );
+}
+
+/**
+ * Use WordPress's oEmbed API
+ *
+ * @since bbPress (r3752)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the oEmbed option
+ * @return bool Use oEmbed?
+ */
+function bbp_use_autoembed( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_use_autoembed', (bool) get_option( '_bbp_use_autoembed', $default ) );
+}
+
+/**
+ * Get the current theme package ID
+ *
+ * @since bbPress (r3829)
+ * @param $default string Optional. Default value 'default'
+ * @uses get_option() To get the subtheme option
+ * @return string ID of the subtheme
+ */
+function bbp_get_theme_package_id( $default = 'default' ) {
+	return apply_filters( 'bbp_get_theme_package_id', get_option( '_bbp_theme_package_id', $default ) );
+}
+
+/**
+ * Output the maximum length of a title
+ *
+ * @since bbPress (r3246)
+ * @param $default bool Optional. Default value 80
+ */
+function bbp_title_max_length( $default = 80 ) {
+	echo bbp_get_title_max_length( $default );
+}
+	/**
+	 * Return the maximum length of a title
+	 *
+	 * @since bbPress (r3246)
+	 * @param $default bool Optional. Default value 80
+	 * @uses get_option() To get the maximum title length
+	 * @return int Is anonymous posting allowed?
+	 */
+	function bbp_get_title_max_length( $default = 80 ) {
+		return (int) apply_filters( 'bbp_get_title_max_length', (int) get_option( '_bbp_title_max_length', $default ) );
+	}
+
+/**
+ * Output the grop forums root parent forum id
+ *
+ * @since bbPress (r3575)
+ * @param $default int Optional. Default value
+ */
+function bbp_group_forums_root_id( $default = 0 ) {
+	echo bbp_get_group_forums_root_id( $default );
+}
+	/**
+	 * Return the grop forums root parent forum id
+	 *
+	 * @since bbPress (r3575)
+	 * @param $default bool Optional. Default value 0
+	 * @uses get_option() To get the root group forum ID
+	 * @return int The post ID for the root forum
+	 */
+	function bbp_get_group_forums_root_id( $default = 0 ) {
+		return (int) apply_filters( 'bbp_get_group_forums_root_id', (int) get_option( '_bbp_group_forums_root_id', $default ) );
+	}
+
+/**
+ * Checks if BuddyPress Group Forums are enabled
+ *
+ * @since bbPress (r3575)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the group forums option
+ * @return bool Is group forums enabled or not
+ */
+function bbp_is_group_forums_active( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_is_group_forums_active', (bool) get_option( '_bbp_enable_group_forums', $default ) );
+}
+
+/**
+ * Checks if Akismet is enabled
+ *
+ * @since bbPress (r3575)
+ * @param $default bool Optional. Default value true
+ * @uses get_option() To get the Akismet option
+ * @return bool Is Akismet enabled or not
+ */
+function bbp_is_akismet_active( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_is_akismet_active', (bool) get_option( '_bbp_enable_akismet', $default ) );
+}
+
+/** Slugs *********************************************************************/
+
+/**
+ * Return the root slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_root_slug( $default = 'forums' ) {
+	return apply_filters( 'bbp_get_root_slug', get_option( '_bbp_root_slug', $default ) );
+}
+
+/**
+ * Are we including the root slug in front of forum pages?
+ *
+ * @since bbPress (r3759)
+ * @return bool
+ */
+function bbp_include_root_slug( $default = 1 ) {
+	return (bool) apply_filters( 'bbp_include_root_slug', (bool) get_option( '_bbp_include_root', $default ) );
+}
+
+/**
+ * Maybe return the root slug, based on whether or not it's included in the url
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_maybe_get_root_slug() {
+	$retval = '';
+
+	if ( bbp_get_root_slug() && bbp_include_root_slug() )
+		$retval = trailingslashit( bbp_get_root_slug() );
+
+	return apply_filters( 'bbp_maybe_get_root_slug', $retval );
+}
+
+/**
+ * Return the single forum slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_forum_slug( $default = 'forum' ) {;
+	return apply_filters( 'bbp_get_root_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_forum_slug', $default ) );
+}
+
+/**
+ * Return the topic archive slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_topic_archive_slug( $default = 'topics' ) {
+	return apply_filters( 'bbp_get_topic_archive_slug', get_option( '_bbp_topic_archive_slug', $default ) );
+}
+
+/**
+ * Return the single topic slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_topic_slug( $default = 'topic' ) {
+	return apply_filters( 'bbp_get_topic_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_topic_slug', $default ) );
+}
+
+/**
+ * Return the topic-tag taxonomy slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_topic_tag_tax_slug( $default = 'topic-tag' ) {
+	return apply_filters( 'bbp_get_topic_tag_tax_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_topic_tag_slug', $default ) );
+}
+
+/**
+ * Return the single reply slug (used mostly for editing)
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_reply_slug( $default = 'reply' ) {
+	return apply_filters( 'bbp_get_reply_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_reply_slug', $default ) );
+}
+
+/**
+ * Return the single user slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_user_slug( $default = 'user' ) {
+	return apply_filters( 'bbp_get_user_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_user_slug', $default ) );
+}
+
+/**
+ * Return the single user favorites slug
+ *
+ * @since bbPress (r4187)
+ * @return string
+ */
+function bbp_get_user_favorites_slug( $default = 'favorites' ) {
+	return apply_filters( 'bbp_get_user_favorites_slug', get_option( '_bbp_user_favs_slug', $default ) );
+}
+
+/**
+ * Return the single user subscriptions slug
+ *
+ * @since bbPress (r4187)
+ * @return string
+ */
+function bbp_get_user_subscriptions_slug( $default = 'subscriptions' ) {
+	return apply_filters( 'bbp_get_user_subscriptions_slug', get_option( '_bbp_user_subs_slug', $default ) );
+}
+
+/**
+ * Return the topic view slug
+ *
+ * @since bbPress (r3759)
+ * @return string
+ */
+function bbp_get_view_slug( $default = 'view' ) {
+	return apply_filters( 'bbp_get_view_slug', bbp_maybe_get_root_slug() . get_option( '_bbp_view_slug', $default ) );
+}
+
+/** Legacy ********************************************************************/
+
+/**
+ * Checks if there is a previous BuddyPress Forum configuration
+ *
+ * @since bbPress (r3790)
+ * @param $default string Optional. Default empty string
+ * @uses get_option() To get the old bb-config.php location
+ * @return string The location of the bb-config.php file, if any
+ */
+function bbp_get_config_location( $default = '' ) {
+	return apply_filters( 'bbp_get_config_location', get_option( 'bb-config-location', $default ) );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/sub-actions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,391 @@
+<?php
+
+/**
+ * Plugin Dependency
+ *
+ * The purpose of the following hooks is to mimic the behavior of something
+ * called 'plugin dependency' which enables a plugin to have plugins of their
+ * own in a safe and reliable way.
+ *
+ * We do this in bbPress by mirroring existing WordPress hookss in many places
+ * allowing dependant plugins to hook into the bbPress specific ones, thus
+ * guaranteeing proper code execution only when bbPress is active.
+ *
+ * The following functions are wrappers for hookss, allowing them to be
+ * manually called and/or piggy-backed on top of other hooks if needed.
+ *
+ * @todo use anonymous functions when PHP minimun requirement allows (5.3)
+ */
+
+/** Activation Actions ********************************************************/
+
+/**
+ * Runs on bbPress activation
+ *
+ * @since bbPress (r2509)
+ * @uses register_uninstall_hook() To register our own uninstall hook
+ * @uses do_action() Calls 'bbp_activation' hook
+ */
+function bbp_activation() {
+	do_action( 'bbp_activation' );
+}
+
+/**
+ * Runs on bbPress deactivation
+ *
+ * @since bbPress (r2509)
+ * @uses do_action() Calls 'bbp_deactivation' hook
+ */
+function bbp_deactivation() {
+	do_action( 'bbp_deactivation' );
+}
+
+/**
+ * Runs when uninstalling bbPress
+ *
+ * @since bbPress (r2509)
+ * @uses do_action() Calls 'bbp_uninstall' hook
+ */
+function bbp_uninstall() {
+	do_action( 'bbp_uninstall' );
+}
+
+/** Main Actions **************************************************************/
+
+/**
+ * Main action responsible for constants, globals, and includes
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_loaded'
+ */
+function bbp_loaded() {
+	do_action( 'bbp_loaded' );
+}
+
+/**
+ * Setup constants
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_constants'
+ */
+function bbp_constants() {
+	do_action( 'bbp_constants' );
+}
+
+/**
+ * Setup globals BEFORE includes
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_boot_strap_globals'
+ */
+function bbp_boot_strap_globals() {
+	do_action( 'bbp_boot_strap_globals' );
+}
+
+/**
+ * Include files
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_includes'
+ */
+function bbp_includes() {
+	do_action( 'bbp_includes' );
+}
+
+/**
+ * Setup globals AFTER includes
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_setup_globals'
+ */
+function bbp_setup_globals() {
+	do_action( 'bbp_setup_globals' );
+}
+
+/**
+ * Register any objects before anything is initialized
+ *
+ * @since bbPress (r4180)
+ * @uses do_action() Calls 'bbp_register'
+ */
+function bbp_register() {
+	do_action( 'bbp_register' );
+}
+
+/**
+ * Initialize any code after everything has been loaded
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_init'
+ */
+function bbp_init() {
+	do_action( 'bbp_init' );
+}
+
+/**
+ * Initialize widgets
+ *
+ * @since bbPress (r3389)
+ * @uses do_action() Calls 'bbp_widgets_init'
+ */
+function bbp_widgets_init() {
+	do_action( 'bbp_widgets_init' );
+}
+
+/**
+ * Setup the currently logged-in user
+ *
+ * @since bbPress (r2695)
+ * @uses do_action() Calls 'bbp_setup_current_user'
+ */
+function bbp_setup_current_user() {
+	do_action( 'bbp_setup_current_user' );
+}
+
+/** Supplemental Actions ******************************************************/
+
+/**
+ * Load translations for current language
+ *
+ * @since bbPress (r2599)
+ * @uses do_action() Calls 'bbp_load_textdomain'
+ */
+function bbp_load_textdomain() {
+	do_action( 'bbp_load_textdomain' );
+}
+
+/**
+ * Setup the post types
+ *
+ * @since bbPress (r2464)
+ * @uses do_action() Calls 'bbp_register_post_type'
+ */
+function bbp_register_post_types() {
+	do_action( 'bbp_register_post_types' );
+}
+
+/**
+ * Setup the post statuses
+ *
+ * @since bbPress (r2727)
+ * @uses do_action() Calls 'bbp_register_post_statuses'
+ */
+function bbp_register_post_statuses() {
+	do_action( 'bbp_register_post_statuses' );
+}
+
+/**
+ * Register the built in bbPress taxonomies
+ *
+ * @since bbPress (r2464)
+ * @uses do_action() Calls 'bbp_register_taxonomies'
+ */
+function bbp_register_taxonomies() {
+	do_action( 'bbp_register_taxonomies' );
+}
+
+/**
+ * Register the default bbPress views
+ *
+ * @since bbPress (r2789)
+ * @uses do_action() Calls 'bbp_register_views'
+ */
+function bbp_register_views() {
+	do_action( 'bbp_register_views' );
+}
+
+/**
+ * Register the default bbPress shortcodes
+ *
+ * @since bbPress (r4211)
+ * @uses do_action() Calls 'bbp_register_shortcodes'
+ */
+function bbp_register_shortcodes() {
+	do_action( 'bbp_register_shortcodes' );
+}
+
+/**
+ * Enqueue bbPress specific CSS and JS
+ *
+ * @since bbPress (r3373)
+ * @uses do_action() Calls 'bbp_enqueue_scripts'
+ */
+function bbp_enqueue_scripts() {
+	do_action( 'bbp_enqueue_scripts' );
+}
+
+/**
+ * Add the bbPress-specific rewrite tags
+ *
+ * @since bbPress (r2753)
+ * @uses do_action() Calls 'bbp_add_rewrite_tags'
+ */
+function bbp_add_rewrite_tags() {
+	do_action( 'bbp_add_rewrite_tags' );
+}
+
+/**
+ * Add the bbPress-specific login forum action
+ *
+ * @since bbPress (r2753)
+ * @uses do_action() Calls 'bbp_login_form_login'
+ */
+function bbp_login_form_login() {
+	do_action( 'bbp_login_form_login' );
+}
+
+/** User Actions **************************************************************/
+
+/**
+ * The main action for hooking into when a user account is updated
+ *
+ * @since bbPress (r4304)
+ *
+ * @param int $user_id ID of user being edited
+ * @param array $old_user_data The old, unmodified user data
+ * @uses do_action() Calls 'bbp_profile_update'
+ */
+function bbp_profile_update( $user_id = 0, $old_user_data = array() ) {
+	do_action( 'bbp_profile_update', $user_id, $old_user_data );
+}
+
+/**
+ * The main action for hooking into a user being registered
+ *
+ * @since bbPress (r4304)
+ * @param int $user_id ID of user being edited
+ * @uses do_action() Calls 'bbp_user_register'
+ */
+function bbp_user_register( $user_id = 0 ) {
+	do_action( 'bbp_user_register', $user_id );
+}
+
+/** Final Action **************************************************************/
+
+/**
+ * bbPress has loaded and initialized everything, and is okay to go
+ *
+ * @since bbPress (r2618)
+ * @uses do_action() Calls 'bbp_ready'
+ */
+function bbp_ready() {
+	do_action( 'bbp_ready' );
+}
+
+/** Theme Permissions *********************************************************/
+
+/**
+ * The main action used for redirecting bbPress theme actions that are not
+ * permitted by the current_user
+ *
+ * @since bbPress (r3605)
+ * @uses do_action()
+ */
+function bbp_template_redirect() {
+	do_action( 'bbp_template_redirect' );
+}
+
+/** Theme Helpers *************************************************************/
+
+/**
+ * The main action used for executing code before the theme has been setup
+ *
+ * @since bbPress (r3829)
+ * @uses do_action()
+ */
+function bbp_register_theme_packages() {
+	do_action( 'bbp_register_theme_packages' );
+}
+
+/**
+ * The main action used for executing code before the theme has been setup
+ *
+ * @since bbPress (r3732)
+ * @uses do_action()
+ */
+function bbp_setup_theme() {
+	do_action( 'bbp_setup_theme' );
+}
+
+/**
+ * The main action used for executing code after the theme has been setup
+ *
+ * @since bbPress (r3732)
+ * @uses do_action()
+ */
+function bbp_after_setup_theme() {
+	do_action( 'bbp_after_setup_theme' );
+}
+
+/**
+ * Filter the plugin locale and domain.
+ *
+ * @since bbPress (r4213)
+ *
+ * @param string $locale
+ * @param string $domain
+ */
+function bbp_plugin_locale( $locale = '', $domain = '' ) {
+	return apply_filters( 'bbp_plugin_locale', $locale, $domain );
+}
+
+/** Filters *******************************************************************/
+
+/**
+ * Piggy back filter for WordPress's 'request' filter
+ *
+ * @since bbPress (r3758)
+ * @param array $query_vars
+ * @return array
+ */
+function bbp_request( $query_vars = array() ) {
+	return apply_filters( 'bbp_request', $query_vars );
+}
+
+/**
+ * The main filter used for theme compatibility and displaying custom bbPress
+ * theme files.
+ *
+ * @since bbPress (r3311)
+ * @uses apply_filters()
+ * @param string $template
+ * @return string Template file to use
+ */
+function bbp_template_include( $template = '' ) {
+	return apply_filters( 'bbp_template_include', $template );
+}
+
+/**
+ * Generate bbPress-specific rewrite rules
+ *
+ * @since bbPress (r2688)
+ * @param WP_Rewrite $wp_rewrite
+ * @uses do_action() Calls 'bbp_generate_rewrite_rules' with {@link WP_Rewrite}
+ */
+function bbp_generate_rewrite_rules( $wp_rewrite ) {
+	do_action_ref_array( 'bbp_generate_rewrite_rules', array( &$wp_rewrite ) );
+}
+
+/**
+ * Filter the allowed themes list for bbPress specific themes
+ *
+ * @since bbPress (r2944)
+ * @uses apply_filters() Calls 'bbp_allowed_themes' with the allowed themes list
+ */
+function bbp_allowed_themes( $themes ) {
+	return apply_filters( 'bbp_allowed_themes', $themes );
+}
+
+/**
+ * Maps forum/topic/reply caps to built in WordPress caps
+ *
+ * @since bbPress (r2593)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ */
+function bbp_map_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+	return apply_filters( 'bbp_map_meta_caps', $caps, $cap, $user_id, $args );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/template-functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,468 @@
+<?php
+
+/**
+ * bbPress Template Functions
+ *
+ * This file contains functions necessary to mirror the WordPress core template
+ * loading process. Many of those functions are not filterable, and even then
+ * would not be robust enough to predict where bbPress templates might exist.
+ *
+ * @package bbPress
+ * @subpackage TemplateFunctions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Adds bbPress theme support to any active WordPress theme
+ *
+ * @since bbPress (r3032)
+ *
+ * @param string $slug
+ * @param string $name Optional. Default null
+ * @uses bbp_locate_template()
+ * @uses load_template()
+ * @uses get_template_part()
+ */
+function bbp_get_template_part( $slug, $name = null ) {
+
+	// Execute code for this part
+	do_action( 'get_template_part_' . $slug, $slug, $name );
+
+	// Setup possible parts
+	$templates = array();
+	if ( isset( $name ) )
+		$templates[] = $slug . '-' . $name . '.php';
+	$templates[] = $slug . '.php';
+
+	// Allow template parst to be filtered
+	$templates = apply_filters( 'bbp_get_template_part', $templates, $slug, $name );
+
+	// Return the part that is found
+	return bbp_locate_template( $templates, true, false );
+}
+
+/**
+ * Retrieve the name of the highest priority template file that exists.
+ *
+ * Searches in the child theme before parent theme so that themes which
+ * inherit from a parent theme can just overload one file. If the template is
+ * not found in either of those, it looks in the theme-compat folder last.
+ *
+ * @since bbPres (r3618)
+ *
+ * @param string|array $template_names Template file(s) to search for, in order.
+ * @param bool $load If true the template file will be loaded if it is found.
+ * @param bool $require_once Whether to require_once or require. Default true.
+ *                            Has no effect if $load is false.
+ * @return string The template filename if one is located.
+ */
+function bbp_locate_template( $template_names, $load = false, $require_once = true ) {
+
+	// No file found yet
+	$located            = false;
+	$template_locations = bbp_get_template_stack();
+
+	// Try to find a template file
+	foreach ( (array) $template_names as $template_name ) {
+
+		// Continue if template is empty
+		if ( empty( $template_name ) )
+			continue;
+
+		// Trim off any slashes from the template name
+		$template_name  = ltrim( $template_name, '/' );
+
+		// Loop through template stack
+		foreach ( (array) $template_locations as $template_location ) {
+
+			// Continue if $template_location is empty
+			if ( empty( $template_location ) )
+				continue;
+
+			// Check child theme first
+			if ( file_exists( trailingslashit( $template_location ) . $template_name ) ) {
+				$located = trailingslashit( $template_location ) . $template_name;
+				break 2;
+			}
+		}
+	}
+
+	// Maybe load the template if one was located
+	if ( ( true == $load ) && !empty( $located ) )
+		load_template( $located, $require_once );
+
+	return $located;
+}
+
+/**
+ * This is really cool. This function registers a new template stack location,
+ * using WordPress's built in filters API.
+ *
+ * This allows for templates to live in places beyond just the parent/child
+ * relationship, to allow for custom template locations. Used in conjunction
+ * with bbp_locate_template(), this allows for easy template overrides.
+ *
+ * @since bbPress (r4323)
+ *
+ * @param string $location Callback function that returns the 
+ * @param int $priority
+ */
+function bbp_register_template_stack( $location_callback = '', $priority = 10 ) {
+
+	// Bail if no location, or function does not exist
+	if ( empty( $location_callback ) || ! function_exists( $location_callback ) )
+		return false;
+
+	// Add location callback to template stack
+	add_filter( 'bbp_template_stack', $location_callback, (int) $priority );
+}
+
+/**
+ * Call the functions added to the 'bbp_template_stack' filter hook, and return
+ * an array of the template locations.
+ *
+ * @see bbp_register_template_stack()
+ *
+ * @since bbPress (r4323)
+ *
+ * @global array $wp_filter Stores all of the filters
+ * @global array $merged_filters Merges the filter hooks using this function.
+ * @global array $wp_current_filter stores the list of current filters with the current one last
+ *
+ * @return array The filtered value after all hooked functions are applied to it.
+ */
+function bbp_get_template_stack() {
+	global $wp_filter, $merged_filters, $wp_current_filter;
+
+	// Setup some default variables
+	$tag  = 'bbp_template_stack';
+	$args = $stack = array();
+
+	// Add 'bbp_template_stack' to the current filter array
+	$wp_current_filter[] = $tag;
+
+	// Sort
+	if ( ! isset( $merged_filters[ $tag ] ) ) {
+		ksort( $wp_filter[$tag] );
+		$merged_filters[ $tag ] = true;
+	}
+
+	// Ensure we're always at the beginning of the filter array
+	reset( $wp_filter[ $tag ] );
+
+	// Loop through 'bbp_template_stack' filters, and call callback functions
+	do {
+		foreach( (array) current( $wp_filter[$tag] ) as $the_ ) {
+			if ( ! is_null( $the_['function'] ) ) {
+				$args[1] = $stack;
+				$stack[] = call_user_func_array( $the_['function'], array_slice( $args, 1, (int) $the_['accepted_args'] ) );
+			}
+		}
+	} while ( next( $wp_filter[$tag] ) !== false );
+
+	// Remove 'bbp_template_stack' from the current filter array
+	array_pop( $wp_current_filter );
+
+	// Remove empties and duplicates
+	$stack = array_unique( array_filter( $stack ) );
+
+	return (array) apply_filters( 'bbp_get_template_stack', $stack ) ;
+}
+
+/**
+ * Retrieve path to a template
+ *
+ * Used to quickly retrieve the path of a template without including the file
+ * extension. It will also check the parent theme and theme-compat theme with
+ * the use of {@link bbp_locate_template()}. Allows for more generic template
+ * locations without the use of the other get_*_template() functions.
+ *
+ * @since bbPress (r3629)
+ *
+ * @param string $type Filename without extension.
+ * @param array $templates An optional list of template candidates
+ * @uses bbp_set_theme_compat_templates()
+ * @uses bbp_locate_template()
+ * @uses bbp_set_theme_compat_template()
+ * @return string Full path to file.
+ */
+function bbp_get_query_template( $type, $templates = array() ) {
+	$type = preg_replace( '|[^a-z0-9-]+|', '', $type );
+
+	if ( empty( $templates ) )
+		$templates = array( "{$type}.php" );
+
+	// Filter possible templates, try to match one, and set any bbPress theme
+	// compat properties so they can be cross-checked later.
+	$templates = apply_filters( "bbp_get_{$type}_template", $templates );
+	$templates = bbp_set_theme_compat_templates( $templates );
+	$template  = bbp_locate_template( $templates );
+	$template  = bbp_set_theme_compat_template( $template );
+
+	return apply_filters( "bbp_{$type}_template", $template );
+}
+
+/**
+ * Get the possible subdirectories to check for templates in
+ *
+ * @since bbPress (r3738)
+ * @param array $templates Templates we are looking for
+ * @return array Possible subfolders to look in
+ */
+function bbp_get_template_locations( $templates = array() ) {
+	$locations = array(
+		'bbpress',
+		'forums',
+		''
+	);
+	return apply_filters( 'bbp_get_template_locations', $locations, $templates );
+}
+
+/**
+ * Add template locations to template files being searched for
+ *
+ * @since bbPress (r3738)
+ *
+ * @param array $templates
+ * @return array() 
+ */
+function bbp_add_template_locations( $templates = array() ) {
+	$retval = array();
+
+	// Get alternate locations
+	$locations = bbp_get_template_locations( $templates );
+
+	// Loop through locations and templates and combine
+	foreach ( (array) $locations as $location )
+		foreach ( (array) $templates as $template )
+			$retval[] = ltrim( trailingslashit( $location ) . $template, '/' );
+
+	return apply_filters( 'bbp_add_template_locations', array_unique( $retval ), $templates );
+}
+
+/**
+ * Add checks for bbPress conditions to parse_query action
+ *
+ * If it's a user page, WP_Query::bbp_is_single_user is set to true.
+ * If it's a user edit page, WP_Query::bbp_is_single_user_edit is set to true
+ * and the the 'wp-admin/includes/user.php' file is included.
+ * In addition, on user/user edit pages, WP_Query::home is set to false & query
+ * vars 'bbp_user_id' with the displayed user id and 'author_name' with the
+ * displayed user's nicename are added.
+ *
+ * If it's a forum edit, WP_Query::bbp_is_forum_edit is set to true
+ * If it's a topic edit, WP_Query::bbp_is_topic_edit is set to true
+ * If it's a reply edit, WP_Query::bbp_is_reply_edit is set to true.
+ *
+ * If it's a view page, WP_Query::bbp_is_view is set to true
+ *
+ * @since bbPress (r2688)
+ *
+ * @param WP_Query $posts_query
+ *
+ * @uses get_query_var() To get {@link WP_Query} query var
+ * @uses is_email() To check if the string is an email
+ * @uses get_user_by() To try to get the user by email and nicename
+ * @uses get_userdata() to get the user data
+ * @uses current_user_can() To check if the current user can edit the user
+ * @uses is_user_member_of_blog() To check if user profile page exists
+ * @uses WP_Query::set_404() To set a 404 status
+ * @uses apply_filters() Calls 'enable_edit_any_user_configuration' with true
+ * @uses bbp_get_view_query_args() To get the view query args
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses remove_action() To remove the auto save post revision action
+ */
+function bbp_parse_query( $posts_query ) {
+
+	// Bail if $posts_query is not the main loop
+	if ( ! $posts_query->is_main_query() )
+		return;
+
+	// Bail if filters are suppressed on this query
+	if ( true == $posts_query->get( 'suppress_filters' ) )
+		return;
+
+	// Bail if in admin
+	if ( is_admin() )
+		return;
+
+	// Get query variables
+	$bbp_view = $posts_query->get( bbp_get_view_rewrite_id() );
+	$bbp_user = $posts_query->get( bbp_get_user_rewrite_id() );
+	$is_edit  = $posts_query->get( bbp_get_edit_rewrite_id() );
+
+	// It is a user page - We'll also check if it is user edit
+	if ( !empty( $bbp_user ) ) {
+
+		// Not a user_id so try email and slug
+		if ( !is_numeric( $bbp_user ) ) {
+
+			// Email was passed
+			if ( is_email( $bbp_user ) ) {
+				$bbp_user = get_user_by( 'email', $bbp_user );
+
+			// Try nicename
+			} else {
+				$bbp_user = get_user_by( 'slug', $bbp_user );
+			}
+
+			// If we were successful, set to ID
+			if ( is_object( $bbp_user ) ) {
+				$bbp_user = $bbp_user->ID;
+			}
+		}
+
+		// Cast as int, just in case
+		$bbp_user = (int) $bbp_user;
+
+		// 404 and bail if user does not have a profile
+		if ( ! bbp_user_has_profile( $bbp_user ) ) {
+			$posts_query->set_404();
+			return;
+		}
+
+		/** User Exists *******************************************************/
+
+		$is_favs    = $posts_query->get( bbp_get_user_favorites_rewrite_id()     );
+		$is_subs    = $posts_query->get( bbp_get_user_subscriptions_rewrite_id() );
+		$is_topics  = $posts_query->get( bbp_get_user_topics_rewrite_id()        );
+		$is_replies = $posts_query->get( bbp_get_user_replies_rewrite_id()       );
+
+		// View or edit?
+		if ( !empty( $is_edit ) ) {
+
+			// We are editing a profile
+			$posts_query->bbp_is_single_user_edit = true;
+
+			// Load the core WordPress contact methods
+			if ( !function_exists( '_wp_get_user_contactmethods' ) ) {
+				include_once( ABSPATH . 'wp-includes/registration.php' );
+			}
+
+			// Load the edit_user functions
+			if ( !function_exists( 'edit_user' ) ) {
+				require_once( ABSPATH . 'wp-admin/includes/user.php' );
+			}
+
+			// Load the grant/revoke super admin functions
+			if ( is_multisite() && !function_exists( 'revoke_super_admin' ) ) {
+				require_once( ABSPATH . 'wp-admin/includes/ms.php' );
+			}
+
+			// Editing a user
+			$posts_query->bbp_is_edit = true;
+
+		// User favorites
+		} elseif ( ! empty( $is_favs ) ) {
+			$posts_query->bbp_is_single_user_favs = true;
+
+		// User subscriptions
+		} elseif ( ! empty( $is_subs ) ) {
+			$posts_query->bbp_is_single_user_subs = true;
+
+		// User topics
+		} elseif ( ! empty( $is_topics ) ) {
+			$posts_query->bbp_is_single_user_topics = true;
+
+		// User topics
+		} elseif ( ! empty( $is_replies ) ) {
+			$posts_query->bbp_is_single_user_replies = true;
+
+		// User profile
+		} else {
+			$posts_query->bbp_is_single_user_profile = true;
+		}
+
+		// Looking at a single user
+		$posts_query->bbp_is_single_user = true;
+
+		// Make sure 404 is not set
+		$posts_query->is_404  = false;
+
+		// Correct is_home variable
+		$posts_query->is_home = false;
+
+		// Get the user data
+		$user = get_userdata( $bbp_user );
+
+		// User is looking at their own profile
+		if ( get_current_user_id() == $user->ID ) {
+			$posts_query->bbp_is_single_user_home = true;
+		}
+
+		// Set bbp_user_id for future reference
+		$posts_query->set( 'bbp_user_id', $user->ID );
+
+		// Set author_name as current user's nicename to get correct posts
+		$posts_query->set( 'author_name', $user->user_nicename );
+
+		// Set the displayed user global to this user
+		bbpress()->displayed_user = $user;
+
+	// View Page
+	} elseif ( !empty( $bbp_view ) ) {
+
+		// Check if the view exists by checking if there are query args are set
+		$view_args = bbp_get_view_query_args( $bbp_view );
+
+		// Bail if view args is false (view isn't registered)
+		if ( false === $view_args ) {
+			$posts_query->set_404();
+			return;
+		}
+
+		// Correct is_home variable
+		$posts_query->is_home     = false;
+
+		// We are in a custom topic view
+		$posts_query->bbp_is_view = true;
+
+	// Forum/Topic/Reply Edit Page
+	} elseif ( !empty( $is_edit ) ) {
+
+		// Get the post type from the main query loop
+		$post_type = $posts_query->get( 'post_type' );
+		
+		// Check which post_type we are editing, if any
+		if ( !empty( $post_type ) ) {
+			switch( $post_type ) {
+
+				// We are editing a forum
+				case bbp_get_forum_post_type() :
+					$posts_query->bbp_is_forum_edit = true;
+					$posts_query->bbp_is_edit       = true;
+					break;
+
+				// We are editing a topic
+				case bbp_get_topic_post_type() :
+					$posts_query->bbp_is_topic_edit = true;
+					$posts_query->bbp_is_edit       = true;
+					break;
+
+				// We are editing a reply
+				case bbp_get_reply_post_type() :
+					$posts_query->bbp_is_reply_edit = true;
+					$posts_query->bbp_is_edit       = true;
+					break;
+			}
+
+		// We are editing a topic tag
+		} elseif ( bbp_is_topic_tag() ) {
+			$posts_query->bbp_is_topic_tag_edit = true;
+			$posts_query->bbp_is_edit           = true;
+		}
+
+		// We save post revisions on our own
+		remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Topic tag page
+	} elseif ( bbp_is_topic_tag() ) {
+		$posts_query->set( 'bbp_topic_tag',  get_query_var( 'term' )   );
+		$posts_query->set( 'post_type',      bbp_get_topic_post_type() );
+		$posts_query->set( 'posts_per_page', bbp_get_topics_per_page() );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/template-loader.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,468 @@
+<?php
+
+/**
+ * bbPress Template Loader
+ *
+ * @package bbPress
+ * @subpackage TemplateLoader
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Possibly intercept the template being loaded
+ *
+ * Listens to the 'template_include' filter and waits for any bbPress specific
+ * template condition to be met. If one is met and the template file exists,
+ * it will be used; otherwise 
+ *
+ * Note that the _edit() checks are ahead of their counterparts, to prevent them
+ * from being stomped on accident.
+ *
+ * @since bbPress (r3032)
+ *
+ * @param string $template
+ *
+ * @uses bbp_is_single_user() To check if page is single user
+ * @uses bbp_get_single_user_template() To get user template
+ * @uses bbp_is_single_user_edit() To check if page is single user edit
+ * @uses bbp_get_single_user_edit_template() To get user edit template
+ * @uses bbp_is_single_view() To check if page is single view
+ * @uses bbp_get_single_view_template() To get view template
+ * @uses bbp_is_forum_edit() To check if page is forum edit
+ * @uses bbp_get_forum_edit_template() To get forum edit template
+ * @uses bbp_is_topic_merge() To check if page is topic merge
+ * @uses bbp_get_topic_merge_template() To get topic merge template
+ * @uses bbp_is_topic_split() To check if page is topic split
+ * @uses bbp_get_topic_split_template() To get topic split template
+ * @uses bbp_is_topic_edit() To check if page is topic edit
+ * @uses bbp_get_topic_edit_template() To get topic edit template
+ * @uses bbp_is_reply_edit() To check if page is reply edit
+ * @uses bbp_get_reply_edit_template() To get reply edit template
+ * @uses bbp_set_theme_compat_template() To set the global theme compat template
+ *
+ * @return string The path to the template file that is being used
+ */
+function bbp_template_include_theme_supports( $template = '' ) {
+
+	// Editing a user
+	if     ( bbp_is_single_user_edit() && ( $new_template = bbp_get_single_user_edit_template() ) ) :
+
+	// User favorites
+	elseif ( bbp_is_favorites()        && ( $new_template = bbp_get_favorites_template()        ) ) :
+
+	// User favorites
+	elseif ( bbp_is_subscriptions()    && ( $new_template = bbp_get_subscriptions_template()    ) ) :
+
+	// Viewing a user
+	elseif ( bbp_is_single_user()      && ( $new_template = bbp_get_single_user_template()      ) ) :
+
+	// Single View
+	elseif ( bbp_is_single_view()      && ( $new_template = bbp_get_single_view_template()      ) ) :
+
+	// Forum edit
+	elseif ( bbp_is_forum_edit()       && ( $new_template = bbp_get_forum_edit_template()       ) ) :
+
+	// Single Forum
+	elseif ( bbp_is_single_forum()     && ( $new_template = bbp_get_single_forum_template()     ) ) :
+
+	// Forum Archive
+	elseif ( bbp_is_forum_archive()    && ( $new_template = bbp_get_forum_archive_template()    ) ) :
+
+	// Topic merge
+	elseif ( bbp_is_topic_merge()      && ( $new_template = bbp_get_topic_merge_template()      ) ) :
+
+	// Topic split
+	elseif ( bbp_is_topic_split()      && ( $new_template = bbp_get_topic_split_template()      ) ) :
+
+	// Topic edit
+	elseif ( bbp_is_topic_edit()       && ( $new_template = bbp_get_topic_edit_template()       ) ) :
+
+	// Single Topic
+	elseif ( bbp_is_single_topic()     && ( $new_template = bbp_get_single_topic_template()     ) ) :
+
+	// Topic Archive
+	elseif ( bbp_is_topic_archive()    && ( $new_template = bbp_get_topic_archive_template()    ) ) :
+
+	// Editing a reply
+	elseif ( bbp_is_reply_edit()       && ( $new_template = bbp_get_reply_edit_template()       ) ) :
+
+	// Single Reply
+	elseif ( bbp_is_single_reply()     && ( $new_template = bbp_get_single_reply_template()     ) ) :
+
+	// Editing a topic tag
+	elseif ( bbp_is_topic_tag_edit()   && ( $new_template = bbp_get_topic_tag_edit_template()   ) ) :
+
+	// Viewing a topic tag
+	elseif ( bbp_is_topic_tag()        && ( $new_template = bbp_get_topic_tag_template()        ) ) :
+	endif;
+
+	// bbPress template file exists
+	if ( !empty( $new_template ) ) {
+
+		// Override the WordPress template with a bbPress one
+		$template = $new_template;
+
+		// @see: bbp_template_include_theme_compat()
+		bbpress()->theme_compat->bbpress_template = true;
+	}
+
+	return apply_filters( 'bbp_template_include_theme_supports', $template );
+}
+
+/** Custom Functions **********************************************************/
+
+/**
+ * Attempt to load a custom bbPress functions file, similar to each themes
+ * functions.php file.
+ *
+ * @since bbPress (r3732)
+ *
+ * @global string $pagenow
+ * @uses bbp_locate_template()
+ */
+function bbp_load_theme_functions() {
+	global $pagenow;
+
+	// If bbPress is being deactivated, do not load any more files
+	if ( bbp_is_deactivation() )
+		return;
+
+	if ( ! defined( 'WP_INSTALLING' ) || ( !empty( $pagenow ) && ( 'wp-activate.php' !== $pagenow ) ) ) {
+		bbp_locate_template( 'bbpress-functions.php', true );
+	}
+}
+
+/** Individual Templates ******************************************************/
+
+/**
+ * Get the user profile template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_user_template() {
+	$nicename  = bbp_get_displayed_user_field( 'user_nicename' );
+	$user_id   = bbp_get_displayed_user_id();
+	$templates = array(
+		'single-user-' . $nicename . '.php', // Single User nicename
+		'single-user-' . $user_id  . '.php', // Single User ID
+		'single-user.php',                   // Single User
+		'user.php',                          // User
+	);
+	return bbp_get_query_template( 'profile', $templates );
+}
+
+/**
+ * Get the user profile edit template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_user_edit_template() {
+	$nicename  = bbp_get_displayed_user_field( 'user_nicename' );
+	$user_id   = bbp_get_displayed_user_id();
+	$templates = array(
+		'single-user-edit-' . $nicename . '.php', // Single User Edit nicename
+		'single-user-edit-' . $user_id  . '.php', // Single User Edit ID
+		'single-user-edit.php',                   // Single User Edit
+		'user-edit.php',                          // User Edit
+		'user.php',                               // User
+	);
+	return bbp_get_query_template( 'profile_edit', $templates );
+}
+
+/**
+ * Get the user favorites template
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_favorites_template() {
+	$nicename  = bbp_get_displayed_user_field( 'user_nicename' );
+	$user_id   = bbp_get_displayed_user_id();
+	$templates = array(
+		'single-user-favorites-' . $nicename . '.php', // Single User Favs nicename
+		'single-user-favorites-' . $user_id  . '.php', // Single User Favs ID
+		'favorites-' . $nicename  . '.php',            // Favorites nicename
+		'favorites-' . $user_id   . '.php',            // Favorites ID
+		'favorites.php',                               // Favorites
+		'user.php',                                    // User
+	);
+	return bbp_get_query_template( 'favorites', $templates );
+}
+
+/**
+ * Get the user subscriptions template
+ *
+ * @since bbPress (r4225)
+ *
+ * @uses bbp_get_displayed_user_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_subscriptions_template() {
+	$nicename  = bbp_get_displayed_user_field( 'user_nicename' );
+	$user_id   = bbp_get_displayed_user_id();
+	$templates = array(
+		'single-user-subscriptions-' . $nicename . '.php', // Single User Subs nicename
+		'single-user-subscriptions-' . $user_id  . '.php', // Single User Subs ID
+		'subscriptions-' . $nicename  . '.php',            // Subscriptions nicename
+		'subscriptions-' . $user_id   . '.php',            // Subscriptions ID
+		'subscriptions.php',                               // Subscriptions
+		'user.php',                                        // User
+	);
+	return bbp_get_query_template( 'subscriptions', $templates );
+}
+
+/**
+ * Get the view template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_view_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_view_template() {
+	$view_id   = bbp_get_view_id();
+	$templates = array(
+		'single-view-' . $view_id . '.php', // Single View ID
+		'view-'        . $view_id . '.php', // View ID
+		'single-view.php',                  // Single View
+		'view.php',                         // View
+	);
+	return bbp_get_query_template( 'single_view', $templates );
+}
+
+/**
+ * Get the single forum template
+ *
+ * @since bbPress (r3922)
+ *
+ * @uses bbp_get_forum_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_forum_template() {
+	$templates = array(
+		'single-' . bbp_get_forum_post_type() . '.php' // Single Forum
+	);
+	return bbp_get_query_template( 'single_forum', $templates );
+}
+
+/**
+ * Get the forum archive template
+ *
+ * @since bbPress (r3922)
+ *
+ * @uses bbp_get_forum_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_forum_archive_template() {
+	$templates = array(
+		'archive-' . bbp_get_forum_post_type() . '.php' // Forum Archive
+	);
+	return bbp_get_query_template( 'forum_archive', $templates );
+}
+
+/**
+ * Get the forum edit template
+ *
+ * @since bbPress (r3566)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_forum_edit_template() {
+	$templates = array(
+		'single-' . bbp_get_forum_post_type() . '-edit.php' // Single Forum Edit
+	);
+	return bbp_get_query_template( 'forum_edit', $templates );
+}
+
+/**
+ * Get the single topic template
+ *
+ * @since bbPress (r3922)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_topic_template() {
+	$templates = array(
+		'single-' . bbp_get_topic_post_type() . '.php'
+	);
+	return bbp_get_query_template( 'single_topic', $templates );
+}
+
+/**
+ * Get the topic archive template
+ *
+ * @since bbPress (r3922)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_archive_template() {
+	$templates = array(
+		'archive-' . bbp_get_topic_post_type() . '.php' // Topic Archive
+	);
+	return bbp_get_query_template( 'topic_archive', $templates );
+}
+
+/**
+ * Get the topic edit template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_edit_template() {
+	$templates = array(
+		'single-' . bbp_get_topic_post_type() . '-edit.php' // Single Topic Edit
+	);
+	return bbp_get_query_template( 'topic_edit', $templates );
+}
+
+/**
+ * Get the topic split template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_split_template() {
+	$templates = array(
+		'single-' . bbp_get_topic_post_type() . '-split.php', // Topic Split
+	);
+	return bbp_get_query_template( 'topic_split', $templates );
+}
+
+/**
+ * Get the topic merge template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_merge_template() {
+	$templates = array(
+		'single-' . bbp_get_topic_post_type() . '-merge.php', // Topic Merge
+	);
+	return bbp_get_query_template( 'topic_merge', $templates );
+}
+
+/**
+ * Get the single reply template
+ *
+ * @since bbPress (r3922)
+ *
+ * @uses bbp_get_reply_post_type()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_single_reply_template() {
+	$templates = array(
+		'single-' . bbp_get_reply_post_type() . '.php'
+	);
+	return bbp_get_query_template( 'single_reply', $templates );
+}
+
+/**
+ * Get the reply edit template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_reply_post_type()
+ * @uses bbp_get_query_template()
+* @return string Path to template file
+ */
+function bbp_get_reply_edit_template() {
+	$templates = array(
+		'single-' . bbp_get_reply_post_type() . '-edit.php' // Single Reply Edit
+	);
+	return bbp_get_query_template( 'reply_edit', $templates );
+}
+
+/**
+ * Get the topic template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_topic_tag_tax_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_tag_template() {
+	$tt_slug   = bbp_get_topic_tag_slug();
+	$tt_id     = bbp_get_topic_tag_tax_id();
+	$templates = array(
+		'taxonomy-' . $tt_slug . '.php', // Single Topic Tag slug
+		'taxonomy-' . $tt_id   . '.php', // Single Topic Tag ID
+	);
+	return bbp_get_query_template( 'topic_tag', $templates );
+}
+
+/**
+ * Get the topic edit template
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses bbp_get_topic_tag_tax_id()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_topic_tag_edit_template() {
+	$tt_slug   = bbp_get_topic_tag_slug();
+	$tt_id     = bbp_get_topic_tag_tax_id();
+	$templates = array(
+		'taxonomy-' . $tt_slug . '-edit.php', // Single Topic Tag Edit slug
+		'taxonomy-' . $tt_id   . '-edit.php'  // Single Topic Tag Edit ID
+	);
+	return bbp_get_query_template( 'topic_tag_edit', $templates );
+}
+
+/**
+ * Get the templates to use as the endpoint for bbPress template parts
+ *
+ * @since bbPress (r3311)
+ *
+ * @uses apply_filters()
+ * @uses bbp_set_theme_compat_templates()
+ * @uses bbp_get_query_template()
+ * @return string Path to template file
+ */
+function bbp_get_theme_compat_templates() {
+	$templates = array(
+		'plugin-bbpress.php',
+		'bbpress.php',
+		'forums.php',
+		'forum.php',
+		'generic.php',
+		'page.php',
+		'single.php',
+		'index.php'
+	);
+	return bbp_get_query_template( 'bbpress', $templates );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/theme-compat.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1024 @@
+<?php
+
+/**
+ * bbPress Core Theme Compatibility
+ *
+ * @package bbPress
+ * @subpackage ThemeCompatibility
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Theme Compat **************************************************************/
+
+/**
+ * What follows is an attempt at intercepting the natural page load process
+ * to replace the_content() with the appropriate bbPress content.
+ *
+ * To do this, bbPress does several direct manipulations of global variables
+ * and forces them to do what they are not supposed to be doing.
+ *
+ * Don't try anything you're about to witness here, at home. Ever.
+ */
+
+/** Base Class ****************************************************************/
+
+/**
+ * Theme Compatibility base class
+ *
+ * This is only intended to be extended, and is included here as a basic guide
+ * for future Theme Packs to use. @link BBP_Twenty_Ten is a good example of
+ * extending this class, as is @link bbp_setup_theme_compat()
+ *
+ * @since bbPress (r3506)
+ */
+class BBP_Theme_Compat {
+
+	/**
+	 * Should be like:
+	 *
+	 * array(
+	 *     'id'      => ID of the theme (should be unique)
+	 *     'name'    => Name of the theme (should match style.css)
+	 *     'version' => Theme version for cache busting scripts and styling
+	 *     'dir'     => Path to theme
+	 *     'url'     => URL to theme
+	 * );
+	 * @var array 
+	 */
+	private $_data = array();
+
+	/**
+	 * Pass the $properties to the object on creation.
+	 *
+	 * @since bbPress (r3926)
+	 * @param array $properties
+	 */
+    public function __construct( Array $properties = array() ) {
+		$this->_data = $properties;
+	}
+
+	/**
+	 * Set a theme's property.
+	 *
+	 * @since bbPress (r3926)
+	 * @param string $property
+	 * @param mixed $value
+	 * @return mixed
+	 */
+	public function __set( $property, $value ) {
+		return $this->_data[$property] = $value;
+	}
+
+	/**
+	 * Get a theme's property.
+	 *
+	 * @since bbPress (r3926)
+	 * @param string $property
+	 * @param mixed $value
+	 * @return mixed
+	 */
+	public function __get( $property ) {
+		return array_key_exists( $property, $this->_data ) ? $this->_data[$property] : '';
+	}
+}
+
+/** Functions *****************************************************************/
+
+/**
+ * Setup the default theme compat theme
+ *
+ * @since bbPress (r3311)
+ * @param BBP_Theme_Compat $theme
+ */
+function bbp_setup_theme_compat( $theme = '' ) {
+	$bbp = bbpress();
+
+	// Make sure theme package is available, set to default if not
+	if ( ! isset( $bbp->theme_compat->packages[$theme] ) || ! is_a( $bbp->theme_compat->packages[$theme], 'BBP_Theme_Compat' ) ) {
+		$theme = 'default';
+	}
+
+	// Set the active theme compat theme
+	$bbp->theme_compat->theme = $bbp->theme_compat->packages[$theme];
+}
+
+/**
+ * Gets the name of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_id() {
+	return apply_filters( 'bbp_get_theme_compat_id', bbpress()->theme_compat->theme->id );
+}
+
+/**
+ * Gets the name of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_name() {
+	return apply_filters( 'bbp_get_theme_compat_name', bbpress()->theme_compat->theme->name );
+}
+
+/**
+ * Gets the version of the bbPress compatable theme used, in the event the
+ * currently active WordPress theme does not explicitly support bbPress.
+ * This can be filtered or set manually. Tricky theme authors can override the
+ * default and include their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3506)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_version() {
+	return apply_filters( 'bbp_get_theme_compat_version', bbpress()->theme_compat->theme->version );
+}
+
+/**
+ * Gets the bbPress compatable theme used in the event the currently active
+ * WordPress theme does not explicitly support bbPress. This can be filtered,
+ * or set manually. Tricky theme authors can override the default and include
+ * their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3032)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_dir() {
+	return apply_filters( 'bbp_get_theme_compat_dir', bbpress()->theme_compat->theme->dir );
+}
+
+/**
+ * Gets the bbPress compatable theme used in the event the currently active
+ * WordPress theme does not explicitly support bbPress. This can be filtered,
+ * or set manually. Tricky theme authors can override the default and include
+ * their own bbPress compatability layers for their themes.
+ *
+ * @since bbPress (r3032)
+ * @uses apply_filters()
+ * @return string
+ */
+function bbp_get_theme_compat_url() {
+	return apply_filters( 'bbp_get_theme_compat_url', bbpress()->theme_compat->theme->url );
+}
+
+/**
+ * Gets true/false if page is currently inside theme compatibility
+ *
+ * @since bbPress (r3265)
+ * @return bool
+ */
+function bbp_is_theme_compat_active() {
+	$bbp = bbpress();
+
+	if ( empty( $bbp->theme_compat->active ) )
+		return false;
+
+	return $bbp->theme_compat->active;
+}
+
+/**
+ * Sets true/false if page is currently inside theme compatibility
+ *
+ * @since bbPress (r3265)
+ * @param bool $set
+ * @return bool
+ */
+function bbp_set_theme_compat_active( $set = true ) {
+	bbpress()->theme_compat->active = $set;
+
+	return (bool) bbpress()->theme_compat->active;
+}
+
+/**
+ * Set the theme compat templates global
+ *
+ * Stash possible template files for the current query. Useful if plugins want
+ * to override them, or see what files are being scanned for inclusion.
+ *
+ * @since bbPress (r3311)
+ */
+function bbp_set_theme_compat_templates( $templates = array() ) {
+	bbpress()->theme_compat->templates = $templates;
+
+	return bbpress()->theme_compat->templates;
+}
+
+/**
+ * Set the theme compat template global
+ *
+ * Stash the template file for the current query. Useful if plugins want
+ * to override it, or see what file is being included.
+ *
+ * @since bbPress (r3311)
+ */
+function bbp_set_theme_compat_template( $template = '' ) {
+	bbpress()->theme_compat->template = $template;
+
+	return bbpress()->theme_compat->template;
+}
+
+/**
+ * Set the theme compat original_template global
+ *
+ * Stash the original template file for the current query. Useful for checking
+ * if bbPress was able to find a more appropriate template.
+ *
+ * @since bbPress (r3926)
+ */
+function bbp_set_theme_compat_original_template( $template = '' ) {
+	bbpress()->theme_compat->original_template = $template;
+
+	return bbpress()->theme_compat->original_template;
+}
+
+/**
+ * Set the theme compat original_template global
+ *
+ * Stash the original template file for the current query. Useful for checking
+ * if bbPress was able to find a more appropriate template.
+ *
+ * @since bbPress (r3926)
+ */
+function bbp_is_theme_compat_original_template( $template = '' ) {
+	$bbp = bbpress();
+
+	if ( empty( $bbp->theme_compat->original_template ) )
+		return false;
+
+	return (bool) ( $bbp->theme_compat->original_template == $template );
+}
+
+/**
+ * Register a new bbPress theme package to the active theme packages array
+ *
+ * @since bbPress (r3829)
+ * @param array $theme
+ */
+function bbp_register_theme_package( $theme = array(), $override = true ) {
+
+	// Create new BBP_Theme_Compat object from the $theme array
+	if ( is_array( $theme ) )
+		$theme = new BBP_Theme_Compat( $theme );
+
+	// Bail if $theme isn't a proper object
+	if ( ! is_a( $theme, 'BBP_Theme_Compat' ) )
+		return;
+
+	// Load up bbPress
+	$bbp = bbpress();
+
+	// Only override if the flag is set and not previously registered
+	if ( empty( $bbp->theme_compat->packages[$theme->id] ) || ( true === $override ) ) {
+		$bbp->theme_compat->packages[$theme->id] = $theme;
+	}
+}
+/**
+ * This fun little function fills up some WordPress globals with dummy data to
+ * stop your average page template from complaining about it missing.
+ *
+ * @since bbPress (r3108)
+ * @global WP_Query $wp_query
+ * @global object $post
+ * @param array $args
+ */
+function bbp_theme_compat_reset_post( $args = array() ) {
+	global $wp_query, $post;
+
+	// Default arguments
+	$defaults = array(
+		'ID'                    => -9999,
+		'post_status'           => bbp_get_public_status_id(),
+		'post_author'           => 0,
+		'post_parent'           => 0,
+		'post_type'             => 'page',
+		'post_date'             => 0,
+		'post_date_gmt'         => 0,
+		'post_modified'         => 0,
+		'post_modified_gmt'     => 0,
+		'post_content'          => '',
+		'post_title'            => '',
+		'post_excerpt'          => '',
+		'post_content_filtered' => '',
+		'post_mime_type'        => '',
+		'post_password'         => '',
+		'post_name'             => '',
+		'guid'                  => '',
+		'menu_order'            => 0,
+		'pinged'                => '',
+		'to_ping'               => '',
+		'ping_status'           => '',
+		'comment_status'        => 'closed',
+		'comment_count'         => 0,
+
+		'is_404'          => false,
+		'is_page'         => false,
+		'is_single'       => false,
+		'is_archive'      => false,
+		'is_tax'          => false,
+	);
+
+	// Switch defaults if post is set
+	if ( isset( $wp_query->post ) ) {		  
+		$defaults = array(
+			'ID'                    => $wp_query->post->ID,
+			'post_status'           => $wp_query->post->post_status,
+			'post_author'           => $wp_query->post->post_author,
+			'post_parent'           => $wp_query->post->post_parent,
+			'post_type'             => $wp_query->post->post_type,
+			'post_date'             => $wp_query->post->post_date,
+			'post_date_gmt'         => $wp_query->post->post_date_gmt,
+			'post_modified'         => $wp_query->post->post_modified,
+			'post_modified_gmt'     => $wp_query->post->post_modified_gmt,
+			'post_content'          => $wp_query->post->post_content,
+			'post_title'            => $wp_query->post->post_title,
+			'post_excerpt'          => $wp_query->post->post_excerpt,
+			'post_content_filtered' => $wp_query->post->post_content_filtered,
+			'post_mime_type'        => $wp_query->post->post_mime_type,
+			'post_password'         => $wp_query->post->post_password,
+			'post_name'             => $wp_query->post->post_name,
+			'guid'                  => $wp_query->post->guid,
+			'menu_order'            => $wp_query->post->menu_order,
+			'pinged'                => $wp_query->post->pinged,
+			'to_ping'               => $wp_query->post->to_ping,
+			'ping_status'           => $wp_query->post->ping_status,
+			'comment_status'        => $wp_query->post->comment_status,
+			'comment_count'         => $wp_query->post->comment_count,
+
+			'is_404'          => false,
+			'is_page'         => false,
+			'is_single'       => false,
+			'is_archive'      => false,
+			'is_tax'          => false,
+		);
+	}
+	$dummy = bbp_parse_args( $args, $defaults, 'theme_compat_reset_post' );
+
+	// Clear out the post related globals
+	unset( $wp_query->posts );
+	unset( $wp_query->post  );
+	unset( $post            );
+
+	// Setup the dummy post object
+	$wp_query->post                        = new stdClass; 
+	$wp_query->post->ID                    = $dummy['ID'];
+	$wp_query->post->post_status           = $dummy['post_status'];
+	$wp_query->post->post_author           = $dummy['post_author'];
+	$wp_query->post->post_parent           = $dummy['post_parent'];
+	$wp_query->post->post_type             = $dummy['post_type'];
+	$wp_query->post->post_date             = $dummy['post_date'];
+	$wp_query->post->post_date_gmt         = $dummy['post_date_gmt'];
+	$wp_query->post->post_modified         = $dummy['post_modified'];
+	$wp_query->post->post_modified_gmt     = $dummy['post_modified_gmt'];
+	$wp_query->post->post_content          = $dummy['post_content'];
+	$wp_query->post->post_title            = $dummy['post_title'];
+	$wp_query->post->post_excerpt          = $dummy['post_excerpt'];
+	$wp_query->post->post_content_filtered = $dummy['post_content_filtered'];
+	$wp_query->post->post_mime_type        = $dummy['post_mime_type'];
+	$wp_query->post->post_password         = $dummy['post_password'];
+	$wp_query->post->post_name             = $dummy['post_name'];
+	$wp_query->post->guid                  = $dummy['guid'];
+	$wp_query->post->menu_order            = $dummy['menu_order'];
+	$wp_query->post->pinged                = $dummy['pinged'];
+	$wp_query->post->to_ping               = $dummy['to_ping'];
+	$wp_query->post->ping_status           = $dummy['ping_status'];
+	$wp_query->post->comment_status        = $dummy['comment_status'];
+	$wp_query->post->comment_count         = $dummy['comment_count'];
+
+	// Set the $post global
+	$post = $wp_query->post;
+
+	// Setup the dummy post loop
+	$wp_query->posts[0] = $wp_query->post;
+
+	// Prevent comments form from appearing
+	$wp_query->post_count = 1;
+	$wp_query->is_404     = $dummy['is_404'];
+	$wp_query->is_page    = $dummy['is_page'];
+	$wp_query->is_single  = $dummy['is_single'];
+	$wp_query->is_archive = $dummy['is_archive'];
+	$wp_query->is_tax     = $dummy['is_tax'];
+
+	/**
+	 * Force the header back to 200 status if not a deliberate 404
+	 *
+	 * @see http://bbpress.trac.wordpress.org/ticket/1973
+	 */
+	if ( ! $wp_query->is_404() )
+		status_header( 200 );
+
+	// If we are resetting a post, we are in theme compat
+	bbp_set_theme_compat_active();
+}
+
+/**
+ * Reset main query vars and filter 'the_content' to output a bbPress
+ * template part as needed.
+ *
+ * @since bbPress (r3032)
+ * @param string $template
+ * @uses bbp_is_single_user() To check if page is single user
+ * @uses bbp_get_single_user_template() To get user template
+ * @uses bbp_is_single_user_edit() To check if page is single user edit
+ * @uses bbp_get_single_user_edit_template() To get user edit template
+ * @uses bbp_is_single_view() To check if page is single view
+ * @uses bbp_get_single_view_template() To get view template
+ * @uses bbp_is_forum_edit() To check if page is forum edit
+ * @uses bbp_get_forum_edit_template() To get forum edit template
+ * @uses bbp_is_topic_merge() To check if page is topic merge
+ * @uses bbp_get_topic_merge_template() To get topic merge template
+ * @uses bbp_is_topic_split() To check if page is topic split
+ * @uses bbp_get_topic_split_template() To get topic split template
+ * @uses bbp_is_topic_edit() To check if page is topic edit
+ * @uses bbp_get_topic_edit_template() To get topic edit template
+ * @uses bbp_is_reply_edit() To check if page is reply edit
+ * @uses bbp_get_reply_edit_template() To get reply edit template
+ * @uses bbp_set_theme_compat_template() To set the global theme compat template
+ */
+function bbp_template_include_theme_compat( $template = '' ) {
+
+	// Bail if the template already matches a bbPress template. This includes
+	// archive-* and single-* WordPress post_type matches (allowing
+	// themes to use the expected format) as well as all bbPress-specific
+	// template files for users, topics, forums, etc...
+	if ( !empty( bbpress()->theme_compat->bbpress_template ) )
+		return $template;
+
+	/** Users *************************************************************/
+
+	if ( bbp_is_single_user_edit() || bbp_is_single_user() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_title'     => esc_attr( bbp_get_displayed_user_field( 'display_name' ) ),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => false,
+			'comment_status' => 'closed'
+		) );
+
+	/** Forums ************************************************************/
+
+	// Forum archive
+	} elseif ( bbp_is_forum_archive() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_forum_archive_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_forum_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => true,
+			'comment_status' => 'closed'
+		) );
+
+	// Single Forum
+	} elseif ( bbp_is_forum_edit() || bbp_is_single_forum() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_forum_id(),
+			'post_title'     => bbp_get_forum_title(),
+			'post_author'    => bbp_get_forum_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_forum_id() ),
+			'post_type'      => bbp_get_forum_post_type(),
+			'post_status'    => bbp_get_forum_visibility(),
+			'is_single'      => true,
+			'comment_status' => 'closed'
+		) );
+
+	/** Topics ************************************************************/
+
+	// Topic archive
+	} elseif ( bbp_is_topic_archive() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_topic_archive_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_topic_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'is_archive'     => true,
+			'comment_status' => 'closed'
+		) );
+
+	// Single Topic
+	} elseif ( bbp_is_topic_edit() || bbp_is_single_topic() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_topic_id(),
+			'post_title'     => bbp_get_topic_title(),
+			'post_author'    => bbp_get_topic_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_topic_id() ),
+			'post_type'      => bbp_get_topic_post_type(),
+			'post_status'    => bbp_get_topic_status(),
+			'is_single'      => true,
+			'comment_status' => 'closed'
+		) );
+
+	/** Replies ***********************************************************/
+
+	// Reply archive
+	} elseif ( is_post_type_archive( bbp_get_reply_post_type() ) ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => __( 'Replies', 'bbpress' ),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => bbp_get_reply_post_type(),
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+
+	// Single Reply
+	} elseif ( bbp_is_reply_edit() || bbp_is_single_reply() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => bbp_get_reply_id(),
+			'post_title'     => bbp_get_reply_title(),
+			'post_author'    => bbp_get_reply_author_id(),
+			'post_date'      => 0,
+			'post_content'   => get_post_field( 'post_content', bbp_get_reply_id() ),
+			'post_type'      => bbp_get_reply_post_type(),
+			'post_status'    => bbp_get_reply_status(),
+			'comment_status' => 'closed'
+		) );
+
+	/** Views *************************************************************/
+
+	} elseif ( bbp_is_single_view() ) {
+
+		// Reset post
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_title'     => bbp_get_view_title(),
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+
+	/** Topic Tags ********************************************************/
+
+	// Topic Tag Edit
+	} elseif ( bbp_is_topic_tag_edit() || bbp_is_topic_tag() ) {
+
+		// Stash the current term in a new var
+		set_query_var( 'bbp_topic_tag', get_query_var( 'term' ) );
+
+		// Reset the post with our new title
+		bbp_theme_compat_reset_post( array(
+			'ID'             => 0,
+			'post_author'    => 0,
+			'post_date'      => 0,
+			'post_content'   => '',
+			'post_type'      => '',
+			'post_title'     => sprintf( __( 'Topic Tag: %s', 'bbpress' ), '<span>' . bbp_get_topic_tag_name() . '</span>' ),
+			'post_status'    => bbp_get_public_status_id(),
+			'comment_status' => 'closed'
+		) );
+	}
+
+	/**
+	 * If we are relying on bbPress's built in theme compatibility to load
+	 * the proper content, we need to intercept the_content, replace the
+	 * output, and display ours instead.
+	 *
+	 * To do this, we first remove all filters from 'the_content' and hook
+	 * our own function into it, which runs a series of checks to determine
+	 * the context, and then uses the built in shortcodes to output the
+	 * correct results from inside an output buffer.
+	 *
+	 * Uses bbp_get_theme_compat_templates() to provide fall-backs that
+	 * should be coded without superfluous mark-up and logic (prev/next
+	 * navigation, comments, date/time, etc...)
+	 * 
+	 * Hook into the 'bbp_get_bbpress_template' to override the array of
+	 * possible templates, or 'bbp_bbpress_template' to override the result.
+	 */
+	if ( bbp_is_theme_compat_active() ) {
+
+		// Remove all filters from the_content
+		bbp_remove_all_filters( 'the_content' );
+
+		// Add a filter on the_content late, which we will later remove
+		add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// Find the appropriate template file
+		$template = bbp_get_theme_compat_templates();
+	}
+
+	return apply_filters( 'bbp_template_include_theme_compat', $template );
+}
+
+/**
+ * Replaces the_content() if the post_type being displayed is one that would
+ * normally be handled by bbPress, but proper single page templates do not
+ * exist in the currently active theme.
+ *
+ * @since bbPress (r3034)
+ * @param string $content
+ * @return type
+ */
+function bbp_replace_the_content( $content = '' ) {
+
+	// Bail if not inside the main query loop
+	if ( ! in_the_loop() || ! is_main_query() )
+		return $content;
+
+	$bbp = bbpress();
+
+	// Define local variable(s)
+	$new_content = '';
+
+	// Bail if shortcodes are unset somehow
+	if ( !is_a( $bbp->shortcodes, 'BBP_Shortcodes' ) )
+		return $content;
+
+	// Use shortcode API to display forums/topics/replies because they are
+	// already output buffered and ready to fit inside the_content
+
+	/** Users *************************************************************/
+
+	// Profile View
+	if ( bbp_is_single_user_edit() || bbp_is_single_user() ) {
+		ob_start();
+
+		bbp_get_template_part( 'content', 'single-user' );
+
+		$new_content = ob_get_contents();
+
+		ob_end_clean();
+
+	/** Forums ************************************************************/
+
+	// Forum archive
+	} elseif ( bbp_is_forum_archive() ) {
+
+		// Page exists where this archive should be
+		$page = bbp_get_page_by_path( bbp_get_root_slug() );
+		if ( !empty( $page ) ) {
+
+			// Restore previously unset filters
+			bbp_restore_all_filters( 'the_content' );
+
+			// Remove 'bbp_replace_the_content' filter to prevent infinite loops
+			remove_filter( 'the_content', 'bbp_replace_the_content' );
+
+			// Start output buffer
+			ob_start();
+
+			// Grab the content of this page
+			$new_content = apply_filters( 'the_content', $page->post_content );
+
+			// Clean up the buffer
+			ob_end_clean();
+
+			// Add 'bbp_replace_the_content' filter back (@see $this::start())
+			add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// No page so show the archive
+		} else {
+			$new_content = $bbp->shortcodes->display_forum_index();
+		}
+
+	// Forum Edit
+	} elseif ( bbp_is_forum_edit() ) {
+		$new_content = $bbp->shortcodes->display_forum_form();
+
+	// Single Forum
+	} elseif ( bbp_is_single_forum() ) {
+		$new_content = $bbp->shortcodes->display_forum( array( 'id' => get_the_ID() ) );
+
+	/** Topics ************************************************************/
+
+	// Topic archive
+	} elseif ( bbp_is_topic_archive() ) {
+
+		// Page exists where this archive should be
+		$page = bbp_get_page_by_path( bbp_get_topic_archive_slug() );
+		if ( !empty( $page ) ) {
+
+			// Restore previously unset filters
+			bbp_restore_all_filters( 'the_content' );
+
+			// Remove 'bbp_replace_the_content' filter to prevent infinite loops
+			remove_filter( 'the_content', 'bbp_replace_the_content' );
+
+			// Start output buffer
+			ob_start();
+
+			// Grab the content of this page
+			$new_content = apply_filters( 'the_content', $page->post_content );
+
+			// Clean up the buffer
+			ob_end_clean();
+
+			// Add 'bbp_replace_the_content' filter back (@see $this::start())
+			add_filter( 'the_content', 'bbp_replace_the_content' );
+
+		// No page so show the archive
+		} else {
+			$new_content = $bbp->shortcodes->display_topic_index();
+		}
+
+	// Topic Edit
+	} elseif ( bbp_is_topic_edit() ) {
+
+		// Split
+		if ( bbp_is_topic_split() ) {
+			ob_start();
+
+			bbp_get_template_part( 'form', 'topic-split' );
+
+			$new_content = ob_get_contents();
+
+			ob_end_clean();
+
+		// Merge
+		} elseif ( bbp_is_topic_merge() ) {
+			ob_start();
+
+			bbp_get_template_part( 'form', 'topic-merge' );
+
+			$new_content = ob_get_contents();
+
+			ob_end_clean();
+
+		// Edit
+		} else {
+			$new_content = $bbp->shortcodes->display_topic_form();
+		}
+
+	// Single Topic
+	} elseif ( bbp_is_single_topic() ) {
+		$new_content = $bbp->shortcodes->display_topic( array( 'id' => get_the_ID() ) );
+
+	/** Replies ***********************************************************/
+
+	// Reply archive
+	} elseif ( is_post_type_archive( bbp_get_reply_post_type() ) ) {
+		//$new_content = $bbp->shortcodes->display_reply_index();
+
+	// Reply Edit
+	} elseif ( bbp_is_reply_edit() ) {
+		$new_content = $bbp->shortcodes->display_reply_form();
+
+	// Single Reply
+	} elseif ( bbp_is_single_reply() ) {
+		$new_content = $bbp->shortcodes->display_reply( array( 'id' => get_the_ID() ) );
+
+	/** Views *************************************************************/
+
+	} elseif ( bbp_is_single_view() ) {
+		$new_content = $bbp->shortcodes->display_view( array( 'id' => get_query_var( 'bbp_view' ) ) );
+
+	/** Topic Tags ********************************************************/
+
+	// Show topics of tag
+	} elseif ( bbp_is_topic_tag() ) {
+		$new_content = $bbp->shortcodes->display_topics_of_tag( array( 'id' => bbp_get_topic_tag_id() ) );
+
+	// Edit topic tag
+	} elseif ( bbp_is_topic_tag_edit() ) {
+		$new_content = $bbp->shortcodes->display_topic_tag_form();
+	}
+
+	// Juggle the content around and try to prevent unsightly comments
+	if ( !empty( $new_content ) && ( $new_content != $content ) ) {
+
+		// Set the content to be the new content
+		$content = apply_filters( 'bbp_replace_the_content', $new_content, $content );
+
+		// Clean up after ourselves
+		unset( $new_content );
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+
+	// Return possibly hi-jacked content
+	return $content;
+}
+
+/** Helpers *******************************************************************/
+
+/**
+ * Remove the canonical redirect to allow pretty pagination
+ *
+ * @since bbPress (r2628)
+ * @param string $redirect_url Redirect url
+ * @uses WP_Rewrite::using_permalinks() To check if the blog is using permalinks
+ * @uses bbp_get_paged() To get the current page number
+ * @uses bbp_is_single_topic() To check if it's a topic page
+ * @uses bbp_is_single_forum() To check if it's a forum page
+ * @return bool|string False if it's a topic/forum and their first page,
+ *                      otherwise the redirect url
+ */
+function bbp_redirect_canonical( $redirect_url ) {
+	global $wp_rewrite;
+
+	// Canonical is for the beautiful
+	if ( $wp_rewrite->using_permalinks() ) {
+
+		// If viewing beyond page 1 of several
+		if ( 1 < bbp_get_paged() ) {
+
+			// Only on single topics...
+			if ( bbp_is_single_topic() ) {
+				$redirect_url = false;
+
+			// ...and single forums...
+			} elseif ( bbp_is_single_forum() ) {
+				$redirect_url = false;
+
+			// ...and single replies...
+			} elseif ( bbp_is_single_reply() ) {
+				$redirect_url = false;
+
+			// ...and any single anything else...
+			//
+			// @todo - Find a more accurate way to disable paged canonicals for
+			//          paged shortcode usage within other posts.
+			} elseif ( is_page() || is_singular() ) {
+				$redirect_url = false;
+			}
+
+		// If editing a topic
+		} elseif ( bbp_is_topic_edit() ) {
+			$redirect_url = false;
+
+		// If editing a reply
+		} elseif ( bbp_is_reply_edit() ) {
+			$redirect_url = false;
+		}
+	}
+
+	return $redirect_url;
+}
+
+/** Filters *******************************************************************/
+
+/**
+ * Removes all filters from a WordPress filter, and stashes them in the $bbp
+ * global in the event they need to be restored later.
+ *
+ * @since bbPress (r3251)
+ * @global WP_filter $wp_filter
+ * @global array $merged_filters
+ * @param string $tag
+ * @param int $priority
+ * @return bool
+ */
+function bbp_remove_all_filters( $tag, $priority = false ) {
+	global $wp_filter, $merged_filters;
+
+	$bbp = bbpress();
+
+	// Filters exist
+	if ( isset( $wp_filter[$tag] ) ) {
+
+		// Filters exist in this priority
+		if ( !empty( $priority ) && isset( $wp_filter[$tag][$priority] ) ) {
+
+			// Store filters in a backup
+			$bbp->filters->wp_filter[$tag][$priority] = $wp_filter[$tag][$priority];
+
+			// Unset the filters
+			unset( $wp_filter[$tag][$priority] );
+
+		// Priority is empty
+		} else {
+
+			// Store filters in a backup
+			$bbp->filters->wp_filter[$tag] = $wp_filter[$tag];
+
+			// Unset the filters
+			unset( $wp_filter[$tag] );
+		}
+	}
+
+	// Check merged filters
+	if ( isset( $merged_filters[$tag] ) ) {
+
+		// Store filters in a backup
+		$bbp->filters->merged_filters[$tag] = $merged_filters[$tag];
+
+		// Unset the filters
+		unset( $merged_filters[$tag] );
+	}
+
+	return true;
+}
+
+/**
+ * Restores filters from the $bbp global that were removed using
+ * bbp_remove_all_filters()
+ *
+ * @since bbPress (r3251)
+ * @global WP_filter $wp_filter
+ * @global array $merged_filters
+ * @param string $tag
+ * @param int $priority
+ * @return bool
+ */
+function bbp_restore_all_filters( $tag, $priority = false ) {
+	global $wp_filter, $merged_filters;
+
+	$bbp = bbpress();
+
+	// Filters exist
+	if ( isset( $bbp->filters->wp_filter[$tag] ) ) {
+
+		// Filters exist in this priority
+		if ( !empty( $priority ) && isset( $bbp->filters->wp_filter[$tag][$priority] ) ) {
+
+			// Store filters in a backup
+			$wp_filter[$tag][$priority] = $bbp->filters->wp_filter[$tag][$priority];
+
+			// Unset the filters
+			unset( $bbp->filters->wp_filter[$tag][$priority] );
+
+		// Priority is empty
+		} else {
+
+			// Store filters in a backup
+			$wp_filter[$tag] = $bbp->filters->wp_filter[$tag];
+
+			// Unset the filters
+			unset( $bbp->filters->wp_filter[$tag] );
+		}
+	}
+
+	// Check merged filters
+	if ( isset( $bbp->filters->merged_filters[$tag] ) ) {
+
+		// Store filters in a backup
+		$merged_filters[$tag] = $bbp->filters->merged_filters[$tag];
+
+		// Unset the filters
+		unset( $bbp->filters->merged_filters[$tag] );
+	}
+
+	return true;
+}
+
+/**
+ * Force comments_status to 'closed' for bbPress post types
+ *
+ * @since bbPress (r3589)
+ * @param bool $open True if open, false if closed
+ * @param int $post_id ID of the post to check
+ * @return bool True if open, false if closed
+ */
+function bbp_force_comment_status( $open, $post_id = 0 ) {
+
+	// Get the post type of the post ID
+	$post_type = get_post_type( $post_id );
+
+	// Default return value is what is passed in $open
+	$retval = $open;
+
+	// Only force for bbPress post types
+	switch ( $post_type ) {
+		case bbp_get_forum_post_type() :
+		case bbp_get_topic_post_type() :
+		case bbp_get_reply_post_type() :
+			$retval = false;
+			break;
+	}
+
+	// Allow override of the override
+	return apply_filters( 'bbp_force_comment_status', $retval, $open, $post_id, $post_type );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/core/update.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,291 @@
+<?php
+
+/**
+ * bbPress Updater
+ *
+ * @package bbPress
+ * @subpackage Updater
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * If there is no raw DB version, this is the first installation
+ *
+ * @since bbPress (r3764)
+ *
+ * @uses get_option()
+ * @uses bbp_get_db_version() To get bbPress's database version
+ * @return bool True if update, False if not
+ */
+function bbp_is_install() {
+	return ! bbp_get_db_version_raw();
+}
+
+/**
+ * Compare the bbPress version to the DB version to determine if updating
+ *
+ * @since bbPress (r3421)
+ *
+ * @uses get_option()
+ * @uses bbp_get_db_version() To get bbPress's database version
+ * @return bool True if update, False if not
+ */
+function bbp_is_update() {
+	$raw    = (int) bbp_get_db_version_raw();
+	$cur    = (int) bbp_get_db_version();
+	$retval = (bool) ( $raw < $cur );
+	return $retval;
+}
+
+/**
+ * Determine if bbPress is being activated
+ *
+ * Note that this function currently is not used in bbPress core and is here
+ * for third party plugins to use to check for bbPress activation.
+ *
+ * @since bbPress (r3421)
+ *
+ * @return bool True if activating bbPress, false if not
+ */
+function bbp_is_activation( $basename = '' ) {
+	$bbp = bbpress();
+
+	$action = false;
+	if ( ! empty( $_REQUEST['action'] ) && ( '-1' != $_REQUEST['action'] ) )
+		$action = $_REQUEST['action'];
+	elseif ( ! empty( $_REQUEST['action2'] ) && ( '-1' != $_REQUEST['action2'] ) )
+		$action = $_REQUEST['action2'];
+
+	// Bail if not activating
+	if ( empty( $action ) || !in_array( $action, array( 'activate', 'activate-selected' ) ) )
+		return false;
+
+	// The plugin(s) being activated
+	if ( $action == 'activate' ) {
+		$plugins = isset( $_GET['plugin'] ) ? array( $_GET['plugin'] ) : array();
+	} else {
+		$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
+	}
+
+	// Set basename if empty
+	if ( empty( $basename ) && !empty( $bbp->basename ) )
+		$basename = $bbp->basename;
+
+	// Bail if no basename
+	if ( empty( $basename ) )
+		return false;
+
+	// Is bbPress being activated?
+	return in_array( $basename, $plugins );
+}
+
+/**
+ * Determine if bbPress is being deactivated
+ *
+ * @since bbPress (r3421)
+ * @return bool True if deactivating bbPress, false if not
+ */
+function bbp_is_deactivation( $basename = '' ) {
+	$bbp = bbpress();
+
+	$action = false;
+	if ( ! empty( $_REQUEST['action'] ) && ( '-1' != $_REQUEST['action'] ) )
+		$action = $_REQUEST['action'];
+	elseif ( ! empty( $_REQUEST['action2'] ) && ( '-1' != $_REQUEST['action2'] ) )
+		$action = $_REQUEST['action2'];
+
+	// Bail if not deactivating
+	if ( empty( $action ) || !in_array( $action, array( 'deactivate', 'deactivate-selected' ) ) )
+		return false;
+
+	// The plugin(s) being deactivated
+	if ( $action == 'deactivate' ) {
+		$plugins = isset( $_GET['plugin'] ) ? array( $_GET['plugin'] ) : array();
+	} else {
+		$plugins = isset( $_POST['checked'] ) ? (array) $_POST['checked'] : array();
+	}
+
+	// Set basename if empty
+	if ( empty( $basename ) && !empty( $bbp->basename ) )
+		$basename = $bbp->basename;
+
+	// Bail if no basename
+	if ( empty( $basename ) )
+		return false;
+
+	// Is bbPress being deactivated?
+	return in_array( $basename, $plugins );
+}
+
+/**
+ * Update the DB to the latest version
+ *
+ * @since bbPress (r3421)
+ * @uses update_option()
+ * @uses bbp_get_db_version() To get bbPress's database version
+ */
+function bbp_version_bump() {
+	$db_version = bbp_get_db_version();
+	update_option( '_bbp_db_version', $db_version );
+}
+
+/**
+ * Setup the bbPress updater
+ *
+ * @since bbPress (r3419)
+ *
+ * @uses bbp_version_updater()
+ * @uses bbp_version_bump()
+ * @uses flush_rewrite_rules()
+ */
+function bbp_setup_updater() {
+
+	// Bail if no update needed
+	if ( ! bbp_is_update() )
+		return;
+
+	// Call the automated updater
+	bbp_version_updater();
+}
+
+/**
+ * Create a default forum, topic, and reply
+ *
+ * @since bbPress (r3767)
+ * @param array $args Array of arguments to override default values
+ */
+function bbp_create_initial_content( $args = array() ) {
+
+	$defaults = array(
+		'forum_parent'  => 0,
+		'forum_status'  => 'publish',
+		'forum_title'   => __( 'General',                                  'bbpress' ),
+		'forum_content' => __( 'General chit-chat',                        'bbpress' ),
+		'topic_title'   => __( 'Hello World!',                             'bbpress' ),
+		'topic_content' => __( 'I am the first topic in your new forums.', 'bbpress' ),
+		'reply_title'   => __( 'Re: Hello World!',                         'bbpress' ),
+		'reply_content' => __( 'Oh, and this is what a reply looks like.', 'bbpress' ),
+	);
+	$r = bbp_parse_args( $args, $defaults, 'create_initial_content' );
+	extract( $r );
+
+	// Create the initial forum
+	$forum_id = bbp_insert_forum( array(
+		'post_parent'  => $forum_parent,
+		'post_status'  => $forum_status,
+		'post_title'   => $forum_title,
+		'post_content' => $forum_content
+	) );
+
+	// Create the initial topic
+	$topic_id = bbp_insert_topic(
+		array(
+			'post_parent'  => $forum_id,
+			'post_title'   => $topic_title,
+			'post_content' => $topic_content
+		),
+		array( 'forum_id'  => $forum_id )
+	);
+
+	// Create the initial reply
+	$reply_id = bbp_insert_reply(
+		array(
+			'post_parent'  => $topic_id,
+			'post_title'   => $reply_title,
+			'post_content' => $reply_content
+		),
+		array(
+			'forum_id'     => $forum_id,
+			'topic_id'     => $topic_id
+		)
+	);
+
+	return array(
+		'forum_id' => $forum_id,
+		'topic_id' => $topic_id,
+		'reply_id' => $reply_id
+	);
+}
+
+/**
+ * bbPress's version updater looks at what the current database version is, and
+ * runs whatever other code is needed.
+ *
+ * This is most-often used when the data schema changes, but should also be used
+ * to correct issues with bbPress meta-data silently on software update.
+ *
+ * @since bbPress (r4104)
+ */
+function bbp_version_updater() {
+
+	// Get the raw database version
+	$raw_db_version = (int) bbp_get_db_version_raw();
+
+	/** 2.0 Branch ************************************************************/
+
+	// 2.0, 2.0.1, 2.0.2, 2.0.3
+	if ( $raw_db_version < 200 ) {
+		// Do nothing
+	}
+
+	/** 2.1 Branch ************************************************************/
+
+	// 2.1, 2.1.1
+	if ( $raw_db_version < 211 ) {
+
+		/**
+		 * Repair private and hidden forum data
+		 *
+		 * @link http://bbpress.trac.wordpress.org/ticket/1891
+		 */
+		bbp_admin_repair_forum_visibility();
+	}
+
+	/** 2.2 Branch ************************************************************/
+
+	// 2.2
+	if ( $raw_db_version < 220 ) {
+
+		// Remove bbPress 1.1 roles (BuddyPress)
+		remove_role( 'member'    );
+		remove_role( 'inactive'  );
+		remove_role( 'blocked'   );
+		remove_role( 'moderator' );
+		remove_role( 'keymaster' );
+
+		// Refresh capabilities
+		bbp_remove_caps();
+	}
+
+	/** All done! *************************************************************/
+
+	// Bump the version
+	bbp_version_bump();
+
+	// Delete rewrite rules to force a flush
+	bbp_delete_rewrite_rules();
+}
+
+/**
+ * Redirect user to bbPress's What's New page on activation
+ *
+ * @since bbPress (r4389)
+ *
+ * @internal Used internally to redirect bbPress to the about page on activation
+ *
+ * @uses is_network_admin() To bail if being network activated
+ * @uses set_transient() To drop the activation transient for 30 seconds
+ *
+ * @return If network admin or bulk activation
+ */
+function bbp_add_activation_redirect() {
+
+	// Bail if activating from network, or bulk
+	if ( is_network_admin() || isset( $_GET['activate-multi'] ) )
+		return;
+
+	// Add the transient to redirect
+    set_transient( '_bbp_activation_redirect', true, 30 );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/akismet.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,686 @@
+<?php
+
+/**
+ * Main bbPress Akismet Class
+ *
+ * @package bbPress
+ * @subpackage Akismet
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Akismet' ) ) :
+/**
+ * Loads Akismet extension
+ *
+ * @since bbPress (r3277)
+ *
+ * @package bbPress
+ * @subpackage Akismet
+ */
+class BBP_Akismet {
+
+	/**
+	 * The main bbPress Akismet loader
+	 *
+	 * @since bbPress (r3277)
+	 *
+	 * @uses add_filter()
+	 */
+	public function __construct() {
+		$this->setup_actions();
+	}
+
+	/**
+	 * Setup the admin hooks
+	 *
+	 * @since bbPress (r3277)
+	 * @access private
+	 *
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		// Prevent debug notices
+		$checks = array();
+
+		// bbPress functions to check for spam
+		$checks['check']  = array(
+			'bbp_new_topic_pre_insert'  => 1,  // New topic check
+			'bbp_new_reply_pre_insert'  => 1,  // New reply check
+			'bbp_edit_topic_pre_insert' => 1,  // Edit topic check
+			'bbp_edit_reply_pre_insert' => 1   // Edit reply check
+		);
+
+		// bbPress functions for spam and ham submissions
+		$checks['submit'] = array(
+			'bbp_spammed_topic'   => 10, // Spammed topic
+			'bbp_unspammed_topic' => 10, // Unspammed reply
+			'bbp_spammed_reply'   => 10, // Spammed reply
+			'bbp_unspammed_reply' => 10, // Unspammed reply
+		);
+
+		// Add the checks
+		foreach ( $checks as $type => $functions )
+			foreach( $functions as $function => $priority )
+				add_filter( $function, array( $this, $type . '_post'  ), $priority );
+
+		// Update post meta
+		add_action( 'wp_insert_post', array( $this, 'update_post_meta' ), 10, 2 );
+	}
+
+	/**
+	 * Converts topic/reply data into Akismet comment checking format
+	 *
+	 * @since bbPress (r3277)
+	 *
+	 * @param string $post_data
+	 *
+	 * @uses get_userdata() To get the user data
+	 * @uses bbp_filter_anonymous_user_data() To get anonymous user data
+	 * @uses bbp_get_topic_permalink() To get the permalink of the topic
+	 * @uses bbp_get_reply_url() To get the permalink of the reply
+	 * @uses bbp_current_author_ip() To get the IP address of the current user
+	 * @uses BBP_Akismet::maybe_spam() To check if post is spam
+	 * @uses akismet_get_user_roles() To get the role(s) of the current user
+	 * @uses do_action() To call the 'bbp_akismet_spam_caught' hook
+	 * @uses add_filter() To call the 'bbp_new_reply_pre_set_terms' hook
+	 *
+	 * @return array Array of post data
+	 */
+	public function check_post( $post_data ) {
+
+		// Define local variables
+		$user_data = array();
+		$post_permalink = '';
+
+		// Post is not published
+		if ( bbp_get_public_status_id() != $post_data['post_status'] )
+			return $post_data;
+
+		// Cast the post_author to 0 if it's empty
+		if ( empty( $post_data['post_author'] ) )
+			$post_data['post_author'] = 0;
+
+		/** Author ************************************************************/
+
+		// Get user data
+		$userdata       = get_userdata( $post_data['post_author'] );
+		$anonymous_data = bbp_filter_anonymous_post_data();
+
+		// Author is anonymous
+		if ( !empty( $anonymous_data ) ) {
+			$user_data['name']    = $anonymous_data['bbp_anonymous_name'];
+			$user_data['email']   = $anonymous_data['bbp_anonymous_name'];
+			$user_data['website'] = $anonymous_data['bbp_anonymous_name'];
+
+		// Author is logged in
+		} elseif ( !empty( $userdata ) ) {
+			$user_data['name']    = $userdata->display_name;
+			$user_data['email']   = $userdata->user_email;
+			$user_data['website'] = $userdata->user_url;
+
+		// Missing author data, so set some empty strings
+		} else {
+			$user_data['name']    = '';
+			$user_data['email']   = '';
+			$user_data['website'] = '';
+		}
+
+		/** Post **************************************************************/
+
+		// Use post parent for permalink
+		if ( !empty( $post_data['post_parent'] ) )
+			$post_permalink = get_permalink( $post_data['post_parent'] );
+
+		// Put post_data back into usable array
+		$_post = array(
+			'comment_author'       => $user_data['name'],
+			'comment_author_email' => $user_data['email'],
+			'comment_author_url'   => $user_data['website'],
+			'comment_content'      => $post_data['post_content'],
+			'comment_post_ID'      => $post_data['post_parent'],
+			'comment_type'         => $post_data['post_type'],
+			'permalink'            => $post_permalink,
+			'referrer'             => $_SERVER['HTTP_REFERER'],
+			'user_agent'           => $_SERVER['HTTP_USER_AGENT'],
+			'user_ID'              => $post_data['post_author'],
+			'user_ip'              => bbp_current_author_ip(),
+			'user_role'            => akismet_get_user_roles( $post_data['post_author'] ),
+		);
+
+		// Check the post_data
+		$_post = $this->maybe_spam( $_post );
+
+		// Get the result
+		$post_data['bbp_akismet_result'] = $_post['bbp_akismet_result'];
+		unset( $_post['bbp_akismet_result'] );
+
+		// Store the data as submitted
+		$post_data['bbp_post_as_submitted'] = $_post;
+
+		// Allow post_data to be manipulated
+		do_action_ref_array( 'bbp_akismet_check_post', $post_data );
+
+		// Spam
+		if ( 'true' == $post_data['bbp_akismet_result'] ) {
+
+			// Let plugins do their thing
+			do_action( 'bbp_akismet_spam_caught' );
+
+			// This is spam
+			$post_data['post_status'] = bbp_get_spam_status_id();
+
+			// We don't want your spam tags here
+			add_filter( 'bbp_new_reply_pre_set_terms', array( $this, 'filter_post_terms' ), 1, 3 );
+
+			// @todo Spam counter?
+		}
+
+		// @todo Topic/reply moderation? No true/false response - 'pending' or 'draft'
+		// @todo Auto-delete old spam?
+
+		// Log the last post
+		$this->last_post = $post_data;
+
+		// Pass the data back to the filter
+		return $post_data;
+	}
+
+	/**
+	 * Submit a post for spamming or hamming
+	 *
+	 * @since bbPress (r3277)
+	 *
+	 * @param int $post_id
+	 *
+	 * @global WP_Query $wpdb
+	 * @global string $akismet_api_host
+	 * @global string $akismet_api_port
+	 * @global object $current_user
+	 * @global object $current_site
+	 *
+	 * @uses current_filter() To get the reply_id
+	 * @uses get_post() To get the post object
+	 * @uses get_the_author_meta() To get the author meta
+	 * @uses get_post_meta() To get the post meta
+	 * @uses bbp_get_user_profile_url() To get a user's profile url
+	 * @uses get_permalink() To get the permalink of the post_parent
+	 * @uses akismet_get_user_roles() To get the role(s) of the post_author
+	 * @uses bbp_current_author_ip() To get the IP address of the current user
+	 * @uses BBP_Akismet::maybe_spam() To submit the post as ham or spam
+	 * @uses update_post_meta() To update the post meta with some Akismet data
+	 * @uses do_action() To call the 'bbp_akismet_submit_spam_post' and 'bbp_akismet_submit_ham_post' hooks
+	 *
+	 * @return array Array of existing topic terms
+	 */
+	public function submit_post( $post_id = 0 ) {
+		global $current_user, $current_site;
+
+		// Innocent until proven guilty
+		$request_type   = 'ham';
+		$current_filter = current_filter();
+
+		// Check this filter and adjust the $request_type accordingly
+		switch ( $current_filter ) {
+
+			// Mysterious, and straight from the can
+			case 'bbp_spammed_topic' :
+			case 'bbp_spammed_reply' :
+				$request_type = 'spam';
+				break;
+
+			// Honey-glazed, a straight off the bone
+			case 'bbp_unspammed_topic' :
+			case 'bbp_unspammed_reply' :
+				$request_type = 'ham';
+				break;
+
+			// Possibly poison...
+			default :
+				return;
+		}
+
+		// Setup some variables
+		$post_id = (int) $post_id;
+
+		// Make sure we have a post
+		$_post = get_post( $post_id );
+
+		// Bail if get_post() fails
+		if ( empty( $_post ) )
+			return;
+
+		// Bail if we're spamming, but the post_status isn't spam
+		if ( ( 'spam' == $request_type ) && ( bbp_get_spam_status_id() != $_post->post_status ) )
+			return;
+
+		// Set some default post_data
+		$post_data = array(
+			'comment_approved'     => $_post->post_status,
+			'comment_author'       => $_post->post_author ? get_the_author_meta( 'display_name', $_post->post_author ) : get_post_meta( $post_id, '_bbp_anonymous_name',    true ),
+			'comment_author_email' => $_post->post_author ? get_the_author_meta( 'email',        $_post->post_author ) : get_post_meta( $post_id, '_bbp_anonymous_email',   true ),
+			'comment_author_url'   => $_post->post_author ? bbp_get_user_profile_url(            $_post->post_author ) : get_post_meta( $post_id, '_bbp_anonymous_website', true ),
+			'comment_content'      => $_post->post_content,
+			'comment_date'         => $_post->post_date,
+			'comment_ID'           => $post_id,
+			'comment_post_ID'      => $_post->post_parent,
+			'comment_type'         => $_post->post_type,
+			'permalink'            => get_permalink( $post_id ),
+			'user_ID'              => $_post->post_author,
+			'user_ip'              => get_post_meta( $post_id, '_bbp_author_ip', true ),
+			'user_role'            => akismet_get_user_roles( $_post->post_author ),
+		);
+
+		// Use the original version stored in post_meta if available
+		$as_submitted = get_post_meta( $post_id, '_bbp_akismet_as_submitted', true );
+		if ( $as_submitted && is_array( $as_submitted ) && isset( $as_submitted['comment_content'] ) )
+			$post_data = array_merge( $post_data, $as_submitted );
+
+		// Add the reporter IP address
+		$post_data['reporter_ip']  = bbp_current_author_ip();
+
+		// Add some reporter info
+		if ( is_object( $current_user ) )
+		    $post_data['reporter'] = $current_user->user_login;
+
+		// Add the current site domain
+		if ( is_object( $current_site ) )
+			$post_data['site_domain'] = $current_site->domain;
+
+		// Place your slide beneath the microscope
+		$post_data = $this->maybe_spam( $post_data, 'submit', $request_type );
+
+		// Manual user action
+		if ( isset( $post_data['reporter'] ) ) {
+
+			// What kind of action
+			switch ( $request_type ) {
+
+				// Spammy
+				case 'spam' :
+					$this->update_post_history( $post_id, sprintf( __( '%1$s reported this %2$s as spam', 'bbpress' ),     $post_data['reporter'], $post_data['comment_type'] ), 'report-spam' );
+					update_post_meta( $post_id, '_bbp_akismet_user_result', 'true'                 );
+					update_post_meta( $post_id, '_bbp_akismet_user',        $post_data['reporter'] );
+					break;
+
+				// Hammy
+				case 'ham'  :
+					$this->update_post_history( $post_id, sprintf( __( '%1$s reported this %2$s as not spam', 'bbpress' ), $post_data['reporter'], $post_data['comment_type'] ), 'report-ham'  );
+					update_post_meta( $post_id, '_bbp_akismet_user_result', 'false'                 );
+					update_post_meta( $post_id, '_bbp_akismet_user',         $post_data['reporter'] );
+
+					// @todo Topic term revision history
+					break;
+
+				// Possible other actions
+				default :
+					break;
+			}
+		}
+
+		do_action( 'bbp_akismet_submit_' . $request_type . '_post', $post_id, $post_data['bbp_akismet_result'] );
+	}
+
+	/**
+	 * Ping Akismet service and check for spam/ham response
+	 *
+	 * @since bbPress (r3277)
+	 *
+	 * @param array $post_data
+	 * @param string $check Accepts check|submit
+	 * @param string $spam Accepts spam|ham
+	 *
+	 * @global string $akismet_api_host
+	 * @global string $akismet_api_port
+	 *
+	 * @uses akismet_test_mode() To determine if Akismet is in test mode
+	 * @uses akismet_http_post() To send data to the mothership for processing
+	 *
+	 * @return array Array of post data
+	 */
+	private function maybe_spam( $post_data, $check = 'check', $spam = 'spam' ) {
+		global $akismet_api_host, $akismet_api_port;
+
+		// Define variables
+		$query_string = $path = $response = '';
+
+		// Populate post data
+		$post_data['blog']         = get_option( 'home' );
+		$post_data['blog_charset'] = get_option( 'blog_charset' );
+		$post_data['blog_lang']    = get_locale();
+		$post_data['referrer']     = $_SERVER['HTTP_REFERER'];
+		$post_data['user_agent']   = $_SERVER['HTTP_USER_AGENT'];
+
+		// Akismet Test Mode
+		if ( akismet_test_mode() )
+			$post_data['is_test'] = 'true';
+
+		// Loop through _POST args and rekey strings
+		foreach ( $_POST as $key => $value )
+			if ( is_string( $value ) )
+				$post_data['POST_' . $key] = $value;
+
+		// Keys to ignore
+		$ignore = array( 'HTTP_COOKIE', 'HTTP_COOKIE2', 'PHP_AUTH_PW' );
+
+		// Loop through _SERVER args and remove whitelisted keys
+		foreach ( $_SERVER as $key => $value ) {
+
+			// Key should not be ignored
+			if ( !in_array( $key, $ignore ) && is_string( $value ) ) {
+				$post_data[$key] = $value;
+
+			// Key should be ignored
+			} else {
+				$post_data[$key] = '';
+			}
+		}
+
+		// Ready...
+		foreach ( $post_data as $key => $data )
+			$query_string .= $key . '=' . urlencode( stripslashes( $data ) ) . '&';
+
+		// Aim...
+		if ( 'check' == $check ) {
+			$path = '/1.1/comment-check';
+		} elseif ( 'submit' == $check ) {
+			$path = '/1.1/submit-' . $spam;
+		}
+
+		// Fire!
+		$response = $this->http_post( $query_string, $akismet_api_host, $path, $akismet_api_port );
+
+		// Check the high-speed cam
+		if ( !empty( $response[1] ) ) {
+			$post_data['bbp_akismet_result'] = $response[1];
+		} else {
+			$post_data['bbp_akismet_result'] = __( 'No response', 'bbpress' );
+		}
+
+		// This is ham
+		return $post_data;
+	}
+
+	/**
+	 * Update post meta after a spam check
+	 *
+	 * @since bbPress (r3308)
+	 *
+	 * @param int $post_id
+	 * @param object $_post
+	 *
+	 * @global object $this->last_post
+	 *
+	 * @uses get_post() To get the post object
+	 * @uses get_userdata() To get the user data
+	 * @uses bbp_filter_anonymous_user_data() To get anonymous user data
+	 * @uses update_post_meta() To update post meta with Akismet data
+	 * @uses BBP_Akismet::update_post_history() To update post Akismet history
+	 */
+	public function update_post_meta( $post_id = 0, $_post = false ) {
+
+		// Define local variable(s)
+		$as_submitted = false;
+
+		// Setup some variables
+		$post_id = (int) $post_id;
+
+		// Ensure we have a post object
+		if ( empty( $_post ) )
+			$_post = get_post( $post_id );
+
+		// Set up Akismet last post data
+		if ( !empty( $this->last_post ) )
+			$as_submitted = $this->last_post['bbp_post_as_submitted'];
+
+		// wp_insert_post() might be called in other contexts. Ensure this is
+		// the same topic/reply as was checked by BBP_Akismet::check_post()
+		if ( is_object( $_post ) && !empty( $this->last_post ) && is_array( $as_submitted ) ) {
+
+			// Get user data
+			$userdata       = get_userdata( $_post->post_author );
+			$anonymous_data = bbp_filter_anonymous_post_data();
+
+			// More checks
+			if (	intval( $as_submitted['comment_post_ID'] )    == intval( $_post->post_parent )
+					&&      $as_submitted['comment_author']       == ( $anonymous_data ? $anonymous_data['bbp_anonymous_name']  : $userdata->display_name )
+					&&      $as_submitted['comment_author_email'] == ( $anonymous_data ? $anonymous_data['bbp_anonymous_email'] : $userdata->user_email   )
+				) {
+
+				// Normal result: true
+				if ( $this->last_post['bbp_akismet_result'] == 'true' ) {
+
+					// Leave a trail so other's know what we did
+					update_post_meta( $post_id, '_bbp_akismet_result', 'true' );
+					$this->update_post_history( $post_id, __( 'Akismet caught this post as spam', 'bbpress' ), 'check-spam' );
+
+					// If post_status isn't the spam status, as expected, leave a note
+					if ( $_post->post_status != bbp_get_spam_status_id() ) {
+						$this->update_post_history( $post_id, sprintf( __( 'Post status was changed to %s', 'bbpress' ), $_post->post_status ), 'status-changed-' . $_post->post_status );
+					}
+
+				// Normal result: false
+				} elseif ( $this->last_post['bbp_akismet_result'] == 'false' ) {
+
+					// Leave a trail so other's know what we did
+					update_post_meta( $post_id, '_bbp_akismet_result', 'false' );
+					$this->update_post_history( $post_id, __( 'Akismet cleared this post', 'bbpress' ), 'check-ham' );
+
+					// If post_status is the spam status, which isn't expected, leave a note
+					if ( $_post->post_status == bbp_get_spam_status_id() ) {
+
+						// @todo Use wp_blacklist_check()
+
+						$this->update_post_history( $post_id, sprintf( __( 'Post status was changed to %s', 'bbpress' ), $_post->post_status ), 'status-changed-' . $_post->post_status );
+					}
+
+				// Abnormal result: error
+				} else {
+					// Leave a trail so other's know what we did
+					update_post_meta( $post_id, '_bbp_akismet_error', time() );
+					$this->update_post_history( $post_id, sprintf( __( 'Akismet was unable to check this post (response: %s), will automatically retry again later.', 'bbpress' ), $this->last_post['bbp_akismet_result'] ), 'check-error' );
+				}
+
+				// Record the complete original data as submitted for checking
+				if ( isset( $this->last_post['bbp_post_as_submitted'] ) ) {
+					update_post_meta( $post_id, '_bbp_akismet_as_submitted', $this->last_post['bbp_post_as_submitted'] );
+				}
+			}
+		}
+	}
+
+	/**
+	 * Update a post's Akismet history
+	 *
+	 * @since bbPress (r3308)
+	 *
+	 * @param int $post_id
+	 * @param string $message
+	 * @param string $event
+	 *
+	 * @uses wp_get_current_user() To get the current_user object
+	 * @uses add_post_meta() Add Akismet post history
+	 */
+	private function update_post_history( $post_id = 0, $message = null, $event = null ) {
+
+		// Define local variable(s)
+		$user = '';
+
+		// Get the current user
+		$current_user = wp_get_current_user();
+
+		// Get the user's login name if possible
+		if ( is_object( $current_user ) && isset( $current_user->user_login ) )
+			$user = $current_user->user_login;
+
+		// Setup the event to be saved
+		$event = array(
+			'time'    => akismet_microtime(),
+			'message' => $message,
+			'event'   => $event,
+			'user'    => $user,
+		);
+
+		// Save the event data
+		add_post_meta( $post_id, '_bbp_akismet_history', $event );
+	}
+
+	/**
+	 * Get a post's Akismet history
+	 *
+	 * @since bbPress (r3308)
+	 *
+	 * @param int $post_id
+	 *
+	 * @uses wp_get_current_user() To get the current_user object
+	 * @uses get_post_meta() Get a post's Akismet history
+	 *
+	 * @return array Array of a post's Akismet history
+	 */
+	public function get_post_history( $post_id = 0 ) {
+
+		// Retrieve any previous history
+		$history = get_post_meta( $post_id, '_bbp_akismet_history' );
+
+		// Sort it by the time recorded
+		usort( $history, 'akismet_cmp_time' );
+
+		return $history;
+	}
+
+	/**
+	 * Handle any terms submitted with a post flagged as spam
+	 *
+	 * @since bbPress (r3308)
+	 *
+	 * @param string $terms Comma-separated list of terms
+	 * @param int $topic_id
+	 * @param int $reply_id
+	 *
+	 * @uses bbp_get_reply_id() To get the reply_id
+	 * @uses bbp_get_topic_id() To get the topic_id
+	 * @uses wp_get_object_terms() To a post's current terms
+	 * @uses update_post_meta() To add spam terms to post meta
+	 *
+	 * @return array Array of existing topic terms
+	 */
+	public function filter_post_terms( $terms = '', $topic_id = 0, $reply_id = 0 ) {
+
+		// Validate the reply_id and topic_id
+		$reply_id = bbp_get_reply_id( $reply_id );
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Get any pre-existing terms
+		$existing_terms = wp_get_object_terms( $topic_id, bbp_get_topic_tag_tax_id(), array( 'fields' => 'names' ) );
+
+		// Save the terms for later in case the reply gets hammed
+		if ( !empty( $terms ) )
+			update_post_meta( $reply_id, '_bbp_akismet_spam_terms', $terms );
+
+		// Keep the topic tags the same for now
+		return $existing_terms;
+	}
+
+	/**
+	 * Submit data to Akismet service with unique bbPress User Agent
+	 *
+	 * This code is directly taken from the akismet_http_post() function and
+	 * documented to bbPress 2.0 standard.
+	 *
+	 * @since bbPress (r3466)
+	 *
+	 * @param string $request The request we are sending
+	 * @param string $host The host to send our request to
+	 * @param string $path The path from the host
+	 * @param string $port The port to use
+	 * @param string $ip Optional Override $host with an IP address
+	 * @uses bbp_get_version() To get the current bbPress version
+	 * @return mixed WP_Error on error, array on success, empty on failure
+	 */
+	private function http_post( $request, $host, $path, $port = 80, $ip = '' ) {
+
+		// Preload required variables
+		$bbp_version    = bbp_get_version();
+		$content_length = strlen( $request );
+		$http_host      = $host;
+		$blog_charset   = get_option( 'blog_charset' );
+		$response       = '';
+		$errno          = null;
+		$errstr         = null;
+
+		// Untque User Agent
+		$akismet_ua     = "bbPress/{$bbp_version} | ";
+		$akismet_ua    .= 'Akismet/' . constant( 'AKISMET_VERSION' );
+
+		// Use specific IP (if provided)
+		if ( !empty( $ip ) && long2ip( ip2long( $ip ) ) )
+			$http_host = $ip;
+
+		// WP HTTP class is available
+		if ( function_exists( 'wp_remote_post' ) ) {
+
+			// Setup the arguments
+			$http_args = array(
+				'body'             => $request,
+				'headers'          => array(
+					'Content-Type' => 'application/x-www-form-urlencoded; charset=' . $blog_charset,
+					'Host'         => $host,
+					'User-Agent'   => $akismet_ua
+				),
+				'httpversion'      => '1.0',
+				'timeout'          => 15
+			);
+
+			// Where we are sending our request
+			$akismet_url = 'http://' . $http_host . $path;
+
+			// Send the request
+			$response    = wp_remote_post( $akismet_url, $http_args );
+
+			// Bail if the response is an error
+			if ( is_wp_error( $response ) )
+				return '';
+
+			// No errors so return response
+			return array( $response['headers'], $response['body'] );
+
+		// WP HTTP class is not available (Why not?)
+		} else {
+
+			// Header info to use with our socket
+			$http_request  = "POST {$path} HTTP/1.0\r\n";
+			$http_request .= "Host: {$host}\r\n";
+			$http_request .= "Content-Type: application/x-www-form-urlencoded; charset={$blog_charset}\r\n";
+			$http_request .= "Content-Length: {$content_length}\r\n";
+			$http_request .= "User-Agent: {$akismet_ua}\r\n";
+			$http_request .= "\r\n";
+			$http_request .= $request;
+
+			// Open a socket connection
+			if ( false != ( $fs = @fsockopen( $http_host, $port, $errno, $errstr, 10 ) ) ) {
+
+				// Write our request to the pointer
+				fwrite( $fs, $http_request );
+
+				// Loop through pointer and compile a response
+				while ( !feof( $fs ) ) {
+					// One TCP-IP packet at a time
+					$response .= fgets( $fs, 1160 );
+				}
+
+				// Close our socket
+				fclose( $fs );
+
+				// Explode the response into usable data
+				$response = explode( "\r\n\r\n", $response, 2 );
+			}
+
+			// Return the response ('' if error/empty)
+			return $response;
+		}
+	}
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/activity.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,708 @@
+<?php
+
+/**
+ * bbPress BuddyPress Activity Class
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_BuddyPress_Activity' ) ) :
+/**
+ * Loads BuddyPress Activity extension
+ *
+ * @since bbPress (r3395)
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+class BBP_BuddyPress_Activity {
+
+	/** Variables *************************************************************/
+
+	/**
+	 * The name of the BuddyPress component, used in activity streams
+	 *
+	 * @var string
+	 */
+	private $component = '';
+
+	/**
+	 * Forum Create Activty Action
+	 *
+	 * @var string
+	 */
+	private $forum_create = '';
+
+	/**
+	 * Topic Create Activty Action
+	 *
+	 * @var string
+	 */
+	private $topic_create = '';
+
+	/**
+	 * Topic Close Activty Action
+	 *
+	 * @var string
+	 */
+	private $topic_close = '';
+
+	/**
+	 * Topic Edit Activty Action
+	 *
+	 * @var string
+	 */
+	private $topic_edit = '';
+
+	/**
+	 * Topic Open Activty Action
+	 *
+	 * @var string
+	 */
+	private $topic_open = '';
+
+	/**
+	 * Reply Create Activty Action
+	 *
+	 * @var string
+	 */
+	private $reply_create = '';
+
+	/**
+	 * Reply Edit Activty Action
+	 *
+	 * @var string
+	 */
+	private $reply_edit = '';
+
+	/** Setup Methods *********************************************************/
+
+	/**
+	 * The bbPress BuddyPress Activity loader
+	 *
+	 * @since bbPress (r3395)
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+		$this->setup_filters();
+		$this->fully_loaded();
+	}
+
+	/**
+	 * Extension variables
+	 *
+	 * @since bbPress (r3395)
+	 * @access private
+	 * @uses apply_filters() Calls various filters
+	 */
+	private function setup_globals() {
+
+		// The name of the BuddyPress component, used in activity streams
+		$this->component = 'bbpress';
+
+		// Forums
+		$this->forum_create = 'bbp_forum_create';
+
+		// Topics
+		$this->topic_create = 'bbp_topic_create';
+		$this->topic_edit   = 'bbp_topic_edit';
+		$this->topic_close  = 'bbp_topic_close';
+		$this->topic_open   = 'bbp_topic_open';
+
+		// Replies
+		$this->reply_create = 'bbp_reply_create';
+		$this->reply_edit   = 'bbp_reply_edit';
+	}
+
+	/**
+	 * Setup the actions
+	 *
+	 * @since bbPress (r3395)
+	 * @access private
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		// Register the activity stream actions
+		add_action( 'bp_register_activity_actions',      array( $this, 'register_activity_actions' )        );
+
+		// Hook into topic and reply creation
+		add_action( 'bbp_new_topic',                     array( $this, 'topic_create'              ), 10, 4 );
+		add_action( 'bbp_new_reply',                     array( $this, 'reply_create'              ), 10, 5 );
+
+		// Hook into topic and reply status changes
+		add_action( 'wp_insert_post',                    array( $this, 'topic_update'              ), 10, 2 );
+		add_action( 'wp_insert_post',                    array( $this, 'reply_update'              ), 10, 2 );
+
+		// Hook into topic and reply deletion
+		add_action( 'bbp_delete_topic',                  array( $this, 'topic_delete'              ), 10, 1 );
+		add_action( 'bbp_delete_reply',                  array( $this, 'reply_delete'              ), 10, 1 );
+
+		// Append forum filters in site wide activity streams
+		add_action( 'bp_activity_filter_options',        array( $this, 'activity_filter_options'   ), 10    );
+
+		// Append forum filters in single member activity streams
+		add_action( 'bp_member_activity_filter_options', array( $this, 'activity_filter_options'   ), 10    );
+
+		// Append forum filters in single group activity streams
+		add_action( 'bp_group_activity_filter_options',  array( $this, 'activity_filter_options'   ), 10    );
+	}
+
+	/**
+	 * Setup the filters
+	 *
+	 * @since bbPress (r3395)
+	 * @access private
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_filters() {
+
+		/** Activity **********************************************************/
+
+		// Obey BuddyPress commenting rules
+		add_filter( 'bp_activity_can_comment',   array( $this, 'activity_can_comment'   )        );
+
+		// Link directly to the topic or reply
+		add_filter( 'bp_activity_get_permalink', array( $this, 'activity_get_permalink' ), 10, 2 );
+
+		/** Mentions **********************************************************/
+
+		// Convert mentions into links on create
+		add_filter( 'bbp_new_topic_pre_content',  'bp_activity_at_name_filter' );
+		add_filter( 'bbp_new_reply_pre_content',  'bp_activity_at_name_filter' );
+
+		// Convert mentions into links on edit
+		add_filter( 'bbp_edit_topic_pre_content', 'bp_activity_at_name_filter' );
+		add_filter( 'bbp_edit_reply_pre_content', 'bp_activity_at_name_filter' );
+
+		// Revert links into text on edit
+		add_filter( 'bbp_get_form_topic_content', array( $this, 'strip_mentions_on_edit' ) );
+		add_filter( 'bbp_get_form_reply_content', array( $this, 'strip_mentions_on_edit' ) );
+	}
+
+	/**
+	 * Allow the variables, actions, and filters to be modified by third party
+	 * plugins and themes.
+	 *
+	 * @since bbPress (r3902)
+	 */
+	private function fully_loaded() {
+		do_action_ref_array( 'bbp_buddypress_activity_loaded', array( $this ) );
+	}
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * Strip out BuddyPress activity at-name HTML on topic/reply edit
+	 *
+	 * Copied from bp_forums_strip_mentions_on_post_edit() in case forums
+	 * component is not active or is not loaded in yet.
+	 *
+	 * @since bbPress (r3475)
+	 * @param type $content Optional
+	 * @uses bp_get_root_domain()
+	 * @uses bp_get_members_root_slug()
+	 * @return string
+	 */
+	public function strip_mentions_on_edit( $content = '' ) {
+
+		// Backwards compat for members root slug
+		if ( function_exists( 'bp_get_members_root_slug' ) ) {
+			$members_root = bp_get_members_root_slug();
+		} elseif ( defined( 'BP_MEMBERS_SLUG' ) ) {
+			$members_root = BP_MEMBERS_SLUG;
+		} else {
+			$members_root = 'members';
+		}
+
+		$pattern = "|<a href=&#039;" . bp_get_root_domain() . "/" . $members_root . "/[A-Za-z0-9-_\.]+/&#039; rel=&#039;nofollow&#039;>(@[A-Za-z0-9-_\.@]+)</a>|";
+		$content = preg_replace( $pattern, "$1", htmlspecialchars_decode( $content ) );
+
+		return $content;
+	}
+
+	/**
+	 * Register our activity actions with BuddyPress
+	 *
+	 * @since bbPress (r3395)
+	 * @uses bp_activity_set_action()
+	 */
+	public function register_activity_actions() {
+		bp_activity_set_action( $this->component, $this->topic_create, __( 'New topic created', 'bbpress' ) );
+		bp_activity_set_action( $this->component, $this->reply_create, __( 'New reply created', 'bbpress' ) );
+	}
+
+	/**
+	 * Wrapper for recoding bbPress actions to the BuddyPress activity stream
+	 *
+	 * @since bbPress (r3395)
+	 * @param type $args Array of arguments for bp_activity_add()
+	 * @uses bbp_get_current_user_id()
+	 * @uses bp_core_current_time()
+	 * @uses bbp_parse_args()
+	 * @uses aplly_filters()
+	 * @uses bp_activity_add()
+	 * @return type Activity ID if successful, false if not
+	 */
+	private function record_activity( $args = '' ) {
+
+		// Default activity args
+		$defaults = array (
+			'id'                => null,
+			'user_id'           => bbp_get_current_user_id(),
+			'type'              => '',
+			'action'            => '',
+			'item_id'           => '',
+			'secondary_item_id' => '',
+			'content'           => '',
+			'primary_link'      => '',
+			'component'         => $this->component,
+			'recorded_time'     => bp_core_current_time(),
+			'hide_sitewide'     => false
+		);
+		$activity = bbp_parse_args( $args, $defaults, 'record_activity' );
+
+		// Add the activity
+		return bp_activity_add( $activity );
+	}
+
+	/**
+	 * Wrapper for deleting bbPress actions from BuddyPress activity stream
+	 *
+	 * @since bbPress (r3395)
+	 * @param type $args Array of arguments for bp_activity_add()
+	 * @uses bbp_get_current_user_id()
+	 * @uses bp_core_current_time()
+	 * @uses bbp_parse_args()
+	 * @uses aplly_filters()
+	 * @uses bp_activity_add()
+	 * @return type Activity ID if successful, false if not
+	 */
+	public function delete_activity( $args = '' ) {
+
+		// Default activity args
+		$defaults = array(
+			'item_id'           => false,
+			'component'         => $this->component,
+			'type'              => false,
+			'user_id'           => false,
+			'secondary_item_id' => false
+		);
+		$activity = bbp_parse_args( $args, $defaults, 'delete_activity' );
+
+		// Delete the activity
+		bp_activity_delete_by_item_id( $activity );
+	}
+
+	/**
+	 * Check for an existing activity stream entry for a given post_id
+	 *
+	 * @param int $post_id ID of the topic or reply
+	 * @uses get_post_meta()
+	 * @uses bp_activity_get_specific()
+	 * @return int if an activity id is verified, false if not
+	 */
+	private static function get_activity_id( $post_id = 0 ) {
+
+		// Try to get the activity ID of the post
+		$activity_id = (int) get_post_meta( $post_id, '_bbp_activity_id', true );
+
+		// Bail if no activity ID is in post meta
+		if ( empty( $activity_id ) )
+			return null;
+
+		// Get the activity stream item, bail if it doesn't exist
+		$existing = bp_activity_get_specific( array( 'activity_ids' => $activity_id, 'show_hidden' => true, 'spam' => 'all', ) );
+		if ( empty( $existing['total'] ) || ( 1 != $existing['total'] ) )
+			return null;
+
+		// Return the activity ID since we've verified the connection
+		return $activity_id;
+	}
+
+	/**
+	 * Maybe disable activity stream comments on select actions
+	 *
+	 * @since bbPress (r3399)
+	 * @global BP_Activity_Template $activities_template
+	 * @param boolean $can_comment
+	 * @uses bp_get_activity_action_name()
+	 * @return boolean
+	 */
+	public function activity_can_comment( $can_comment = true ) {
+		global $activities_template;
+
+		// Already forced off, so comply
+		if ( false === $can_comment )
+			return $can_comment;
+
+		// Check if blog & forum activity stream commenting is off
+		if ( ( false === $activities_template->disable_blogforum_replies ) || (int) $activities_template->disable_blogforum_replies ) {
+
+			// Get the current action name
+			$action_name = bp_get_activity_action_name();
+
+			// Setup the array of possibly disabled actions
+			$disabled_actions = array(
+				$this->topic_create,
+				$this->reply_create
+			);
+
+			// Check if this activity stream action is disabled
+			if ( in_array( $action_name, $disabled_actions ) ) {
+				$can_comment = false;
+			}
+		}
+
+		return $can_comment;
+	}
+
+	/**
+	 * Maybe link directly to topics and replies in activity stream entries
+	 *
+	 * @since bbPress (r3399)
+	 * @param string $link
+	 * @param mixed $activity_object
+	 * @return string The link to the activity stream item
+	 */
+	public function activity_get_permalink( $link = '', $activity_object = false ) {
+
+		// Setup the array of actions to link directly to
+		$disabled_actions = array(
+			$this->topic_create,
+			$this->reply_create
+		);
+
+		// Check if this activity stream action is directly linked
+		if ( in_array( $activity_object->type, $disabled_actions ) ) {
+			$link = $activity_object->primary_link;
+		}
+
+		return $link;
+	}
+
+	/**
+	 * Append forum options to activity filter select box
+	 *
+	 * @since bbPress (r3653)
+	 */
+	function activity_filter_options() {
+	?>
+
+		<option value="<?php echo $this->topic_create; ?>"><?php _e( 'Topics',  'bbpress' ); ?></option>
+		<option value="<?php echo $this->reply_create; ?>"><?php _e( 'Replies', 'bbpress' ); ?></option>
+
+	<?php
+	}
+
+	/** Topics ****************************************************************/
+
+	/**
+	 * Record an activity stream entry when a topic is created or updated
+	 *
+	 * @since bbPress (r3395)
+	 * @param int $topic_id
+	 * @param int $forum_id
+	 * @param array $anonymous_data
+	 * @param int $topic_author_id
+	 * @uses bbp_get_topic_id()
+	 * @uses bbp_get_forum_id()
+	 * @uses bbp_get_user_profile_link()
+	 * @uses bbp_get_topic_permalink()
+	 * @uses bbp_get_topic_title()
+	 * @uses bbp_get_topic_content()
+	 * @uses bbp_get_forum_permalink()
+	 * @uses bbp_get_forum_title()
+	 * @uses bp_create_excerpt()
+	 * @uses apply_filters()
+	 * @return Bail early if topic is by anonymous user
+	 */
+	public function topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id ) {
+
+		// Bail early if topic is by anonymous user
+		if ( !empty( $anonymous_data ) )
+			return;
+
+		// Bail if site is private
+		if ( !bbp_is_site_public() )
+			return;
+
+		// Validate activity data
+		$user_id  = $topic_author_id;
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Bail if user is not active
+		if ( bbp_is_user_inactive( $user_id ) )
+			return;
+
+		// Bail if topic is not published
+		if ( !bbp_is_topic_published( $topic_id ) )
+			return;
+
+		// Bail if forum is not public
+		if ( !bbp_is_forum_public( $forum_id, false ) )
+			return;
+
+		// User link for topic author
+		$user_link  = bbp_get_user_profile_link( $user_id  );
+
+		// Topic
+		$topic_permalink = bbp_get_topic_permalink( $topic_id );
+		$topic_title     = bbp_get_topic_title    ( $topic_id );
+		$topic_content   = bbp_get_topic_content  ( $topic_id );
+		$topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
+
+		// Forum
+		$forum_permalink = bbp_get_forum_permalink( $forum_id );
+		$forum_title     = bbp_get_forum_title    ( $forum_id );
+		$forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
+
+		// Activity action & text
+		$activity_text    = sprintf( __( '%1$s started the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
+		$activity_action  = apply_filters( 'bbp_activity_topic_create',                $activity_text, $user_id,   $topic_id,   $forum_id      );
+		$activity_content = apply_filters( 'bbp_activity_topic_create_excerpt',        bp_create_excerpt( $topic_content ),     $topic_content );
+
+		// Compile the activity stream results
+		$activity = array(
+			'id'                => $this->get_activity_id( $topic_id ),
+			'user_id'           => $user_id,
+			'action'            => $activity_action,
+			'content'           => $activity_content,
+			'primary_link'      => $topic_permalink,
+			'type'              => $this->topic_create,
+			'item_id'           => $topic_id,
+			'secondary_item_id' => $forum_id,
+			'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $topic_id ),
+		);
+
+		// Record the activity
+		$activity_id = $this->record_activity( $activity );
+
+		// Add the activity entry ID as a meta value to the topic
+		if ( !empty( $activity_id ) ) {
+			update_post_meta( $topic_id, '_bbp_activity_id', $activity_id );
+		}
+	}
+
+	/**
+	 * Delete the activity stream entry when a topic is spammed, trashed, or deleted
+	 *
+	 * @param int $topic_id
+	 * @uses bp_activity_delete()
+	 */
+	public function topic_delete( $topic_id ) {
+
+		// Get activity ID, bail if it doesn't exist
+		if ( $activity_id = $this->get_activity_id( $topic_id ) )
+			return bp_activity_delete( array( 'id' => $activity_id ) );
+
+		return false;		
+	}
+
+	/**
+	 * Update the activity stream entry when a topic status changes
+	 *
+	 * @param int $post_id
+	 * @param obj $post
+	 * @uses get_post_type()
+	 * @uses bbp_get_topic_post_type()
+	 * @uses bbp_get_topic_id()
+	 * @uses bbp_is_topic_anonymous()
+	 * @uses bbp_get_public_status_id()
+	 * @uses bbp_get_closed_status_id()
+	 * @uses bbp_get_topic_forum_id()
+	 * @uses bbp_get_topic_author_id()
+	 * @return Bail early if not a topic, or topic is by anonymous user
+	 */
+	public function topic_update( $topic_id, $post ) {
+
+		// Bail early if not a topic
+		if ( get_post_type( $post ) != bbp_get_topic_post_type() )
+			return;
+
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Bail early if topic is by anonymous user
+		if ( bbp_is_topic_anonymous( $topic_id ) )
+			return;
+
+		$anonymous_data = array();
+
+		// Action based on new status
+		if ( in_array( $post->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) {
+
+			// Validate topic data
+			$forum_id        = bbp_get_topic_forum_id( $topic_id );
+			$topic_author_id = bbp_get_topic_author_id( $topic_id );
+
+			$this->topic_create( $topic_id, $forum_id, $anonymous_data, $topic_author_id );
+		} else {
+			$this->topic_delete( $topic_id );
+		}
+	}
+
+	/** Replies ***************************************************************/
+
+	/**
+	 * Record an activity stream entry when a reply is created
+	 *
+	 * @since bbPress (r3395)
+	 * @param int $topic_id
+	 * @param int $forum_id
+	 * @param array $anonymous_data
+	 * @param int $topic_author_id
+	 * @uses bbp_get_reply_id()
+	 * @uses bbp_get_topic_id()
+	 * @uses bbp_get_forum_id()
+	 * @uses bbp_get_user_profile_link()
+	 * @uses bbp_get_reply_url()
+	 * @uses bbp_get_reply_content()
+	 * @uses bbp_get_topic_permalink()
+	 * @uses bbp_get_topic_title()
+	 * @uses bbp_get_forum_permalink()
+	 * @uses bbp_get_forum_title()
+	 * @uses bp_create_excerpt()
+	 * @uses apply_filters()
+	 * @return Bail early if topic is by anonywous user
+	 */
+	public function reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id ) {
+
+		// Do not log activity of anonymous users
+		if ( !empty( $anonymous_data ) )
+			return;
+
+		// Bail if site is private
+		if ( !bbp_is_site_public() )
+			return;
+
+		// Validate activity data
+		$user_id  = $reply_author_id;
+		$reply_id = bbp_get_reply_id( $reply_id );
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Bail if user is not active
+		if ( bbp_is_user_inactive( $user_id ) )
+			return;
+
+		// Bail if reply is not published
+		if ( !bbp_is_reply_published( $reply_id ) )
+			return;
+
+		// Bail if forum is not public
+		if ( !bbp_is_forum_public( $forum_id, false ) )
+			return;
+
+		// Setup links for activity stream
+		$user_link  = bbp_get_user_profile_link( $user_id  );
+
+		// Reply
+		$reply_url     = bbp_get_reply_url    ( $reply_id );
+		$reply_content = bbp_get_reply_content( $reply_id );
+
+		// Topic
+		$topic_permalink = bbp_get_topic_permalink( $topic_id );
+		$topic_title     = bbp_get_topic_title    ( $topic_id );
+		$topic_link      = '<a href="' . $topic_permalink . '" title="' . $topic_title . '">' . $topic_title . '</a>';
+
+		// Forum
+		$forum_permalink = bbp_get_forum_permalink( $forum_id );
+		$forum_title     = bbp_get_forum_title    ( $forum_id );
+		$forum_link      = '<a href="' . $forum_permalink . '" title="' . $forum_title . '">' . $forum_title . '</a>';
+
+		// Activity action & text
+		$activity_text    = sprintf( __( '%1$s replied to the topic %2$s in the forum %3$s', 'bbpress' ), $user_link, $topic_link, $forum_link    );
+		$activity_action  = apply_filters( 'bbp_activity_reply_create',         $activity_text, $user_id,   $reply_id,   $topic_id      );
+		$activity_content = apply_filters( 'bbp_activity_reply_create_excerpt', bp_create_excerpt( $reply_content ),     $reply_content );
+
+		// Compile the activity stream results
+		$activity = array(
+			'id'                => $this->get_activity_id( $reply_id ),
+			'user_id'           => $user_id,
+			'action'            => $activity_action,
+			'content'           => $activity_content,
+			'primary_link'      => $reply_url,
+			'type'              => $this->reply_create,
+			'item_id'           => $reply_id,
+			'secondary_item_id' => $topic_id,
+			'recorded_time'     => get_post_time( 'Y-m-d H:i:s', true, $reply_id ),
+		);
+
+		// Record the activity
+		$activity_id = $this->record_activity( $activity );
+
+		// Add the activity entry ID as a meta value to the reply
+		if ( !empty( $activity_id ) ) {
+			update_post_meta( $reply_id, '_bbp_activity_id', $activity_id );
+		}
+	}
+
+ 	/**
+	 * Delete the activity stream entry when a reply is spammed, trashed, or deleted
+	 *
+	 * @param int $reply_id
+	 * @uses get_post_meta()
+	 * @uses bp_activity_delete()
+	 */
+	public function reply_delete( $reply_id ) {
+
+		// Get activity ID, bail if it doesn't exist
+		if ( $activity_id = $this->get_activity_id( $reply_id ) )
+			return bp_activity_delete( array( 'id' => $activity_id ) );
+
+		return false;		
+	}
+
+	/**
+	 * Update the activity stream entry when a reply status changes
+	 *
+	 * @param int $post_id
+	 * @param obj $post
+	 * @uses get_post_type()
+	 * @uses bbp_get_reply_post_type()
+	 * @uses bbp_get_reply_id()
+	 * @uses bbp_is_reply_anonymous()
+	 * @uses bbp_get_public_status_id()
+	 * @uses bbp_get_closed_status_id()
+	 * @uses bbp_get_reply_topic_id()
+	 * @uses bbp_get_reply_forum_id()
+	 * @uses bbp_get_reply_author_id()
+	 * @return Bail early if not a reply, or reply is by anonymous user
+	 */
+	public function reply_update( $reply_id, $post ) {
+
+		// Bail early if not a reply
+		if ( get_post_type( $post ) != bbp_get_reply_post_type() )
+			return;
+
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// Bail early if reply is by anonymous user
+		if ( bbp_is_reply_anonymous( $reply_id ) )
+			return;
+
+		$anonymous_data = array();
+
+		// Action based on new status
+		if ( $post->post_status == bbp_get_public_status_id() ) {
+
+			// Validate reply data
+			$topic_id        = bbp_get_reply_topic_id( $reply_id );
+			$forum_id        = bbp_get_reply_forum_id( $reply_id );
+			$reply_author_id = bbp_get_reply_author_id( $reply_id );
+
+			$this->reply_create( $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author_id );
+		} else {
+			$this->reply_delete( $reply_id );
+		}
+	}
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,455 @@
+<?php
+
+/**
+ * Main bbPress BuddyPress Class
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** BuddyPress Helpers ********************************************************/
+
+/**
+ * Filter the current bbPress user ID with the current BuddyPress user ID
+ *
+ * @since bbPress (r3552)
+ *
+ * @param int $user_id
+ * @param bool $displayed_user_fallback
+ * @param bool $current_user_fallback
+ *
+ * @return int User ID
+ */
+function bbp_filter_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
+
+	// Define local variable
+	$bbp_user_id = 0;
+
+	// Get possible user ID's
+	$did = bp_displayed_user_id();
+	$lid = bp_loggedin_user_id();
+
+	// Easy empty checking
+	if ( !empty( $user_id ) && is_numeric( $user_id ) )
+		$bbp_user_id = $user_id;
+
+	// Currently viewing or editing a user
+	elseif ( ( true == $displayed_user_fallback ) && !empty( $did ) )
+		$bbp_user_id = $did;
+
+	// Maybe fallback on the current_user ID
+	elseif ( ( true == $current_user_fallback ) && !empty( $lid ) )
+		$bbp_user_id = $lid;
+
+	return $bbp_user_id;
+}
+add_filter( 'bbp_get_user_id', 'bbp_filter_user_id', 10, 3 );
+
+/**
+ * Filter the bbPress is_single_user function with BuddyPress eqivalent
+ *
+ * @since bbPress (r3552)
+ *
+ * @param bool $is Optional. Default false
+ * @return bool True if viewing single user, false if not
+ */
+function bbp_filter_is_single_user( $is = false ) {
+	if ( !empty( $is ) )
+		return $is;
+
+	return bp_is_user();
+}
+add_filter( 'bbp_is_single_user', 'bbp_filter_is_single_user', 10, 1 );
+
+/**
+ * Filter the bbPress is_user_home function with BuddyPress eqivalent
+ *
+ * @since bbPress (r3552)
+ *
+ * @param bool $is Optional. Default false
+ * @return bool True if viewing single user, false if not
+ */
+function bbp_filter_is_user_home( $is = false ) {
+	if ( !empty( $is ) )
+		return $is;
+
+	return bp_is_my_profile();
+}
+add_filter( 'bbp_is_user_home', 'bbp_filter_is_user_home', 10, 1 );
+
+/** BuddyPress Screens ********************************************************/
+
+/**
+ * Hook bbPress topics template into plugins template
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses add_action() To add the content hook
+ * @uses bp_core_load_template() To load the plugins template
+ */
+function bbp_member_forums_screen_topics() {
+	add_action( 'bp_template_content', 'bbp_member_forums_topics_content' );
+	bp_core_load_template( apply_filters( 'bbp_member_forums_screen_topics', 'members/single/plugins' ) );
+}
+
+/**
+ * Hook bbPress replies template into plugins template
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses add_action() To add the content hook
+ * @uses bp_core_load_template() To load the plugins template
+ */
+function bbp_member_forums_screen_replies() {
+	add_action( 'bp_template_content', 'bbp_member_forums_replies_content' );
+	bp_core_load_template( apply_filters( 'bbp_member_forums_screen_replies', 'members/single/plugins' ) );
+}
+
+/**
+ * Hook bbPress favorites template into plugins template
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses add_action() To add the content hook
+ * @uses bp_core_load_template() To load the plugins template
+ */
+function bbp_member_forums_screen_favorites() {
+	add_action( 'bp_template_content', 'bbp_member_forums_favorites_content' );
+	bp_core_load_template( apply_filters( 'bbp_member_forums_screen_favorites', 'members/single/plugins' ) );
+}
+
+/**
+ * Hook bbPress subscriptions template into plugins template
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses add_action() To add the content hook
+ * @uses bp_core_load_template() To load the plugins template
+ */
+function bbp_member_forums_screen_subscriptions() {
+	add_action( 'bp_template_content', 'bbp_member_forums_subscriptions_content' );
+	bp_core_load_template( apply_filters( 'bbp_member_forums_screen_subscriptions', 'members/single/plugins' ) );
+}
+
+/** BuddyPress Templates ******************************************************/
+
+/**
+ * Get the topics created template part
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses bbp_get_template_part()s
+ */
+function bbp_member_forums_topics_content() {
+?>
+
+	<div id="bbpress-forums">
+
+		<?php bbp_get_template_part( 'user', 'topics-created' ); ?>
+
+	</div>
+
+<?php
+}
+
+/**
+ * Get the topics replied to template part
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses bbp_get_template_part()
+ */
+function bbp_member_forums_replies_content() {
+?>
+
+	<div id="bbpress-forums">
+
+		<?php bbp_get_template_part( 'user', 'replies-created' ); ?>
+
+	</div>
+
+<?php
+}
+
+/**
+ * Get the topics favorited template part
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses bbp_get_template_part()
+ */
+function bbp_member_forums_favorites_content() {
+?>
+
+	<div id="bbpress-forums">
+
+		<?php bbp_get_template_part( 'user', 'favorites' ); ?>
+
+	</div>
+
+<?php
+}
+
+/**
+ * Get the topics subscribed template part
+ *
+ * @since bbPress (r3552)
+ *
+ * @uses bbp_get_template_part()
+ */
+function bbp_member_forums_subscriptions_content() {
+?>
+
+	<div id="bbpress-forums">
+
+		<?php bbp_get_template_part( 'user', 'subscriptions' ); ?>
+
+	</div>
+
+<?php
+}
+
+/** Forum/Group Sync **********************************************************/
+
+/**
+ * These functions are used to keep the many-to-many relationships between
+ * groups and forums synchronized. Each forum and group stores ponters to each
+ * other in their respective meta. This way if a group or forum is deleted
+ * their associattions can be updated without much effort.
+ */
+
+/**
+ * Get forum ID's for a group
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_get_group_forum_ids( $group_id = 0 ) {
+
+	// Assume no forums
+	$forum_ids = array();
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get the forums
+	if ( !empty( $group_id ) )
+		$forum_ids = groups_get_groupmeta( $group_id, 'forum_id' );
+
+	// Make sure result is an array
+	if ( !is_array( $forum_ids ) )
+		$forum_ids = (array) $forum_ids;
+
+	// Trim out any empty array items
+	$forum_ids = array_filter( $forum_ids );
+
+	return (array) apply_filters( 'bbp_get_group_forum_ids', $forum_ids, $group_id );
+}
+
+/**
+ * Get group ID's for a forum
+ *
+ * @param type $forum_id
+ * @since bbPress (r3653)
+ */
+function bbp_get_forum_group_ids( $forum_id = 0 ) {
+
+	// Assume no forums
+	$group_ids = array();
+
+	// Use current group if none is set
+	if ( empty( $forum_id ) )
+		$forum_id = bbp_get_forum_id();
+
+	// Get the forums
+	if ( !empty( $forum_id ) )
+		$group_ids = get_post_meta( $forum_id, '_bbp_group_ids', true );
+
+	// Make sure result is an array
+	if ( !is_array( $group_ids ) )
+		$group_ids = (array) $group_ids;
+
+	// Trim out any empty array items
+	$group_ids = array_filter( $group_ids );
+
+	return (array) apply_filters( 'bbp_get_forum_group_ids', $group_ids, $forum_id );
+}
+
+/**
+ * Get forum ID's for a group
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_update_group_forum_ids( $group_id = 0, $forum_ids = array() ) {
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Trim out any empties
+	$forum_ids = array_filter( $forum_ids );
+
+	// Get the forums
+	return groups_update_groupmeta( $group_id, 'forum_id', $forum_ids );
+}
+
+/**
+ * Update group ID's for a forum
+ *
+ * @param type $forum_id
+ * @since bbPress (r3653)
+ */
+function bbp_update_forum_group_ids( $forum_id = 0, $group_ids = array() ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Trim out any empties
+	$group_ids = array_filter( $group_ids );
+
+	// Get the forums
+	return update_post_meta( $forum_id, '_bbp_group_ids', $group_ids );
+}
+
+/**
+ * Add a group to a forum
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_add_group_id_to_forum( $forum_id = 0, $group_id = 0 ) {
+
+	// Validate forum_id
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get current group IDs
+	$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+	// Maybe update the groups forums
+	if ( !in_array( $group_id, $group_ids ) ) {
+		$group_ids[] = $group_id;
+		return bbp_update_forum_group_ids( $forum_id, $group_ids );
+	}
+}
+
+/**
+ * Remove a forum from a group
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_add_forum_id_to_group( $group_id = 0, $forum_id = 0 ) {
+
+	// Validate forum_id
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get current group IDs
+	$forum_ids = bbp_get_group_forum_ids( $group_id );
+
+	// Maybe update the groups forums
+	if ( !in_array( $forum_id, $forum_ids ) ) {
+		$forum_ids[] = $forum_id;
+		return bbp_update_group_forum_ids( $group_id, $forum_ids );
+	}
+}
+
+/**
+ * Remove a group from a forum
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_remove_group_id_from_forum( $forum_id = 0, $group_id = 0 ) {
+
+	// Validate forum_id
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get current group IDs
+	$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+	// Maybe update the groups forums
+	if ( in_array( $group_id, $group_ids ) ) {
+		unset( $group_ids[$group_id] );
+		return bbp_update_forum_group_ids( $forum_id, $group_ids );
+	}
+}
+
+/**
+ * Remove a forum from a group
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_remove_forum_id_from_group( $group_id = 0, $forum_id = 0 ) {
+
+	// Validate forum_id
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get current group IDs
+	$forum_ids = bbp_get_group_forum_ids( $group_id );
+
+	// Maybe update the groups forums
+	if ( in_array( $forum_id, $forum_ids ) ) {
+		unset( $forum_ids[$forum_id] );
+		return bbp_update_group_forum_ids( $group_id, $forum_ids );
+	}
+}
+
+/**
+ * Remove a group from aall forums
+ *
+ * @param type $group_id
+ * @since bbPress (r3653)
+ */
+function bbp_remove_group_id_from_all_forums( $group_id = 0 ) {
+
+	// Use current group if none is set
+	if ( empty( $group_id ) )
+		$group_id = bp_get_current_group_id();
+
+	// Get current group IDs
+	$forum_ids = bbp_get_group_forum_ids( $group_id );
+
+	// Loop through forums and remove this group from each one
+	foreach( (array) $forum_ids as $forum_id ) {
+		bbp_remove_group_id_from_forum( $group_id, $forum_id );
+	}
+}
+
+/**
+ * Remove a forum from all groups
+ *
+ * @param type $forum_id
+ * @since bbPress (r3653)
+ */
+function bbp_remove_forum_id_from_all_groups( $forum_id = 0 ) {
+
+	// Validate
+	$forum_id  = bbp_get_forum_id( $forum_id );
+	$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+	// Loop through groups and remove this forum from each one
+	foreach( (array) $group_ids as $group_id ) {
+		bbp_remove_forum_id_from_group( $forum_id, $group_id );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/group.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1101 @@
+<?php
+
+/**
+ * bbPress BuddyPress Group Extension Class
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ * @todo maybe move to BuddyPress Forums once bbPress 1.1 can be removed
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Forums_Group_Extension' ) && class_exists( 'BP_Group_Extension' ) ) :
+/**
+ * Loads Group Extension for Forums Component
+ *
+ * @since bbPress (r3552)
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ * @todo Everything
+ */
+class BBP_Forums_Group_Extension extends BP_Group_Extension {
+
+	/** Methods ***************************************************************/
+
+	/**
+	 * Setup bbPress group extension variables
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function __construct() {
+
+		// Name and slug
+		$this->name          = __( 'Forum', 'bbpress' );
+		$this->nav_item_name = __( 'Forum', 'bbpress' );
+		$this->slug          = 'forum';
+		$this->topic_slug    = 'topic';
+		$this->reply_slug    = 'reply';
+
+		// Forum component is visible
+		$this->visibility = 'public';
+
+		// Set positions towards end
+		$this->create_step_position = 15;
+		$this->nav_item_position    = 10;
+
+		// Allow create step and show in nav
+		$this->enable_create_step   = true;
+		$this->enable_nav_item      = true;
+		$this->enable_edit_item     = true;
+
+		// Template file to load, and action to hook display on to
+		$this->template_file        = 'groups/single/plugins';
+		$this->display_hook         = 'bp_template_content';
+
+		// Add handlers to bp_actions
+		add_action( 'bp_actions', 'bbp_new_forum_handler'  );
+		add_action( 'bp_actions', 'bbp_new_topic_handler'  );
+		add_action( 'bp_actions', 'bbp_new_reply_handler'  );
+		add_action( 'bp_actions', 'bbp_edit_forum_handler' );
+		add_action( 'bp_actions', 'bbp_edit_topic_handler' );
+		add_action( 'bp_actions', 'bbp_edit_reply_handler' );
+
+		// Possibly redirect
+		add_action( 'bbp_template_redirect',     array( $this, 'redirect_canonical' ) );
+
+		// Group forum pagination
+		add_filter( 'bbp_topic_pagination',      array( $this, 'topic_pagination'   ) );
+		add_filter( 'bbp_replies_pagination',    array( $this, 'replies_pagination' ) );
+
+		// Tweak the redirect field
+		add_filter( 'bbp_new_topic_redirect_to', array( $this, 'new_topic_redirect_to'        ), 10, 3 );
+		add_filter( 'bbp_new_reply_redirect_to', array( $this, 'new_reply_redirect_to'        ), 10, 3 );
+
+		// Map forum/topic/replys permalinks to their groups
+		add_filter( 'bbp_get_forum_permalink',   array( $this, 'map_forum_permalink_to_group' ), 10, 2 );
+		add_filter( 'bbp_get_topic_permalink',   array( $this, 'map_topic_permalink_to_group' ), 10, 2 );
+		add_filter( 'bbp_get_reply_permalink',   array( $this, 'map_reply_permalink_to_group' ), 10, 2 );
+
+		// Map reply edit links to their groups
+		add_filter( 'bbp_get_reply_edit_url',    array( $this, 'map_reply_edit_url_to_group'  ), 10, 2 );
+
+		// Map assorted template function permalinks
+		add_filter( 'post_link',                 array( $this, 'post_link'                    ), 10, 2 );
+		add_filter( 'page_link',                 array( $this, 'page_link'                    ), 10, 2 );
+		add_filter( 'post_type_link',            array( $this, 'post_type_link'               ), 10, 2 );
+
+		// Allow group member to view private/hidden forums
+		add_filter( 'bbp_map_topic_meta_caps',   array( $this, 'map_topic_meta_caps'          ), 10, 4 );
+		add_filter( 'bbp_map_reply_meta_caps',   array( $this, 'map_topic_meta_caps'          ), 10, 4 );
+
+		// Remove topic cap map when view is done
+		add_action( 'bbp_after_group_forum_display', array( $this, 'remove_topic_meta_cap_map' ) );
+		
+		// Map group forum activity items to groups
+		add_filter( 'bbp_before_record_activity_parse_args', array( $this, 'map_activity_to_group' ) );
+
+		// No subforums yet, so suppress them for now
+		add_filter( 'bbp_get_forum_subforum_count_int', array( $this, 'no_subforums_yet' ) );
+	}
+
+	/**
+	 * The primary display function for group forums
+	 */
+	public function display() {
+
+		// Prevent Topic Parent from appearing
+		add_action( 'bbp_theme_before_topic_form_forum', array( $this, 'ob_start'     ) );
+		add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'ob_end_clean' ) );
+		add_action( 'bbp_theme_after_topic_form_forum',  array( $this, 'topic_parent' ) );
+
+		// Prevent Forum Parent from appearing
+		add_action( 'bbp_theme_before_forum_form_parent', array( $this, 'ob_start'     ) );
+		add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'ob_end_clean' ) );
+		add_action( 'bbp_theme_after_forum_form_parent',  array( $this, 'forum_parent' ) );
+
+		// Hide breadcrumb
+		add_filter( 'bbp_no_breadcrumb', '__return_true' );
+
+		$this->display_forums( 0 );
+	}
+
+	/**
+	 * Allow group members to have advanced priviledges in group forum topics.
+	 *
+	 * @since bbPress (r4434)
+	 *
+	 * @param array $caps
+	 * @param string $cap
+	 * @param int $user_id
+	 * @param array $args
+	 * @return array
+	 */
+	public function map_topic_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+		// Bail if not viewing a single topic
+		if ( ! bp_is_single_item() || ! bp_is_groups_component() || ! bp_is_current_action( 'forum' ) || ! bp_is_action_variable( 0, 'topic' ) )
+			return $caps;
+
+		switch ( $cap ) {
+
+			// If user is a group mmember, allow them to create content.
+			case 'read_forum'          :
+			case 'publish_replies'     :
+			case 'publish_topics'      :
+			case 'read_hidden_forums'  :
+			case 'read_private_forums' :
+				if ( bp_group_is_member() ) {
+					$caps = array( 'participate' );
+				}
+				break;
+
+			// If user is a group mod ar admin, map to participate cap.
+			case 'moderate'     :
+			case 'edit_topic'   :
+			case 'edit_reply'   :
+			case 'view_trash'   :
+			case 'edit_others_replies' :
+			case 'edit_others_topics'  :
+				if ( bp_group_is_mod() || bp_group_is_admin() ) {
+					$caps = array( 'participate' );
+				}
+				break;
+
+			// If user is a group admin, allow them to delete topics and replies.
+			case 'delete_topic' :
+			case 'delete_reply' :
+				if ( bp_group_is_admin() ) {
+					$caps = array( 'participate' );
+				}
+				break;
+		}
+
+		return apply_filters( 'bbp_map_group_forum_topic_meta_caps', $caps, $cap, $user_id, $args );
+	}
+
+	/**
+	 * Remove the topic meta cap map, so it doesn't interfere with sidebars.
+	 *
+	 * @since bbPress (r4434)
+	 */
+	public function remove_topic_meta_cap_map() {
+		remove_filter( 'bbp_map_topic_meta_caps', array( $this, 'map_topic_meta_caps' ), 10, 4 );
+		remove_filter( 'bbp_map_reply_meta_caps', array( $this, 'map_topic_meta_caps' ), 10, 4 );
+	}
+
+	/** Edit ******************************************************************/
+
+	/**
+	 * Show forums and new forum form when editing a group
+	 *
+	 * @since bbPress (r3563)
+	 * @uses bbp_get_template_part()
+	 */
+	public function edit_screen() {
+
+		$checked = bp_get_new_group_enable_forum() || bp_group_is_forum_enabled( bp_get_group_id() ); ?>
+
+		<h4><?php _e( 'Enable Group Forum', 'bbpress' ); ?></h4>
+
+		<p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
+
+		<div class="checkbox">
+			<label><input type="checkbox" name="bbp-edit-group-forum" id="bbp-edit-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
+		</div>
+
+		<p class="description"><?php _e( 'Saying no will not delete existing forum content.', 'bbpress' ); ?></p>
+
+		<input type="submit" value="<?php esc_attr_e( 'Save Settings', 'bbpress' ); ?>" />
+
+		<?php
+
+		// Verify intent
+		wp_nonce_field( 'groups_edit_save_' . $this->slug );
+	}
+
+	/**
+	 * Save the Group Forum data on edit
+	 *
+	 * @since bbPress (r3465)
+	 * @uses bbp_new_forum_handler() To check for forum creation
+	 * @uses bbp_edit_forum_handler() To check for forum edit
+	 */
+	public function edit_screen_save() {
+
+		// Bail if not a POST action
+		if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+			return;
+
+		check_admin_referer( 'groups_edit_save_' . $this->slug );
+
+		$edit_forum   = !empty( $_POST['bbp-edit-group-forum'] ) ? true : false;
+		$forum_id     = 0;
+		$group_id     = bp_get_current_group_id();
+		$forum_ids    = bbp_get_group_forum_ids( $group_id );
+		if ( !empty( $forum_ids ) )
+			$forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
+
+		// Update the group forum setting
+		$group               = new BP_Groups_Group( $group_id );
+		$group->enable_forum = $edit_forum;
+		$group->save();
+
+		// Redirect after save
+		bp_core_redirect( trailingslashit( bp_get_group_permalink( buddypress()->groups->current_group ) . '/admin/' . $this->slug ) );
+	}
+
+	/** Create ****************************************************************/
+
+	/**
+	 * Show forums and new forum form when creating a group
+	 *
+	 * @since bbPress (r3465)
+	 */
+	public function create_screen() {
+
+		// Bail if not looking at this screen
+		if ( !bp_is_group_creation_step( $this->slug ) )
+			return false;
+
+		$checked = bp_get_new_group_enable_forum() || groups_get_groupmeta( bp_get_new_group_id(), 'forum_id' ); ?>
+
+		<h4><?php _e( 'Group Forum', 'bbpress' ); ?></h4>
+
+		<p><?php _e( 'Create a discussion forum to allow members of this group to communicate in a structured, bulletin-board style fashion.', 'bbpress' ); ?></p>
+
+		<div class="checkbox">
+			<label><input type="checkbox" name="bbp-create-group-forum" id="bbp-create-group-forum" value="1"<?php checked( $checked ); ?> /> <?php _e( 'Yes. I want this group to have a forum.', 'bbpress' ); ?></label>
+		</div>
+
+		<?php
+
+		// Verify intent
+		wp_nonce_field( 'groups_create_save_' . $this->slug );
+	}
+
+	/**
+	 * Save the Group Forum data on create
+	 *
+	 * @since bbPress (r3465)
+	 */
+	public function create_screen_save() {
+
+		check_admin_referer( 'groups_create_save_' . $this->slug );
+
+		$create_forum = !empty( $_POST['bbp-create-group-forum'] ) ? true : false;
+		$forum_id     = 0;
+		$forum_ids    = bbp_get_group_forum_ids( bp_get_new_group_id() );
+		if ( !empty( $forum_ids ) )
+			$forum_id = (int) is_array( $forum_ids ) ? $forum_ids[0] : $forum_ids;
+
+		// Create a forum, or not
+		switch ( $create_forum ) {
+			case true  :
+
+				// Bail if initial content was already created
+				if ( !empty( $forum_id ) )
+					return;
+
+				// Set the default forum status
+				switch ( bp_get_new_group_status() ) {
+					case 'hidden'  :
+						$status = bbp_get_hidden_status_id();
+						break;
+					case 'private' :
+						$status = bbp_get_private_status_id();
+						break;
+					case 'public'  :
+					default        :
+						$status = bbp_get_public_status_id();
+						break;
+				}
+
+				// Create the initial forum
+				$forum_id = bbp_insert_forum( array(
+					'post_parent'  => bbp_get_group_forums_root_id(),
+					'post_title'   => bp_get_new_group_name(),
+					'post_content' => bp_get_new_group_description(),
+					'post_status'  => $status
+				) );
+
+				// Run the BP-specific functions for new groups
+				$this->new_forum( array( 'forum_id' => $forum_id ) );
+
+				// Update forum active
+				groups_update_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id, true );
+
+				break;
+			case false :
+
+				// Forum was created but is now being undone
+				if ( !empty( $forum_id ) ) {
+					wp_delete_post( $forum_id, true );
+					groups_delete_groupmeta( bp_get_new_group_id(), 'forum_id' );
+					groups_delete_groupmeta( bp_get_new_group_id(), '_bbp_forum_enabled_' . $forum_id );
+				}
+
+				break;
+		}
+	}
+
+	/**
+	 * Used to start an output buffer
+	 */
+	public function ob_start() {
+		ob_start();
+	}
+
+	/**
+	 * Used to end an output buffer
+	 */
+	public function ob_end_clean() {
+		ob_end_clean();
+	}
+
+	/**
+	 * Creating a group forum or category (including root for group)
+	 *
+	 * @since bbPress (r3653)
+	 * @param type $forum_args
+	 * @uses bbp_get_forum_id()
+	 * @uses bp_get_current_group_id()
+	 * @uses bbp_add_forum_id_to_group()
+	 * @uses bbp_add_group_id_to_forum()
+	 * @return if no forum_id is available
+	 */
+	public function new_forum( $forum_args = array() ) {
+
+		// Bail if no forum_id was passed
+		if ( empty( $forum_args['forum_id'] ) )
+			return;
+
+		// Validate forum_id
+		$forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
+		$group_id = bp_get_current_group_id();
+
+		bbp_add_forum_id_to_group( $group_id, $forum_id );
+		bbp_add_group_id_to_forum( $forum_id, $group_id );
+	}
+
+	/**
+	 * Removing a group forum or category (including root for group)
+	 *
+	 * @since bbPress (r3653)
+	 * @param type $forum_args
+	 * @uses bbp_get_forum_id()
+	 * @uses bp_get_current_group_id()
+	 * @uses bbp_add_forum_id_to_group()
+	 * @uses bbp_add_group_id_to_forum()
+	 * @return if no forum_id is available
+	 */
+	public function remove_forum( $forum_args = array() ) {
+
+		// Bail if no forum_id was passed
+		if ( empty( $forum_args['forum_id'] ) )
+			return;
+
+		// Validate forum_id
+		$forum_id = bbp_get_forum_id( $forum_args['forum_id'] );
+		$group_id = bp_get_current_group_id();
+
+		bbp_remove_forum_id_from_group( $group_id, $forum_id );
+		bbp_remove_group_id_from_forum( $forum_id, $group_id );
+	}
+
+	/** Display Methods *******************************************************/
+
+	/**
+	 * Output the forums for a group in the edit screens
+	 *
+	 * @since bbPress (r3653)
+	 * @uses bp_get_current_group_id()
+	 * @uses bbp_get_group_forum_ids()
+	 * @uses bbp_has_forums()
+	 * @uses bbp_get_template_part()
+	 */
+	public function display_forums( $offset = 0 ) {
+
+		// Allow actions immediately before group forum output
+		do_action( 'bbp_before_group_forum_display' );
+
+		// Load up bbPress once
+		$bbp = bbpress();
+
+		// Forum data
+		$forum_ids  = bbp_get_group_forum_ids( bp_get_current_group_id() );
+		$forum_args = array( 'post__in' => $forum_ids, 'post_parent' => null );
+
+		// Unset global queries
+		$bbp->forum_query = new stdClass;
+		$bbp->topic_query = new stdClass;
+		$bbp->reply_query = new stdClass;
+
+		// Unset global ID's
+		$bbp->current_forum_id     = 0;
+		$bbp->current_topic_id     = 0;
+		$bbp->current_reply_id     = 0;
+		$bbp->current_topic_tag_id = 0;
+
+		// Reset the post data
+		wp_reset_postdata();
+
+		// Allow admins special views
+		$post_status = array( bbp_get_closed_status_id(), bbp_get_public_status_id() );
+		if ( is_super_admin() || current_user_can( 'moderate' ) || bp_is_item_admin() || bp_is_item_mod() )
+			$post_status = array_merge( $post_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ); ?>
+
+		<div id="bbpress-forums">
+
+			<?php
+
+			// Looking at the group forum root
+			if ( !bp_action_variable( $offset ) ) :
+
+				// Query forums and show them if they exist
+				if ( !empty( $forum_ids ) && bbp_has_forums( $forum_args ) ) :
+
+					// Only one forum found
+					if ( 1 == $bbp->forum_query->post_count ) :
+
+						// Get forum data
+						$forum_slug = bp_action_variable( $offset );
+						$forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
+						$forums     = get_posts( $forum_args );
+
+						bbp_the_forum();
+
+						// Forum exists
+						if ( !empty( $forums ) ) :
+							$forum = $forums[0];
+
+							// Suppress subforums for now
+							add_filter( 'bbp_get_forum_subforum_count', '__return_false' );
+
+							// Set up forum data
+							$forum_id = bbpress()->current_forum_id = $forum->ID;
+							bbp_set_query_name( 'bbp_single_forum' ); ?>
+
+							<h3><?php bbp_forum_title(); ?></h3>
+
+							<?php bbp_get_template_part( 'content', 'single-forum' ); ?>
+
+							<?php 
+
+							// Remove the subforum suppression filter
+							remove_filter( 'bbp_get_forum_subforum_count', '__return_false' );
+							
+							?>
+
+						<?php else : ?>
+
+							<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+							<?php bbp_get_template_part( 'form',       'topic'     ); ?>
+
+						<?php endif;
+
+					// More than 1 forum found or group forum admin screen
+					elseif ( 1 < $bbp->forum_query->post_count ) : ?>
+
+						<h3><?php _e( 'Forums', 'bbpress' ); ?></h3>
+
+						<?php bbp_get_template_part( 'loop', 'forums' ); ?>
+
+						<h3><?php _e( 'Topics', 'bbpress' ); ?></h3>
+
+						<?php if ( bbp_has_topics( array( 'post_parent__in' => $forum_ids ) ) ) : ?>
+
+							<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+							<?php bbp_get_template_part( 'loop',       'topics'    ); ?>
+
+							<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+							<?php bbp_get_template_part( 'form',       'topic'     ); ?>
+
+						<?php else : ?>
+
+							<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+							<?php bbp_get_template_part( 'form',       'topic'     ); ?>
+
+						<?php endif;
+
+					// No forums found
+					else : ?>
+
+						<div id="message" class="info">
+							<p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
+						</div>
+
+					<?php endif;
+
+				// No forums found
+				else : ?>
+
+					<div id="message" class="info">
+						<p><?php _e( 'This group does not currently have any forums.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif;
+
+			// Single forum
+			elseif ( ( bp_action_variable( $offset ) != $this->slug ) && ( bp_action_variable( $offset ) != $this->topic_slug ) && ( bp_action_variable( $offset ) != $this->reply_slug ) ) :
+
+				// Get forum data
+				$forum_slug = bp_action_variable( $offset );
+				$forum_args = array( 'name' => $forum_slug, 'post_type' => bbp_get_forum_post_type() );
+				$forums     = get_posts( $forum_args );
+
+				// Forum exists
+				if ( !empty( $forums ) ) :
+					$forum = $forums[0];
+
+					// Set up forum data
+					$forum_id = bbpress()->current_forum_id = $forum->ID;
+
+					// Reset necessary forum_query attributes for forums loop to function
+					$bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
+					$bbp->forum_query->in_the_loop             = true;
+					$bbp->forum_query->post                    = get_post( $forum_id );
+
+					// Forum edit
+					if ( bp_action_variable( $offset + 1 ) == $bbp->edit_id ) :
+						global $wp_query, $post;
+
+						$wp_query->bbp_is_edit       = true;
+						$wp_query->bbp_is_forum_edit = true;
+						$post                        = $forum;
+
+						bbp_set_query_name( 'bbp_forum_form' );
+
+						bbp_get_template_part( 'form', 'forum' );
+
+					else :
+						bbp_set_query_name( 'bbp_single_forum' ); ?>
+
+						<h3><?php bbp_forum_title(); ?></h3>
+
+						<?php bbp_get_template_part( 'content', 'single-forum' );
+
+					endif;
+
+				else :
+					bbp_get_template_part( 'feedback', 'no-topics' );
+					bbp_get_template_part( 'form',     'topic'     );
+
+				endif;
+
+			// Single topic
+			elseif ( bp_action_variable( $offset ) == $this->topic_slug ) :
+
+				// Get topic data
+				$topic_slug = bp_action_variable( $offset + 1 );
+				$topic_args = array( 'name' => $topic_slug, 'post_type' => bbp_get_topic_post_type(), 'post_status' => $post_status );
+				$topics     = get_posts( $topic_args );
+
+				// Topic exists
+				if ( !empty( $topics ) ) :
+					$topic = $topics[0];
+
+					// Set up topic data
+					$topic_id = bbpress()->current_topic_id = $topic->ID;
+					$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+					// Reset necessary forum_query attributes for topics loop to function
+					$bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
+					$bbp->forum_query->in_the_loop             = true;
+					$bbp->forum_query->post                    = get_post( $forum_id );
+
+					// Reset necessary topic_query attributes for topics loop to function
+					$bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
+					$bbp->topic_query->in_the_loop             = true;
+					$bbp->topic_query->post                    = $topic;
+
+					// Topic edit
+					if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
+						global $wp_query, $post;
+						$wp_query->bbp_is_edit       = true;
+						$wp_query->bbp_is_topic_edit = true;
+						$post                        = $topic;
+
+						// Merge
+						if ( !empty( $_GET['action'] ) && 'merge' == $_GET['action'] ) :
+							bbp_set_query_name( 'bbp_topic_merge' );
+
+							bbp_get_template_part( 'form', 'topic-merge' );
+
+						// Split
+						elseif ( !empty( $_GET['action'] ) && 'split' == $_GET['action'] ) :
+							bbp_set_query_name( 'bbp_topic_split' );
+
+							bbp_get_template_part( 'form', 'topic-split' );
+
+						// Edit
+						else :
+							bbp_set_query_name( 'bbp_topic_form' );
+							bbp_get_template_part( 'form', 'topic' );
+
+						endif;
+
+					// Single Topic
+					else:
+
+						bbp_set_query_name( 'bbp_single_topic' ); ?>
+
+						<h3><?php bbp_topic_title(); ?></h3>
+
+						<?php bbp_get_template_part( 'content', 'single-topic' );
+
+					endif;
+
+				// No Topics
+				else :
+					bbp_get_template_part( 'feedback', 'no-topics'   );
+					bbp_get_template_part( 'form',     'topic'       );
+
+				endif;
+
+			// Single reply
+			elseif ( bp_action_variable( $offset ) == $this->reply_slug ) :
+
+				// Get reply data
+				$reply_slug = bp_action_variable( $offset + 1 );
+				$reply_args = array( 'name' => $reply_slug, 'post_type' => bbp_get_reply_post_type() );
+				$replies    = get_posts( $reply_args );
+
+				if ( empty( $replies ) )
+					return;
+
+				// Get the first reply
+				$reply = $replies[0];
+
+				// Set up reply data
+				$reply_id = bbpress()->current_reply_id = $reply->ID;
+				$topic_id = bbp_get_reply_topic_id( $reply_id );
+				$forum_id = bbp_get_reply_forum_id( $reply_id );
+
+				// Reset necessary forum_query attributes for reply to function
+				$bbp->forum_query->query_vars['post_type'] = bbp_get_forum_post_type();
+				$bbp->forum_query->in_the_loop             = true;
+				$bbp->forum_query->post                    = get_post( $forum_id );
+
+				// Reset necessary topic_query attributes for reply to function
+				$bbp->topic_query->query_vars['post_type'] = bbp_get_topic_post_type();
+				$bbp->topic_query->in_the_loop             = true;
+				$bbp->topic_query->post                    = get_post( $topic_id );
+
+				// Reset necessary reply_query attributes for reply to function
+				$bbp->reply_query->query_vars['post_type'] = bbp_get_reply_post_type();
+				$bbp->reply_query->in_the_loop             = true;
+				$bbp->reply_query->post                    = $reply;
+
+				if ( bp_action_variable( $offset + 2 ) == $bbp->edit_id ) :
+					global $wp_query, $post;
+
+					$wp_query->bbp_is_edit       = true;
+					$wp_query->bbp_is_reply_edit = true;
+					$post                        = $reply;
+
+					bbp_set_query_name( 'bbp_reply_form' );
+					bbp_get_template_part( 'form', 'reply' );
+
+				endif;
+
+			endif; ?>
+
+		</div>
+
+		<?php
+
+		// Allow actions immediately after group forum output
+		do_action( 'bbp_after_group_forum_display' );
+	}
+
+	/** Redirect Helpers ******************************************************/
+
+	/**
+	 * Redirect to the group forum screen
+	 *
+	 * @since bbPress (r3653)
+	 * @param str $redirect_url
+	 * @param str $redirect_to
+	 */
+	public function new_topic_redirect_to( $redirect_url = '', $redirect_to = '', $topic_id = 0 ) {
+		if ( bp_is_group() ) {
+			$topic        = bbp_get_topic( $topic_id );
+			$topic_hash   = '#post-' . $topic_id;
+			$redirect_url = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name ) . $topic_hash;
+		}
+
+		return $redirect_url;
+	}
+
+	/**
+	 * Redirect to the group forum screen
+	 *
+	 * @since bbPress (r3653)
+	 */
+	public function new_reply_redirect_to( $redirect_url = '', $redirect_to = '', $reply_id = 0 ) {
+		global $wp_rewrite;
+
+		if ( bp_is_group() ) {
+			$topic_id       = bbp_get_reply_topic_id( $reply_id );
+			$topic          = bbp_get_topic( $topic_id );
+			$reply_position = bbp_get_reply_position( $reply_id, $topic_id );
+			$reply_page     = ceil( (int) $reply_position / (int) bbp_get_replies_per_page() );
+			$reply_hash     = '#post-' . $reply_id;
+			$topic_url      = trailingslashit( bp_get_group_permalink( groups_get_current_group() ) ) . trailingslashit( $this->slug ) . trailingslashit( $this->topic_slug ) . trailingslashit( $topic->post_name );
+
+			// Don't include pagination if on first page
+			if ( 1 >= $reply_page ) {
+				$redirect_url = trailingslashit( $topic_url ) . $reply_hash;
+
+			// Include pagination
+			} else {
+				$redirect_url = trailingslashit( $topic_url ) . trailingslashit( $wp_rewrite->pagination_base ) . trailingslashit( $reply_page ) . $reply_hash;
+			}
+
+			// Add topic view query arg back to end if it is set
+			if ( bbp_get_view_all() ) {
+				$redirect_url = bbp_add_view_all( $redirect_url );
+			}
+		}
+
+		return $redirect_url;
+	}
+
+	/**
+	 * Redirect to the group admin forum edit screen
+	 *
+	 * @since bbPress (r3653)
+	 * @uses groups_get_current_group()
+	 * @uses bp_is_group_admin_screen()
+	 * @uses trailingslashit()
+	 * @uses bp_get_root_domain()
+	 * @uses bp_get_groups_root_slug()
+	 */
+	public function edit_redirect_to( $redirect_url = '' ) {
+
+		// Get the current group, if there is one
+		$group = groups_get_current_group();
+
+		// If this is a group of any kind, empty out the redirect URL
+		if ( bp_is_group_admin_screen( $this->slug ) )
+			$redirect_url = trailingslashit( bp_get_root_domain() . '/' . bp_get_groups_root_slug() . '/' . $group->slug . '/admin/' . $this->slug );
+
+		return $redirect_url;
+	}
+
+	/** Form Helpers **********************************************************/
+
+	public function forum_parent() {
+	?>
+
+		<input type="hidden" name="bbp_forum_parent_id" id="bbp_forum_parent_id" value="<?php bbp_group_forums_root_id(); ?>" />
+
+	<?php
+	}
+
+	public function topic_parent() {
+
+		$forum_ids = bbp_get_group_forum_ids( bp_get_current_group_id() ); ?>
+
+		<p>
+			<label for="bbp_forum_id"><?php _e( 'Forum:', 'bbpress' ); ?></label><br />
+			<?php bbp_dropdown( array( 'include' => $forum_ids, 'selected' => bbp_get_form_topic_forum() ) ); ?>
+		</p>
+
+	<?php
+	}
+
+	/** Permalink Mappers *****************************************************/
+
+	/**
+	 * Maybe map a bbPress forum/topic/reply permalink to the corresponding group
+	 *
+	 * @param int $post_id
+	 * @uses get_post()
+	 * @uses bbp_is_reply()
+	 * @uses bbp_get_reply_topic_id()
+	 * @uses bbp_get_reply_forum_id()
+	 * @uses bbp_is_topic()
+	 * @uses bbp_get_topic_forum_id()
+	 * @uses bbp_is_forum()
+	 * @uses get_post_field()
+	 * @uses bbp_get_forum_group_ids()
+	 * @uses groups_get_group()
+	 * @uses bp_get_group_admin_permalink()
+	 * @uses bp_get_group_permalink()
+	 * @return Bail early if not a group forum post
+	 * @return string
+	 */
+	private function maybe_map_permalink_to_group( $post_id = 0, $url = false ) {
+
+		switch ( get_post_type( $post_id ) ) {
+
+			// Reply
+			case bbp_get_reply_post_type() :
+				$topic_id = bbp_get_reply_topic_id( $post_id );
+				$forum_id = bbp_get_reply_forum_id( $post_id );
+				$url_end  = trailingslashit( $this->reply_slug ) . get_post_field( 'post_name', $post_id );
+				break;
+
+			// Topic
+			case bbp_get_topic_post_type() :
+				$topic_id = $post_id;
+				$forum_id = bbp_get_topic_forum_id( $post_id );
+				$url_end  = trailingslashit( $this->topic_slug ) . get_post_field( 'post_name', $post_id );
+				break;
+
+			// Forum
+			case bbp_get_forum_post_type() :
+				$forum_id = $post_id;
+				$url_end  = ''; //get_post_field( 'post_name', $post_id );
+				break;
+
+			// Unknown
+			default :
+				return $url;
+				break;
+		}
+		
+		// Get group ID's for this forum
+		$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+		// Bail if the post isn't associated with a group
+		if ( empty( $group_ids ) )
+			return $url;
+
+		// @todo Multiple group forums/forum groups
+		$group_id = $group_ids[0];
+		$group    = groups_get_group( array( 'group_id' => $group_id ) );
+
+		if ( bp_is_group_admin_screen( $this->slug ) ) {
+			$group_permalink = trailingslashit( bp_get_group_admin_permalink( $group ) );
+		} else {
+			$group_permalink = trailingslashit( bp_get_group_permalink( $group ) );
+		}
+
+		return trailingslashit( trailingslashit( $group_permalink . $this->slug ) . $url_end );
+	}
+
+	/**
+	 * Map a forum permalink to its corresponding group
+	 *
+	 * @since bbPress (r3802)
+	 * @param string $url
+	 * @param int $forum_id
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function map_forum_permalink_to_group( $url, $forum_id ) {
+		return $this->maybe_map_permalink_to_group( $forum_id, $url );
+	}
+
+	/**
+	 * Map a topic permalink to its group forum
+	 *
+	 * @since bbPress (r3802)
+	 * @param string $url
+	 * @param int $topic_id
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function map_topic_permalink_to_group( $url, $topic_id ) {
+		return $this->maybe_map_permalink_to_group( $topic_id, $url );
+	}
+
+	/**
+	 * Map a reply permalink to its group forum
+	 *
+	 * @since bbPress (r3802)
+	 * @param string $url
+	 * @param int $reply_id
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function map_reply_permalink_to_group( $url, $reply_id ) {
+		return $this->maybe_map_permalink_to_group( bbp_get_reply_topic_id( $reply_id ), $url );
+	}
+
+	/**
+	 * Map a reply edit link to its group forum
+	 *
+	 * @param string $url
+	 * @param int $reply_id
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function map_reply_edit_url_to_group( $url, $reply_id ) {
+		$new = $this->maybe_map_permalink_to_group( $reply_id );
+
+		if ( empty( $new ) )
+			return $url;
+
+		return trailingslashit( $new ) . bbpress()->edit_id  . '/';
+	}
+
+	/**
+	 * Map a post link to its group forum
+	 *
+	 * @param string $url
+	 * @param obj $post
+	 * @param boolean $leavename
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function post_link( $url, $post ) {
+		return $this->maybe_map_permalink_to_group( $post->ID, $url );
+	}
+
+	/**
+	 * Map a page link to its group forum
+	 *
+	 * @param string $url
+	 * @param int $post_id
+	 * @param $sample
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function page_link( $url, $post_id ) {
+		return $this->maybe_map_permalink_to_group( $post_id, $url );
+	}
+
+	/**
+	 * Map a custom post type link to its group forum
+	 *
+	 * @param string $url
+	 * @param obj $post
+	 * @param $leavename
+	 * @param $sample
+	 * @uses maybe_map_permalink_to_group()
+	 * @return string
+	 */
+	public function post_type_link( $url, $post ) {
+		return $this->maybe_map_permalink_to_group( $post->ID, $url );
+	}
+
+	/**
+	 * Fix pagination of topics on forum view
+	 *
+	 * @param array $args
+	 * @global $wp_rewrite
+	 * @uses bbp_get_forum_id()
+	 * @uses maybe_map_permalink_to_group
+	 * @return array
+ 	 */
+	public function topic_pagination( $args ) {
+		$new = $this->maybe_map_permalink_to_group( bbp_get_forum_id() );
+
+		if ( empty( $new ) )
+			return $args;
+
+		global $wp_rewrite;
+
+		$args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
+
+		return $args;
+	}
+
+	/**
+	 * Fix pagination of replies on topic view
+	 *
+	 * @param array $args
+	 * @global $wp_rewrite
+	 * @uses bbp_get_topic_id()
+	 * @uses maybe_map_permalink_to_group
+	 * @return array
+	 */
+	public function replies_pagination( $args ) {
+		$new = $this->maybe_map_permalink_to_group( bbp_get_topic_id() );
+		if ( empty( $new ) )
+			return $args;
+
+		global $wp_rewrite;
+
+		$args['base'] = trailingslashit( $new ) . $wp_rewrite->pagination_base . '/%#%/';
+
+		return $args;
+	}
+	
+	/**
+	 * Ensure that forum content associated with a BuddyPress group can only be
+	 * viewed via the group URL.
+	 *
+	 * @since bbPress (r3802)
+	 */
+	public function redirect_canonical() {
+
+		// Viewing a single forum
+		if ( bbp_is_single_forum() ) {
+			$forum_id  = get_the_ID();
+			$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+		// Viewing a single topic
+		} elseif ( bbp_is_single_topic() ) {
+			$topic_id  = get_the_ID();
+			$slug      = get_post_field( 'post_name', $topic_id );
+			$forum_id  = bbp_get_topic_forum_id( $topic_id );
+			$group_ids = bbp_get_forum_group_ids( $forum_id );
+
+		// Not a forum or topic
+		} else {
+			return;
+		}
+
+		// Bail if not a group forum
+		if ( empty( $group_ids ) )
+			return;
+
+		// Use the first group ID
+		$group_id 	 = $group_ids[0];
+		$group    	 = groups_get_group( array( 'group_id' => $group_id ) );
+		$group_link  = trailingslashit( bp_get_group_permalink( $group ) );
+		$redirect_to = trailingslashit( $group_link . $this->slug );
+
+		// Add topic slug to URL
+		if ( bbp_is_single_topic() ) {
+			$redirect_to  = trailingslashit( $redirect_to . $this->topic_slug . '/' . $slug );
+		}
+
+		bp_core_redirect( $redirect_to );
+	}
+
+	/** Activity ***************************************************************/
+
+	/**
+	 * Map a forum post to its corresponding group in the group activity stream.
+	 *
+	 * @since bbPress (r4396)
+	 *
+	 * @param array $args Arguments from BBP_BuddyPress_Activity::record_activity()
+	 * @uses groups_get_current_group() To see if we're posting from a BP group
+	 *
+	 * @return array
+	 */
+	public function map_activity_to_group( $args = array() ) {
+
+		// Get current BP group
+		$group = groups_get_current_group();
+
+		// Not posting from a BuddyPress group? stop now!
+		if ( empty( $group ) )
+			return $args;
+
+		// Set the component to 'groups' so the activity item shows up in the group
+		$args['component']         = buddypress()->groups->id;
+
+		// Move the forum post ID to the secondary item ID
+		$args['secondary_item_id'] = $args['item_id'];
+
+		// Set the item ID to the group ID so the activity item shows up in the group
+		$args['item_id']           = $group->id;
+
+		return $args;
+	}	
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/loader.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,323 @@
+<?php
+
+/**
+ * bbPress BuddyPress Component Class
+ *
+ * bbPress and BuddyPress are designed to connect together seamlessly and
+ * invisibly, and this is the hunk of code necessary to make that happen.
+ *
+ * The code in this BuddyPress Extension does some pretty complicated stuff,
+ * far outside the realm of the simplicity bbPress is traditionally known for.
+ *
+ * While the rest of bbPress serves as an example of how to write pretty, simple
+ * code, what's in these files is pure madness. It should not be used as an
+ * example of anything other than successfully juggling chainsaws and puppy-dogs.
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Forums_Component' ) ) :
+/**
+ * Loads Forums Component
+ *
+ * @since bbPress (r3552)
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+class BBP_Forums_Component extends BP_Component {
+
+	/**
+	 * Start the forums component creation process
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function __construct() {
+		parent::start(
+			'forums',
+			__( 'Forums', 'bbpress' ),
+			BP_PLUGIN_DIR
+		);
+		$this->includes();
+		$this->setup_globals();
+		$this->setup_actions();
+		$this->setup_nav();
+		$this->fully_loaded();
+	}
+
+	/**
+	 * Include BuddyPress classes and functions
+	 */
+	public function includes() {
+
+		// Helper BuddyPress functions
+		require( bbpress()->includes_dir . 'extend/buddypress/functions.php' );
+
+		// Members modifications
+		require( bbpress()->includes_dir . 'extend/buddypress/members.php' );
+
+		// BuddyPress Activity Extension class
+		if ( bp_is_active( 'activity' ) ) {
+			require( bbpress()->includes_dir . 'extend/buddypress/activity.php' );
+		}
+
+		// BuddyPress Group Extension class
+		if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
+			require( bbpress()->includes_dir . 'extend/buddypress/group.php' );
+		}
+	}
+
+	/**
+	 * Setup globals
+	 *
+	 * The BP_FORUMS_SLUG constant is deprecated, and only used here for
+	 * backwards compatibility.
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function setup_globals() {
+		$bp = buddypress();
+
+		// Define the parent forum ID
+		if ( !defined( 'BP_FORUMS_PARENT_FORUM_ID' ) )
+			define( 'BP_FORUMS_PARENT_FORUM_ID', 1 );
+
+		// Define a slug, if necessary
+		if ( !defined( 'BP_FORUMS_SLUG' ) )
+			define( 'BP_FORUMS_SLUG', $this->id );
+
+		// All globals for messaging component.
+		$globals = array(
+			'path'                  => BP_PLUGIN_DIR,
+			'slug'                  => BP_FORUMS_SLUG,
+			'root_slug'             => isset( $bp->pages->forums->slug ) ? $bp->pages->forums->slug : BP_FORUMS_SLUG,
+			'has_directory'         => false,
+			'notification_callback' => 'messages_format_notifications',
+			'search_string'         => __( 'Search Forums...', 'bbpress' ),
+		);
+
+		parent::setup_globals( $globals );
+	}
+
+	/**
+	 * Instantiate classes for BuddyPress integration
+	 *
+	 * @since bbPress (r3395)
+	 */
+	public function setup_components() {
+
+		// Always load the members component
+		bbpress()->extend->buddypress->members = new BBP_BuddyPress_Members;
+
+		// Create new activity class
+		if ( bp_is_active( 'activity' ) ) {
+			bbpress()->extend->buddypress->activity = new BBP_BuddyPress_Activity;
+		}
+
+		// Register the group extension only if groups are active
+		if ( bbp_is_group_forums_active() && bp_is_active( 'groups' ) ) {
+			bp_register_group_extension( 'BBP_Forums_Group_Extension' );
+		}
+	}
+
+	/**
+	 * Setup the actions
+	 *
+	 * @since bbPress (r3395)
+	 * @access private
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	public function setup_actions() {
+
+		// Setup the components
+		add_action( 'bp_init', array( $this, 'setup_components' ) );
+
+		parent::setup_actions();
+	}
+
+	/**
+	 * Allow the variables, actions, and filters to be modified by third party
+	 * plugins and themes.
+	 *
+	 * @since bbPress (r3902)
+	 */
+	private function fully_loaded() {
+		do_action_ref_array( 'bbp_buddypress_loaded', array( $this ) );
+	}
+
+	/**
+	 * Setup BuddyBar navigation
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function setup_nav() {
+
+		// Stop if there is no user displayed or logged in
+		if ( !is_user_logged_in() && !bp_displayed_user_id() )
+			return;
+
+		// Define local variable(s)
+		$sub_nav     = array();
+		$user_domain = '';
+
+		// Add 'Forums' to the main navigation
+		$main_nav = array(
+			'name'                => __( 'Forums', 'bbpress' ),
+			'slug'                => $this->slug,
+			'position'            => 80,
+			'screen_function'     => 'bbp_member_forums_screen_topics',
+			'default_subnav_slug' => 'topics',
+			'item_css_id'         => $this->id
+		);
+
+		// Determine user to use
+		if ( bp_displayed_user_id() )
+			$user_domain = bp_displayed_user_domain();
+		elseif ( bp_loggedin_user_domain() )
+			$user_domain = bp_loggedin_user_domain();
+		else
+			return;
+
+		// User link
+		$forums_link = trailingslashit( $user_domain . $this->slug );
+
+		// Topics started
+		$sub_nav[] = array(
+			'name'            => __( 'Topics Started', 'bbpress' ),
+			'slug'            => 'topics',
+			'parent_url'      => $forums_link,
+			'parent_slug'     => $this->slug,
+			'screen_function' => 'bbp_member_forums_screen_topics',
+			'position'        => 20,
+			'item_css_id'     => 'topics'
+		);
+
+		// Replies to topics
+		$sub_nav[] = array(
+			'name'            => __( 'Replies Created', 'bbpress' ),
+			'slug'            => 'replies',
+			'parent_url'      => $forums_link,
+			'parent_slug'     => $this->slug,
+			'screen_function' => 'bbp_member_forums_screen_replies',
+			'position'        => 40,
+			'item_css_id'     => 'replies'
+		);
+
+		// Favorite topics
+		$sub_nav[] = array(
+			'name'            => __( 'Favorites', 'bbpress' ),
+			'slug'            => 'favorites',
+			'parent_url'      => $forums_link,
+			'parent_slug'     => $this->slug,
+			'screen_function' => 'bbp_member_forums_screen_favorites',
+			'position'        => 60,
+			'item_css_id'     => 'favorites'
+		);
+
+		// Subscribed topics (my profile only)
+		if ( bp_is_my_profile() ) {
+			$sub_nav[] = array(
+				'name'            => __( 'Subscriptions', 'bbpress' ),
+				'slug'            => 'subscriptions',
+				'parent_url'      => $forums_link,
+				'parent_slug'     => $this->slug,
+				'screen_function' => 'bbp_member_forums_screen_subscriptions',
+				'position'        => 60,
+				'item_css_id'     => 'subscriptions'
+			);
+		}
+
+		parent::setup_nav( $main_nav, $sub_nav );
+	}
+
+	/**
+	 * Set up the admin bar
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function setup_admin_bar() {
+
+		// Prevent debug notices
+		$wp_admin_nav = array();
+
+		// Menus for logged in user
+		if ( is_user_logged_in() ) {
+
+			// Setup the logged in user variables
+			$user_domain = bp_loggedin_user_domain();
+			$forums_link = trailingslashit( $user_domain . $this->slug );
+
+			// Add the "My Account" sub menus
+			$wp_admin_nav[] = array(
+				'parent' => buddypress()->my_account_menu_id,
+				'id'     => 'my-account-' . $this->id,
+				'title'  => __( 'Forums', 'bbpress' ),
+				'href'   => trailingslashit( $forums_link )
+			);
+
+			// Topics
+			$wp_admin_nav[] = array(
+				'parent' => 'my-account-' . $this->id,
+				'id'     => 'my-account-' . $this->id . '-topics',
+				'title'  => __( 'Topics Started', 'bbpress' ),
+				'href'   => trailingslashit( $forums_link . 'topics' )
+			);
+
+			// Replies
+			$wp_admin_nav[] = array(
+				'parent' => 'my-account-' . $this->id,
+				'id'     => 'my-account-' . $this->id . '-replies',
+				'title'  => __( 'Replies Created', 'bbpress' ),
+				'href'   => trailingslashit( $forums_link . 'replies' )
+			);
+
+			// Favorites
+			$wp_admin_nav[] = array(
+				'parent' => 'my-account-' . $this->id,
+				'id'     => 'my-account-' . $this->id . '-favorites',
+				'title'  => __( 'Favorite Topics', 'bbpress' ),
+				'href'   => trailingslashit( $forums_link . 'favorites' )
+			);
+
+			// Subscriptions
+			$wp_admin_nav[] = array(
+				'parent' => 'my-account-' . $this->id,
+				'id'     => 'my-account-' . $this->id . '-subscriptions',
+				'title'  => __( 'Subscribed Topics', 'bbpress' ),
+				'href'   => trailingslashit( $forums_link . 'subscriptions' )
+			);
+		}
+
+		parent::setup_admin_bar( $wp_admin_nav );
+	}
+
+	/**
+	 * Sets up the title for pages and <title>
+	 *
+	 * @since bbPress (r3552)
+	 */
+	public function setup_title() {
+		$bp = buddypress();
+
+		// Adjust title based on view
+		if ( bp_is_forums_component() ) {
+			if ( bp_is_my_profile() ) {
+				$bp->bp_options_title = __( 'Forums', 'bbpress' );
+			} elseif ( bp_is_user() ) {
+				$bp->bp_options_avatar = bp_core_fetch_avatar( array(
+					'item_id' => bp_displayed_user_id(),
+					'type'    => 'thumb'
+				) );
+				$bp->bp_options_title = bp_get_displayed_user_fullname();
+			}
+		}
+
+		parent::setup_title();
+	}
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/buddypress/members.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,143 @@
+<?php
+
+/**
+ * bbPress BuddyPress Members Class
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+if ( !class_exists( 'BBP_Forums_Members' ) ) :
+/**
+ * Member profile modifications
+ *
+ * @since bbPress (r4395)
+ *
+ * @package bbPress
+ * @subpackage BuddyPress
+ */
+class BBP_BuddyPress_Members {
+
+	/**
+	 * Main constructor for modifying bbPress profile links
+	 *
+	 * @since bbPress (r4395)
+	 */
+	public function __construct() {
+		$this->setup_actions();
+		$this->setup_filters();
+	}
+
+	/**
+	 * Setup the actions
+	 *
+	 * @since bbPress (r4395)
+	 *
+	 * @access private
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		/** Favorites *********************************************************/
+
+		// Move handler to 'bp_actions' - BuddyPress bypasses template_loader
+		remove_action( 'template_redirect', 'bbp_favorites_handler', 1 );
+		add_action(    'bp_actions',        'bbp_favorites_handler', 1 );
+
+		/** Subscriptions *****************************************************/
+
+		// Move handler to 'bp_actions' - BuddyPress bypasses template_loader
+		remove_action( 'template_redirect', 'bbp_subscriptions_handler', 1 );
+		add_action(    'bp_actions',        'bbp_subscriptions_handler', 1 );
+	}
+
+	/**
+	 * Setup the filters
+	 *
+	 * @since bbPress (r4395)
+	 *
+	 * @access private
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_filters() {
+		add_filter( 'bbp_pre_get_user_profile_url',    array( $this, 'user_profile_url'            )        );
+		add_filter( 'bbp_get_favorites_permalink',     array( $this, 'get_favorites_permalink'     ), 10, 2 );
+		add_filter( 'bbp_get_subscriptions_permalink', array( $this, 'get_subscriptions_permalink' ), 10, 2 );
+	}
+
+	/** Filters ***************************************************************/
+
+	/**
+	 * Override bbPress profile URL with BuddyPress profile URL
+	 *
+	 * @since bbPress (r3401)
+	 * @param string $url
+	 * @param int $user_id
+	 * @param string $user_nicename
+	 * @return string
+	 */
+	public function user_profile_url( $user_id ) {
+
+		// Define local variable(s)
+		$profile_url = '';
+
+		// Special handling for forum component
+		if ( bp_is_current_component( 'forums' ) ) {
+
+			// Empty action or 'topics' action
+			if ( !bp_current_action() || bp_is_current_action( 'topics' ) ) {
+				$profile_url = bp_core_get_user_domain( $user_id ) . 'forums/topics';
+
+			// Empty action or 'topics' action
+			} elseif ( bp_is_current_action( 'replies' ) ) {
+				$profile_url = bp_core_get_user_domain( $user_id ) . 'forums/replies';
+
+			// 'favorites' action
+			} elseif ( bbp_is_favorites_active() && bp_is_current_action( 'favorites' ) ) {
+				$profile_url = $this->get_favorites_permalink( '', $user_id );
+
+			// 'subscriptions' action
+			} elseif ( bbp_is_subscriptions_active() && bp_is_current_action( 'subscriptions' ) ) {
+				$profile_url = $this->get_subscriptions_permalink( '', $user_id );
+			}
+
+		// Not in users' forums area
+		} else {
+			$profile_url = bp_core_get_user_domain( $user_id );
+		}
+
+		return trailingslashit( $profile_url );
+	}
+
+	/**
+	 * Override bbPress favorites URL with BuddyPress profile URL
+	 *
+	 * @since bbPress (r3721)
+	 * @param string $url
+	 * @param int $user_id
+	 * @return string
+	 */
+	public function get_favorites_permalink( $url, $user_id ) {
+		$url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/favorites' );
+		return $url;
+	}
+
+	/**
+	 * Override bbPress subscriptions URL with BuddyPress profile URL
+	 *
+	 * @since bbPress (r3721)
+	 * @param string $url
+	 * @param int $user_id
+	 * @return string
+	 */
+	public function get_subscriptions_permalink( $url, $user_id ) {
+		$url = trailingslashit( bp_core_get_user_domain( $user_id ) . 'forums/subscriptions' );
+		return $url;
+	}
+}
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/extend/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/forums/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,184 @@
+<?php
+
+/**
+ * bbPress Forum Capabilites
+ *
+ * Used to map forum capabilities to WordPress's existing capabilities.
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+/**
+ * Return forum capabilities
+ *
+ * @since bbPress (r2593)
+ *
+ * @uses apply_filters() Calls 'bbp_get_forum_caps' with the capabilities
+ * @return array Forum capabilities
+ */
+function bbp_get_forum_caps() {
+	return apply_filters( 'bbp_get_forum_caps', array (
+		'edit_posts'          => 'edit_forums',
+		'edit_others_posts'   => 'edit_others_forums',
+		'publish_posts'       => 'publish_forums',
+		'read_private_posts'  => 'read_private_forums',
+		'read_hidden_posts'   => 'read_hidden_forums',
+		'delete_posts'        => 'delete_forums',
+		'delete_others_posts' => 'delete_others_forums'
+	) );
+}
+
+/**
+ * Maps forum capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses get_post() To get the post
+ * @uses get_post_type_object() To get the post type object
+ * @uses apply_filters() Filter capability map results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_forum_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+
+		/** Reading ***********************************************************/
+
+		case 'read_private_forums' :
+		case 'read_hidden_forums'  :
+
+			// Moderators can always read private/hidden forums
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		case 'read_forum' :
+
+			// User cannot spectate
+			if ( ! user_can( $user_id, 'spectate' ) ) {
+				$caps = array( 'do_not_allow' );
+
+			// Do some post ID based logic
+			} else {
+
+				// Get the post
+				$_post = get_post( $args[0] );
+				if ( !empty( $_post ) ) {
+
+					// Get caps for post type object
+					$post_type = get_post_type_object( $_post->post_type );
+
+					// Post is public
+					if ( bbp_get_public_status_id() == $_post->post_status ) {
+						$caps = array( 'spectate' );
+
+					// User is author so allow read
+					} elseif ( (int) $user_id == (int) $_post->post_author ) {
+						$caps = array( 'spectate' );
+
+					// Unknown so map to private posts
+					} else {
+						$caps = array( $post_type->cap->read_private_posts );
+					}
+				}
+			}
+
+			break;
+
+		/** Publishing ********************************************************/
+
+		case 'publish_forums'  :
+
+			// Moderators can always edit
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		/** Editing ***********************************************************/
+
+		// Used primarily in wp-admin
+		case 'edit_forums'         :
+		case 'edit_others_forums'  :
+
+			// Moderators can always edit
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		// Used everywhere
+		case 'edit_forum' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// User is author so allow edit
+				} elseif ( (int) $user_id == (int) $_post->post_author ) {
+					$caps[] = $post_type->cap->edit_posts;
+
+				// Unknown, so map to edit_others_posts
+				} else {
+					$caps[] = $post_type->cap->edit_others_posts;
+				}
+			}
+
+			break;
+
+		/** Deleting **********************************************************/
+
+		// Allow forum authors to delete forums (for BuddyPress groups, etc)
+		case 'delete_forum' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// User is author so allow to delete
+				} elseif ( (int) $user_id == (int) $_post->post_author ) {
+					$caps[] = $post_type->cap->delete_posts;
+
+				// Unknown so map to delete_others_posts
+				} else {
+					$caps[] = $post_type->cap->delete_others_posts;
+				}
+			}
+
+			break;
+
+		/** Admin *************************************************************/
+
+		case 'bbp_forums_admin' :
+			$caps = array( 'manage_options' );
+			break;
+	}
+
+	return apply_filters( 'bbp_map_forum_meta_caps', $caps, $cap, $user_id, $args );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/forums/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2191 @@
+<?php
+
+/**
+ * bbPress Forum Functions
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Insert ********************************************************************/
+
+/**
+ * A wrapper for wp_insert_post() that also includes the necessary meta values
+ * for the forum to function properly.
+ *
+ * @since bbPress (r3349)
+ *
+ * @uses bbp_parse_args()
+ * @uses bbp_get_forum_post_type()
+ * @uses wp_insert_post()
+ * @uses update_post_meta()
+ *
+ * @param array $forum_data Forum post data
+ * @param arrap $forum_meta Forum meta data
+ */
+function bbp_insert_forum( $forum_data = array(), $forum_meta = array() ) {
+
+	// Forum
+	$default_forum = array(
+		'post_parent'    => 0, // forum ID
+		'post_status'    => bbp_get_public_status_id(),
+		'post_type'      => bbp_get_forum_post_type(),
+		'post_author'    => bbp_get_current_user_id(),
+		'post_password'  => '',
+		'post_content'   => '',
+		'post_title'     => '',
+		'menu_order'     => 0,
+		'comment_status' => 'closed'
+	);
+	$forum_data = bbp_parse_args( $forum_data, $default_forum, 'insert_forum' );
+
+	// Insert forum
+	$forum_id   = wp_insert_post( $forum_data );
+
+	// Bail if no forum was added
+	if ( empty( $forum_id ) )
+		return false;
+
+	// Forum meta
+	$default_meta = array(
+		'reply_count'          => 0,
+		'topic_count'          => 0,
+		'topic_count_hidden'   => 0,
+		'total_reply_count'    => 0,
+		'total_topic_count'    => 0,
+		'last_topic_id'        => 0,
+		'last_reply_id'        => 0,
+		'last_active_id'       => 0,
+		'last_active_time'     => 0,
+		'forum_subforum_count' => 0,
+	);
+	$forum_meta = bbp_parse_args( $forum_meta, $default_meta, 'insert_forum_meta' );
+
+	// Insert forum meta
+	foreach ( $forum_meta as $meta_key => $meta_value )
+		update_post_meta( $forum_id, '_bbp_' . $meta_key, $meta_value );
+
+	// Return new forum ID
+	return $forum_id;
+}
+
+/** Post Form Handlers ********************************************************/
+
+/**
+ * Handles the front end forum submission
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses bbp_is_anonymous() To check if an anonymous post is being made
+ * @uses current_user_can() To check if the current user can publish forum
+ * @uses bbp_get_current_user_id() To get the current user id
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses bbp_set_current_anonymous_user_data() To set the anonymous user cookies
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses esc_attr() For sanitization
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @uses bbp_is_forum_private() To check if the forum is private
+ * @uses bbp_check_for_flood() To check for flooding
+ * @uses bbp_check_for_duplicate() To check for duplicates
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses apply_filters() Calls 'bbp_new_forum_pre_title' with the content
+ * @uses apply_filters() Calls 'bbp_new_forum_pre_content' with the content
+ * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
+ * @uses wp_insert_post() To insert the forum
+ * @uses do_action() Calls 'bbp_new_forum' with the forum id, forum id,
+ *                    anonymous data and reply author
+ * @uses bbp_stick_forum() To stick or super stick the forum
+ * @uses bbp_unstick_forum() To unstick the forum
+ * @uses bbp_get_forum_permalink() To get the forum permalink
+ * @uses wp_safe_redirect() To redirect to the forum link
+ * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
+ *                                              messages
+ */
+function bbp_new_forum_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-new-forum
+	if ( empty( $_POST['action'] ) || ( 'bbp-new-forum' !== $_POST['action'] ) )
+		return;
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-new-forum' ) ) {
+		bbp_add_error( 'bbp_new_forum_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Define local variable(s)
+	$view_all = $anonymous_data = false;
+	$forum_parent_id = $forum_author = 0;
+	$forum_title = $forum_content = '';
+
+	/** Forum Author **********************************************************/
+
+	// User cannot create forums
+	if ( !current_user_can( 'publish_forums' ) ) {
+		bbp_add_error( 'bbp_forum_permissions', __( '<strong>ERROR</strong>: You do not have permission to create new forums.', 'bbpress' ) );
+		return;
+	}
+
+	// Forum author is current user
+	$forum_author = bbp_get_current_user_id();
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_forum'] ) && wp_create_nonce( 'bbp-unfiltered-html-forum_new' ) == $_POST['_bbp_unfiltered_html_forum'] ) {
+		remove_filter( 'bbp_new_forum_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_new_forum_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Forum Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_forum_title'] ) )
+		$forum_title = esc_attr( strip_tags( $_POST['bbp_forum_title'] ) );
+
+	// Filter and sanitize
+	$forum_title = apply_filters( 'bbp_new_forum_pre_title', $forum_title );
+
+	// No forum title
+	if ( empty( $forum_title ) )
+		bbp_add_error( 'bbp_forum_title', __( '<strong>ERROR</strong>: Your forum needs a title.', 'bbpress' ) );
+
+	/** Forum Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_forum_content'] ) )
+		$forum_content = $_POST['bbp_forum_content'];
+
+	// Filter and sanitize
+	$forum_content = apply_filters( 'bbp_new_forum_pre_content', $forum_content );
+
+	// No forum content
+	if ( empty( $forum_content ) )
+		bbp_add_error( 'bbp_forum_content', __( '<strong>ERROR</strong>: Your forum description cannot be empty.', 'bbpress' ) );
+
+	/** Forum Parent **********************************************************/
+
+	// Forum parent was passed (the norm)
+	if ( !empty( $_POST['bbp_forum_parent_id'] ) )
+		$forum_parent_id = (int) $_POST['bbp_forum_parent_id'];
+		
+	// Filter and sanitize
+	$forum_parent_id = apply_filters( 'bbp_new_forum_pre_parent_id', $forum_parent_id );
+
+	// No forum parent was passed (should never happen)
+	if ( empty( $forum_parent_id ) ) {
+		bbp_add_error( 'bbp_new_forum_missing_parent', __( '<strong>ERROR</strong>: Your forum must have a parent.', 'bbpress' ) );
+
+	// Forum exists
+	} elseif ( !empty( $forum_parent_id ) ) {
+
+		// Forum is a category
+		if ( bbp_is_forum_category( $forum_parent_id ) ) {
+			bbp_add_error( 'bbp_new_forum_forum_category', __( '<strong>ERROR</strong>: This forum is a category. No forums can be created in this forum.', 'bbpress' ) );
+		}
+
+		// Forum is closed and user cannot access
+		if ( bbp_is_forum_closed( $forum_parent_id ) && !current_user_can( 'edit_forum', $forum_parent_id ) ) {
+			bbp_add_error( 'bbp_new_forum_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new forums.', 'bbpress' ) );
+		}
+
+		// Forum is private and user cannot access
+		if ( bbp_is_forum_private( $forum_parent_id ) && !current_user_can( 'read_private_forums' ) ) {
+			bbp_add_error( 'bbp_new_forum_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new forums in it.', 'bbpress' ) );
+		}
+
+		// Forum is hidden and user cannot access
+		if ( bbp_is_forum_hidden( $forum_parent_id ) && !current_user_can( 'read_hidden_forums' ) ) {
+			bbp_add_error( 'bbp_new_forum_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new forums in it.', 'bbpress' ) );
+		}		
+	}
+
+	/** Forum Flooding ********************************************************/
+
+	if ( !bbp_check_for_flood( $anonymous_data, $forum_author ) )
+		bbp_add_error( 'bbp_forum_flood', __( '<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress' ) );
+
+	/** Forum Duplicate *******************************************************/
+
+	if ( !bbp_check_for_duplicate( array( 'post_type' => bbp_get_forum_post_type(), 'post_author' => $forum_author, 'post_content' => $forum_content, 'anonymous_data' => $anonymous_data ) ) )
+		bbp_add_error( 'bbp_forum_duplicate', __( '<strong>ERROR</strong>: This forum already exists.', 'bbpress' ) );
+
+	/** Forum Blacklist *******************************************************/
+
+	if ( !bbp_check_for_blacklist( $anonymous_data, $forum_author, $forum_title, $forum_content ) )
+		bbp_add_error( 'bbp_forum_blacklist', __( '<strong>ERROR</strong>: Your forum cannot be created at this time.', 'bbpress' ) );
+
+	/** Forum Moderation ******************************************************/
+
+	$post_status = bbp_get_public_status_id();
+	if ( !bbp_check_for_moderation( $anonymous_data, $forum_author, $forum_title, $forum_content ) )
+		$post_status = bbp_get_pending_status_id();
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_new_forum_pre_extras', $forum_parent_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $forum_data as an array
+	// Just in time manipulation of forum data before being created
+	$forum_data = apply_filters( 'bbp_new_forum_pre_insert', array(
+		'post_author'    => $forum_author,
+		'post_title'     => $forum_title,
+		'post_content'   => $forum_content,
+		'post_parent'    => $forum_parent_id,
+		'post_status'    => $post_status,
+		'post_type'      => bbp_get_forum_post_type(),
+		'comment_status' => 'closed'
+	) );
+
+	// Insert forum
+	$forum_id = wp_insert_post( $forum_data );
+
+	/** No Errors *************************************************************/
+
+	if ( !empty( $forum_id ) && !is_wp_error( $forum_id ) ) {
+
+		/** Trash Check *******************************************************/
+
+		// If the forum is trash, or the forum_status is switched to
+		// trash, trash it properly
+		if ( ( get_post_field( 'post_status', $forum_id ) == bbp_get_trash_status_id() ) || ( $forum_data['post_status'] == bbp_get_trash_status_id() ) ) {
+
+			// Trash the reply
+			wp_trash_post( $forum_id );
+
+			// Force view=all
+			$view_all = true;
+		}
+
+		/** Spam Check ********************************************************/
+
+		// If reply or forum are spam, officially spam this reply
+		if ( $forum_data['post_status'] == bbp_get_spam_status_id() ) {
+			add_post_meta( $forum_id, '_bbp_spam_meta_status', bbp_get_public_status_id() );
+
+			// Force view=all
+			$view_all = true;
+		}
+
+		/** Update counts, etc... *********************************************/
+
+		$forum_args = array(
+			'forum_id'           => $forum_id,
+			'post_parent'        => $forum_parent_id,
+			'forum_author'       => $forum_author,
+			'last_topic_id'      => 0,
+			'last_reply_id'      => 0,
+			'last_active_id'     => 0,
+			'last_active_time'   => 0,
+			'last_active_status' => bbp_get_public_status_id()
+		);
+		do_action( 'bbp_new_forum', $forum_args );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_new_forum_post_extras', $forum_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// Get the forum URL
+		$redirect_url = bbp_get_forum_permalink( $forum_id, $redirect_to );
+
+		// Add view all?
+		if ( bbp_get_view_all() || !empty( $view_all ) ) {
+
+			// User can moderate, so redirect to forum with view all set
+			if ( current_user_can( 'moderate' ) ) {
+				$redirect_url = bbp_add_view_all( $redirect_url );
+
+			// User cannot moderate, so redirect to forum
+			} else {
+				$redirect_url = bbp_get_forum_permalink( $forum_id );
+			}
+		}
+
+		// Allow to be filtered
+		$redirect_url = apply_filters( 'bbp_new_forum_redirect_to', $redirect_url, $redirect_to );
+
+		/** Successful Save ***************************************************/
+
+		// Redirect back to new forum
+		wp_safe_redirect( $redirect_url );
+
+		// For good measure
+		exit();
+
+	// Errors
+	} else {
+		$append_error = ( is_wp_error( $forum_id ) && $forum_id->get_error_message() ) ? $forum_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_forum_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your forum:' . $append_error, 'bbpress' ) );
+	}
+}
+
+/**
+ * Handles the front end edit forum submission
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_get_forum() To get the forum
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses bbp_is_forum_anonymous() To check if forum is by an anonymous user
+ * @uses current_user_can() To check if the current user can edit the forum
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses esc_attr() For sanitization
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @uses bbp_is_forum_private() To check if the forum is private
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses apply_filters() Calls 'bbp_edit_forum_pre_title' with the title and
+ *                        forum id
+ * @uses apply_filters() Calls 'bbp_edit_forum_pre_content' with the content
+ *                        and forum id
+ * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
+ * @uses wp_save_post_revision() To save a forum revision
+ * @uses bbp_update_forum_revision_log() To update the forum revision log
+ * @uses wp_update_post() To update the forum
+ * @uses do_action() Calls 'bbp_edit_forum' with the forum id, forum id,
+ *                    anonymous data and reply author
+ * @uses bbp_move_forum_handler() To handle movement of a forum from one forum
+ *                                 to another
+ * @uses bbp_get_forum_permalink() To get the forum permalink
+ * @uses wp_safe_redirect() To redirect to the forum link
+ * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
+ *                                              messages
+ */
+function bbp_edit_forum_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-edit-forum
+	if ( empty( $_POST['action'] ) || ( 'bbp-edit-forum' !== $_POST['action'] ) )
+		return;
+
+	// Define local variable(s)
+	$anonymous_data = array();
+	$forum = $forum_id = $forum_parent_id = 0;
+	$forum_title = $forum_content = $forum_edit_reason = '';
+
+	/** Forum *****************************************************************/
+
+	// Forum id was not passed
+	if ( empty( $_POST['bbp_forum_id'] ) ) {
+		bbp_add_error( 'bbp_edit_forum_id', __( '<strong>ERROR</strong>: Forum ID not found.', 'bbpress' ) );
+		return;
+
+	// Forum id was passed
+	} elseif ( is_numeric( $_POST['bbp_forum_id'] ) ) {
+		$forum_id = (int) $_POST['bbp_forum_id'];
+		$forum    = bbp_get_forum( $forum_id );
+	}
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-edit-forum_' . $forum_id ) ) {
+		bbp_add_error( 'bbp_edit_forum_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+
+	// Forum does not exist
+	} elseif ( empty( $forum ) ) {
+		bbp_add_error( 'bbp_edit_forum_not_found', __( '<strong>ERROR</strong>: The forum you want to edit was not found.', 'bbpress' ) );
+		return;
+
+	// User cannot edit this forum
+	} elseif ( !current_user_can( 'edit_forum', $forum_id ) ) {
+		bbp_add_error( 'bbp_edit_forum_permissions', __( '<strong>ERROR</strong>: You do not have permission to edit that forum.', 'bbpress' ) );
+		return;
+	}
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_forum'] ) && ( wp_create_nonce( 'bbp-unfiltered-html-forum_' . $forum_id ) == $_POST['_bbp_unfiltered_html_forum'] ) ) {
+		remove_filter( 'bbp_edit_forum_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_edit_forum_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Forum Parent ***********************************************************/
+
+	// Forum parent id was passed
+	if ( is_numeric( $_POST['bbp_forum_parent_id'] ) ) {
+		$forum_parent_id = (int) $_POST['bbp_forum_parent_id'];
+	}
+
+	// Current forum this forum is in
+	$current_parent_forum_id = bbp_get_forum_parent_id( $forum_id );
+
+	// Forum exists
+	if ( !empty( $forum_parent_id ) && ( $forum_parent_id !== $current_parent_forum_id ) ) {
+
+		// Forum is closed and user cannot access
+		if ( bbp_is_forum_closed( $forum_parent_id ) && !current_user_can( 'edit_forum', $forum_parent_id ) ) {
+			bbp_add_error( 'bbp_edit_forum_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new forums.', 'bbpress' ) );
+		}
+
+		// Forum is private and user cannot access
+		if ( bbp_is_forum_private( $forum_parent_id ) && !current_user_can( 'read_private_forums' ) ) {
+			bbp_add_error( 'bbp_edit_forum_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new forums in it.', 'bbpress' ) );
+		}
+
+		// Forum is hidden and user cannot access
+		if ( bbp_is_forum_hidden( $forum_parent_id ) && !current_user_can( 'read_hidden_forums' ) ) {
+			bbp_add_error( 'bbp_edit_forum_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new forums in it.', 'bbpress' ) );
+		}
+	}
+
+	/** Forum Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_forum_title'] ) )
+		$forum_title = esc_attr( strip_tags( $_POST['bbp_forum_title'] ) );
+
+	// Filter and sanitize
+	$forum_title = apply_filters( 'bbp_edit_forum_pre_title', $forum_title, $forum_id );
+
+	// No forum title
+	if ( empty( $forum_title ) )
+		bbp_add_error( 'bbp_edit_forum_title', __( '<strong>ERROR</strong>: Your forum needs a title.', 'bbpress' ) );
+
+	/** Forum Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_forum_content'] ) )
+		$forum_content = $_POST['bbp_forum_content'];
+
+	// Filter and sanitize
+	$forum_content = apply_filters( 'bbp_edit_forum_pre_content', $forum_content, $forum_id );
+
+	// No forum content
+	if ( empty( $forum_content ) )
+		bbp_add_error( 'bbp_edit_forum_content', __( '<strong>ERROR</strong>: Your forum description cannot be empty.', 'bbpress' ) );
+
+	/** Forum Blacklist *******************************************************/
+
+	if ( !bbp_check_for_blacklist( $anonymous_data, bbp_get_forum_author_id( $forum_id ), $forum_title, $forum_content ) )
+		bbp_add_error( 'bbp_forum_blacklist', __( '<strong>ERROR</strong>: Your forum cannot be edited at this time.', 'bbpress' ) );
+
+	/** Forum Moderation ******************************************************/
+
+	$post_status = bbp_get_public_status_id();
+	if ( !bbp_check_for_moderation( $anonymous_data, bbp_get_forum_author_id( $forum_id ), $forum_title, $forum_content ) )
+		$post_status = bbp_get_pending_status_id();
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_edit_forum_pre_extras', $forum_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $forum_data as an array
+	// Just in time manipulation of forum data before being edited
+	$forum_data = apply_filters( 'bbp_edit_forum_pre_insert', array(
+		'ID'           => $forum_id,
+		'post_title'   => $forum_title,
+		'post_content' => $forum_content,
+		'post_status'  => $post_status,
+		'post_parent'  => $forum_parent_id
+	) );
+
+	// Insert forum
+	$forum_id = wp_update_post( $forum_data );
+
+	/** Revisions *************************************************************/
+
+	/**
+	 * @todo omitted for 2.1
+	// Revision Reason
+	if ( !empty( $_POST['bbp_forum_edit_reason'] ) )
+		$forum_edit_reason = esc_attr( strip_tags( $_POST['bbp_forum_edit_reason'] ) );
+
+	// Update revision log
+	if ( !empty( $_POST['bbp_log_forum_edit'] ) && ( 1 == $_POST['bbp_log_forum_edit'] ) && ( $revision_id = wp_save_post_revision( $forum_id ) ) ) {
+		bbp_update_forum_revision_log( array(
+			'forum_id'    => $forum_id,
+			'revision_id' => $revision_id,
+			'author_id'   => bbp_get_current_user_id(),
+			'reason'      => $forum_edit_reason
+		) );
+	}
+	 */
+
+	/** No Errors *************************************************************/
+
+	if ( !empty( $forum_id ) && !is_wp_error( $forum_id ) ) {
+
+		// Update counts, etc...
+		$forum_args = array(
+			'forum_id'           => $forum_id,
+			'post_parent'        => $forum_parent_id,
+			'forum_author'       => $forum->post_author,
+			'last_topic_id'      => 0,
+			'last_reply_id'      => 0,
+			'last_active_id'     => 0,
+			'last_active_time'   => 0,
+			'last_active_status' => bbp_get_public_status_id()
+		);
+		do_action( 'bbp_edit_forum', $forum_args );
+
+		// If the new forum parent id is not equal to the old forum parent
+		// id, run the bbp_move_forum action and pass the forum's parent id
+		// as the first arg and new forum parent id as the second.
+		// @todo implement
+		//if ( $forum_id != $forum->post_parent )
+		//	bbp_move_forum_handler( $forum_parent_id, $forum->post_parent, $forum_id );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_edit_forum_post_extras', $forum_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// View all?
+		$view_all = bbp_get_view_all();
+
+		// Get the forum URL
+		$forum_url = bbp_get_forum_permalink( $forum_id, $redirect_to );
+
+		// Add view all?
+		if ( !empty( $view_all ) )
+			$forum_url = bbp_add_view_all( $forum_url );
+
+		// Allow to be filtered
+		$forum_url = apply_filters( 'bbp_edit_forum_redirect_to', $forum_url, $view_all, $redirect_to );
+
+		/** Successful Edit ***************************************************/
+
+		// Redirect back to new forum
+		wp_safe_redirect( $forum_url );
+
+		// For good measure
+		exit();
+
+	/** Errors ****************************************************************/
+
+	} else {
+		$append_error = ( is_wp_error( $forum_id ) && $forum_id->get_error_message() ) ? $forum_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_forum_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your forum:' . $append_error . 'Please try again.', 'bbpress' ) );
+	}
+}
+
+/**
+ * Handle the saving of core forum metadata (Status, Visibility, and Type)
+ *
+ * @since bbPress (r3678)
+ * @param int $forum_id
+ * @uses bbp_is_forum_closed() To check if forum is closed
+ * @uses bbp_close_forum() To close forum
+ * @uses bbp_open_forum() To open forum
+ * @uses bbp_is_forum_category() To check if forum is a category
+ * @uses bbp_categorize_forum() To turn forum into a category
+ * @uses bbp_normalize_forum() To turn category into forum
+ * @uses bbp_get_public_status_id() To get the public status ID
+ * @uses bbp_get_private_status_id() To get the private status ID
+ * @uses bbp_get_hidden_status_id() To get the hidden status ID
+ * @uses bbp_get_forum_visibility() To get the forums visibility
+ * @uses bbp_hide_forum() To hide a forum
+ * @uses bbp_privatize_forum() To make a forum private
+ * @uses bbp_publicize_forum() To make a forum public
+ * @return If forum ID is empty
+ */
+function bbp_save_forum_extras( $forum_id = 0 ) {
+
+	// Validate the forum ID
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Bail if forum ID is empty
+	if ( empty( $forum_id ) || ! bbp_is_forum( $forum_id ) )
+		return;
+
+	/** Forum Status ******************************************************/
+
+	if ( !empty( $_POST['bbp_forum_status'] ) && in_array( $_POST['bbp_forum_status'], array( 'open', 'closed' ) ) ) {
+		if ( 'closed' == $_POST['bbp_forum_status'] && !bbp_is_forum_closed( $forum_id, false ) ) {
+			bbp_close_forum( $forum_id );
+		} elseif ( 'open' == $_POST['bbp_forum_status'] && bbp_is_forum_closed( $forum_id, false ) ) {
+			bbp_open_forum( $forum_id );
+		}
+	}
+
+	/** Forum Type ********************************************************/
+
+	if ( !empty( $_POST['bbp_forum_type'] ) && in_array( $_POST['bbp_forum_type'], array( 'forum', 'category' ) ) ) {
+		if ( 'category' == $_POST['bbp_forum_type'] && !bbp_is_forum_category( $forum_id ) ) {
+			bbp_categorize_forum( $forum_id );
+		} elseif ( 'forum' == $_POST['bbp_forum_type'] && bbp_is_forum_category( $forum_id ) ) {
+			bbp_normalize_forum( $forum_id );
+		}
+	}
+
+	/** Forum Visibility **************************************************/
+
+	if ( !empty( $_POST['bbp_forum_visibility'] ) && in_array( $_POST['bbp_forum_visibility'], array( bbp_get_public_status_id(), bbp_get_private_status_id(), bbp_get_hidden_status_id() ) ) ) {
+
+		// Get forums current visibility
+		$visibility = bbp_get_forum_visibility( $forum_id );
+
+		// What is the new forum visibility setting?
+		switch ( $_POST['bbp_forum_visibility'] ) {
+
+			// Hidden
+			case bbp_get_hidden_status_id()  :
+				bbp_hide_forum( $forum_id, $visibility );
+				break;
+
+			// Private
+			case bbp_get_private_status_id() :
+				bbp_privatize_forum( $forum_id, $visibility );
+				break;
+
+			// Publish (default)
+			case bbp_get_public_status_id()  :
+			default        :
+				bbp_publicize_forum( $forum_id, $visibility );
+				break;
+		}
+	}
+}
+
+/** Walk **********************************************************************/
+
+/**
+ * Walk the forum tree
+ *
+ * @param object $forums Forums
+ * @param int $depth Depth
+ * @param int $current Current forum
+ * @param array $r Parsed arguments, supported by the walker. If you want to
+ *                  use your own walker, pass the 'walker' arg with the walker.
+ *                  The walker defaults to {@link BBP_Walker_Forum}
+ * @return object Walked forum tree
+ */
+function bbp_walk_forum( $forums, $depth, $current, $r ) {
+	$walker = empty( $r['walker'] ) ? new BBP_Walker_Forum : $r['walker'];
+	$args   = array( $forums, $depth, $r, $current );
+	return call_user_func_array( array( &$walker, 'walk' ), $args );
+}
+
+/** Forum Actions *************************************************************/
+
+/**
+ * Closes a forum
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id forum id
+ * @uses do_action() Calls 'bbp_close_forum' with the forum id
+ * @uses update_post_meta() To add the previous status to a meta
+ * @uses do_action() Calls 'bbp_opened_forum' with the forum id
+ * @return mixed False or {@link WP_Error} on failure, forum id on success
+ */
+function bbp_close_forum( $forum_id = 0 ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_close_forum',  $forum_id );
+
+	update_post_meta( $forum_id, '_bbp_status', 'closed' );
+
+	do_action( 'bbp_closed_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Opens a forum
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id forum id
+ * @uses do_action() Calls 'bbp_open_forum' with the forum id
+ * @uses get_post_meta() To get the previous status
+ * @uses update_post_meta() To delete the previous status meta
+ * @uses do_action() Calls 'bbp_opened_forum' with the forum id
+ * @return mixed False or {@link WP_Error} on failure, forum id on success
+ */
+function bbp_open_forum( $forum_id = 0 ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_open_forum',   $forum_id );
+
+	update_post_meta( $forum_id, '_bbp_status', 'open' );
+
+	do_action( 'bbp_opened_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Make the forum a category
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses update_post_meta() To update the forum category meta
+ * @return bool False on failure, true on success
+ */
+function bbp_categorize_forum( $forum_id = 0 ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_categorize_forum',  $forum_id );
+
+	update_post_meta( $forum_id, '_bbp_forum_type', 'category' );
+
+	do_action( 'bbp_categorized_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Remove the category status from a forum
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses delete_post_meta() To delete the forum category meta
+ * @return bool False on failure, true on success
+ */
+function bbp_normalize_forum( $forum_id = 0 ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_normalize_forum',  $forum_id );
+
+	update_post_meta( $forum_id, '_bbp_forum_type', 'forum' );
+
+	do_action( 'bbp_normalized_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Mark the forum as public
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses update_post_meta() To update the forum private meta
+ * @return bool False on failure, true on success
+ */
+function bbp_publicize_forum( $forum_id = 0, $current_visibility = '' ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_publicize_forum',  $forum_id );
+
+	// Get private forums
+	$private = bbp_get_private_forum_ids();
+
+	// Find this forum in the array
+	if ( in_array( $forum_id, $private ) ) {
+
+		$offset = array_search( $forum_id, $private );
+
+		// Splice around it
+		array_splice( $private, $offset, 1 );
+
+		// Update private forums minus this one
+		update_option( '_bbp_private_forums', array_unique( array_filter( array_values( $private ) ) ) );
+	}
+
+	// Get hidden forums
+	$hidden = bbp_get_hidden_forum_ids();
+
+	// Find this forum in the array
+	if ( in_array( $forum_id, $hidden ) ) {
+
+		$offset = array_search( $forum_id, $hidden );
+
+		// Splice around it
+		array_splice( $hidden, $offset, 1 );
+
+		// Update hidden forums minus this one
+		update_option( '_bbp_hidden_forums', array_unique( array_filter( array_values( $hidden ) ) ) );
+	}
+
+	// Only run queries if visibility is changing
+	if ( bbp_get_public_status_id() != $current_visibility ) {
+
+		// Update forum post_status
+		global $wpdb;
+		$wpdb->update( $wpdb->posts, array( 'post_status' => bbp_get_public_status_id() ), array( 'ID' => $forum_id ) );
+		wp_transition_post_status( bbp_get_public_status_id(), $current_visibility, get_post( $forum_id ) );
+	}
+
+	do_action( 'bbp_publicized_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Mark the forum as private
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses update_post_meta() To update the forum private meta
+ * @return bool False on failure, true on success
+ */
+function bbp_privatize_forum( $forum_id = 0, $current_visibility = '' ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_privatize_forum',  $forum_id );
+
+	// Only run queries if visibility is changing
+	if ( bbp_get_private_status_id() != $current_visibility ) {
+
+		// Get hidden forums
+		$hidden = bbp_get_hidden_forum_ids();
+
+		// Find this forum in the array
+		if ( in_array( $forum_id, $hidden ) ) {
+
+			$offset = array_search( $forum_id, $hidden );
+
+			// Splice around it
+			array_splice( $hidden, $offset, 1 );
+
+			// Update hidden forums minus this one
+			update_option( '_bbp_hidden_forums', array_unique( array_filter( array_values( $hidden ) ) ) );
+		}
+
+		// Add to '_bbp_private_forums' site option
+		$private   = bbp_get_private_forum_ids();
+		$private[] = $forum_id;
+		update_option( '_bbp_private_forums', array_unique( array_filter( array_values( $private ) ) ) );
+
+		// Update forums visibility setting
+		global $wpdb;
+		$wpdb->update( $wpdb->posts, array( 'post_status' => bbp_get_private_status_id() ), array( 'ID' => $forum_id ) );
+		wp_transition_post_status( bbp_get_private_status_id(), $current_visibility, get_post( $forum_id ) );
+	}
+
+	do_action( 'bbp_privatized_forum', $forum_id );
+
+	return $forum_id;
+}
+
+/**
+ * Mark the forum as hidden
+ *
+ * @since bbPress (r2996)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses update_post_meta() To update the forum private meta
+ * @return bool False on failure, true on success
+ */
+function bbp_hide_forum( $forum_id = 0, $current_visibility = '' ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	do_action( 'bbp_hide_forum', $forum_id );
+
+	// Only run queries if visibility is changing
+	if ( bbp_get_hidden_status_id() != $current_visibility ) {
+
+		// Get private forums
+		$private = bbp_get_private_forum_ids();
+
+		// Find this forum in the array
+		if ( in_array( $forum_id, $private ) ) {
+
+			$offset = array_search( $forum_id, $private );
+
+			// Splice around it
+			array_splice( $private, $offset, 1 );
+
+			// Update private forums minus this one
+			update_option( '_bbp_private_forums', array_unique( array_filter( array_values( $private ) ) ) );
+		}
+
+		// Add to '_bbp_hidden_forums' site option
+		$hidden   = bbp_get_hidden_forum_ids();
+		$hidden[] = $forum_id;
+		update_option( '_bbp_hidden_forums', array_unique( array_filter( array_values( $hidden ) ) ) );
+
+		// Update forums visibility setting
+		global $wpdb;
+		$wpdb->update( $wpdb->posts, array( 'post_status' => bbp_get_hidden_status_id() ), array( 'ID' => $forum_id ) );
+		wp_transition_post_status( bbp_get_hidden_status_id(), $current_visibility, get_post( $forum_id ) );
+	}
+
+	do_action( 'bbp_hid_forum',  $forum_id );
+
+	return $forum_id;
+}
+
+/** Count Bumpers *************************************************************/
+
+/**
+ * Bump the total topic count of a forum
+ *
+ * @since bbPress (r3825)
+ *
+ * @param int $forum_id Optional. Forum id.
+ * @param int $difference Optional. Default 1
+ * @param bool $update_ancestors Optional. Default true
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses update_post_meta() To update the forum's topic count meta
+ * @uses apply_filters() Calls 'bbp_bump_forum_topic_count' with the topic
+ *                        count, forum id, and difference
+ * @return int Forum topic count
+ */
+function bbp_bump_forum_topic_count( $forum_id = 0, $difference = 1, $update_ancestors = true ) {
+
+	// Get some counts
+	$forum_id          = bbp_get_forum_id( $forum_id );
+	$topic_count       = bbp_get_forum_topic_count( $forum_id, false, false );
+	$total_topic_count = bbp_get_forum_topic_count( $forum_id, true,  false );
+
+	// Update this forum id
+	update_post_meta( $forum_id, '_bbp_topic_count',       (int) $topic_count       + (int) $difference );
+	update_post_meta( $forum_id, '_bbp_total_topic_count', (int) $total_topic_count + (int) $difference );
+
+	// Check for ancestors
+	if ( true === $update_ancestors ) {
+
+		// Get post ancestors
+		$forum     = get_post( $forum_id );
+		$ancestors = get_post_ancestors( $forum );
+
+		// If has ancestors, loop through them...
+		if ( !empty( $ancestors ) ) {
+			foreach ( (array) $ancestors as $parent_forum_id ) {
+
+				// Get forum counts
+				$parent_topic_count       = bbp_get_forum_topic_count( $parent_forum_id, false, false );
+				$parent_total_topic_count = bbp_get_forum_topic_count( $parent_forum_id, true,  false );
+
+				// Update counts
+				update_post_meta( $parent_forum_id, '_bbp_topic_count',       (int) $parent_topic_count       + (int) $difference );
+				update_post_meta( $parent_forum_id, '_bbp_total_topic_count', (int) $parent_total_topic_count + (int) $difference );
+			}
+		}
+	}
+
+	return (int) apply_filters( 'bbp_bump_forum_topic_count', (int) $total_topic_count + (int) $difference, $forum_id, (int) $difference, (bool) $update_ancestors );
+}
+
+/**
+ * Bump the total hidden topic count of a forum
+ *
+ * @since bbPress (r3825)
+ *
+ * @param int $forum_id Optional. Forum id.
+ * @param int $difference Optional. Default 1
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses update_post_meta() To update the forum's topic count meta
+ * @uses apply_filters() Calls 'bbp_bump_forum_topic_count_hidden' with the
+ *                        topic count, forum id, and difference
+ * @return int Forum hidden topic count
+ */
+function bbp_bump_forum_topic_count_hidden( $forum_id = 0, $difference = 1 ) {
+
+	// Get some counts
+	$forum_id    = bbp_get_forum_id( $forum_id );
+	$topic_count = bbp_get_forum_topic_count_hidden( $forum_id, false );
+	$new_count   = (int) $topic_count + (int) $difference;
+
+	// Update this forum id
+	update_post_meta( $forum_id, '_bbp_topic_count_hidden', (int) $new_count );
+
+	return (int) apply_filters( 'bbp_bump_forum_topic_count_hidden', (int) $new_count, $forum_id, (int) $difference );
+}
+
+/**
+ * Bump the total topic count of a forum
+ *
+ * @since bbPress (r3825)
+ *
+ * @param int $forum_id Optional. Forum id.
+ * @param int $difference Optional. Default 1
+ * @param bool $update_ancestors Optional. Default true
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses update_post_meta() To update the forum's topic count meta
+ * @uses apply_filters() Calls 'bbp_bump_forum_reply_count' with the topic
+ *                        count, forum id, and difference
+ * @return int Forum topic count
+ */
+function bbp_bump_forum_reply_count( $forum_id = 0, $difference = 1, $update_ancestors = true ) {
+
+	// Get some counts
+	$forum_id          = bbp_get_forum_id( $forum_id );
+	$topic_count       = bbp_get_forum_reply_count( $forum_id, false );
+	$total_reply_count = bbp_get_forum_reply_count( $forum_id, true  );
+
+	// Update this forum id
+	update_post_meta( $forum_id, '_bbp_reply_count',       (int) $topic_count       + (int) $difference );
+	update_post_meta( $forum_id, '_bbp_total_reply_count', (int) $total_reply_count + (int) $difference );
+
+	// Check for ancestors
+	if ( true === $update_ancestors ) {
+
+		// Get post ancestors
+		$forum     = get_post( $forum_id );
+		$ancestors = get_post_ancestors( $forum );
+
+		// If has ancestors, loop through them...
+		if ( !empty( $ancestors ) ) {
+			foreach ( (array) $ancestors as $parent_forum_id ) {
+
+				// Get forum counts
+				$parent_topic_count       = bbp_get_forum_reply_count( $parent_forum_id, false );
+				$parent_total_reply_count = bbp_get_forum_reply_count( $parent_forum_id, true  );
+
+				// Update counts
+				update_post_meta( $parent_forum_id, '_bbp_reply_count',       (int) $parent_topic_count       + (int) $difference );
+				update_post_meta( $parent_forum_id, '_bbp_total_reply_count', (int) $parent_total_reply_count + (int) $difference );
+			}
+		}
+	}
+
+	return (int) apply_filters( 'bbp_bump_forum_reply_count', (int) $total_reply_count + (int) $difference, $forum_id, (int) $difference, (bool) $update_ancestors );
+}
+
+/** Forum Updaters ************************************************************/
+
+/**
+ * Update the forum last topic id
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_forum_query_subforum_ids() To get the subforum ids
+ * @uses bbp_update_forum_last_topic_id() To update the last topic id of child
+ *                                         forums
+ * @uses get_posts() To get the most recent topic in the forum
+ * @uses update_post_meta() To update the forum's last active id meta
+ * @uses apply_filters() Calls 'bbp_update_forum_last_topic_id' with the last
+ *                        reply id and forum id
+ * @return bool True on success, false on failure
+ */
+function bbp_update_forum_last_topic_id( $forum_id = 0, $topic_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Define local variable(s)
+	$children_last_topic = 0;
+
+	// Do some calculation if not manually set
+	if ( empty( $topic_id ) ) {
+
+		// Loop through children and add together forum reply counts
+		$children = bbp_forum_query_subforum_ids( $forum_id );
+		if ( !empty( $children ) ) {
+			foreach ( (array) $children as $child ) {
+				$children_last_topic = bbp_update_forum_last_topic_id( $child ); // Recursive
+			}
+		}
+
+		// Setup recent topic query vars
+		$post_vars = array(
+			'post_parent' => $forum_id,
+			'post_type'   => bbp_get_topic_post_type(),
+			'meta_key'    => '_bbp_last_active_time',
+			'orderby'     => 'meta_value',
+			'numberposts' => 1
+		);
+
+		// Get the most recent topic in this forum_id
+		$recent_topic = get_posts( $post_vars );
+		if ( !empty( $recent_topic ) ) {
+			$topic_id = $recent_topic[0]->ID;
+		}
+	}
+
+	// Cast as integer in case of empty or string
+	$topic_id            = (int) $topic_id;
+	$children_last_topic = (int) $children_last_topic;
+
+	// If child forums have higher id, use that instead
+	if ( !empty( $children ) && ( $children_last_topic > $topic_id ) )
+		$topic_id = $children_last_topic;
+
+	// Update the last public topic ID
+	if ( bbp_is_topic_published( $topic_id ) )
+		update_post_meta( $forum_id, '_bbp_last_topic_id', $topic_id );
+
+	return (int) apply_filters( 'bbp_update_forum_last_topic_id', $topic_id, $forum_id );
+}
+
+/**
+ * Update the forum last reply id
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_forum_query_subforum_ids() To get the subforum ids
+ * @uses bbp_update_forum_last_reply_id() To update the last reply id of child
+ *                                         forums
+ * @uses bbp_forum_query_topic_ids() To get the topic ids in the forum
+ * @uses bbp_forum_query_last_reply_id() To get the forum's last reply id
+ * @uses bbp_is_reply_published() To make sure the reply is published
+ * @uses update_post_meta() To update the forum's last active id meta
+ * @uses apply_filters() Calls 'bbp_update_forum_last_reply_id' with the last
+ *                        reply id and forum id
+ * @return bool True on success, false on failure
+ */
+function bbp_update_forum_last_reply_id( $forum_id = 0, $reply_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Define local variable(s)
+	$children_last_reply = 0;
+
+	// Do some calculation if not manually set
+	if ( empty( $reply_id ) ) {
+
+		// Loop through children and get the most recent reply id
+		$children = bbp_forum_query_subforum_ids( $forum_id );
+		if ( !empty( $children ) ) {
+			foreach ( (array) $children as $child ) {
+				$children_last_reply = bbp_update_forum_last_reply_id( $child ); // Recursive
+			}
+		}
+
+		// If this forum has topics...
+		$topic_ids = bbp_forum_query_topic_ids( $forum_id );
+		if ( !empty( $topic_ids ) ) {
+
+			// ...get the most recent reply from those topics...
+			$reply_id = bbp_forum_query_last_reply_id( $forum_id, $topic_ids );
+
+			// ...and compare it to the most recent topic id...
+			$reply_id = ( $reply_id > max( $topic_ids ) ) ? $reply_id : max( $topic_ids );
+		}
+	}
+
+	// Cast as integer in case of empty or string
+	$reply_id            = (int) $reply_id;
+	$children_last_reply = (int) $children_last_reply;
+	
+	// If child forums have higher ID, check for newer reply id
+	if ( !empty( $children ) && ( $children_last_reply > $reply_id ) )
+		$reply_id = $children_last_reply;
+
+	// Update the last public reply ID
+	if ( bbp_is_reply_published( $reply_id ) )
+		update_post_meta( $forum_id, '_bbp_last_reply_id', $reply_id );
+
+	return (int) apply_filters( 'bbp_update_forum_last_reply_id', $reply_id, $forum_id );
+}
+
+/**
+ * Update the forum last active post id
+ *
+ * @since bbPress (r2860)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param int $active_id Optional. Active post id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_forum_query_subforum_ids() To get the subforum ids
+ * @uses bbp_update_forum_last_active_id() To update the last active id of
+ *                                          child forums
+ * @uses bbp_forum_query_topic_ids() To get the topic ids in the forum
+ * @uses bbp_forum_query_last_reply_id() To get the forum's last reply id
+ * @uses get_post_status() To make sure the reply is published
+ * @uses update_post_meta() To update the forum's last active id meta
+ * @uses apply_filters() Calls 'bbp_update_forum_last_active_id' with the last
+ *                        active post id and forum id
+ * @return bool True on success, false on failure
+ */
+function bbp_update_forum_last_active_id( $forum_id = 0, $active_id = 0 ) {
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Define local variable(s)
+	$children_last_active = 0;
+
+	// Do some calculation if not manually set
+	if ( empty( $active_id ) ) {
+
+		// Loop through children and add together forum reply counts
+		$children = bbp_forum_query_subforum_ids( $forum_id );
+		if ( !empty( $children ) ) {
+			foreach ( (array) $children as $child ) {
+				$children_last_active = bbp_update_forum_last_active_id( $child, $active_id );
+			}
+		}
+
+		// Don't count replies if the forum is a category
+		$topic_ids = bbp_forum_query_topic_ids( $forum_id );
+		if ( !empty( $topic_ids ) ) {
+			$active_id = bbp_forum_query_last_reply_id( $forum_id, $topic_ids );
+			$active_id = $active_id > max( $topic_ids ) ? $active_id : max( $topic_ids );
+
+		// Forum has no topics
+		} else {
+			$active_id = 0;
+		}
+	}
+
+	// Cast as integer in case of empty or string
+	$active_id            = (int) $active_id;
+	$children_last_active = (int) $children_last_active;
+
+	// If child forums have higher id, use that instead
+	if ( !empty( $children ) && ( $children_last_active > $active_id ) )
+		$active_id = $children_last_active;
+
+	// Update only if published
+	if ( bbp_get_public_status_id() == get_post_status( $active_id ) )
+		update_post_meta( $forum_id, '_bbp_last_active_id', (int) $active_id );
+
+	return (int) apply_filters( 'bbp_update_forum_last_active_id', (int) $active_id, $forum_id );
+}
+
+/**
+ * Update the forums last active date/time (aka freshness)
+ *
+ * @since bbPress (r2680)
+ *
+ * @param int $forum_id Optional. Topic id
+ * @param string $new_time Optional. New time in mysql format
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_forum_last_active_id() To get the forum's last post id
+ * @uses get_post_field() To get the post date of the forum's last post
+ * @uses update_post_meta() To update the forum last active time
+ * @uses apply_filters() Calls 'bbp_update_forum_last_active' with the new time
+ *                        and forum id
+ * @return bool True on success, false on failure
+ */
+function bbp_update_forum_last_active_time( $forum_id = 0, $new_time = '' ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Check time and use current if empty
+	if ( empty( $new_time ) )
+		$new_time = get_post_field( 'post_date', bbp_get_forum_last_active_id( $forum_id ) );
+
+	// Update only if there is a time
+	if ( !empty( $new_time ) )
+		update_post_meta( $forum_id, '_bbp_last_active_time', $new_time );
+
+	return (int) apply_filters( 'bbp_update_forum_last_active', $new_time, $forum_id );
+}
+
+/**
+ * Update the forum sub-forum count
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @return bool True on success, false on failure
+ */
+function bbp_update_forum_subforum_count( $forum_id = 0, $subforums = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $subforums ) )
+		$subforums = count( bbp_forum_query_subforum_ids( $forum_id ) );
+
+	update_post_meta( $forum_id, '_bbp_forum_subforum_count', (int) $subforums );
+
+	return (int) apply_filters( 'bbp_update_forum_subforum_count', (int) $subforums, $forum_id );
+}
+
+/**
+ * Adjust the total topic count of a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id or topic id. It is checked whether it
+ *                       is a topic or a forum. If it's a topic, its parent,
+ *                       i.e. the forum is automatically retrieved.
+ * @param bool $total_count Optional. To return the total count or normal
+ *                           count?
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_forum_query_subforum_ids() To get the subforum ids
+ * @uses bbp_update_forum_topic_count() To update the forum topic count
+ * @uses bbp_forum_query_topic_ids() To get the forum topic ids
+ * @uses update_post_meta() To update the forum's topic count meta
+ * @uses apply_filters() Calls 'bbp_update_forum_topic_count' with the topic
+ *                        count and forum id
+ * @return int Forum topic count
+ */
+function bbp_update_forum_topic_count( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+	$children_topic_count = 0;
+
+	// Loop through subforums and add together forum topic counts
+	$children = bbp_forum_query_subforum_ids( $forum_id );
+	if ( !empty( $children ) ) {
+		foreach ( (array) $children as $child ) {
+			$children_topic_count += bbp_update_forum_topic_count( $child ); // Recursive
+		}
+	}
+
+	// Get total topics for this forum
+	$topics = (int) count( bbp_forum_query_topic_ids( $forum_id ) );
+
+	// Calculate total topics in this forum
+	$total_topics = $topics + $children_topic_count;
+
+	// Update the count
+	update_post_meta( $forum_id, '_bbp_topic_count',       (int) $topics       );
+	update_post_meta( $forum_id, '_bbp_total_topic_count', (int) $total_topics );
+
+	return (int) apply_filters( 'bbp_update_forum_topic_count', (int) $total_topics, $forum_id );
+}
+
+/**
+ * Adjust the total hidden topic count of a forum (hidden includes trashed and spammed topics)
+ *
+ * @since bbPress (r2888)
+ *
+ * @param int $forum_id Optional. Topic id to update
+ * @param int $topic_count Optional. Set the topic count manually
+ * @uses bbp_is_topic() To check if the supplied id is a topic
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses wpdb::prepare() To prepare our sql query
+ * @uses wpdb::get_col() To execute our query and get the column back
+ * @uses update_post_meta() To update the forum hidden topic count meta
+ * @uses apply_filters() Calls 'bbp_update_forum_topic_count_hidden' with the
+ *                        hidden topic count and forum id
+ * @return int Topic hidden topic count
+ */
+function bbp_update_forum_topic_count_hidden( $forum_id = 0, $topic_count = 0 ) {
+	global $wpdb;
+
+	// If topic_id was passed as $forum_id, then get its forum
+	if ( bbp_is_topic( $forum_id ) ) {
+		$topic_id = bbp_get_topic_id( $forum_id );
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+	// $forum_id is not a topic_id, so validate and proceed
+	} else {
+		$forum_id = bbp_get_forum_id( $forum_id );
+	}
+
+	// Can't update what isn't there
+	if ( !empty( $forum_id ) ) {
+
+		// Get topics of forum
+		if ( empty( $topic_count ) )
+			$topic_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( '" . join( '\',\'', array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ) ) . "') AND post_type = '%s';", $forum_id, bbp_get_topic_post_type() ) );
+
+		// Update the count
+		update_post_meta( $forum_id, '_bbp_topic_count_hidden', (int) $topic_count );
+	}
+
+	return (int) apply_filters( 'bbp_update_forum_topic_count_hidden', (int) $topic_count, $forum_id );
+}
+
+/**
+ * Adjust the total reply count of a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id or topic id. It is checked whether it
+ *                       is a topic or a forum. If it's a topic, its parent,
+ *                       i.e. the forum is automatically retrieved.
+ * @param bool $total_count Optional. To return the total count or normal
+ *                           count?
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_forum_query_subforum_ids() To get the subforum ids
+ * @uses bbp_update_forum_reply_count() To update the forum reply count
+ * @uses bbp_forum_query_topic_ids() To get the forum topic ids
+ * @uses wpdb::prepare() To prepare the sql statement
+ * @uses wpdb::get_var() To execute the query and get the var back
+ * @uses update_post_meta() To update the forum's reply count meta
+ * @uses apply_filters() Calls 'bbp_update_forum_topic_count' with the reply
+ *                        count and forum id
+ * @return int Forum reply count
+ */
+function bbp_update_forum_reply_count( $forum_id = 0 ) {
+	global $wpdb;
+
+	$forum_id = bbp_get_forum_id( $forum_id );
+	$children_reply_count = 0;
+
+	// Loop through children and add together forum reply counts
+	$children = bbp_forum_query_subforum_ids( $forum_id );
+	if ( !empty( $children ) ) {
+		foreach ( (array) $children as $child ) {
+			$children_reply_count += bbp_update_forum_reply_count( $child );
+		}
+	}
+
+	// Don't count replies if the forum is a category
+	$topic_ids = bbp_forum_query_topic_ids( $forum_id );
+	if ( !empty( $topic_ids ) )
+		$reply_count = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent IN ( " . join( ',', $topic_ids ) . " ) AND post_status = '%s' AND post_type = '%s';", bbp_get_public_status_id(), bbp_get_reply_post_type() ) );
+	else
+		$reply_count = 0;
+
+	// Calculate total replies in this forum
+	$total_replies = (int) $reply_count + $children_reply_count;
+
+	// Update the count
+	update_post_meta( $forum_id, '_bbp_reply_count',       (int) $reply_count   );
+	update_post_meta( $forum_id, '_bbp_total_reply_count', (int) $total_replies );
+
+	return (int) apply_filters( 'bbp_update_forum_reply_count', (int) $total_replies, $forum_id );
+}
+
+/**
+ * Updates the counts of a forum.
+ *
+ * This calls a few internal functions that all run manual queries against the
+ * database to get their results. As such, this function can be costly to run
+ * but is necessary to keep everything accurate.
+ *
+ * @since bbPress (r2908)
+ *
+ * @param mixed $args Supports these arguments:
+ *  - forum_id: Forum id
+ *  - last_topic_id: Last topic id
+ *  - last_reply_id: Last reply id
+ *  - last_active_id: Last active post id
+ *  - last_active_time: last active time
+ * @uses bbp_update_forum_last_topic_id() To update the forum last topic id
+ * @uses bbp_update_forum_last_reply_id() To update the forum last reply id
+ * @uses bbp_update_forum_last_active_id() To update the last active post id
+ * @uses get_post_field() To get the post date of the last active id
+ * @uses bbp_update_forum_last_active_time()  To update the last active time
+ * @uses bbp_update_forum_subforum_count() To update the subforum count
+ * @uses bbp_update_forum_topic_count() To update the forum topic count
+ * @uses bbp_update_forum_reply_count() To update the forum reply count
+ * @uses bbp_update_forum_topic_count_hidden() To update the hidden topic count
+ */
+function bbp_update_forum( $args = '' ) {
+	$defaults = array(
+		'forum_id'           => 0,
+		'post_parent'        => 0,
+		'last_topic_id'      => 0,
+		'last_reply_id'      => 0,
+		'last_active_id'     => 0,
+		'last_active_time'   => 0,
+		'last_active_status' => bbp_get_public_status_id()
+	);
+	$r = bbp_parse_args( $args, $defaults, 'update_forum' );
+	extract( $r );
+
+	// Last topic and reply ID's
+	bbp_update_forum_last_topic_id( $forum_id, $last_topic_id );
+	bbp_update_forum_last_reply_id( $forum_id, $last_reply_id );
+
+	// Active dance
+	$last_active_id = bbp_update_forum_last_active_id( $forum_id, $last_active_id );
+
+	// If no active time was passed, get it from the last_active_id
+	if ( empty( $last_active_time ) )
+		$last_active_time = get_post_field( 'post_date', $last_active_id );
+
+	if ( bbp_get_public_status_id() == $last_active_status ) {
+		bbp_update_forum_last_active_time( $forum_id, $last_active_time );
+	}
+
+	// Counts
+	bbp_update_forum_subforum_count    ( $forum_id );
+	bbp_update_forum_reply_count       ( $forum_id );
+	bbp_update_forum_topic_count       ( $forum_id );
+	bbp_update_forum_topic_count_hidden( $forum_id );
+
+	// Update the parent forum if one was passed
+	if ( !empty( $post_parent ) && is_numeric( $post_parent ) ) {
+		bbp_update_forum( array(
+			'forum_id'    => $post_parent,
+			'post_parent' => get_post_field( 'post_parent', $post_parent )
+		) );
+	}
+}
+
+/** Queries *******************************************************************/
+
+/**
+ * Returns the hidden forum ids
+ *
+ * Only hidden forum ids are returned. Public and private ids are not.
+ *
+ * @since bbPress (r3007)
+ *
+ * @uses get_option() Returns the unserialized array of hidden forum ids
+ * @uses apply_filters() Calls 'bbp_forum_query_topic_ids' with the topic ids
+ *                        and forum id
+ */
+function bbp_get_hidden_forum_ids() {
+   	$forum_ids = get_option( '_bbp_hidden_forums', array() );
+
+	return apply_filters( 'bbp_get_hidden_forum_ids', (array) $forum_ids );
+}
+
+/**
+ * Returns the private forum ids
+ *
+ * Only private forum ids are returned. Public and hidden ids are not.
+ *
+ * @since bbPress (r3007)
+ *
+ * @uses get_option() Returns the unserialized array of private forum ids
+ * @uses apply_filters() Calls 'bbp_forum_query_topic_ids' with the topic ids
+ *                        and forum id
+ */
+function bbp_get_private_forum_ids() {
+   	$forum_ids = get_option( '_bbp_private_forums', array() );
+
+	return apply_filters( 'bbp_get_private_forum_ids', (array) $forum_ids );
+}
+
+/**
+ * Returns a meta_query that either includes or excludes hidden forum IDs
+ * from a query.
+ *
+ * @since bbPress (r3291)
+ *
+ * @param string Optional. The type of value to return. (string|array|meta_query)
+ *
+ * @uses is_super_admin()
+ * @uses bbp_get_hidden_forum_ids()
+ * @uses bbp_get_private_forum_ids()
+ * @uses apply_filters()
+ */
+function bbp_exclude_forum_ids( $type = 'string' ) {
+
+	// Setup arrays
+	$private = $hidden = $meta_query = $forum_ids = array();
+
+	// Default return value
+	switch ( $type ) {
+		case 'string' :
+			$retval = '';
+			break;
+
+		case 'array'  :
+			$retval = array();
+			break;
+
+		case 'meta_query' :
+			$retval = array( array() ) ;
+			break;
+	}
+	
+	// Exclude for everyone but super admins
+	if ( !is_super_admin() ) {
+
+		// Private forums
+		if ( !current_user_can( 'read_private_forums' ) )
+			$private = bbp_get_private_forum_ids();
+
+		// Hidden forums
+		if ( !current_user_can( 'read_hidden_forums' ) )
+			$hidden  = bbp_get_hidden_forum_ids();
+
+		// Merge private and hidden forums together
+		$forum_ids = (array) array_filter( array_merge( $private, $hidden ) );
+
+		// There are forums that need to be excluded
+		if ( !empty( $forum_ids ) ) {
+
+			switch ( $type ) {
+
+				// Separate forum ID's into a comma separated string
+				case 'string' :
+					$retval = implode( ',', $forum_ids );
+					break;
+
+				// Use forum_ids array
+				case 'array'  :
+					$retval = $forum_ids;
+					break;
+
+				// Build a meta_query
+				case 'meta_query' :
+					$retval = array(
+						'key'     => '_bbp_forum_id',
+						'value'   => implode( ',', $forum_ids ),
+						'type'    => 'numeric',
+						'compare' => ( 1 < count( $forum_ids ) ) ? 'NOT IN' : '!='
+					);
+					break;
+			}
+		}
+	}
+
+	// Filter and return the results
+	return apply_filters( 'bbp_exclude_forum_ids', $retval, $forum_ids, $type );
+}
+
+/**
+ * Adjusts topic and reply queries to exclude items that might be contained
+ * inside hidden or private forums that the user does not have the capability
+ * to view.
+ *
+ * @since bbPress (r3291)
+ *
+ * @param WP_Query $posts_query
+ *
+ * @uses apply_filters()
+ * @uses bbp_exclude_forum_ids()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ * @return WP_Query
+ */
+function bbp_pre_get_posts_exclude_forums( $posts_query ) {
+
+	// Bail if all forums are explicitly allowed
+	if ( true === apply_filters( 'bbp_include_all_forums', $posts_query ) )
+		return;
+
+	// Bail if $posts_query is not an object or of incorrect class
+	if ( !is_object( $posts_query ) || !is_a( $posts_query, 'WP_Query' ) )
+		return;
+
+	// Bail if filters are suppressed on this query
+	if ( true == $posts_query->get( 'suppress_filters' ) )
+		return;
+
+	// Only exclude forums on bbPress queries
+	switch ( $posts_query->get( 'post_type' ) ) {
+
+		// Forums
+		case bbp_get_forum_post_type() :
+
+			// Prevent accidental wp-admin post_row override
+			if ( is_admin() && isset( $_REQUEST['post_status'] ) )
+				break;
+
+			// Define local variable
+			$status = array();
+
+			// All users can see published forums
+			$status[] = bbp_get_public_status_id();
+
+			// Add bbp_get_private_status_id() if user is capable
+			if ( current_user_can( 'read_private_forums' ) ) {
+				$status[] = bbp_get_private_status_id();
+			}
+
+			// Add bbp_get_hidden_status_id() if user is capable
+			if ( current_user_can( 'read_hidden_forums' ) ) {
+				$status[] = bbp_get_hidden_status_id();
+			}
+
+			// Implode and add the statuses
+			$posts_query->set( 'post_status', implode( ',', $status ) );
+
+			break;
+
+		// Topics
+		case bbp_get_topic_post_type() :
+
+		// Replies
+		case bbp_get_reply_post_type() :
+
+			// Get forums to exclude
+			$forum_ids = bbp_exclude_forum_ids( 'meta_query' );
+
+			// Bail if no forums to exclude
+			if ( empty( $forum_ids ) )
+				return;
+
+			// Get any existing meta queries
+			$meta_query   = $posts_query->get( 'meta_query' );
+
+			// Add our meta query to existing
+			$meta_query[] = $forum_ids;
+
+			// Set the meta_query var
+			$posts_query->set( 'meta_query', $meta_query );
+
+			break;
+	}
+}
+
+/**
+ * Returns the forum's topic ids
+ *
+ * Only topics with published and closed statuses are returned
+ *
+ * @since bbPress (r2908)
+ *
+ * @param int $forum_id Forum id
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_public_child_ids() To get the topic ids
+ * @uses apply_filters() Calls 'bbp_forum_query_topic_ids' with the topic ids
+ *                        and forum id
+ */
+function bbp_forum_query_topic_ids( $forum_id ) {
+   	$topic_ids = bbp_get_public_child_ids( $forum_id, bbp_get_topic_post_type() );
+
+	return apply_filters( 'bbp_forum_query_topic_ids', $topic_ids, $forum_id );
+}
+
+/**
+ * Returns the forum's subforum ids
+ *
+ * Only forums with published status are returned
+ *
+ * @since bbPress (r2908)
+ *
+ * @param int $forum_id Forum id
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_public_child_ids() To get the forum ids
+ * @uses apply_filters() Calls 'bbp_forum_query_subforum_ids' with the subforum
+ *                        ids and forum id
+ */
+function bbp_forum_query_subforum_ids( $forum_id ) {
+	$subforum_ids = bbp_get_public_child_ids( $forum_id, bbp_get_forum_post_type() );
+	//usort( $subforum_ids, '_bbp_forum_query_usort_subforum_ids' );
+
+	return apply_filters( 'bbp_get_forum_subforum_ids', $subforum_ids, $forum_id );
+}
+
+/**
+ * Callback to sort forum ID's based on last active time
+ *
+ * @since bbPress (r3789)
+ * @param int $a First forum ID to compare
+ * @param int $b Second forum ID to compare
+ * @return Position change based on sort
+ */
+function _bbp_forum_query_usort_subforum_ids( $a = 0, $b = 0 ) {
+	$ta = get_post_meta( $a, '_bbp_last_active_time', true );
+	$tb = get_post_meta( $b, '_bbp_last_active_time', true );
+	return ( $ta < $tb ) ? -1 : 1;
+}
+
+/**
+ * Returns the forum's last reply id
+ *
+ * @since bbPress (r2908)
+ *
+ * @param int $forum_id Forum id
+ * @param int $topic_ids Optional. Topic ids
+ * @uses wp_cache_get() To check for cache and retrieve it
+ * @uses bbp_forum_query_topic_ids() To get the forum's topic ids
+ * @uses wpdb::prepare() To prepare the query
+ * @uses wpdb::get_var() To execute the query and get the var back
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wp_cache_set() To set the cache for future use
+ * @uses apply_filters() Calls 'bbp_forum_query_last_reply_id' with the reply id
+ *                        and forum id
+ */
+function bbp_forum_query_last_reply_id( $forum_id, $topic_ids = 0 ) {
+	global $wpdb;
+
+	$cache_id = 'bbp_get_forum_' . $forum_id . '_reply_id';
+	$reply_id = (int) wp_cache_get( $cache_id, 'bbpress' );
+
+	if ( empty( $reply_id ) ) {
+
+		if ( empty( $topic_ids ) ) {
+			$topic_ids = bbp_forum_query_topic_ids( $forum_id );
+		}
+
+		if ( !empty( $topic_ids ) ) {
+			$reply_id = (int) $wpdb->get_var( $wpdb->prepare( "SELECT ID FROM {$wpdb->posts} WHERE post_parent IN ( " . join( ',', $topic_ids ) . " ) AND post_status = '%s' AND post_type = '%s' ORDER BY ID DESC LIMIT 1;", bbp_get_public_status_id(), bbp_get_reply_post_type() ) );
+			wp_cache_set( $cache_id, $reply_id, 'bbpress' ); // May be (int) 0
+		} else {
+			wp_cache_set( $cache_id, '0', 'bbpress' );
+		}
+	}
+
+	return (int) apply_filters( 'bbp_get_forum_last_reply_id', (int) $reply_id, $forum_id );
+}
+
+/** Listeners *****************************************************************/
+
+/**
+ * Check if it's a hidden forum or a topic or reply of a hidden forum and if
+ * the user can't view it, then sets a 404
+ *
+ * @since bbPress (r2996)
+ *
+ * @uses current_user_can() To check if the current user can read private forums
+ * @uses is_singular() To check if it's a singular page
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() TO get the reply post type
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_reply_forum_id() To get the reply forum id
+ * @uses bbp_is_forum_hidden() To check if the forum is hidden or not
+ * @uses bbp_set_404() To set a 404 status
+ */
+function bbp_forum_enforce_hidden() {
+
+	// Bail if not viewing a single item or if user has caps
+	if ( !is_singular() || is_super_admin() || current_user_can( 'read_hidden_forums' ) )
+		return;
+
+	global $wp_query;
+
+	// Define local variable
+	$forum_id = 0;
+
+	// Check post type
+	switch ( $wp_query->get( 'post_type' ) ) {
+
+		// Forum
+		case bbp_get_forum_post_type() :
+			$forum_id = bbp_get_forum_id( $wp_query->post->ID );
+			break;
+
+		// Topic
+		case bbp_get_topic_post_type() :
+			$forum_id = bbp_get_topic_forum_id( $wp_query->post->ID );
+			break;
+
+		// Reply
+		case bbp_get_reply_post_type() :
+			$forum_id = bbp_get_reply_forum_id( $wp_query->post->ID );
+			break;
+
+	}
+
+	// If forum is explicitly hidden and user not capable, set 404
+	if ( !empty( $forum_id ) && bbp_is_forum_hidden( $forum_id ) && !current_user_can( 'read_hidden_forums' ) )
+		bbp_set_404();
+}
+
+/**
+ * Check if it's a private forum or a topic or reply of a private forum and if
+ * the user can't view it, then sets a 404
+ *
+ * @since bbPress (r2996)
+ *
+ * @uses current_user_can() To check if the current user can read private forums
+ * @uses is_singular() To check if it's a singular page
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_get_reply_post_type() TO get the reply post type
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_reply_forum_id() To get the reply forum id
+ * @uses bbp_is_forum_private() To check if the forum is private or not
+ * @uses bbp_set_404() To set a 404 status
+ */
+function bbp_forum_enforce_private() {
+
+	// Bail if not viewing a single item or if user has caps
+	if ( !is_singular() || is_super_admin() || current_user_can( 'read_private_forums' ) )
+		return;
+
+	global $wp_query;
+
+	// Define local variable
+	$forum_id = 0;
+
+	// Check post type
+	switch ( $wp_query->get( 'post_type' ) ) {
+
+		// Forum
+		case bbp_get_forum_post_type() :
+			$forum_id = bbp_get_forum_id( $wp_query->post->ID );
+			break;
+
+		// Topic
+		case bbp_get_topic_post_type() :
+			$forum_id = bbp_get_topic_forum_id( $wp_query->post->ID );
+			break;
+
+		// Reply
+		case bbp_get_reply_post_type() :
+			$forum_id = bbp_get_reply_forum_id( $wp_query->post->ID );
+			break;
+
+	}
+
+	// If forum is explicitly hidden and user not capable, set 404
+	if ( !empty( $forum_id ) && bbp_is_forum_private( $forum_id ) && !current_user_can( 'read_private_forums' ) )
+		bbp_set_404();
+}
+
+/** Permissions ***************************************************************/
+
+/**
+ * Redirect if unathorized user is attempting to edit a forum
+ * 
+ * @since bbPress (r3607)
+ *
+ * @uses bbp_is_forum_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_forum_id()
+ * @uses wp_safe_redirect()
+ * @uses bbp_get_forum_permalink()
+ */
+function bbp_check_forum_edit() {
+
+	// Bail if not editing a topic
+	if ( !bbp_is_forum_edit() )
+		return;
+
+	// User cannot edit topic, so redirect back to reply
+	if ( !current_user_can( 'edit_forum', bbp_get_forum_id() ) ) {
+		wp_safe_redirect( bbp_get_forum_permalink() );
+		exit();
+	}
+}
+
+/**
+ * Delete all topics (and their replies) for a specific forum ID
+ *
+ * @since bbPress (r3668)
+ *
+ * @param int $forum_id
+ * @uses bbp_get_forum_id() To validate the forum ID
+ * @uses bbp_is_forum() To make sure it's a forum
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_topics() To make sure there are topics to loop through
+ * @uses wp_trash_post() To trash the post
+ * @uses update_post_meta() To update the forum meta of trashed topics
+ * @return If forum is not valid
+ */
+function bbp_delete_forum_topics( $forum_id = 0 ) {
+
+	// Validate forum ID
+	$forum_id = bbp_get_forum_id( $forum_id );
+	if ( empty( $forum_id ) )
+		return;
+
+	// Forum is being permanently deleted, so its topics gotta go too
+	if ( $topics = new WP_Query( array(
+		'suppress_filters' => true,
+		'post_type'        => bbp_get_topic_post_type(),
+		'post_parent'      => $forum_id,
+		'post_status'      => 'any',
+		'posts_per_page'   => -1,
+		'nopaging'         => true,
+		'fields'           => 'id=>parent'
+	) ) ) {
+		foreach ( $topics->posts as $topic ) {
+			wp_delete_post( $topic->ID, true );
+		}
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+}
+
+/**
+ * Trash all topics inside a forum
+ * 
+ * @since bbPress (r3668)
+ *
+ * @param int $forum_id
+ * @uses bbp_get_forum_id() To validate the forum ID
+ * @uses bbp_is_forum() To make sure it's a forum
+ * @uses bbp_get_public_status_id() To return public post status
+ * @uses bbp_get_closed_status_id() To return closed post status
+ * @uses bbp_get_pending_status_id() To return pending post status
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wp_trash_post() To trash the post
+ * @uses update_post_meta() To update the forum meta of trashed topics
+ * @return If forum is not valid
+ */
+function bbp_trash_forum_topics( $forum_id = 0 ) {
+
+	// Validate forum ID
+	$forum_id = bbp_get_forum_id( $forum_id );
+	if ( empty( $forum_id ) )
+		return;
+
+	// Allowed post statuses to pre-trash
+	$post_stati = join( ',', array(
+		bbp_get_public_status_id(),
+		bbp_get_closed_status_id(),
+		bbp_get_pending_status_id()
+	) );
+
+	// Forum is being trashed, so its topics are trashed too
+	if ( $topics = new WP_Query( array(
+		'suppress_filters' => true,
+		'post_type'        => bbp_get_topic_post_type(),
+		'post_parent'      => $forum_id,
+		'post_status'      => $post_stati,
+		'posts_per_page'   => -1,
+		'nopaging'         => true,
+		'fields'           => 'id=>parent'
+	) ) ) {
+
+		// Prevent debug notices
+		$pre_trashed_topics = array();
+
+		// Loop through topics, trash them, and add them to array
+		foreach ( $topics->posts as $topic ) {
+			wp_trash_post( $topic->ID, true );
+			$pre_trashed_topics[] = $topic->ID;
+		}
+
+		// Set a post_meta entry of the topics that were trashed by this action.
+		// This is so we can possibly untrash them, without untrashing topics
+		// that were purposefully trashed before.
+		update_post_meta( $forum_id, '_bbp_pre_trashed_topics', $pre_trashed_topics );
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+}
+
+/**
+ * Trash all topics inside a forum
+ *
+ * @since bbPress (r3668)
+ *
+ * @param int $forum_id
+ * @uses bbp_get_forum_id() To validate the forum ID
+ * @uses bbp_is_forum() To make sure it's a forum
+ * @uses get_post_meta() To update the forum meta of trashed topics
+ * @uses wp_untrash_post() To trash the post
+ * @return If forum is not valid
+ */
+function bbp_untrash_forum_topics( $forum_id = 0 ) {
+
+	// Validate forum ID
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) )
+		return;
+
+	// Get the topics that were not previously trashed
+	$pre_trashed_topics = get_post_meta( $forum_id, '_bbp_pre_trashed_topics', true );
+
+	// There are topics to untrash
+	if ( !empty( $pre_trashed_topics ) ) {
+
+		// Maybe reverse the trashed topics array
+		if ( is_array( $pre_trashed_topics ) )
+			$pre_trashed_topics = array_reverse( $pre_trashed_topics );
+
+		// Loop through topics
+		foreach ( (array) $pre_trashed_topics as $topic ) {
+			wp_untrash_post( $topic );
+		}
+	}
+}
+
+/** Before Delete/Trash/Untrash ***********************************************/
+
+/**
+ * Called before deleting a forum.
+ *
+ * This function is supplemental to the actual forum deletion which is
+ * handled by WordPress core API functions. It is used to clean up after
+ * a forum that is being deleted.
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_delete_forum' with the forum id
+ */
+function bbp_delete_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_delete_forum', $forum_id );
+}
+
+/**
+ * Called before trashing a forum
+ *
+ * This function is supplemental to the actual forum being trashed which is
+ * handled by WordPress core API functions. It is used to clean up after
+ * a forum that is being trashed.
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_trash_forum' with the forum id
+ */
+function bbp_trash_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_trash_forum', $forum_id );
+}
+
+/**
+ * Called before untrashing a forum
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_untrash_forum' with the forum id
+ */
+function bbp_untrash_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_untrash_forum', $forum_id );
+}
+
+/** After Delete/Trash/Untrash ************************************************/
+
+/**
+ * Called after deleting a forum
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_deleted_forum' with the forum id
+ */
+function bbp_deleted_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_deleted_forum', $forum_id );
+}
+
+/**
+ * Called after trashing a forum
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_trashed_forum' with the forum id
+ */
+function bbp_trashed_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_trashed_forum', $forum_id );
+}
+
+/**
+ * Called after untrashing a forum
+ *
+ * @since bbPress (r3668)
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_is_forum() To check if the passed id is a forum
+ * @uses do_action() Calls 'bbp_untrashed_forum' with the forum id
+ */
+function bbp_untrashed_forum( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	if ( empty( $forum_id ) || !bbp_is_forum( $forum_id ) )
+		return false;
+
+	do_action( 'bbp_untrashed_forum', $forum_id );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/forums/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/forums/template-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2351 @@
+<?php
+
+/**
+ * bbPress Forum Template Tags
+ *
+ * @package bbPress
+ * @subpackage TemplateTags
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Post Type *****************************************************************/
+
+/**
+ * Output the unique id of the custom post type for forums
+ *
+ * @since bbPress (r2857)
+ * @uses bbp_get_forum_post_type() To get the forum post type
+ */
+function bbp_forum_post_type() {
+	echo bbp_get_forum_post_type();
+}
+	/**
+	 * Return the unique id of the custom post type for forums
+	 *
+	 * @since bbPress (r2857)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_forum_post_type' with the forum
+	 *                        post type id
+	 * @return string The unique forum post type id
+	 */
+	function bbp_get_forum_post_type() {
+		return apply_filters( 'bbp_get_forum_post_type', bbpress()->forum_post_type );
+	}
+
+/** Forum Loop ****************************************************************/
+
+/**
+ * The main forum loop.
+ *
+ * WordPress makes this easy for us.
+ *
+ * @since bbPress (r2464)
+ *
+ * @param mixed $args All the arguments supported by {@link WP_Query}
+ * @uses WP_Query To make query and get the forums
+ * @uses bbp_get_forum_post_type() To get the forum post type id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses get_option() To get the forums per page option
+ * @uses current_user_can() To check if the current user is capable of editing
+ *                           others' forums
+ * @uses apply_filters() Calls 'bbp_has_forums' with
+ *                        bbPres::forum_query::have_posts()
+ *                        and bbPres::forum_query
+ * @return object Multidimensional array of forum information
+ */
+function bbp_has_forums( $args = '' ) {
+	$bbp = bbpress();
+
+	// Setup possible post__not_in array
+	$post_stati[] = bbp_get_public_status_id();
+
+	// Check if user can read private forums
+	if ( current_user_can( 'read_private_forums' ) )
+		$post_stati[] = bbp_get_private_status_id();
+
+	// Check if user can read hidden forums
+	if ( current_user_can( 'read_hidden_forums' ) )
+		$post_stati[] = bbp_get_hidden_status_id();
+
+	// The default forum query for most circumstances
+	$defaults = array (
+		'post_type'      => bbp_get_forum_post_type(),
+		'post_parent'    => bbp_is_forum_archive() ? 0 : bbp_get_forum_id() ,
+		'post_status'    => implode( ',', $post_stati ),
+		'posts_per_page' => get_option( '_bbp_forums_per_page', 50 ),
+		'orderby'        => 'menu_order',
+		'order'          => 'ASC'
+	);
+	$bbp_f = bbp_parse_args( $args, $defaults, 'has_forums' );
+
+	// Run the query
+	$bbp->forum_query = new WP_Query( $bbp_f );
+
+	return apply_filters( 'bbp_has_forums', $bbp->forum_query->have_posts(), $bbp->forum_query );
+}
+
+/**
+ * Whether there are more forums available in the loop
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbPress:forum_query::have_posts() To check if there are more forums
+ *                                          available
+ * @return object Forum information
+ */
+function bbp_forums() {
+
+	// Put into variable to check against next
+	$have_posts = bbpress()->forum_query->have_posts();
+
+	// Reset the post data when finished
+	if ( empty( $have_posts ) )
+		wp_reset_postdata();
+
+	return $have_posts;
+}
+
+/**
+ * Loads up the current forum in the loop
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbPress:forum_query::the_post() To get the current forum
+ * @return object Forum information
+ */
+function bbp_the_forum() {
+	return bbpress()->forum_query->the_post();
+}
+
+/** Forum *********************************************************************/
+
+/**
+ * Output forum id
+ *
+ * @since bbPress (r2464)
+ *
+ * @param $forum_id Optional. Used to check emptiness
+ * @uses bbp_get_forum_id() To get the forum id
+ */
+function bbp_forum_id( $forum_id = 0 ) {
+	echo bbp_get_forum_id( $forum_id );
+}
+	/**
+	 * Return the forum id
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param $forum_id Optional. Used to check emptiness
+	 * @uses bbPress::forum_query::in_the_loop To check if we're in the loop
+	 * @uses bbPress::forum_query::post::ID To get the forum id
+	 * @uses WP_Query::post::ID To get the forum id
+	 * @uses bbp_is_single_forum() To check if it's a forum page
+	 * @uses bbp_is_single_topic() To check if it's a topic page
+	 * @uses bbp_get_topic_forum_id() To get the topic forum id
+	 * @uses get_post_field() To get the post's post type
+	 * @uses apply_filters() Calls 'bbp_get_forum_id' with the forum id and
+	 *                        supplied forum id
+	 * @return int The forum id
+	 */
+	function bbp_get_forum_id( $forum_id = 0 ) {
+		global $wp_query;
+
+		$bbp = bbpress();
+
+		// Easy empty checking
+		if ( !empty( $forum_id ) && is_numeric( $forum_id ) )
+			$bbp_forum_id = $forum_id;
+
+		// Currently inside a forum loop
+		elseif ( !empty( $bbp->forum_query->in_the_loop ) && isset( $bbp->forum_query->post->ID ) )
+			$bbp_forum_id = $bbp->forum_query->post->ID;
+
+		// Currently viewing a forum
+		elseif ( bbp_is_single_forum() && !empty( $bbp->current_forum_id ) )
+			$bbp_forum_id = $bbp->current_forum_id;
+
+		// Currently viewing a forum
+		elseif ( bbp_is_single_forum() && isset( $wp_query->post->ID ) )
+			$bbp_forum_id = $wp_query->post->ID;
+
+		// Currently viewing a topic
+		elseif ( bbp_is_single_topic() )
+			$bbp_forum_id = bbp_get_topic_forum_id();
+
+		// Fallback
+		else
+			$bbp_forum_id = 0;
+
+		return (int) apply_filters( 'bbp_get_forum_id', (int) $bbp_forum_id, $forum_id );
+	}
+
+/**
+ * Gets a forum
+ *
+ * @since bbPress (r2787)
+ *
+ * @param int|object $forum forum id or forum object
+ * @param string $output Optional. OBJECT, ARRAY_A, or ARRAY_N. Default = OBJECT
+ * @param string $filter Optional Sanitation filter. See {@link sanitize_post()}
+ * @uses get_post() To get the forum
+ * @uses apply_filters() Calls 'bbp_get_forum' with the forum, output type and
+ *                        sanitation filter
+ * @return mixed Null if error or forum (in specified form) if success
+ */
+function bbp_get_forum( $forum, $output = OBJECT, $filter = 'raw' ) {
+
+	// Use forum ID
+	if ( empty( $forum ) || is_numeric( $forum ) )
+		$forum = bbp_get_forum_id( $forum );
+
+	// Attempt to load the forum
+	$forum = get_post( $forum, OBJECT, $filter );
+	if ( empty( $forum ) )
+		return $forum;
+
+	// Bail if post_type is not a forum
+	if ( $forum->post_type !== bbp_get_forum_post_type() )
+		return null;
+
+	// Tweak the data type to return
+	if ( $output == OBJECT ) {
+		return $forum;
+
+	} elseif ( $output == ARRAY_A ) {
+		$_forum = get_object_vars( $forum );
+		return $_forum;
+
+	} elseif ( $output == ARRAY_N ) {
+		$_forum = array_values( get_object_vars( $forum ) );
+		return $_forum;
+
+	}
+
+	return apply_filters( 'bbp_get_forum', $forum, $output, $filter );
+}
+
+/**
+ * Output the link to the forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_permalink() To get the permalink
+ */
+function bbp_forum_permalink( $forum_id = 0 ) {
+	echo bbp_get_forum_permalink( $forum_id );
+}
+	/**
+	 * Return the link to the forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param $string $redirect_to Optional. Pass a redirect value for use with
+	 *                              shortcodes and other fun things.
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_permalink() Get the permalink of the forum
+	 * @uses apply_filters() Calls 'bbp_get_forum_permalink' with the forum
+	 *                        link
+	 * @return string Permanent link to forum
+	 */
+	function bbp_get_forum_permalink( $forum_id = 0, $redirect_to = '' ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Use the redirect address
+		if ( !empty( $redirect_to ) ) {
+			$forum_permalink = esc_url_raw( $redirect_to );
+
+		// Use the topic permalink
+		} else {
+			$forum_permalink = get_permalink( $forum_id );
+		}
+
+		return apply_filters( 'bbp_get_forum_permalink', $forum_permalink, $forum_id );
+	}
+
+/**
+ * Output the title of the forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_title() To get the forum title
+ */
+function bbp_forum_title( $forum_id = 0 ) {
+	echo bbp_get_forum_title( $forum_id );
+}
+	/**
+	 * Return the title of the forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_the_title() To get the forum title
+	 * @uses apply_filters() Calls 'bbp_get_forum_title' with the title
+	 * @return string Title of forum
+	 */
+	function bbp_get_forum_title( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$title    = get_the_title( $forum_id );
+
+		return apply_filters( 'bbp_get_forum_title', $title, $forum_id );
+	}
+
+/**
+ * Output the forum archive title
+ *
+ * @since bbPress (r3249)
+ *
+ * @param string $title Default text to use as title
+ */
+function bbp_forum_archive_title( $title = '' ) {
+	echo bbp_get_forum_archive_title( $title );
+}
+	/**
+	 * Return the forum archive title
+	 *
+	 * @since bbPress (r3249)
+	 *
+	 * @param string $title Default text to use as title
+	 *
+	 * @uses bbp_get_page_by_path() Check if page exists at root path
+	 * @uses get_the_title() Use the page title at the root path
+	 * @uses get_post_type_object() Load the post type object
+	 * @uses bbp_get_forum_post_type() Get the forum post type ID
+	 * @uses get_post_type_labels() Get labels for forum post type
+	 * @uses apply_filters() Allow output to be manipulated
+	 *
+	 * @return string The forum archive title
+	 */
+	function bbp_get_forum_archive_title( $title = '' ) {
+
+		// If no title was passed
+		if ( empty( $title ) ) {
+
+			// Set root text to page title
+			$page = bbp_get_page_by_path( bbp_get_root_slug() );
+			if ( !empty( $page ) ) {
+				$title = get_the_title( $page->ID );
+
+			// Default to forum post type name label
+			} else {
+				$fto    = get_post_type_object( bbp_get_forum_post_type() );
+				$title  = $fto->labels->name;
+			}
+		}
+
+		return apply_filters( 'bbp_get_forum_archive_title', $title );
+	}
+
+/**
+ * Output the content of the forum
+ *
+ * @since bbPress (r2780)
+ *
+ * @param int $forum_id Optional. Topic id
+ * @uses bbp_get_forum_content() To get the forum content
+ */
+function bbp_forum_content( $forum_id = 0 ) {
+	echo bbp_get_forum_content( $forum_id );
+}
+	/**
+	 * Return the content of the forum
+	 *
+	 * @since bbPress (r2780)
+	 *
+	 * @param int $forum_id Optional. Topic id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses post_password_required() To check if the forum requires pass
+	 * @uses get_the_password_form() To get the password form
+	 * @uses get_post_field() To get the content post field
+	 * @uses apply_filters() Calls 'bbp_get_forum_content' with the content
+	 *                        and forum id
+	 * @return string Content of the forum
+	 */
+	function bbp_get_forum_content( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Check if password is required
+		if ( post_password_required( $forum_id ) )
+			return get_the_password_form();
+
+		$content = get_post_field( 'post_content', $forum_id );
+
+		return apply_filters( 'bbp_get_forum_content', $content, $forum_id );
+	}
+
+/**
+ * Allow topic rows to have adminstrative actions
+ *
+ * @since bbPress (r3653)
+ * @uses do_action()
+ * @todo Links and filter
+ */
+function bbp_forum_row_actions() {
+	do_action( 'bbp_forum_row_actions' );
+}
+
+/**
+ * Output the forums last active ID
+ *
+ * @since bbPress (r2860)
+ *
+ * @uses bbp_get_forum_last_active_id() To get the forum's last active id
+ * @param int $forum_id Optional. Forum id
+ */
+function bbp_forum_last_active_id( $forum_id = 0 ) {
+	echo bbp_get_forum_last_active_id( $forum_id );
+}
+	/**
+	 * Return the forums last active ID
+	 *
+	 * @since bbPress (r2860)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum's last active id
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_active_id' with
+	 *                        the last active id and forum id
+	 * @return int Forum's last active id
+	 */
+	function bbp_get_forum_last_active_id( $forum_id = 0 ) {
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$active_id = get_post_meta( $forum_id, '_bbp_last_active_id', true );
+
+		return (int) apply_filters( 'bbp_get_forum_last_active_id', (int) $active_id, $forum_id );
+	}
+
+/**
+ * Output the forums last update date/time (aka freshness)
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbp_get_forum_last_active_time() To get the forum freshness
+ * @param int $forum_id Optional. Forum id
+ */
+function bbp_forum_last_active_time( $forum_id = 0 ) {
+	echo bbp_get_forum_last_active_time( $forum_id );
+}
+	/**
+	 * Return the forums last update date/time (aka freshness)
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To retrieve forum last active meta
+	 * @uses bbp_get_forum_last_reply_id() To get forum's last reply id
+	 * @uses get_post_field() To get the post date of the reply
+	 * @uses bbp_get_forum_last_topic_id() To get forum's last topic id
+	 * @uses bbp_get_topic_last_active_time() To get time when the topic was
+	 *                                    last active
+	 * @uses bbp_convert_date() To convert the date
+	 * @uses bbp_get_time_since() To get time in since format
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_active' with last
+	 *                        active time and forum id
+	 * @return string Forum last update date/time (freshness)
+	 */
+	function bbp_get_forum_last_active_time( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		$last_active = get_post_meta( $forum_id, '_bbp_last_active_time', true );
+		if ( empty( $last_active ) ) {
+			$reply_id = bbp_get_forum_last_reply_id( $forum_id );
+			if ( !empty( $reply_id ) ) {
+				$last_active = get_post_field( 'post_date', $reply_id );
+			} else {
+				$topic_id = bbp_get_forum_last_topic_id( $forum_id );
+				if ( !empty( $topic_id ) ) {
+					$last_active = bbp_get_topic_last_active_time( $topic_id );
+				}
+			}
+		}
+
+		$last_active = !empty( $last_active ) ? bbp_get_time_since( bbp_convert_date( $last_active ) ) : '';
+
+		return apply_filters( 'bbp_get_forum_last_active', $last_active, $forum_id );
+	}
+
+/**
+ * Output link to the most recent activity inside a forum.
+ *
+ * Outputs a complete link with attributes and content.
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_freshness_link() To get the forum freshness link
+ */
+function bbp_forum_freshness_link( $forum_id = 0) {
+	echo bbp_get_forum_freshness_link( $forum_id );
+}
+	/**
+	 * Returns link to the most recent activity inside a forum.
+	 *
+	 * Returns a complete link with attributes and content.
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_active_id() To get the forum last active id
+	 * @uses bbp_get_forum_last_reply_id() To get the forum last reply id
+	 * @uses bbp_get_forum_last_topic_id() To get the forum last topic id
+	 * @uses bbp_get_forum_last_reply_url() To get the forum last reply url
+	 * @uses bbp_get_forum_last_reply_title() To get the forum last reply
+	 *                                         title
+	 * @uses bbp_get_forum_last_topic_permalink() To get the forum last
+	 *                                             topic permalink
+	 * @uses bbp_get_forum_last_topic_title() To get the forum last topic
+	 *                                         title
+	 * @uses bbp_get_forum_last_active_time() To get the time when the forum
+	 *                                         was last active
+	 * @uses apply_filters() Calls 'bbp_get_forum_freshness_link' with the
+	 *                        link and forum id
+	 */
+	function bbp_get_forum_freshness_link( $forum_id = 0 ) {
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$active_id = bbp_get_forum_last_active_id( $forum_id );
+
+		if ( empty( $active_id ) )
+			$active_id = bbp_get_forum_last_reply_id( $forum_id );
+
+		if ( empty( $active_id ) )
+			$active_id = bbp_get_forum_last_topic_id( $forum_id );
+
+		if ( bbp_is_topic( $active_id ) ) {
+			$link_url = bbp_get_forum_last_topic_permalink( $forum_id );
+			$title    = bbp_get_forum_last_topic_title( $forum_id );
+		} elseif ( bbp_is_reply( $active_id ) ) {
+			$link_url = bbp_get_forum_last_reply_url( $forum_id );
+			$title    = bbp_get_forum_last_reply_title( $forum_id );
+		}
+
+		$time_since = bbp_get_forum_last_active_time( $forum_id );
+
+		if ( !empty( $time_since ) && !empty( $link_url ) )
+			$anchor = '<a href="' . $link_url . '" title="' . esc_attr( $title ) . '">' . $time_since . '</a>';
+		else
+			$anchor = __( 'No Topics', 'bbpress' );
+
+		return apply_filters( 'bbp_get_forum_freshness_link', $anchor, $forum_id );
+	}
+
+/**
+ * Output parent ID of a forum, if exists
+ *
+ * @since bbPress (r3675)
+ *
+ * @param int $forum_id Forum ID
+ * @uses bbp_get_forum_parent_id() To get the forum's parent ID
+ */
+function bbp_forum_parent_id( $forum_id = 0 ) {
+	echo bbp_get_forum_parent_id( $forum_id );
+}
+	/**
+	 * Return ID of forum parent, if exists
+	 *
+	 * @since bbPress (r3675)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_field() To get the forum parent
+	 * @uses apply_filters() Calls 'bbp_get_forum_parent' with the parent & forum id
+	 * @return int Forum parent
+	 */
+	function bbp_get_forum_parent_id( $forum_id = 0 ) {
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$parent_id = get_post_field( 'post_parent', $forum_id );
+
+		return (int) apply_filters( 'bbp_get_forum_parent_id', (int) $parent_id, $forum_id );
+	}
+
+/**
+ * Return array of parent forums
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_forum() To get the forum
+ * @uses apply_filters() Calls 'bbp_get_forum_ancestors' with the ancestors
+ *                        and forum id
+ * @return array Forum ancestors
+ */
+function bbp_get_forum_ancestors( $forum_id = 0 ) {
+	$forum_id  = bbp_get_forum_id( $forum_id );
+	$ancestors = array();
+	$forum     = bbp_get_forum( $forum_id );
+
+	if ( !empty( $forum ) ) {
+		while ( 0 !== (int) $forum->post_parent ) {
+			$ancestors[] = $forum->post_parent;
+			$forum       = bbp_get_forum( $forum->post_parent );
+		}
+	}
+
+	return apply_filters( 'bbp_get_forum_ancestors', $ancestors, $forum_id );
+}
+
+/**
+ * Return subforums of given forum
+ *
+ * @since bbPress (r2747)
+ *
+ * @param mixed $args All the arguments supported by {@link WP_Query}
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses current_user_can() To check if the current user is capable of
+ *                           reading private forums
+ * @uses get_posts() To get the subforums
+ * @uses apply_filters() Calls 'bbp_forum_get_subforums' with the subforums
+ *                        and the args
+ * @return mixed false if none, array of subs if yes
+ */
+function bbp_forum_get_subforums( $args = '' ) {
+
+	// Use passed integer as post_parent
+	if ( is_numeric( $args ) )
+		$args = array( 'post_parent' => $args );
+
+	// Setup possible post__not_in array
+	$post_stati[] = bbp_get_public_status_id();
+
+	// Super admin get whitelisted post statuses
+	if ( is_super_admin() ) {
+		$post_stati = array( bbp_get_public_status_id(), bbp_get_private_status_id(), bbp_get_hidden_status_id() );
+
+	// Not a super admin, so check caps
+	} else {
+
+		// Check if user can read private forums
+		if ( current_user_can( 'read_private_forums' ) ) {
+			$post_stati[] = bbp_get_private_status_id();
+		}
+
+		// Check if user can read hidden forums
+		if ( current_user_can( 'read_hidden_forums' ) ) {
+			$post_stati[] = bbp_get_hidden_status_id();
+		}
+	}
+
+	$defaults = array(
+		'post_parent'    => 0,
+		'post_type'      => bbp_get_forum_post_type(),
+		'post_status'    => implode( ',', $post_stati ),
+		'posts_per_page' => get_option( '_bbp_forums_per_page', 50 ),
+		'orderby'        => 'menu_order',
+		'order'          => 'ASC'
+	);
+	$r = bbp_parse_args( $args, $defaults, 'forum_get_subforums' );
+	$r['post_parent'] = bbp_get_forum_id( $r['post_parent'] );
+
+	// No forum passed
+	$sub_forums = !empty( $r['post_parent'] ) ? get_posts( $r ) : '';
+
+	return apply_filters( 'bbp_forum_get_sub_forums', (array) $sub_forums, $args );
+}
+
+/**
+ * Output a list of forums (can be used to list subforums)
+ *
+ * @param mixed $args The function supports these args:
+ *  - before: To put before the output. Defaults to '<ul class="bbp-forums">'
+ *  - after: To put after the output. Defaults to '</ul>'
+ *  - link_before: To put before every link. Defaults to '<li class="bbp-forum">'
+ *  - link_after: To put after every link. Defaults to '</li>'
+ *  - separator: Separator. Defaults to ', '
+ *  - forum_id: Forum id. Defaults to ''
+ *  - show_topic_count - To show forum topic count or not. Defaults to true
+ *  - show_reply_count - To show forum reply count or not. Defaults to true
+ * @uses bbp_forum_get_subforums() To check if the forum has subforums or not
+ * @uses bbp_get_forum_permalink() To get forum permalink
+ * @uses bbp_get_forum_title() To get forum title
+ * @uses bbp_is_forum_category() To check if a forum is a category
+ * @uses bbp_get_forum_topic_count() To get forum topic count
+ * @uses bbp_get_forum_reply_count() To get forum reply count
+ */
+function bbp_list_forums( $args = '' ) {
+
+	// Define used variables
+	$output = $sub_forums = $topic_count = $reply_count = $counts = '';
+	$i = 0;
+	$count = array();
+
+	// Defaults and arguments
+	$defaults = array (
+		'before'            => '<ul class="bbp-forums-list">',
+		'after'             => '</ul>',
+		'link_before'       => '<li class="bbp-forum">',
+		'link_after'        => '</li>',
+		'count_before'      => ' (',
+		'count_after'       => ')',
+		'count_sep'         => ', ',
+		'separator'         => ', ',
+		'forum_id'          => '',
+		'show_topic_count'  => true,
+		'show_reply_count'  => true,
+	);
+	$r = bbp_parse_args( $args, $defaults, 'list_forums' );
+	extract( $r, EXTR_SKIP );
+
+	// Bail if there are no subforums
+	if ( !bbp_get_forum_subforum_count( $forum_id, false ) )
+		return;
+
+	// Loop through forums and create a list
+	$sub_forums = bbp_forum_get_subforums( $forum_id );
+	if ( !empty( $sub_forums ) ) {
+
+		// Total count (for separator)
+		$total_subs = count( $sub_forums );
+		foreach ( $sub_forums as $sub_forum ) {
+			$i++; // Separator count
+
+			// Get forum details
+			$count     = array();
+			$show_sep  = $total_subs > $i ? $separator : '';
+			$permalink = bbp_get_forum_permalink( $sub_forum->ID );
+			$title     = bbp_get_forum_title( $sub_forum->ID );
+
+			// Show topic count
+			if ( !empty( $show_topic_count ) && !bbp_is_forum_category( $sub_forum->ID ) ) {
+				$count['topic'] = bbp_get_forum_topic_count( $sub_forum->ID );
+			}
+
+			// Show reply count
+			if ( !empty( $show_reply_count ) && !bbp_is_forum_category( $sub_forum->ID ) ) {
+				$count['reply'] = bbp_get_forum_reply_count( $sub_forum->ID );
+			}
+
+			// Counts to show
+			if ( !empty( $count ) ) {
+				$counts = $count_before . implode( $count_sep, $count ) . $count_after;
+			}
+
+			// Build this sub forums link
+			$output .= $link_before . '<a href="' . $permalink . '" class="bbp-forum-link">' . $title . $counts . '</a>' . $show_sep . $link_after;
+		}
+
+		// Output the list
+		echo apply_filters( 'bbp_list_forums', $before . $output . $after, $args );
+	}
+}
+
+/** Forum Last Topic **********************************************************/
+
+/**
+ * Output the forum's last topic id
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbp_get_forum_last_topic_id() To get the forum's last topic id
+ * @param int $forum_id Optional. Forum id
+ */
+function bbp_forum_last_topic_id( $forum_id = 0 ) {
+	echo bbp_get_forum_last_topic_id( $forum_id );
+}
+	/**
+	 * Return the forum's last topic id
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum's last topic id
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_topic_id' with the
+	 *                        forum and topic id
+	 * @return int Forum's last topic id
+	 */
+	function bbp_get_forum_last_topic_id( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$topic_id = get_post_meta( $forum_id, '_bbp_last_topic_id', true );
+
+		return (int) apply_filters( 'bbp_get_forum_last_topic_id', (int) $topic_id, $forum_id );
+	}
+
+/**
+ * Output the title of the last topic inside a forum
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_topic_title() To get the forum's last topic's title
+ */
+function bbp_forum_last_topic_title( $forum_id = 0 ) {
+	echo bbp_get_forum_last_topic_title( $forum_id );
+}
+	/**
+	 * Return the title of the last topic inside a forum
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_topic_id() To get the forum's last topic id
+	 * @uses bbp_get_topic_title() To get the topic's title
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_topic_title' with the
+	 *                        topic title and forum id
+	 * @return string Forum's last topic's title
+	 */
+	function bbp_get_forum_last_topic_title( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		return apply_filters( 'bbp_get_forum_last_topic_title', bbp_get_topic_title( bbp_get_forum_last_topic_id( $forum_id ) ), $forum_id );
+	}
+
+/**
+ * Output the link to the last topic in a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_topic_permalink() To get the forum's last topic's
+ *                                             permanent link
+ */
+function bbp_forum_last_topic_permalink( $forum_id = 0 ) {
+	echo bbp_get_forum_last_topic_permalink( $forum_id );
+}
+	/**
+	 * Return the link to the last topic in a forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_topic_id() To get the forum's last topic id
+	 * @uses bbp_get_topic_permalink() To get the topic's permalink
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_topic_permalink' with
+	 *                        the topic link and forum id
+	 * @return string Permanent link to topic
+	 */
+	function bbp_get_forum_last_topic_permalink( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		return apply_filters( 'bbp_get_forum_last_topic_permalink', bbp_get_topic_permalink( bbp_get_forum_last_topic_id( $forum_id ) ), $forum_id );
+	}
+
+/**
+ * Return the author ID of the last topic of a forum
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_forum_last_topic_id() To get the forum's last topic id
+ * @uses bbp_get_topic_author_id() To get the topic's author id
+ * @uses apply_filters() Calls 'bbp_get_forum_last_topic_author' with the author
+ *                        id and forum id
+ * @return int Forum's last topic's author id
+ */
+function bbp_get_forum_last_topic_author_id( $forum_id = 0 ) {
+	$forum_id  = bbp_get_forum_id( $forum_id );
+	$author_id = bbp_get_topic_author_id( bbp_get_forum_last_topic_id( $forum_id ) );
+	return (int) apply_filters( 'bbp_get_forum_last_topic_author_id', (int) $author_id, $forum_id );
+}
+
+/**
+ * Output link to author of last topic of forum
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_topic_author_link() To get the forum's last topic's
+ *                                               author link
+ */
+function bbp_forum_last_topic_author_link( $forum_id = 0 ) {
+	echo bbp_get_forum_last_topic_author_link( $forum_id );
+}
+	/**
+	 * Return link to author of last topic of forum
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_topic_author_id() To get the forum's last
+	 *                                             topic's author id
+	 * @uses bbp_get_user_profile_link() To get the author's profile link
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_topic_author_link'
+	 *                        with the author link and forum id
+	 * @return string Forum's last topic's author link
+	 */
+	function bbp_get_forum_last_topic_author_link( $forum_id = 0 ) {
+		$forum_id    = bbp_get_forum_id( $forum_id );
+		$author_id   = bbp_get_forum_last_topic_author_id( $forum_id );
+		$author_link = bbp_get_user_profile_link( $author_id );
+		return apply_filters( 'bbp_get_forum_last_topic_author_link', $author_link, $forum_id );
+	}
+
+/** Forum Last Reply **********************************************************/
+
+/**
+ * Output the forums last reply id
+ *
+ * @since bbPress (r2464)
+ *
+ * @uses bbp_get_forum_last_reply_id() To get the forum's last reply id
+ * @param int $forum_id Optional. Forum id
+ */
+function bbp_forum_last_reply_id( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_id( $forum_id );
+}
+	/**
+	 * Return the forums last reply id
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum's last reply id
+	 * @uses bbp_get_forum_last_topic_id() To get the forum's last topic id
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_id' with
+	 *                        the last reply id and forum id
+	 * @return int Forum's last reply id
+	 */
+	function bbp_get_forum_last_reply_id( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$reply_id = get_post_meta( $forum_id, '_bbp_last_reply_id', true );
+
+		if ( empty( $reply_id ) )
+			$reply_id = bbp_get_forum_last_topic_id( $forum_id );
+
+		return (int) apply_filters( 'bbp_get_forum_last_reply_id', (int) $reply_id, $forum_id );
+	}
+
+/**
+ * Output the title of the last reply inside a forum
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_reply_title() To get the forum's last reply's title
+ */
+function bbp_forum_last_reply_title( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_title( $forum_id );
+}
+	/**
+	 * Return the title of the last reply inside a forum
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_reply_id() To get the forum's last reply id
+	 * @uses bbp_get_reply_title() To get the reply title
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_title' with the
+	 *                        reply title and forum id
+	 * @return string
+	 */
+	function bbp_get_forum_last_reply_title( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		return apply_filters( 'bbp_get_forum_last_reply_title', bbp_get_reply_title( bbp_get_forum_last_reply_id( $forum_id ) ), $forum_id );
+	}
+
+/**
+ * Output the link to the last reply in a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_reply_permalink() To get the forum last reply link
+ */
+function bbp_forum_last_reply_permalink( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_permalink( $forum_id );
+}
+	/**
+	 * Return the link to the last reply in a forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_reply_id() To get the forum's last reply id
+	 * @uses bbp_get_reply_permalink() To get the reply permalink
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_permalink' with
+	 *                        the reply link and forum id
+	 * @return string Permanent link to the forum's last reply
+	 */
+	function bbp_get_forum_last_reply_permalink( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		return apply_filters( 'bbp_get_forum_last_reply_permalink', bbp_get_reply_permalink( bbp_get_forum_last_reply_id( $forum_id ) ), $forum_id );
+	}
+
+/**
+ * Output the url to the last reply in a forum
+ *
+ * @since bbPress (r2683)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_reply_url() To get the forum last reply url
+ */
+function bbp_forum_last_reply_url( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_url( $forum_id );
+}
+	/**
+	 * Return the url to the last reply in a forum
+	 *
+	 * @since bbPress (r2683)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_reply_id() To get the forum's last reply id
+	 * @uses bbp_get_reply_url() To get the reply url
+	 * @uses bbp_get_forum_last_topic_permalink() To get the forum's last
+	 *                                             topic's permalink
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_url' with the
+	 *                        reply url and forum id
+	 * @return string Paginated URL to latest reply
+	 */
+	function bbp_get_forum_last_reply_url( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// If forum has replies, get the last reply and use its url
+		$reply_id = bbp_get_forum_last_reply_id( $forum_id );
+		if ( !empty( $reply_id ) ) {
+			$reply_url = bbp_get_reply_url( $reply_id );
+
+		// No replies, so look for topics and use last permalink
+		} else {
+			$reply_url = bbp_get_forum_last_topic_permalink( $forum_id );
+
+			// No topics either, so set $reply_url as empty string
+			if ( empty( $reply_url ) ) {
+				$reply_url = '';
+			}
+		}
+
+		// Filter and return
+		return apply_filters( 'bbp_get_forum_last_reply_url', $reply_url, $forum_id );
+	}
+
+/**
+ * Output author ID of last reply of forum
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_reply_author_id() To get the forum's last reply
+ *                                             author id
+ */
+function bbp_forum_last_reply_author_id( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_author_id( $forum_id );
+}
+	/**
+	 * Return author ID of last reply of forum
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_reply_author_id() To get the forum's last
+	 *                                             reply's author id
+	 * @uses bbp_get_reply_author_id() To get the reply's author id
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_author_id' with
+	 *                        the author id and forum id
+	 * @return int Forum's last reply author id
+	 */
+	function bbp_get_forum_last_reply_author_id( $forum_id = 0 ) {
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$author_id = bbp_get_reply_author_id( bbp_get_forum_last_reply_id( $forum_id ) );
+		return apply_filters( 'bbp_get_forum_last_reply_author_id', $author_id, $forum_id );
+	}
+
+/**
+ * Output link to author of last reply of forum
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_last_reply_author_link() To get the forum's last reply's
+ *                                               author link
+ */
+function bbp_forum_last_reply_author_link( $forum_id = 0 ) {
+	echo bbp_get_forum_last_reply_author_link( $forum_id );
+}
+	/**
+	 * Return link to author of last reply of forum
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_last_reply_author_id() To get the forum's last
+	 *                                             reply's author id
+	 * @uses bbp_get_user_profile_link() To get the reply's author's profile
+	 *                                    link
+	 * @uses apply_filters() Calls 'bbp_get_forum_last_reply_author_link'
+	 *                        with the author link and forum id
+	 * @return string Link to author of last reply of forum
+	 */
+	function bbp_get_forum_last_reply_author_link( $forum_id = 0 ) {
+		$forum_id    = bbp_get_forum_id( $forum_id );
+		$author_id   = bbp_get_forum_last_reply_author_id( $forum_id );
+		$author_link = bbp_get_user_profile_link( $author_id );
+		return apply_filters( 'bbp_get_forum_last_reply_author_link', $author_link, $forum_id );
+	}
+
+/** Forum Counts **************************************************************/
+
+/**
+ * Output the topics link of the forum
+ *
+ * @since bbPress (r2883)
+ *
+ * @param int $forum_id Optional. Topic id
+ * @uses bbp_get_forum_topics_link() To get the forum topics link
+ */
+function bbp_forum_topics_link( $forum_id = 0 ) {
+	echo bbp_get_forum_topics_link( $forum_id );
+}
+
+	/**
+	 * Return the topics link of the forum
+	 *
+	 * @since bbPress (r2883)
+	 *
+	 * @param int $forum_id Optional. Topic id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum() To get the forum
+	 * @uses bbp_get_forum_topic_count() To get the forum topic count
+	 * @uses bbp_get_forum_permalink() To get the forum permalink
+	 * @uses remove_query_arg() To remove args from the url
+	 * @uses bbp_get_forum_topic_count_hidden() To get the forum hidden
+	 *                                           topic count
+	 * @uses current_user_can() To check if the current user can edit others
+	 *                           topics
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_forum_topics_link' with the
+	 *                        topics link and forum id
+	 */
+	function bbp_get_forum_topics_link( $forum_id = 0 ) {
+		$forum    = bbp_get_forum( $forum_id );
+		$forum_id = $forum->ID;
+		$topics   = sprintf( _n( '%s topic', '%s topics', bbp_get_forum_topic_count( $forum_id, true, false ), 'bbpress' ), bbp_get_forum_topic_count( $forum_id ) );
+		$retval   = '';
+
+		// First link never has view=all
+		if ( bbp_get_view_all( 'edit_others_topics' ) )
+			$retval .= "<a href='" . esc_url( bbp_remove_view_all( bbp_get_forum_permalink( $forum_id ) ) ) . "'>$topics</a>";
+		else
+			$retval .= $topics;
+
+		// Get deleted topics
+		$deleted = bbp_get_forum_topic_count_hidden( $forum_id );
+
+		// This forum has hidden topics
+		if ( !empty( $deleted ) && current_user_can( 'edit_others_topics' ) ) {
+
+			// Extra text
+			$extra = sprintf( __( ' (+ %d hidden)', 'bbpress' ), $deleted );
+
+			// No link
+			if ( bbp_get_view_all() ) {
+				$retval .= " $extra";
+
+			// Link
+			} else {
+				$retval .= " <a href='" . esc_url( bbp_add_view_all( bbp_get_forum_permalink( $forum_id ), true ) ) . "'>$extra</a>";
+			}
+		}
+
+		return apply_filters( 'bbp_get_forum_topics_link', $retval, $forum_id );
+	}
+
+/**
+ * Output total sub-forum count of a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id to check
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_forum_subforum_count() To get the forum's subforum count
+ */
+function bbp_forum_subforum_count( $forum_id = 0, $integer = false ) {
+	echo bbp_get_forum_subforum_count( $forum_id, $integer );
+}
+	/**
+	 * Return total subforum count of a forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the subforum count
+	 * @uses apply_filters() Calls 'bbp_get_forum_subforum_count' with the
+	 *                        subforum count and forum id
+	 * @return int Forum's subforum count
+	 */
+	function bbp_get_forum_subforum_count( $forum_id = 0, $integer = false ) {
+		$forum_id    = bbp_get_forum_id( $forum_id );
+		$forum_count = (int) get_post_meta( $forum_id, '_bbp_forum_subforum_count', true );
+		$filter      = ( true === $integer ) ? 'bbp_get_forum_subforum_count_int' : 'bbp_get_forum_subforum_count';
+
+		return apply_filters( $filter, $forum_count, $forum_id );
+	}
+
+/**
+ * Output total topic count of a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $total_count Optional. To get the total count or normal count?
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_forum_topic_count() To get the forum topic count
+ */
+function bbp_forum_topic_count( $forum_id = 0, $total_count = true, $integer = false ) {
+	echo bbp_get_forum_topic_count( $forum_id, $total_count, $integer );
+}
+	/**
+	 * Return total topic count of a forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param bool $total_count Optional. To get the total count or normal
+	 *                           count? Defaults to total.
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum topic count
+	 * @uses apply_filters() Calls 'bbp_get_forum_topic_count' with the
+	 *                        topic count and forum id
+	 * @return int Forum topic count
+	 */
+	function bbp_get_forum_topic_count( $forum_id = 0, $total_count = true, $integer = false ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$meta_key = empty( $total_count ) ? '_bbp_topic_count' : '_bbp_total_topic_count';
+		$topics   = (int) get_post_meta( $forum_id, $meta_key, true );
+		$filter   = ( true === $integer ) ? 'bbp_get_forum_topic_count_int' : 'bbp_get_forum_topic_count';
+
+		return apply_filters( $filter, $topics, $forum_id );
+	}
+
+/**
+ * Output total reply count of a forum
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $total_count Optional. To get the total count or normal count?
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_forum_reply_count() To get the forum reply count
+ */
+function bbp_forum_reply_count( $forum_id = 0, $total_count = true, $integer = false ) {
+	echo bbp_get_forum_reply_count( $forum_id, $total_count, $integer );
+}
+	/**
+	 * Return total post count of a forum
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param bool $total_count Optional. To get the total count or normal
+	 *                           count?
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum reply count
+	 * @uses apply_filters() Calls 'bbp_get_forum_reply_count' with the
+	 *                        reply count and forum id
+	 * @return int Forum reply count
+	 */
+	function bbp_get_forum_reply_count( $forum_id = 0, $total_count = true, $integer = false ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$meta_key = empty( $total_count ) ? '_bbp_reply_count' : '_bbp_total_reply_count';
+		$replies  = (int) get_post_meta( $forum_id, $meta_key, true );
+		$filter   = ( true === $integer ) ? 'bbp_get_forum_reply_count_int' : 'bbp_get_forum_reply_count';
+
+		return apply_filters( $filter, $replies, $forum_id );
+	}
+
+/**
+ * Output total post count of a forum
+ *
+ * @since bbPress (r2954)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $total_count Optional. To get the total count or normal count?
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_forum_post_count() To get the forum post count
+ */
+function bbp_forum_post_count( $forum_id = 0, $total_count = true, $integer = false ) {
+	echo bbp_get_forum_post_count( $forum_id, $total_count, $integer );
+}
+	/**
+	 * Return total post count of a forum
+	 *
+	 * @since bbPress (r2954)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param bool $total_count Optional. To get the total count or normal
+	 *                           count?
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the forum post count
+	 * @uses apply_filters() Calls 'bbp_get_forum_post_count' with the
+	 *                        post count and forum id
+	 * @return int Forum post count
+	 */
+	function bbp_get_forum_post_count( $forum_id = 0, $total_count = true, $integer = false ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$topics   = bbp_get_forum_topic_count( $forum_id, $total_count, true );
+		$meta_key = empty( $total_count ) ? '_bbp_reply_count' : '_bbp_total_reply_count';
+		$replies  = (int) get_post_meta( $forum_id, $meta_key, true );
+		$retval   = $replies + $topics;
+		$filter   = ( true === $integer ) ? 'bbp_get_forum_post_count_int' : 'bbp_get_forum_post_count';
+
+		return apply_filters( $filter, $retval, $forum_id );
+	}
+
+/**
+ * Output total hidden topic count of a forum (hidden includes trashed and
+ * spammed topics)
+ *
+ * @since bbPress (r2883)
+ *
+ * @param int $forum_id Optional. Topic id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_forum_topic_count_hidden() To get the forum hidden topic count
+ */
+function bbp_forum_topic_count_hidden( $forum_id = 0, $integer = false ) {
+	echo bbp_get_forum_topic_count_hidden( $forum_id, $integer );
+}
+	/**
+	 * Return total hidden topic count of a forum (hidden includes trashed
+	 * and spammed topics)
+	 *
+	 * @since bbPress (r2883)
+	 *
+	 * @param int $forum_id Optional. Topic id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_meta() To get the hidden topic count
+	 * @uses apply_filters() Calls 'bbp_get_forum_topic_count_hidden' with
+	 *                        the hidden topic count and forum id
+	 * @return int Topic hidden topic count
+	 */
+	function bbp_get_forum_topic_count_hidden( $forum_id = 0, $integer = false ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$topics   = (int) get_post_meta( $forum_id, '_bbp_topic_count_hidden', true );
+		$filter   = ( true === $integer ) ? 'bbp_get_forum_topic_count_hidden_int' : 'bbp_get_forum_topic_count_hidden';
+
+		return apply_filters( $filter, $topics, $forum_id );
+	}
+
+/**
+ * Output the status of the forum
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_status() To get the forum status
+ */
+function bbp_forum_status( $forum_id = 0 ) {
+	echo bbp_get_forum_status( $forum_id );
+}
+	/**
+	 * Return the status of the forum
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_status() To get the forum's status
+	 * @uses apply_filters() Calls 'bbp_get_forum_status' with the status
+	 *                        and forum id
+	 * @return string Status of forum
+	 */
+	function bbp_get_forum_status( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$status   = get_post_meta( $forum_id, '_bbp_status', true );
+		if ( empty( $status ) )
+			$status = 'open';
+
+		return apply_filters( 'bbp_get_forum_status', $status, $forum_id );
+	}
+
+/**
+ * Output the visibility of the forum
+ *
+ * @since bbPress (r2997)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_visibility() To get the forum visibility
+ */
+function bbp_forum_visibility( $forum_id = 0 ) {
+	echo bbp_get_forum_visibility( $forum_id );
+}
+	/**
+	 * Return the visibility of the forum
+	 *
+	 * @since bbPress (r2997)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_visibility() To get the forum's visibility
+	 * @uses apply_filters() Calls 'bbp_get_forum_visibility' with the visibility
+	 *                        and forum id
+	 * @return string Status of forum
+	 */
+	function bbp_get_forum_visibility( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		return apply_filters( 'bbp_get_forum_visibility', get_post_status( $forum_id ), $forum_id );
+	}
+
+/**
+ * Output the type of the forum
+ *
+ * @since bbPress (r3563)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_type() To get the forum type
+ */
+function bbp_forum_type( $forum_id = 0 ) {
+	echo bbp_get_forum_type( $forum_id );
+}
+	/**
+	 * Return the type of forum (category/forum/etc...)
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses get_post_meta() To get the forum category meta
+	 * @return bool Whether the forum is a category or not
+	 */
+	function bbp_get_forum_type( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$retval   = get_post_meta( $forum_id, '_bbp_forum_type', true );
+		if ( empty( $retval ) )
+			$retval = 'forum';
+
+		return apply_filters( 'bbp_get_forum_type', $retval, $forum_id );
+	}
+
+/**
+ * Is the forum a category?
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_type() To get the forum type
+ * @return bool Whether the forum is a category or not
+ */
+function bbp_is_forum_category( $forum_id = 0 ) {
+	$forum_id = bbp_get_forum_id( $forum_id );
+	$type     = bbp_get_forum_type( $forum_id );
+	$retval   = ( !empty( $type ) && 'category' == $type );
+
+	return (bool) apply_filters( 'bbp_is_forum_category', (bool) $retval, $forum_id );
+}
+
+/**
+ * Is the forum open?
+ *
+ * @since bbPress (r2746)
+ * @param int $forum_id Optional. Forum id
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_is_forum_closed() To check if the forum is closed or not
+ * @return bool Whether the forum is open or not
+ */
+function bbp_is_forum_open( $forum_id = 0 ) {
+	return !bbp_is_forum_closed( $forum_id );
+}
+
+	/**
+	 * Is the forum closed?
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @param bool $check_ancestors Check if the ancestors are closed (only
+	 *                               if they're a category)
+	 * @uses bbp_get_forum_status() To get the forum status
+	 * @uses bbp_get_forum_ancestors() To get the forum ancestors
+	 * @uses bbp_is_forum_category() To check if the forum is a category
+	 * @uses bbp_is_forum_closed() To check if the forum is closed
+	 * @return bool True if closed, false if not
+	 */
+	function bbp_is_forum_closed( $forum_id = 0, $check_ancestors = true ) {
+
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$retval    = ( bbp_get_closed_status_id() == bbp_get_forum_status( $forum_id ) );
+
+		if ( !empty( $check_ancestors ) ) {
+			$ancestors = bbp_get_forum_ancestors( $forum_id );
+
+			foreach ( (array) $ancestors as $ancestor ) {
+				if ( bbp_is_forum_category( $ancestor, false ) && bbp_is_forum_closed( $ancestor, false ) ) {
+					$retval = true;
+				}
+			}
+		}
+
+		return (bool) apply_filters( 'bbp_is_forum_closed', (bool) $retval, $forum_id, $check_ancestors );
+	}
+
+/**
+ * Is the forum public?
+ *
+ * @since bbPress (r2997)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $check_ancestors Check if the ancestors are public (only if
+ *                               they're a category)
+ * @uses get_post_meta() To get the forum public meta
+ * @uses bbp_get_forum_ancestors() To get the forum ancestors
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @return bool True if closed, false if not
+ */
+function bbp_is_forum_public( $forum_id = 0, $check_ancestors = true ) {
+
+	$forum_id   = bbp_get_forum_id( $forum_id );
+	$visibility = bbp_get_forum_visibility( $forum_id );
+
+	// If post status is public, return true
+	$retval = ( bbp_get_public_status_id() == $visibility );
+
+	// Check ancestors and inherit their privacy setting for display
+	if ( !empty( $check_ancestors ) ) {
+		$ancestors = bbp_get_forum_ancestors( $forum_id );
+
+		foreach ( (array) $ancestors as $ancestor ) {
+			if ( bbp_is_forum( $ancestor ) && bbp_is_forum_public( $ancestor, false ) ) {
+				$retval = true;
+			}
+		}
+	}
+
+	return (bool) apply_filters( 'bbp_is_forum_public', (bool) $retval, $forum_id, $check_ancestors );
+}
+
+/**
+ * Is the forum private?
+ *
+ * @since bbPress (r2746)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $check_ancestors Check if the ancestors are private (only if
+ *                               they're a category)
+ * @uses get_post_meta() To get the forum private meta
+ * @uses bbp_get_forum_ancestors() To get the forum ancestors
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @return bool True if closed, false if not
+ */
+function bbp_is_forum_private( $forum_id = 0, $check_ancestors = true ) {
+
+	$forum_id   = bbp_get_forum_id( $forum_id );
+	$visibility = bbp_get_forum_visibility( $forum_id );
+
+	// If post status is private, return true
+	$retval = ( bbp_get_private_status_id() == $visibility );
+
+	// Check ancestors and inherit their privacy setting for display
+	if ( !empty( $check_ancestors ) ) {
+		$ancestors = bbp_get_forum_ancestors( $forum_id );
+
+		foreach ( (array) $ancestors as $ancestor ) {
+			if ( bbp_is_forum( $ancestor ) && bbp_is_forum_private( $ancestor, false ) ) {
+				$retval = true;
+			}
+		}
+	}
+
+	return (bool) apply_filters( 'bbp_is_forum_private', (bool) $retval, $forum_id, $check_ancestors );
+}
+
+/**
+ * Is the forum hidden?
+ *
+ * @since bbPress (r2997)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @param bool $check_ancestors Check if the ancestors are private (only if
+ *                               they're a category)
+ * @uses get_post_meta() To get the forum private meta
+ * @uses bbp_get_forum_ancestors() To get the forum ancestors
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @return bool True if closed, false if not
+ */
+function bbp_is_forum_hidden( $forum_id = 0, $check_ancestors = true ) {
+
+	$forum_id   = bbp_get_forum_id( $forum_id );
+	$visibility = bbp_get_forum_visibility( $forum_id );
+
+	// If post status is private, return true
+	$retval = ( bbp_get_hidden_status_id() == $visibility );
+
+	// Check ancestors and inherit their privacy setting for display
+	if ( !empty( $check_ancestors ) ) {
+		$ancestors = bbp_get_forum_ancestors( $forum_id );
+
+		foreach ( (array) $ancestors as $ancestor ) {
+			if ( bbp_is_forum( $ancestor ) && bbp_is_forum_hidden( $ancestor, false ) ) {
+				$retval = true;
+			}
+		}
+	}
+
+	return (bool) apply_filters( 'bbp_is_forum_hidden', (bool) $retval, $forum_id, $check_ancestors );
+}
+
+/**
+ * Output the author of the forum
+ *
+ * @since bbPress (r3675)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_author() To get the forum author
+ */
+function bbp_forum_author_display_name( $forum_id = 0 ) {
+	echo bbp_get_forum_author_display_name( $forum_id );
+}
+	/**
+	 * Return the author of the forum
+	 *
+	 * @since bbPress (r3675)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_author_id() To get the forum author id
+	 * @uses get_the_author_meta() To get the display name of the author
+	 * @uses apply_filters() Calls 'bbp_get_forum_author' with the author
+	 *                        and forum id
+	 * @return string Author of forum
+	 */
+	function bbp_get_forum_author_display_name( $forum_id = 0 ) {
+		$forum_id = bbp_get_forum_id( $forum_id );
+		$author   = get_the_author_meta( 'display_name', bbp_get_forum_author_id( $forum_id ) );
+
+		return apply_filters( 'bbp_get_forum_author_display_name', $author, $forum_id );
+	}
+
+/**
+ * Output the author ID of the forum
+ *
+ * @since bbPress (r3675)
+ *
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_forum_author_id() To get the forum author id
+ */
+function bbp_forum_author_id( $forum_id = 0 ) {
+	echo bbp_get_forum_author_id( $forum_id );
+}
+	/**
+	 * Return the author ID of the forum
+	 *
+	 * @since bbPress (r3675)
+	 *
+	 * @param int $forum_id Optional. Forum id
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses get_post_field() To get the forum author id
+	 * @uses apply_filters() Calls 'bbp_get_forum_author_id' with the author
+	 *                        id and forum id
+	 * @return string Author of forum
+	 */
+	function bbp_get_forum_author_id( $forum_id = 0 ) {
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$author_id = get_post_field( 'post_author', $forum_id );
+
+		return (int) apply_filters( 'bbp_get_forum_author_id', (int) $author_id, $forum_id );
+	}
+
+/**
+ * Replace forum meta details for users that cannot view them.
+ *
+ * @since bbPress (r3162)
+ *
+ * @param string $retval
+ * @param int $forum_id
+ *
+ * @uses bbp_is_forum_private()
+ * @uses current_user_can()
+ *
+ * @return string
+ */
+function bbp_suppress_private_forum_meta( $retval, $forum_id ) {
+	if ( bbp_is_forum_private( $forum_id, false ) && !current_user_can( 'read_private_forums' ) )
+		$retval = '-';
+
+	return apply_filters( 'bbp_suppress_private_forum_meta', $retval );
+}
+
+/**
+ * Replace forum author details for users that cannot view them.
+ *
+ * @since bbPress (r3162)
+ *
+ * @param string $retval
+ * @param int $forum_id
+ *
+ * @uses bbp_is_forum_private()
+ * @uses get_post_field()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_is_forum_private()
+ * @uses bbp_get_topic_forum_id()
+ * @uses bbp_get_reply_post_type()
+ * @uses bbp_get_reply_forum_id()
+ *
+ * @return string
+ */
+function bbp_suppress_private_author_link( $author_link, $args ) {
+
+	// Assume the author link is the return value
+	$retval = $author_link;
+
+	// Show the normal author link
+	if ( !empty( $args['post_id'] ) && !current_user_can( 'read_private_forums' ) ) {
+
+		// What post type are we looking at?
+		$post_type = get_post_field( 'post_type', $args['post_id'] );
+
+		switch ( $post_type ) {
+
+			// Topic
+			case bbp_get_topic_post_type() :
+				if ( bbp_is_forum_private( bbp_get_topic_forum_id( $args['post_id'] ) ) )
+					$retval = '';
+
+				break;
+
+			// Reply
+			case bbp_get_reply_post_type() :
+				if ( bbp_is_forum_private( bbp_get_reply_forum_id( $args['post_id'] ) ) )
+					$retval = '';
+
+				break;
+
+			// Post
+			default :
+				if ( bbp_is_forum_private( $args['post_id'] ) )
+					$retval = '';
+
+				break;
+		}
+	}
+
+	return apply_filters( 'bbp_suppress_private_author_link', $retval );
+}
+
+/**
+ * Output the row class of a forum
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $forum_id Optional. Forum ID.
+ * @uses bbp_get_forum_class() To get the row class of the forum
+ */
+function bbp_forum_class( $forum_id = 0 ) {
+	echo bbp_get_forum_class( $forum_id );
+}
+	/**
+	 * Return the row class of a forum
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $forum_id Optional. Forum ID
+	 * @uses bbp_get_forum_id() To validate the forum id
+	 * @uses bbp_is_forum_category() To see if forum is a category
+	 * @uses bbp_get_forum_status() To get the forum status
+	 * @uses bbp_get_forum_visibility() To get the forum visibility
+	 * @uses bbp_get_forum_parent_id() To get the forum parent id
+	 * @uses get_post_class() To get all the classes including ours
+	 * @uses apply_filters() Calls 'bbp_get_forum_class' with the classes
+	 * @return string Row class of the forum
+	 */
+	function bbp_get_forum_class( $forum_id = 0 ) {
+		$bbp       = bbpress();
+		$forum_id  = bbp_get_forum_id( $forum_id );
+		$count     = isset( $bbp->forum_query->current_post ) ? $bbp->forum_query->current_post : 1;
+		$classes   = array();
+
+		// Get some classes
+		$classes[] = 'loop-item-' . $count;
+		$classes[] = ( (int) $count % 2 )                      ? 'even'              : 'odd';
+		$classes[] = bbp_is_forum_category( $forum_id )        ? 'status-category'   : '';
+		$classes[] = bbp_get_forum_subforum_count( $forum_id ) ? 'bbp-has-subforums' : '';
+		$classes[] = bbp_get_forum_parent_id( $forum_id )      ? 'bbp-parent-forum-' . bbp_get_forum_parent_id( $forum_id ) : '';
+		$classes[] = 'bbp-forum-status-'     . bbp_get_forum_status( $forum_id );
+		$classes[] = 'bbp-forum-visibility-' . bbp_get_forum_visibility( $forum_id );
+
+		// Ditch the empties
+		$classes   = array_filter( $classes );
+		$classes   = get_post_class( $classes, $forum_id );
+
+		// Filter the results
+		$classes   = apply_filters( 'bbp_get_forum_class', $classes, $forum_id );
+		$retval    = 'class="' . join( ' ', $classes ) . '"';
+
+		return $retval;
+	}
+
+/** Single Forum **************************************************************/
+
+/**
+ * Output a fancy description of the current forum, including total topics,
+ * total replies, and last activity.
+ *
+ * @since bbPress (r2860)
+ *
+ * @param array $args Arguments passed to alter output
+ * @uses bbp_get_single_forum_description() Return the eventual output
+ */
+function bbp_single_forum_description( $args = '' ) {
+	echo bbp_get_single_forum_description( $args );
+}
+	/**
+	 * Return a fancy description of the current forum, including total
+	 * topics, total replies, and last activity.
+	 *
+	 * @since bbPress (r2860)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - forum_id: Forum id
+	 *  - before: Before the text
+	 *  - after: After the text
+	 *  - size: Size of the avatar
+	 * @uses bbp_get_forum_id() To get the forum id
+	 * @uses bbp_get_forum_topic_count() To get the forum topic count
+	 * @uses bbp_get_forum_reply_count() To get the forum reply count
+	 * @uses bbp_get_forum_subforum_count() To get the forum subforum count
+	 * @uses bbp_get_forum_freshness_link() To get the forum freshness link
+	 * @uses bbp_get_forum_last_active_id() To get the forum last active id
+	 * @uses bbp_get_author_link() To get the author link
+	 * @uses add_filter() To add the 'view all' filter back
+	 * @uses apply_filters() Calls 'bbp_get_single_forum_description' with
+	 *                        the description and args
+	 * @return string Filtered forum description
+	 */
+	function bbp_get_single_forum_description( $args = '' ) {
+
+		// Default arguments
+		$defaults = array (
+			'forum_id'  => 0,
+			'before'    => '<div class="bbp-template-notice info"><p class="bbp-forum-description">',
+			'after'     => '</p></div>',
+			'size'      => 14,
+			'feed'      => true
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_single_forum_description' );
+		extract( $r );
+
+		// Validate forum_id
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Unhook the 'view all' query var adder
+		remove_filter( 'bbp_get_forum_permalink', 'bbp_add_view_all' );
+
+		// Get some forum data
+		$tc_int      = bbp_get_forum_topic_count( $forum_id, false );
+		$rc_int      = bbp_get_forum_reply_count( $forum_id, false );
+		$topic_count = bbp_get_forum_topic_count( $forum_id );
+		$reply_count = bbp_get_forum_reply_count( $forum_id );
+		$last_active = bbp_get_forum_last_active_id( $forum_id );
+
+		// Has replies
+		if ( !empty( $reply_count ) ) {
+			$reply_text = sprintf( _n( '%s reply', '%s replies', $rc_int, 'bbpress' ), $reply_count );
+		}
+
+		// Forum has active data
+		if ( !empty( $last_active ) ) {
+			$topic_text      = bbp_get_forum_topics_link( $forum_id );
+			$time_since      = bbp_get_forum_freshness_link( $forum_id );
+			$last_updated_by = bbp_get_author_link( array( 'post_id' => $last_active, 'size' => $size ) );
+
+		// Forum has no last active data
+		} else {
+			$topic_text      = sprintf( _n( '%s topic', '%s topics', $tc_int, 'bbpress' ), $topic_count );
+		}
+
+		// Forum has active data
+		if ( !empty( $last_active ) ) {
+
+			if ( !empty( $reply_count ) ) {
+
+				if ( bbp_is_forum_category( $forum_id ) ) {
+					$retstr = sprintf( __( 'This category contains %1$s and %2$s, and was last updated by %3$s %4$s.', 'bbpress' ), $topic_text, $reply_text, $last_updated_by, $time_since );
+				} else {
+					$retstr = sprintf( __( 'This forum contains %1$s and %2$s, and was last updated by %3$s %4$s.',    'bbpress' ), $topic_text, $reply_text, $last_updated_by, $time_since );
+				}
+
+			} else {
+
+				if ( bbp_is_forum_category( $forum_id ) ) {
+					$retstr = sprintf( __( 'This category contains %1$s, and was last updated by %2$s %3$s.', 'bbpress' ), $topic_text, $last_updated_by, $time_since );
+				} else {
+					$retstr = sprintf( __( 'This forum contains %1$s, and was last updated by %2$s %3$s.',    'bbpress' ), $topic_text, $last_updated_by, $time_since );
+				}
+			}
+
+		// Forum has no last active data
+		} else {
+
+			if ( !empty( $reply_count ) ) {
+
+				if ( bbp_is_forum_category( $forum_id ) ) {
+					$retstr = sprintf( __( 'This category contains %1$s and %2$s.', 'bbpress' ), $topic_text, $reply_text );
+				} else {
+					$retstr = sprintf( __( 'This forum contains %1$s and %2$s.',    'bbpress' ), $topic_text, $reply_text );
+				}
+
+			} else {
+
+				if ( !empty( $topic_count ) ) {
+
+					if ( bbp_is_forum_category( $forum_id ) ) {
+						$retstr = sprintf( __( 'This category contains %1$s.', 'bbpress' ), $topic_text );
+					} else {
+						$retstr = sprintf( __( 'This forum contains %1$s.',    'bbpress' ), $topic_text );
+					}
+
+				} else {
+					$retstr = __( 'This forum is empty.', 'bbpress' );
+				}
+			}
+		}
+
+		// Add feeds
+		//$feed_links = ( !empty( $feed ) ) ? bbp_get_forum_topics_feed_link ( $forum_id ) . bbp_get_forum_replies_feed_link( $forum_id ) : '';
+
+		// Add the 'view all' filter back
+		add_filter( 'bbp_get_forum_permalink', 'bbp_add_view_all' );
+
+		// Combine the elements together
+		$retstr = $before . $retstr . $after;
+
+		// Return filtered result
+		return apply_filters( 'bbp_get_single_forum_description', $retstr, $args );
+	}
+
+/** Forms *********************************************************************/
+
+/**
+ * Output the value of forum title field
+ *
+ * @since bbPress (r3551)
+ *
+ * @uses bbp_get_form_forum_title() To get the value of forum title field
+ */
+function bbp_form_forum_title() {
+	echo bbp_get_form_forum_title();
+}
+	/**
+	 * Return the value of forum title field
+	 *
+	 * @since bbPress (r3551)
+	 *
+	 * @uses bbp_is_forum_edit() To check if it's forum edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_forum_title' with the title
+	 * @return string Value of forum title field
+	 */
+	function bbp_get_form_forum_title() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_title'] ) )
+			$forum_title = $_POST['bbp_forum_title'];
+
+		// Get edit data
+		elseif ( bbp_is_forum_edit() )
+			$forum_title = bbp_get_global_post_field( 'post_title', 'raw' );
+
+		// No data
+		else
+			$forum_title = '';
+
+		return apply_filters( 'bbp_get_form_forum_title', esc_attr( $forum_title ) );
+	}
+
+/**
+ * Output the value of forum content field
+ *
+ * @since bbPress (r3551)
+ *
+ * @uses bbp_get_form_forum_content() To get value of forum content field
+ */
+function bbp_form_forum_content() {
+	echo bbp_get_form_forum_content();
+}
+	/**
+	 * Return the value of forum content field
+	 *
+	 * @since bbPress (r3551)
+	 *
+	 * @uses bbp_is_forum_edit() To check if it's the forum edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_forum_content' with the content
+	 * @return string Value of forum content field
+	 */
+	function bbp_get_form_forum_content() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_content'] ) )
+			$forum_content = $_POST['bbp_forum_content'];
+
+		// Get edit data
+		elseif ( bbp_is_forum_edit() )
+			$forum_content = bbp_get_global_post_field( 'post_content', 'raw' );
+
+		// No data
+		else
+			$forum_content = '';
+
+		return apply_filters( 'bbp_get_form_forum_content', esc_textarea( $forum_content ) );
+	}
+
+/**
+ * Output value of forum parent
+ *
+ * @since bbPress (r3551)
+ *
+ * @uses bbp_get_form_forum_parent() To get the topic's forum id
+ */
+function bbp_form_forum_parent() {
+	echo bbp_get_form_forum_parent();
+}
+	/**
+	 * Return value of forum parent
+	 *
+	 * @since bbPress (r3551)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_parent_id() To get the topic forum id
+	 * @uses apply_filters() Calls 'bbp_get_form_forum_parent' with the forum
+	 * @return string Value of topic content field
+	 */
+	function bbp_get_form_forum_parent() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_id'] ) )
+			$forum_parent = $_POST['bbp_forum_id'];
+
+		// Get edit data
+		elseif ( bbp_is_forum_edit() )
+			$forum_parent = bbp_get_forum_parent_id();
+
+		// No data
+		else
+			$forum_parent = 0;
+
+		return apply_filters( 'bbp_get_form_forum_parent', esc_attr( $forum_parent ) );
+	}
+
+/**
+ * Output value of forum type
+ *
+ * @since bbPress (r3563)
+ *
+ * @uses bbp_get_form_forum_type() To get the topic's forum id
+ */
+function bbp_form_forum_type() {
+	echo bbp_get_form_forum_type();
+}
+	/**
+	 * Return value of forum type
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_type_id() To get the topic forum id
+	 * @uses apply_filters() Calls 'bbp_get_form_forum_type' with the forum
+	 * @return string Value of topic content field
+	 */
+	function bbp_get_form_forum_type() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_type'] ) )
+			$forum_type = $_POST['bbp_forum_type'];
+
+		// Get edit data
+		elseif ( bbp_is_forum_edit() )
+			$forum_type = bbp_get_forum_type();
+
+		// No data
+		else
+			$forum_type = 'forum';
+
+		return apply_filters( 'bbp_get_form_forum_type', esc_attr( $forum_type ) );
+	}
+
+/**
+ * Output value of forum visibility
+ *
+ * @since bbPress (r3563)
+ *
+ * @uses bbp_get_form_forum_visibility() To get the topic's forum id
+ */
+function bbp_form_forum_visibility() {
+	echo bbp_get_form_forum_visibility();
+}
+	/**
+	 * Return value of forum visibility
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_visibility_id() To get the topic forum id
+	 * @uses apply_filters() Calls 'bbp_get_form_forum_visibility' with the forum
+	 * @return string Value of topic content field
+	 */
+	function bbp_get_form_forum_visibility() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_visibility'] ) )
+			$forum_visibility = $_POST['bbp_forum_visibility'];
+
+		// Get edit data
+		elseif ( bbp_is_forum_edit() )
+			$forum_visibility = bbp_get_forum_visibility();
+
+		// No data
+		else
+			$forum_visibility = bbpress()->public_status_id;
+
+		return apply_filters( 'bbp_get_form_forum_visibility', esc_attr( $forum_visibility ) );
+	}
+
+/** Form Dropdows *************************************************************/
+
+/**
+ * Output value forum type dropdown
+ *
+ * @since bbPress (r3563)
+ *
+ * @param int $forum_id The forum id to use
+ * @uses bbp_get_form_forum_type() To get the topic's forum id
+ */
+function bbp_form_forum_type_dropdown( $forum_id = 0 ) {
+	echo bbp_get_form_forum_type_dropdown( $forum_id );
+}
+	/**
+	 * Return the forum type dropdown
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @param int $forum_id The forum id to use
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_type() To get the forum type
+	 * @uses apply_filters()
+	 * @return string HTML select list for selecting forum type
+	 */
+	function bbp_get_form_forum_type_dropdown( $forum_id = 0 ) {
+		$forum_id   = bbp_get_forum_id( $forum_id );
+		$forum_attr = apply_filters( 'bbp_forum_types', array(
+			'forum'    => __( 'Forum',    'bbpress' ),
+			'category' => __( 'Category', 'bbpress' )
+		) );
+		$type_output = '<select name="bbp_forum_type" id="bbp_forum_type_select">' . "\n";
+
+		foreach( $forum_attr as $value => $label )
+			$type_output .= "\t" . '<option value="' . $value . '"' . selected( bbp_get_forum_type( $forum_id ), $value, false ) . '>' . esc_html( $label ) . '</option>' . "\n";
+
+		$type_output .= '</select>';
+
+		return apply_filters( 'bbp_get_form_forum_type_dropdown', $type_output, $forum_id, $forum_attr );
+	}
+
+/**
+ * Output value forum status dropdown
+ *
+ * @since bbPress (r3563)
+ *
+ * @param int $forum_id The forum id to use
+ * @uses bbp_get_form_forum_status() To get the topic's forum id
+ */
+function bbp_form_forum_status_dropdown( $forum_id = 0 ) {
+	echo bbp_get_form_forum_status_dropdown( $forum_id );
+}
+	/**
+	 * Return the forum status dropdown
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @param int $forum_id The forum id to use
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_status() To get the forum status
+	 * @uses apply_filters()
+	 * @return string HTML select list for selecting forum status
+	 */
+	function bbp_get_form_forum_status_dropdown( $forum_id = 0 ) {
+		$forum_id   = bbp_get_forum_id( $forum_id );
+		$forum_attr = apply_filters( 'bbp_forum_statuses', array(
+			'open'   => _x( 'Open',   'Forum Status', 'bbpress' ),
+			'closed' => _x( 'Closed', 'Forum Status', 'bbpress' )
+		) );
+		$status_output = '<select name="bbp_forum_status" id="bbp_forum_status_select">' . "\n";
+
+		foreach( $forum_attr as $value => $label )
+			$status_output .= "\t" . '<option value="' . $value . '"' . selected( bbp_get_forum_status( $forum_id ), $value, false ) . '>' . esc_html( $label ) . '</option>' . "\n";
+
+		$status_output .= '</select>';
+
+		return apply_filters( 'bbp_get_form_forum_status_dropdown', $status_output, $forum_id, $forum_attr );
+	}
+
+/**
+ * Output value forum visibility dropdown
+ *
+ * @since bbPress (r3563)
+ *
+ * @param int $forum_id The forum id to use
+ * @uses bbp_get_form_forum_visibility() To get the topic's forum id
+ */
+function bbp_form_forum_visibility_dropdown( $forum_id = 0 ) {
+	echo bbp_get_form_forum_visibility_dropdown( $forum_id );
+}
+	/**
+	 * Return the forum visibility dropdown
+	 *
+	 * @since bbPress (r3563)
+	 *
+	 * @param int $forum_id The forum id to use
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_forum_visibility() To get the forum visibility
+	 * @uses apply_filters()
+	 * @return string HTML select list for selecting forum visibility
+	 */
+	function bbp_get_form_forum_visibility_dropdown( $forum_id = 0 ) {
+		$forum_id   = bbp_get_forum_id( $forum_id );
+		$forum_attr = apply_filters( 'bbp_forum_visibilities', array(
+			bbp_get_public_status_id()  => __( 'Public',  'bbpress' ),
+			bbp_get_private_status_id() => __( 'Private', 'bbpress' ),
+			bbp_get_hidden_status_id()  => __( 'Hidden',  'bbpress' )
+		) );
+		$visibility_output = '<select name="bbp_forum_visibility" id="bbp_forum_visibility_select">' . "\n";
+
+		foreach( $forum_attr as $value => $label )
+			$visibility_output .= "\t" . '<option value="' . $value . '"' . selected( bbp_get_forum_visibility( $forum_id ), $value, false ) . '>' . esc_html( $label ) . '</option>' . "\n";
+
+		$visibility_output .= '</select>';
+
+		return apply_filters( 'bbp_get_form_forum_visibility_dropdown', $visibility_output, $forum_id, $forum_attr );
+	}
+
+/** Feeds *********************************************************************/
+
+/**
+ * Output the link for the forum feed
+ *
+ * @since bbPress (r3172)
+ *
+ * @param type $forum_id Optional. Forum ID.
+ *
+ * @uses bbp_get_forum_topics_feed_link()
+ */
+function bbp_forum_topics_feed_link( $forum_id = 0 ) {
+	echo bbp_get_forum_topics_feed_link( $forum_id );
+}
+	/**
+	 * Retrieve the link for the forum feed
+	 *
+	 * @since bbPress (r3172)
+	 *
+	 * @param int $forum_id Optional. Forum ID.
+	 *
+	 * @uses bbp_get_forum_id()
+	 * @uses get_option()
+	 * @uses trailingslashit()
+	 * @uses bbp_get_forum_permalink()
+	 * @uses user_trailingslashit()
+	 * @uses bbp_get_forum_post_type()
+	 * @uses get_post_field()
+	 * @uses apply_filters()
+	 *
+	 * @return string
+	 */
+	function bbp_get_forum_topics_feed_link( $forum_id = 0 ) {
+
+		// Validate forum id
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Forum is valid
+		if ( !empty( $forum_id ) ) {
+
+			// Define local variable(s)
+			$link = '';
+
+			// Pretty permalinks
+			if ( get_option( 'permalink_structure' ) ) {
+
+				// Forum link
+				$url = trailingslashit( bbp_get_forum_permalink( $forum_id ) ) . 'feed';
+				$url = user_trailingslashit( $url, 'single_feed' );
+
+			// Unpretty permalinks
+			} else {
+				$url = home_url( add_query_arg( array(
+					'feed'                    => 'rss2',
+					bbp_get_forum_post_type() => get_post_field( 'post_name', $forum_id )
+				) ) );
+			}
+
+			$link = '<a href="' . $url . '" class="bbp-forum-rss-link topics"><span>' . __( 'Topics', 'bbpress' ) . '</span></a>';
+		}
+
+		return apply_filters( 'bbp_get_forum_topics_feed_link', $link, $url, $forum_id );
+	}
+
+/**
+ * Output the link for the forum replies feed
+ *
+ * @since bbPress (r3172)
+ *
+ * @param type $forum_id Optional. Forum ID.
+ *
+ * @uses bbp_get_forum_replies_feed_link()
+ */
+function bbp_forum_replies_feed_link( $forum_id = 0 ) {
+	echo bbp_get_forum_replies_feed_link( $forum_id );
+}
+	/**
+	 * Retrieve the link for the forum replies feed
+	 *
+	 * @since bbPress (r3172)
+	 *
+	 * @param int $forum_id Optional. Forum ID.
+	 *
+	 * @uses bbp_get_forum_id()
+	 * @uses get_option()
+	 * @uses trailingslashit()
+	 * @uses bbp_get_forum_permalink()
+	 * @uses user_trailingslashit()
+	 * @uses bbp_get_forum_post_type()
+	 * @uses get_post_field()
+	 * @uses apply_filters()
+	 *
+	 * @return string
+	 */
+	function bbp_get_forum_replies_feed_link( $forum_id = 0 ) {
+
+		// Validate forum id
+		$forum_id = bbp_get_forum_id( $forum_id );
+
+		// Forum is valid
+		if ( !empty( $forum_id ) ) {
+
+			// Define local variable(s)
+			$link = '';
+
+			// Pretty permalinks
+			if ( get_option( 'permalink_structure' ) ) {
+
+				// Forum link
+				$url = trailingslashit( bbp_get_forum_permalink( $forum_id ) ) . 'feed';
+				$url = user_trailingslashit( $url, 'single_feed' );
+				$url = add_query_arg( array( 'type' => 'reply' ), $url );
+
+			// Unpretty permalinks
+			} else {
+				$url = home_url( add_query_arg( array(
+					'type'                    => 'reply',
+					'feed'                    => 'rss2',
+					bbp_get_forum_post_type() => get_post_field( 'post_name', $forum_id )
+				) ) );
+			}
+
+			$link = '<a href="' . $url . '" class="bbp-forum-rss-link replies"><span>' . __( 'Replies', 'bbpress' ) . '</span></a>';
+		}
+
+		return apply_filters( 'bbp_get_forum_replies_feed_link', $link, $url, $forum_id );
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/replies/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,183 @@
+<?php
+
+/**
+ * bbPress Reply Capabilites
+ *
+ * Used to map reply capabilities to WordPress's existing capabilities.
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+/**
+ * Return reply capabilities
+ *
+ * @since bbPress (r2593)
+ *
+ * @uses apply_filters() Calls 'bbp_get_reply_caps' with the capabilities
+ * @return array Reply capabilities
+ */
+function bbp_get_reply_caps() {
+	return apply_filters( 'bbp_get_reply_caps', array (
+		'edit_posts'          => 'edit_replies',
+		'edit_others_posts'   => 'edit_others_replies',
+		'publish_posts'       => 'publish_replies',
+		'read_private_posts'  => 'read_private_replies',
+		'delete_posts'        => 'delete_replies',
+		'delete_others_posts' => 'delete_others_replies'
+	) );
+}
+
+/**
+ * Maps topic capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses get_post() To get the post
+ * @uses get_post_type_object() To get the post type object
+ * @uses apply_filters() Filter mapped results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_reply_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+
+		/** Reading ***********************************************************/
+
+		case 'read_reply' :
+
+			// User cannot spectate
+			if ( ! user_can( $user_id, 'spectate' ) ) {
+				$caps = array( 'do_not_allow' );
+
+			// Do some post ID based logic
+			} else {
+
+				// Get the post
+				$_post = get_post( $args[0] );
+				if ( !empty( $_post ) ) {
+
+					// Get caps for post type object
+					$post_type = get_post_type_object( $_post->post_type );
+
+					// Post is public
+					if ( bbp_get_public_status_id() == $_post->post_status ) {
+						$caps = array( 'spectate' );
+
+					// User is author so allow read
+					} elseif ( (int) $user_id == (int) $_post->post_author ) {
+						$caps = array( 'spectate' );
+
+					// Unknown so map to private posts
+					} else {
+						$caps = array( $post_type->cap->read_private_posts );
+					}
+				}
+			}
+
+			break;
+
+		/** Publishing ********************************************************/
+
+		case 'publish_replies' :
+
+			// Moderators can always publish
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		/** Editing ***********************************************************/
+
+		// Used primarily in wp-admin
+		case 'edit_replies'        :
+		case 'edit_others_replies' :
+
+			// Moderators can always edit
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		// Used everywhere
+		case 'edit_reply' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// User is author so allow edit
+				} elseif ( (int) $user_id == (int) $_post->post_author ) {
+					$caps[] = $post_type->cap->edit_posts;
+
+				// Unknown, so map to edit_others_posts
+				} else {
+					$caps[] = $post_type->cap->edit_others_posts;
+				}
+			}
+
+			break;
+
+		/** Deleting **********************************************************/
+
+		case 'delete_reply' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// Moderators can always edit forum content
+				} elseif ( user_can( $user_id, 'moderate' ) ) {
+					$caps[] = 'moderate';
+
+				// Unknown so map to delete_others_posts
+				} else {
+					$caps[] = $post_type->cap->delete_others_posts;
+				}
+			}
+
+			break;
+
+		// Moderation override
+		case 'delete_replies'        :
+		case 'delete_others_replies' :
+
+			// Moderators can always delete
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		/** Admin *************************************************************/
+
+		case 'bbp_replies_admin' :
+			$caps = array( 'moderate' );
+			break;
+	}
+
+	return apply_filters( 'bbp_map_reply_meta_caps', $caps, $cap, $user_id, $args );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/replies/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1705 @@
+<?php
+
+/**
+ * bbPress Reply Functions
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Insert ********************************************************************/
+
+/**
+ * A wrapper for wp_insert_post() that also includes the necessary meta values
+ * for the reply to function properly.
+ *
+ * @since bbPress (r3349)
+ *
+ * @uses bbp_parse_args()
+ * @uses bbp_get_reply_post_type()
+ * @uses wp_insert_post()
+ * @uses update_post_meta()
+ *
+ * @param array $reply_data Forum post data
+ * @param arrap $reply_meta Forum meta data
+ */
+function bbp_insert_reply( $reply_data = array(), $reply_meta = array() ) {
+
+	// Forum
+	$default_reply = array(
+		'post_parent'    => 0, // topic ID
+		'post_status'    => bbp_get_public_status_id(),
+		'post_type'      => bbp_get_reply_post_type(),
+		'post_author'    => bbp_get_current_user_id(),
+		'post_password'  => '',
+		'post_content'   => '',
+		'post_title'     => '',
+		'menu_order'     => 0,
+		'comment_status' => 'closed'
+	);
+	$reply_data = bbp_parse_args( $reply_data, $default_reply, 'insert_reply' );
+
+	// Insert reply
+	$reply_id   = wp_insert_post( $reply_data );
+
+	// Bail if no reply was added
+	if ( empty( $reply_id ) )
+		return false;
+
+	// Forum meta
+	$default_meta = array(
+		'author_ip' => bbp_current_author_ip(),
+		'forum_id'  => 0,
+		'topic_id'  => 0,
+	);
+	$reply_meta = bbp_parse_args( $reply_meta, $default_meta, 'insert_reply_meta' );
+
+	// Insert reply meta
+	foreach ( $reply_meta as $meta_key => $meta_value )
+		update_post_meta( $reply_id, '_bbp_' . $meta_key, $meta_value );
+
+	// Update the topic
+	$topic_id = bbp_get_reply_topic_id( $reply_id );
+	if ( !empty( $topic_id ) )
+		bbp_update_topic( $topic_id );
+
+	// Return new reply ID
+	return $reply_id;
+}
+
+/** Post Form Handlers ********************************************************/
+
+/**
+ * Handles the front end reply submission
+ *
+ * @since bbPress (r2574)
+ *
+ * @uses bbp_add_error() To add an error message
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses bbp_is_anonymous() To check if an anonymous post is being made
+ * @uses current_user_can() To check if the current user can publish replies
+ * @uses bbp_get_current_user_id() To get the current user id
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses bbp_set_current_anonymous_user_data() To set the anonymous user
+ *                                                cookies
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses esc_attr() For sanitization
+ * @uses bbp_check_for_flood() To check for flooding
+ * @uses bbp_check_for_duplicate() To check for duplicates
+ * @uses apply_filters() Calls 'bbp_new_reply_pre_title' with the title
+ * @uses apply_filters() Calls 'bbp_new_reply_pre_content' with the content
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wp_set_post_terms() To set the topic tags
+ * @uses wp_insert_post() To insert the reply
+ * @uses do_action() Calls 'bbp_new_reply' with the reply id, topic id, forum
+ *                    id, anonymous data and reply author
+ * @uses bbp_get_reply_url() To get the paginated url to the reply
+ * @uses wp_safe_redirect() To redirect to the reply url
+ * @uses bbPress::errors::get_error_message() To get the {@link WP_Error} error
+ *                                              message
+ */
+function bbp_new_reply_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-new-reply
+	if ( empty( $_POST['action'] ) || ( 'bbp-new-reply' !== $_POST['action'] ) )
+		return;
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-new-reply' ) ) {
+		bbp_add_error( 'bbp_rew_reply_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Define local variable(s)
+	$topic_id = $forum_id = $reply_author = $anonymous_data = 0;
+	$reply_title = $reply_content = $terms = '';
+
+	/** Reply Author **********************************************************/
+
+	// User is anonymous
+	if ( bbp_is_anonymous() ) {
+
+		// Filter anonymous data
+		$anonymous_data = bbp_filter_anonymous_post_data();
+
+		// Anonymous data checks out, so set cookies, etc...
+		if ( !empty( $anonymous_data ) && is_array( $anonymous_data ) ) {
+			bbp_set_current_anonymous_user_data( $anonymous_data );
+		}
+
+	// User is logged in
+	} else {
+
+		// User cannot create replies
+		if ( !current_user_can( 'publish_replies' ) ) {
+			bbp_add_error( 'bbp_reply_permissions', __( '<strong>ERROR</strong>: You do not have permission to reply.', 'bbpress' ) );
+		}
+
+		// Reply author is current user
+		$reply_author = bbp_get_current_user_id();
+
+	}
+
+	/** Topic ID **************************************************************/
+
+	// Handle Topic ID to append reply to
+	if ( isset( $_POST['bbp_topic_id'] ) ) {
+		$topic_id = (int) $_POST['bbp_topic_id'];
+	} else {
+		bbp_add_error( 'bbp_reply_topic_id', __( '<strong>ERROR</strong>: Topic ID is missing.', 'bbpress' ) );
+	}
+
+	/** Forum ID **************************************************************/
+
+	// Handle Forum ID to adjust counts of
+	if ( isset( $_POST['bbp_forum_id'] ) ) {
+		$forum_id = (int) $_POST['bbp_forum_id'];
+	} elseif ( !empty( $topic_id ) ) {
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+	} else {
+		bbp_add_error( 'bbp_reply_forum_id', __( '<strong>ERROR</strong>: Forum ID is missing.', 'bbpress' ) );
+	}
+
+	/** Unfiltered HTML *******************************************************/
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_reply'] ) && wp_create_nonce( 'bbp-unfiltered-html-reply_' . $topic_id ) == $_POST['_bbp_unfiltered_html_reply'] ) {
+		remove_filter( 'bbp_new_reply_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_new_reply_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Reply Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_reply_title'] ) )
+		$reply_title = esc_attr( strip_tags( $_POST['bbp_reply_title'] ) );
+
+	// Filter and sanitize
+	$reply_title = apply_filters( 'bbp_new_reply_pre_title', $reply_title );
+
+	// No reply title
+	if ( empty( $reply_title ) )
+		bbp_add_error( 'bbp_reply_title', __( '<strong>ERROR</strong>: Your reply needs a title.', 'bbpress' ) );
+
+	/** Reply Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_reply_content'] ) )
+		$reply_content = $_POST['bbp_reply_content'];
+
+	// Filter and sanitize
+	$reply_content = apply_filters( 'bbp_new_reply_pre_content', $reply_content );
+
+	// No reply content
+	if ( empty( $reply_content ) )
+		bbp_add_error( 'bbp_reply_content', __( '<strong>ERROR</strong>: Your reply cannot be empty.', 'bbpress' ) );
+
+	/** Reply Flooding ********************************************************/
+
+	if ( !bbp_check_for_flood( $anonymous_data, $reply_author ) )
+		bbp_add_error( 'bbp_reply_flood', __( '<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress' ) );
+
+	/** Reply Duplicate *******************************************************/
+
+	if ( !bbp_check_for_duplicate( array( 'post_type' => bbp_get_reply_post_type(), 'post_author' => $reply_author, 'post_content' => $reply_content, 'post_parent' => $topic_id, 'anonymous_data' => $anonymous_data ) ) )
+		bbp_add_error( 'bbp_reply_duplicate', __( '<strong>ERROR</strong>: Duplicate reply detected; it looks as though you&#8217;ve already said that!', 'bbpress' ) );
+
+	/** Reply Blacklist *******************************************************/
+
+	if ( !bbp_check_for_blacklist( $anonymous_data, $reply_author, $reply_title, $reply_content ) )
+		bbp_add_error( 'bbp_reply_blacklist', __( '<strong>ERROR</strong>: Your reply cannot be created at this time.', 'bbpress' ) );
+
+	/** Reply Status **********************************************************/
+
+	// Maybe put into moderation
+	if ( !bbp_check_for_moderation( $anonymous_data, $reply_author, $reply_title, $reply_content ) ) {
+		$reply_status = bbp_get_pending_status_id();
+
+	// Default
+	} else {
+		$reply_status = bbp_get_public_status_id();
+	}
+
+	/** Topic Tags ************************************************************/
+
+	// Either replace terms
+	if ( bbp_allow_topic_tags() && current_user_can( 'assign_topic_tags' ) && ! empty( $_POST['bbp_topic_tags'] ) ) {
+		$terms = esc_attr( strip_tags( $_POST['bbp_topic_tags'] ) );
+
+	// ...or remove them.
+	} elseif ( isset( $_POST['bbp_topic_tags'] ) ) {
+		$terms = '';
+
+	// Existing terms
+	} else {
+		$terms = bbp_get_topic_tag_names( $topic_id );
+	}
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_new_reply_pre_extras', $topic_id, $forum_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $reply_data as an array
+	// Just in time manipulation of reply data before being created
+	$reply_data = apply_filters( 'bbp_new_reply_pre_insert', array(
+		'post_author'    => $reply_author,
+		'post_title'     => $reply_title,
+		'post_content'   => $reply_content,
+		'post_status'    => $reply_status,
+		'post_parent'    => $topic_id,
+		'post_type'      => bbp_get_reply_post_type(),
+		'comment_status' => 'closed',
+		'menu_order'     => bbp_get_topic_reply_count( $topic_id, false ) + 1
+	) );
+
+	// Insert reply
+	$reply_id = wp_insert_post( $reply_data );
+
+	/** No Errors *************************************************************/
+
+	// Check for missing reply_id or error
+	if ( !empty( $reply_id ) && !is_wp_error( $reply_id ) ) {
+
+		/** Topic Tags ********************************************************/
+
+		// Just in time manipulation of reply terms before being edited
+		$terms = apply_filters( 'bbp_new_reply_pre_set_terms', $terms, $topic_id, $reply_id );
+
+		// Insert terms
+		$terms = wp_set_post_terms( $topic_id, $terms, bbp_get_topic_tag_tax_id(), false );
+
+		// Term error
+		if ( is_wp_error( $terms ) ) {
+			bbp_add_error( 'bbp_reply_tags', __( '<strong>ERROR</strong>: There was a problem adding the tags to the topic.', 'bbpress' ) );
+		}
+
+		/** Trash Check *******************************************************/
+
+		// If this reply starts as trash, add it to pre_trashed_replies
+		// for the topic, so it is properly restored.
+		if ( bbp_is_topic_trash( $topic_id ) || ( $reply_data['post_status'] == bbp_get_trash_status_id() ) ) {
+
+			// Trash the reply
+			wp_trash_post( $reply_id );
+
+			// Get pre_trashed_replies for topic
+			$pre_trashed_replies = get_post_meta( $topic_id, '_bbp_pre_trashed_replies', true );
+
+			// Add this reply to the end of the existing replies
+			$pre_trashed_replies[] = $reply_id;
+
+			// Update the pre_trashed_reply post meta
+			update_post_meta( $topic_id, '_bbp_pre_trashed_replies', $pre_trashed_replies );
+		}
+
+		/** Spam Check ********************************************************/
+
+		// If reply or topic are spam, officially spam this reply
+		if ( bbp_is_topic_spam( $topic_id ) || ( $reply_data['post_status'] == bbp_get_spam_status_id() ) )
+			add_post_meta( $reply_id, '_bbp_spam_meta_status', bbp_get_public_status_id() );
+
+		/** Update counts, etc... *********************************************/
+
+		do_action( 'bbp_new_reply', $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_new_reply_post_extras', $reply_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// Get the reply URL
+		$reply_url = bbp_get_reply_url( $reply_id, $redirect_to );
+
+		// Allow to be filtered
+		$reply_url = apply_filters( 'bbp_new_reply_redirect_to', $reply_url, $redirect_to, $reply_id );
+
+		/** Successful Save ***************************************************/
+
+		// Redirect back to new reply
+		wp_safe_redirect( $reply_url );
+
+		// For good measure
+		exit();
+
+	/** Errors ****************************************************************/
+
+	} else {
+		$append_error = ( is_wp_error( $reply_id ) && $reply_id->get_error_message() ) ? $reply_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_reply_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your reply:' . $append_error . 'Please try again.', 'bbpress' ) );
+	}
+}
+
+/**
+ * Handles the front end edit reply submission
+ *
+ * @uses bbp_add_error() To add an error message
+ * @uses bbp_get_reply() To get the reply
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses bbp_is_reply_anonymous() To check if the reply was by an anonymous user
+ * @uses current_user_can() To check if the current user can edit that reply
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses esc_attr() For sanitization
+ * @uses apply_filters() Calls 'bbp_edit_reply_pre_title' with the title and
+ *                       reply id
+ * @uses apply_filters() Calls 'bbp_edit_reply_pre_content' with the content
+ *                        reply id
+ * @uses wp_set_post_terms() To set the topic tags
+ * @uses bbp_has_errors() To get the {@link WP_Error} errors
+ * @uses wp_save_post_revision() To save a reply revision
+ * @uses bbp_update_reply_revision_log() To update the reply revision log
+ * @uses wp_update_post() To update the reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses do_action() Calls 'bbp_edit_reply' with the reply id, topic id, forum
+ *                    id, anonymous data, reply author and bool true (for edit)
+ * @uses bbp_get_reply_url() To get the paginated url to the reply
+ * @uses wp_safe_redirect() To redirect to the reply url
+ * @uses bbPress::errors::get_error_message() To get the {@link WP_Error} error
+ *                                             message
+ */
+function bbp_edit_reply_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-edit-reply
+	if ( empty( $_POST['action'] ) || ( 'bbp-edit-reply' !== $_POST['action'] ) )
+		return;
+
+	// Define local variable(s)
+	$revisions_removed = false;
+	$reply = $reply_id = $reply_author = $topic_id = $forum_id = $anonymous_data = 0;
+	$reply_title = $reply_content = $reply_edit_reason = $terms = '';
+
+	/** Reply *****************************************************************/
+
+	// Reply id was not passed
+	if ( empty( $_POST['bbp_reply_id'] ) ) {
+		bbp_add_error( 'bbp_edit_reply_id', __( '<strong>ERROR</strong>: Reply ID not found.', 'bbpress' ) );
+		return;
+
+	// Reply id was passed
+	} elseif ( is_numeric( $_POST['bbp_reply_id'] ) ) {
+		$reply_id = (int) $_POST['bbp_reply_id'];
+		$reply    = bbp_get_reply( $reply_id );
+	}
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-edit-reply_' . $reply_id ) ) {
+		bbp_add_error( 'bbp_edit_reply_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Reply does not exist
+	if ( empty( $reply ) ) {
+		bbp_add_error( 'bbp_edit_reply_not_found', __( '<strong>ERROR</strong>: The reply you want to edit was not found.', 'bbpress' ) );
+		return;
+
+	// Reply exists
+	} else {
+
+		// Check users ability to create new reply
+		if ( ! bbp_is_reply_anonymous( $reply_id ) ) {
+
+			// User cannot edit this reply
+			if ( !current_user_can( 'edit_reply', $reply_id ) ) {
+				bbp_add_error( 'bbp_edit_reply_permissions', __( '<strong>ERROR</strong>: You do not have permission to edit that reply.', 'bbpress' ) );
+				return;
+			}
+
+			// Set reply author
+			$reply_author = bbp_get_reply_author_id( $reply_id );
+
+		// It is an anonymous post
+		} else {
+
+			// Filter anonymous data
+			$anonymous_data = bbp_filter_anonymous_post_data();
+		}
+	}
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_reply'] ) && wp_create_nonce( 'bbp-unfiltered-html-reply_' . $reply_id ) == $_POST['_bbp_unfiltered_html_reply'] ) {
+		remove_filter( 'bbp_edit_reply_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_edit_reply_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Reply Topic ***********************************************************/
+
+	$topic_id = bbp_get_reply_topic_id( $reply_id );
+
+	/** Topic Forum ***********************************************************/
+
+	$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+	// Forum exists
+	if ( !empty( $forum_id ) && ( $forum_id !== bbp_get_reply_forum_id( $reply_id ) ) ) {
+
+		// Forum is a category
+		if ( bbp_is_forum_category( $forum_id ) )
+			bbp_add_error( 'bbp_edit_reply_forum_category', __( '<strong>ERROR</strong>: This forum is a category. No topics or replies can be created in it.', 'bbpress' ) );
+
+		// Forum is closed and user cannot access
+		if ( bbp_is_forum_closed( $forum_id ) && !current_user_can( 'edit_forum', $forum_id ) )
+			bbp_add_error( 'bbp_edit_reply_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new topics and replies.', 'bbpress' ) );
+
+		// Forum is private and user cannot access
+		if ( bbp_is_forum_private( $forum_id ) && !current_user_can( 'read_private_forums' ) )
+			bbp_add_error( 'bbp_edit_reply_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new replies in it.', 'bbpress' ) );
+
+		// Forum is hidden and user cannot access
+		if ( bbp_is_forum_hidden( $forum_id ) && !current_user_can( 'read_hidden_forums' ) )
+			bbp_add_error( 'bbp_edit_reply_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new replies in it.', 'bbpress' ) );
+	}
+
+	/** Reply Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_reply_title'] ) )
+		$reply_title = esc_attr( strip_tags( $_POST['bbp_reply_title'] ) );
+
+	// Filter and sanitize
+	$reply_title = apply_filters( 'bbp_edit_reply_pre_title', $reply_title, $reply_id );
+
+	/** Reply Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_reply_content'] ) )
+		$reply_content = $_POST['bbp_reply_content'];
+
+	// Filter and sanitize
+	$reply_content = apply_filters( 'bbp_edit_reply_pre_content', $reply_content, $reply_id );
+
+	// No reply content
+	if ( empty( $reply_content ) )
+		bbp_add_error( 'bbp_edit_reply_content', __( '<strong>ERROR</strong>: Your reply cannot be empty.', 'bbpress' ) );
+
+	/** Reply Blacklist *******************************************************/
+
+	if ( !bbp_check_for_blacklist( $anonymous_data, $reply_author, $reply_title, $reply_content ) )
+		bbp_add_error( 'bbp_reply_blacklist', __( '<strong>ERROR</strong>: Your reply cannot be edited at this time.', 'bbpress' ) );
+
+	/** Reply Status **********************************************************/
+
+	// Maybe put into moderation
+	if ( !bbp_check_for_moderation( $anonymous_data, $reply_author, $reply_title, $reply_content ) ) {
+
+		// Set post status to pending if public
+		if ( bbp_get_public_status_id() == $reply->post_status ) {
+			$reply_status = bbp_get_pending_status_id();
+		}
+
+	// Use existing post_status
+	} else {
+		$reply_status = $reply->post_status;
+	}
+
+	/** Topic Tags ************************************************************/
+
+	// Either replace terms
+	if ( bbp_allow_topic_tags() && current_user_can( 'assign_topic_tags' ) && ! empty( $_POST['bbp_topic_tags'] ) ) {
+		$terms = esc_attr( strip_tags( $_POST['bbp_topic_tags'] ) );
+
+	// ...or remove them.
+	} elseif ( isset( $_POST['bbp_topic_tags'] ) ) {
+		$terms = '';
+
+	// Existing terms
+	} else {
+		$terms = bbp_get_topic_tag_names( $topic_id );
+	}
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_edit_reply_pre_extras', $reply_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $reply_data as an array
+	// Just in time manipulation of reply data before being edited
+	$reply_data = apply_filters( 'bbp_edit_reply_pre_insert', array(
+		'ID'           => $reply_id,
+		'post_title'   => $reply_title,
+		'post_content' => $reply_content,
+		'post_status'  => $reply_status,
+		'post_parent'  => $topic_id,
+		'post_author'  => $reply_author,
+		'post_type'    => bbp_get_reply_post_type()
+	) );
+
+	// Toggle revisions to avoid duplicates
+	if ( post_type_supports( bbp_get_reply_post_type(), 'revisions' ) ) {
+		$revisions_removed = true;
+		remove_post_type_support( bbp_get_reply_post_type(), 'revisions' );
+	}
+
+	// Insert topic
+	$reply_id = wp_update_post( $reply_data );
+
+	// Toggle revisions back on
+	if ( true === $revisions_removed ) {
+		$revisions_removed = true;
+		add_post_type_support( bbp_get_reply_post_type(), 'revisions' );
+	}
+
+	/** Topic Tags ************************************************************/
+
+	// Just in time manipulation of reply terms before being edited
+	$terms = apply_filters( 'bbp_edit_reply_pre_set_terms', $terms, $topic_id, $reply_id );
+
+	// Insert terms
+	$terms = wp_set_post_terms( $topic_id, $terms, bbp_get_topic_tag_tax_id(), false );
+
+	// Term error
+	if ( is_wp_error( $terms ) ) {
+		bbp_add_error( 'bbp_reply_tags', __( '<strong>ERROR</strong>: There was a problem adding the tags to the topic.', 'bbpress' ) );
+	}
+
+	/** Revisions *************************************************************/
+
+	// Revision Reason
+	if ( !empty( $_POST['bbp_reply_edit_reason'] ) )
+		$reply_edit_reason = esc_attr( strip_tags( $_POST['bbp_reply_edit_reason'] ) );
+
+	// Update revision log
+	if ( !empty( $_POST['bbp_log_reply_edit'] ) && ( 1 == $_POST['bbp_log_reply_edit'] ) ) {
+		$revision_id = wp_is_post_revision( $reply_id );
+		if ( !empty( $revision_id ) ) {
+			bbp_update_reply_revision_log( array(
+				'reply_id'    => $reply_id,
+				'revision_id' => $revision_id,
+				'author_id'   => bbp_get_current_user_id(),
+				'reason'      => $reply_edit_reason
+			) );
+		}
+	}
+
+	/** No Errors *************************************************************/
+
+	if ( !empty( $reply_id ) && !is_wp_error( $reply_id ) ) {
+
+		// Update counts, etc...
+		do_action( 'bbp_edit_reply', $reply_id, $topic_id, $forum_id, $anonymous_data, $reply_author , true /* Is edit */ );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_edit_reply_post_extras', $reply_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// Get the reply URL
+		$reply_url = bbp_get_reply_url( $reply_id, $redirect_to );
+
+		// Allow to be filtered
+		$reply_url = apply_filters( 'bbp_edit_reply_redirect_to', $reply_url, $redirect_to );
+
+		/** Successful Edit ***************************************************/
+
+		// Redirect back to new reply
+		wp_safe_redirect( $reply_url );
+
+		// For good measure
+		exit();
+
+	/** Errors ****************************************************************/
+
+	} else {
+		$append_error = ( is_wp_error( $reply_id ) && $reply_id->get_error_message() ) ? $reply_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_reply_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your reply:' . $append_error . 'Please try again.', 'bbpress' ) );
+	}
+}
+
+/**
+ * Handle all the extra meta stuff from posting a new reply or editing a reply
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param int $topic_id Optional. Topic id
+ * @param int $forum_id Optional. Forum id
+ * @param bool|array $anonymous_data Optional. If it is an array, it is
+ *                    extracted and anonymous user info is saved
+ * @param int $author_id Author id
+ * @param bool $is_edit Optional. Is the post being edited? Defaults to false.
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_current_user_id() To get the current user id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses update_post_meta() To update the reply metas
+ * @uses set_transient() To update the flood check transient for the ip
+ * @uses bbp_update_user_last_posted() To update the users last posted time
+ * @uses bbp_is_subscriptions_active() To check if the subscriptions feature is
+ *                                      activated or not
+ * @uses bbp_is_user_subscribed() To check if the user is subscribed
+ * @uses bbp_remove_user_subscription() To remove the user's subscription
+ * @uses bbp_add_user_subscription() To add the user's subscription
+ * @uses bbp_update_reply_forum_id() To update the reply forum id
+ * @uses bbp_update_reply_topic_id() To update the reply topic id
+ * @uses bbp_update_reply_walker() To update the reply's ancestors' counts
+ */
+function bbp_update_reply( $reply_id = 0, $topic_id = 0, $forum_id = 0, $anonymous_data = false, $author_id = 0, $is_edit = false ) {
+
+	// Validate the ID's passed from 'bbp_new_reply' action
+	$reply_id = bbp_get_reply_id( $reply_id );
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Bail if there is no reply
+	if ( empty( $reply_id ) )
+		return;
+
+	// Check author_id
+	if ( empty( $author_id ) )
+		$author_id = bbp_get_current_user_id();
+
+	// Check topic_id
+	if ( empty( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $reply_id );
+
+	// Check forum_id
+	if ( !empty( $topic_id ) && empty( $forum_id ) )
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+	// If anonymous post, store name, email, website and ip in post_meta.
+	// It expects anonymous_data to be sanitized.
+	// Check bbp_filter_anonymous_post_data() for sanitization.
+	if ( !empty( $anonymous_data ) && is_array( $anonymous_data ) ) {
+
+		// Always set at least these three values to empty
+		$defaults = array(
+			'bbp_anonymous_name'    => '',
+			'bbp_anonymous_email'   => '',
+			'bbp_anonymous_website' => '',
+		);
+		$r = bbp_parse_args( $anonymous_data, $defaults, 'update_reply' );
+
+		// Update all anonymous metas
+		foreach( $r as $anon_key => $anon_value ) {
+			update_post_meta( $reply_id, '_' . $anon_key, (string) $anon_value, false );
+		}
+
+		// Set transient for throttle check (only on new, not edit)
+		if ( empty( $is_edit ) ) {
+			set_transient( '_bbp_' . bbp_current_author_ip() . '_last_posted', time() );
+		}
+
+	} else {
+		if ( empty( $is_edit ) && !current_user_can( 'throttle' ) ) {
+			bbp_update_user_last_posted( $author_id );
+		}
+	}
+
+	// Handle Subscription Checkbox
+	if ( bbp_is_subscriptions_active() && !empty( $author_id ) && !empty( $topic_id ) ) {
+		$subscribed = bbp_is_user_subscribed( $author_id, $topic_id );
+		$subscheck  = ( !empty( $_POST['bbp_topic_subscription'] ) && ( 'bbp_subscribe' == $_POST['bbp_topic_subscription'] ) ) ? true : false;
+
+		// Subscribed and unsubscribing
+		if ( true == $subscribed && false == $subscheck ) {
+			bbp_remove_user_subscription( $author_id, $topic_id );
+
+		// Subscribing
+		} elseif ( false == $subscribed && true == $subscheck ) {
+			bbp_add_user_subscription( $author_id, $topic_id );
+		}
+	}
+
+	// Reply meta relating to reply position in tree
+	bbp_update_reply_forum_id( $reply_id, $forum_id );
+	bbp_update_reply_topic_id( $reply_id, $topic_id );
+
+	// Update associated topic values if this is a new reply
+	if ( empty( $is_edit ) ) {
+
+		// Update poster IP if not editing
+		update_post_meta( $reply_id, '_bbp_author_ip', bbp_current_author_ip(), false );
+
+		// Last active time
+		$last_active_time = current_time( 'mysql' );
+
+		// Walk up ancestors and do the dirty work
+		bbp_update_reply_walker( $reply_id, $last_active_time, $forum_id, $topic_id, false );
+	}
+}
+
+/**
+ * Walk up the ancestor tree from the current reply, and update all the counts
+ *
+ * @since bbPress (r2884)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param string $last_active_time Optional. Last active time
+ * @param int $forum_id Optional. Forum id
+ * @param int $topic_id Optional. Topic id
+ * @param bool $refresh If set to true, unsets all the previous parameters.
+ *                       Defaults to true
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_reply_forum_id() To get the reply forum id
+ * @uses get_post_ancestors() To get the ancestors of the reply
+ * @uses bbp_is_reply() To check if the ancestor is a reply
+ * @uses bbp_is_topic() To check if the ancestor is a topic
+ * @uses bbp_update_topic_last_reply_id() To update the topic last reply id
+ * @uses bbp_update_topic_last_active_id() To update the topic last active id
+ * @uses bbp_get_topic_last_active_id() To get the topic last active id
+ * @uses get_post_field() To get the post date of the last active id
+ * @uses bbp_update_topic_last_active_time() To update the last active topic meta
+ * @uses bbp_update_topic_voice_count() To update the topic voice count
+ * @uses bbp_update_topic_reply_count() To update the topic reply count
+ * @uses bbp_update_topic_reply_count_hidden() To update the topic hidden reply
+ *                                              count
+ * @uses bbp_is_forum() To check if the ancestor is a forum
+ * @uses bbp_update_forum_last_topic_id() To update the last topic id forum meta
+ * @uses bbp_update_forum_last_reply_id() To update the last reply id forum meta
+ * @uses bbp_update_forum_last_active_id() To update the forum last active id
+ * @uses bbp_get_forum_last_active_id() To get the forum last active id
+ * @uses bbp_update_forum_last_active_time() To update the forum last active time
+ * @uses bbp_update_forum_reply_count() To update the forum reply count
+ */
+function bbp_update_reply_walker( $reply_id, $last_active_time = '', $forum_id = 0, $topic_id = 0, $refresh = true ) {
+
+	// Verify the reply ID
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	// Reply was passed
+	if ( !empty( $reply_id ) ) {
+
+		// Get the topic ID if none was passed
+		if ( empty( $topic_id ) ) {
+			$topic_id = bbp_get_reply_topic_id( $reply_id );
+		}
+
+		// Get the forum ID if none was passed
+		if ( empty( $forum_id ) ) {
+			$forum_id = bbp_get_reply_forum_id( $reply_id );
+		}
+	}
+
+	// Set the active_id based on topic_id/reply_id
+	$active_id = empty( $reply_id ) ? $topic_id : $reply_id;
+
+	// Setup ancestors array to walk up
+	$ancestors = array_values( array_unique( array_merge( array( $topic_id, $forum_id ), (array) get_post_ancestors( $topic_id ) ) ) );
+
+	// If we want a full refresh, unset any of the possibly passed variables
+	if ( true == $refresh )
+		$forum_id = $topic_id = $reply_id = $active_id = $last_active_time = 0;
+
+	// Walk up ancestors
+	if ( !empty( $ancestors ) ) {
+		foreach ( $ancestors as $ancestor ) {
+
+			// Reply meta relating to most recent reply
+			if ( bbp_is_reply( $ancestor ) ) {
+				// @todo - hierarchical replies
+
+			// Topic meta relating to most recent reply
+			} elseif ( bbp_is_topic( $ancestor ) ) {
+
+				// Last reply and active ID's
+				bbp_update_topic_last_reply_id ( $ancestor, $reply_id  );
+				bbp_update_topic_last_active_id( $ancestor, $active_id );
+
+				// Get the last active time if none was passed
+				$topic_last_active_time = $last_active_time;
+				if ( empty( $last_active_time ) ) {
+					$topic_last_active_time = get_post_field( 'post_date', bbp_get_topic_last_active_id( $ancestor ) );
+				}
+
+				// Only update if reply is published
+				if ( bbp_is_reply_published( $reply_id ) ) {
+					bbp_update_topic_last_active_time( $ancestor, $topic_last_active_time );
+				}
+
+				// Counts
+				bbp_update_topic_voice_count       ( $ancestor );
+				bbp_update_topic_reply_count       ( $ancestor );
+				bbp_update_topic_reply_count_hidden( $ancestor );
+
+			// Forum meta relating to most recent topic
+			} elseif ( bbp_is_forum( $ancestor ) ) {
+
+				// Last topic and reply ID's
+				bbp_update_forum_last_topic_id( $ancestor, $topic_id );
+				bbp_update_forum_last_reply_id( $ancestor, $reply_id );
+
+				// Last Active
+				bbp_update_forum_last_active_id( $ancestor, $active_id );
+
+				// Get the last active time if none was passed
+				$forum_last_active_time = $last_active_time;
+				if ( empty( $last_active_time ) ) {
+					$forum_last_active_time = get_post_field( 'post_date', bbp_get_forum_last_active_id( $ancestor ) );
+				}
+
+				// Only update if reply is published
+				if ( bbp_is_reply_published( $reply_id ) ) {
+					bbp_update_forum_last_active_time( $ancestor, $forum_last_active_time );
+				}
+
+				// Counts
+				bbp_update_forum_reply_count( $ancestor );
+			}
+		}
+	}
+}
+
+/** Reply Updaters ************************************************************/
+
+/**
+ * Update the reply with its forum id it is in
+ *
+ * @since bbPress (r2855)
+ *
+ * @param int $reply_id Optional. Reply id to update
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses get_post_ancestors() To get the reply's forum
+ * @uses get_post_field() To get the post type of the post
+ * @uses update_post_meta() To update the reply forum id meta
+ * @uses apply_filters() Calls 'bbp_update_reply_forum_id' with the forum id
+ *                        and reply id
+ * @return bool Reply's forum id
+ */
+function bbp_update_reply_forum_id( $reply_id = 0, $forum_id = 0 ) {
+
+	// Validation
+	$reply_id = bbp_get_reply_id( $reply_id );
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// If no forum_id was passed, walk up ancestors and look for forum type
+	if ( empty( $forum_id ) ) {
+
+		// Get ancestors
+		$ancestors = (array) get_post_ancestors( $reply_id );
+
+		// Loop through ancestors
+		if ( !empty( $ancestors ) ) {
+			foreach ( $ancestors as $ancestor ) {
+
+				// Get first parent that is a forum
+				if ( get_post_field( 'post_type', $ancestor ) == bbp_get_forum_post_type() ) {
+					$forum_id = $ancestor;
+
+					// Found a forum, so exit the loop and continue
+					continue;
+				}
+			}
+		}
+	}
+
+	// Update the forum ID
+	bbp_update_forum_id( $reply_id, $forum_id );
+
+	return apply_filters( 'bbp_update_reply_forum_id', (int) $forum_id, $reply_id );
+}
+
+/**
+ * Update the reply with its topic id it is in
+ *
+ * @since bbPress (r2855)
+ *
+ * @param int $reply_id Optional. Reply id to update
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses get_post_ancestors() To get the reply's topic
+ * @uses get_post_field() To get the post type of the post
+ * @uses update_post_meta() To update the reply topic id meta
+ * @uses apply_filters() Calls 'bbp_update_reply_topic_id' with the topic id
+ *                        and reply id
+ * @return bool Reply's topic id
+ */
+function bbp_update_reply_topic_id( $reply_id = 0, $topic_id = 0 ) {
+
+	// Validation
+	$reply_id = bbp_get_reply_id( $reply_id );
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	// If no topic_id was passed, walk up ancestors and look for topic type
+	if ( empty( $topic_id ) ) {
+
+		// Get ancestors
+		$ancestors = (array) get_post_ancestors( $reply_id );
+
+		// Loop through ancestors
+		if ( !empty( $ancestors ) ) {
+			foreach ( $ancestors as $ancestor ) {
+
+				// Get first parent that is a forum
+				if ( get_post_field( 'post_type', $ancestor ) == bbp_get_topic_post_type() ) {
+					$topic_id = $ancestor;
+
+					// Found a forum, so exit the loop and continue
+					continue;
+				}
+			}
+		}
+	}
+
+	// Update the topic ID
+	bbp_update_topic_id( $reply_id, $topic_id );
+
+	return apply_filters( 'bbp_update_reply_topic_id', (int) $topic_id, $reply_id );
+}
+
+/**
+ * Update the revision log of the reply
+ *
+ * @since bbPress (r2782)
+ *
+ * @param mixed $args Supports these args:
+ *  - reply_id: reply id
+ *  - author_id: Author id
+ *  - reason: Reason for editing
+ *  - revision_id: Revision id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_format_revision_reason() To format the reason
+ * @uses bbp_get_reply_raw_revision_log() To get the raw reply revision log
+ * @uses update_post_meta() To update the reply revision log meta
+ * @return mixed False on failure, true on success
+ */
+function bbp_update_reply_revision_log( $args = '' ) {
+	$defaults = array (
+		'reason'      => '',
+		'reply_id'    => 0,
+		'author_id'   => 0,
+		'revision_id' => 0
+	);
+
+	$r = bbp_parse_args( $args, $defaults, 'update_reply_revision_log' );
+	extract( $r );
+
+	// Populate the variables
+	$reason      = bbp_format_revision_reason( $reason );
+	$reply_id    = bbp_get_reply_id( $reply_id );
+	$author_id   = bbp_get_user_id ( $author_id, false, true );
+	$revision_id = (int) $revision_id;
+
+	// Get the logs and append the new one to those
+	$revision_log               = bbp_get_reply_raw_revision_log( $reply_id );
+	$revision_log[$revision_id] = array( 'author' => $author_id, 'reason' => $reason );
+
+	// Finally, update
+	update_post_meta( $reply_id, '_bbp_revision_log', $revision_log );
+
+	return apply_filters( 'bbp_update_reply_revision_log', $revision_log, $reply_id );
+}
+
+/** Reply Actions *************************************************************/
+
+/**
+ * Handles the front end spamming/unspamming and trashing/untrashing/deleting of
+ * replies
+ *
+ * @since bbPress (r2740)
+ *
+ * @uses bbp_get_reply() To get the reply
+ * @uses current_user_can() To check if the user is capable of editing or
+ *                           deleting the reply
+ * @uses check_ajax_referer() To verify the nonce and check the referer
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_is_reply_spam() To check if the reply is marked as spam
+ * @uses bbp_spam_reply() To make the reply as spam
+ * @uses bbp_unspam_reply() To unmark the reply as spam
+ * @uses wp_trash_post() To trash the reply
+ * @uses wp_untrash_post() To untrash the reply
+ * @uses wp_delete_post() To delete the reply
+ * @uses do_action() Calls 'bbp_toggle_reply_handler' with success, post data
+ *                    and action
+ * @uses bbp_get_reply_url() To get the reply url
+ * @uses add_query_arg() To add custom args to the reply url
+ * @uses wp_safe_redirect() To redirect to the reply
+ * @uses bbPress::errors:add() To log the error messages
+ */
+function bbp_toggle_reply_handler() {
+
+	// Bail if not a GET action
+	if ( 'GET' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if required GET actions aren't passed
+	if ( empty( $_GET['reply_id'] ) || empty( $_GET['action'] ) )
+		return;
+
+	// Setup possible get actions
+	$possible_actions = array(
+		'bbp_toggle_reply_spam',
+		'bbp_toggle_reply_trash'
+	);
+
+	// Bail if actions aren't meant for this function
+	if ( !in_array( $_GET['action'], $possible_actions ) )
+		return;
+
+	$failure   = '';                         // Empty failure string
+	$view_all  = false;                      // Assume not viewing all
+	$action    = $_GET['action'];            // What action is taking place?
+	$reply_id  = (int) $_GET['reply_id'];    // What's the reply id?
+	$success   = false;                      // Flag
+	$post_data = array( 'ID' => $reply_id ); // Prelim array
+
+	// Make sure reply exists
+	$reply = bbp_get_reply( $reply_id );
+	if ( empty( $reply ) )
+		return;
+
+	// What is the user doing here?
+	if ( !current_user_can( 'edit_reply', $reply->ID ) || ( 'bbp_toggle_reply_trash' == $action && !current_user_can( 'delete_reply', $reply->ID ) ) ) {
+		bbp_add_error( 'bbp_toggle_reply_permission', __( '<strong>ERROR:</strong> You do not have the permission to do that!', 'bbpress' ) );
+		return;
+	}
+
+	// What action are we trying to perform?
+	switch ( $action ) {
+
+		// Toggle spam
+		case 'bbp_toggle_reply_spam' :
+			check_ajax_referer( 'spam-reply_' . $reply_id );
+
+			$is_spam  = bbp_is_reply_spam( $reply_id );
+			$success  = $is_spam ? bbp_unspam_reply( $reply_id ) : bbp_spam_reply( $reply_id );
+			$failure  = $is_spam ? __( '<strong>ERROR</strong>: There was a problem unmarking the reply as spam!', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem marking the reply as spam!', 'bbpress' );
+			$view_all = !$is_spam;
+
+			break;
+
+		// Toggle trash
+		case 'bbp_toggle_reply_trash' :
+
+			$sub_action = in_array( $_GET['sub_action'], array( 'trash', 'untrash', 'delete' ) ) ? $_GET['sub_action'] : false;
+
+			if ( empty( $sub_action ) )
+				break;
+
+			switch ( $sub_action ) {
+				case 'trash':
+					check_ajax_referer( 'trash-' . bbp_get_reply_post_type() . '_' . $reply_id );
+
+					$view_all = true;
+					$success  = wp_trash_post( $reply_id );
+					$failure  = __( '<strong>ERROR</strong>: There was a problem trashing the reply!', 'bbpress' );
+
+					break;
+
+				case 'untrash':
+					check_ajax_referer( 'untrash-' . bbp_get_reply_post_type() . '_' . $reply_id );
+
+					$success = wp_untrash_post( $reply_id );
+					$failure = __( '<strong>ERROR</strong>: There was a problem untrashing the reply!', 'bbpress' );
+
+					break;
+
+				case 'delete':
+					check_ajax_referer( 'delete-' . bbp_get_reply_post_type() . '_' . $reply_id );
+
+					$success = wp_delete_post( $reply_id );
+					$failure = __( '<strong>ERROR</strong>: There was a problem deleting the reply!', 'bbpress' );
+
+					break;
+			}
+
+			break;
+	}
+
+	// Do additional reply toggle actions
+	do_action( 'bbp_toggle_reply_handler', $success, $post_data, $action );
+
+	// No errors
+	if ( ( false != $success ) && !is_wp_error( $success ) ) {
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// Get the reply URL
+		$reply_url = bbp_get_reply_url( $reply_id, $redirect_to );
+
+		// Add view all if needed
+		if ( !empty( $view_all ) )
+			$reply_url = bbp_add_view_all( $reply_url, true );
+
+		// Redirect back to reply
+		wp_safe_redirect( $reply_url );
+
+		// For good measure
+		exit();
+
+	// Handle errors
+	} else {
+		bbp_add_error( 'bbp_toggle_reply', $failure );
+	}
+}
+
+/** Reply Actions *************************************************************/
+
+/**
+ * Marks a reply as spam
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $reply_id Reply id
+ * @uses get_post() To get the reply
+ * @uses do_action() Calls 'bbp_spam_reply' with the reply ID
+ * @uses add_post_meta() To add the previous status to a meta
+ * @uses wp_insert_post() To insert the updated post
+ * @uses do_action() Calls 'bbp_spammed_reply' with the reply ID
+ * @return mixed False or {@link WP_Error} on failure, reply id on success
+ */
+function bbp_spam_reply( $reply_id = 0 ) {
+
+	// Get reply
+	$reply = get_post( $reply_id, ARRAY_A );
+	if ( empty( $reply ) )
+		return $reply;
+
+	// Bail if already spam
+	if ( bbp_get_spam_status_id() == $reply['post_status'] )
+		return false;
+
+	// Execute pre spam code
+	do_action( 'bbp_spam_reply', $reply_id );
+
+	// Add the original post status as post meta for future restoration
+	add_post_meta( $reply_id, '_bbp_spam_meta_status', $reply['post_status'] );
+
+	// Set post status to spam
+	$reply['post_status'] = bbp_get_spam_status_id();
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Update the reply
+	$reply_id = wp_insert_post( $reply );
+
+	// Execute post spam code
+	do_action( 'bbp_spammed_reply', $reply_id );
+
+	// Return reply_id
+	return $reply_id;
+}
+
+/**
+ * Unspams a reply
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $reply_id Reply id
+ * @uses get_post() To get the reply
+ * @uses do_action() Calls 'bbp_unspam_reply' with the reply ID
+ * @uses get_post_meta() To get the previous status meta
+ * @uses delete_post_meta() To delete the previous status meta
+ * @uses wp_insert_post() To insert the updated post
+ * @uses do_action() Calls 'bbp_unspammed_reply' with the reply ID
+ * @return mixed False or {@link WP_Error} on failure, reply id on success
+ */
+function bbp_unspam_reply( $reply_id = 0 ) {
+
+	// Get reply
+	$reply = get_post( $reply_id, ARRAY_A );
+	if ( empty( $reply ) )
+		return $reply;
+
+	// Bail if already not spam
+	if ( bbp_get_spam_status_id() != $reply['post_status'] )
+		return false;
+
+	// Execute pre unspam code
+	do_action( 'bbp_unspam_reply', $reply_id );
+
+	// Get pre spam status
+	$reply['post_status'] = get_post_meta( $reply_id, '_bbp_spam_meta_status', true );
+
+	// Delete pre spam meta
+	delete_post_meta( $reply_id, '_bbp_spam_meta_status' );
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Update the reply
+	$reply_id = wp_insert_post( $reply );
+
+	// Execute post unspam code
+	do_action( 'bbp_unspammed_reply', $reply_id );
+
+	// Return reply_id
+	return $reply_id;
+}
+
+/** Before Delete/Trash/Untrash ***********************************************/
+
+/**
+ * Called before deleting a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_delete_reply' with the reply id
+ */
+function bbp_delete_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_delete_reply', $reply_id );
+}
+
+/**
+ * Called before trashing a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_trash_reply' with the reply id
+ */
+function bbp_trash_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_trash_reply', $reply_id );
+}
+
+/**
+ * Called before untrashing (restoring) a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_unstrash_reply' with the reply id
+ */
+function bbp_untrash_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_untrash_reply', $reply_id );
+}
+
+/** After Delete/Trash/Untrash ************************************************/
+
+/**
+ * Called after deleting a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_deleted_reply' with the reply id
+ */
+function bbp_deleted_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_deleted_reply', $reply_id );
+}
+
+/**
+ * Called after trashing a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_trashed_reply' with the reply id
+ */
+function bbp_trashed_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_trashed_reply', $reply_id );
+}
+
+/**
+ * Called after untrashing (restoring) a reply
+ *
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_is_reply() To check if the passed id is a reply
+ * @uses do_action() Calls 'bbp_untrashed_reply' with the reply id
+ */
+function bbp_untrashed_reply( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		return false;
+
+	do_action( 'bbp_untrashed_reply', $reply_id );
+}
+
+/** Settings ******************************************************************/
+
+/**
+ * Return the replies per page setting
+ *
+ * @since bbPress (r3540)
+ *
+ * @param int $default Default replies per page (15)
+ * @uses get_option() To get the setting
+ * @uses apply_filters() To allow the return value to be manipulated
+ * @return int
+ */
+function bbp_get_replies_per_page( $default = 15 ) {
+
+	// Get database option and cast as integer
+	$retval = get_option( '_bbp_replies_per_page', $default );
+
+	// If return val is empty, set it to default
+	if ( empty( $retval ) )
+		$retval = $default;
+
+	// Filter and return
+	return (int) apply_filters( 'bbp_get_replies_per_page', $retval, $default );
+}
+
+/**
+ * Return the replies per RSS page setting
+ *
+ * @since bbPress (r3540)
+ *
+ * @param int $default Default replies per page (25)
+ * @uses get_option() To get the setting
+ * @uses apply_filters() To allow the return value to be manipulated
+ * @return int
+ */
+function bbp_get_replies_per_rss_page( $default = 25 ) {
+
+	// Get database option and cast as integer
+	$retval = get_option( '_bbp_replies_per_rss_page', $default );
+
+	// If return val is empty, set it to default
+	if ( empty( $retval ) )
+		$retval = $default;
+
+	// Filter and return
+	return (int) apply_filters( 'bbp_get_replies_per_rss_page', $retval, $default );
+}
+
+/** Autoembed *****************************************************************/
+
+/**
+ * Check if autoembeds are enabled and hook them in if so
+ *
+ * @since bbPress (r3752)
+ * @global WP_Embed $wp_embed
+ */
+function bbp_reply_content_autoembed() {
+	global $wp_embed;
+
+	if ( bbp_use_autoembed() && is_a( $wp_embed, 'WP_Embed' ) ) {
+		add_filter( 'bbp_get_reply_content', array( $wp_embed, 'autoembed' ), 8 );
+	}
+}
+
+/** Filters *******************************************************************/
+
+/**
+ * Used by bbp_has_replies() to add the topic to the posts
+ *
+ * This function filters the 'post_where' of the WP_Query, and changes the query
+ * to include both the topic AND its children in the same loop.
+ *
+ * @since bbPress (r4058)
+ *
+ * @param string $where
+ * @return string
+ */
+function _bbp_has_replies_where( $where, $query ) {
+
+	// Bail if no post_parent to replace
+	if ( ! is_numeric( $query->get( 'post_parent' ) ) )
+		return $where;
+
+	// Bail if not a topic and reply query
+	if ( array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ) != $query->get( 'post_type' ) )
+		return $where;
+
+	// Bail if meta query
+	if ( $query->get( 'meta_key' ) || $query->get( 'meta_query' ) )
+		return $where;
+
+	global $wpdb;
+
+	// Table name for posts
+	$table_name = $wpdb->prefix . 'posts';
+
+	// Get the topic ID
+	$topic_id   = bbp_get_topic_id();
+
+	// The text we're searching for
+	$search     = "WHERE 1=1  AND {$table_name}.post_parent = {$topic_id}";
+
+	// The text to replace it with
+	$replace    = "FORCE INDEX (PRIMARY, post_parent) WHERE 1=1 AND ({$table_name}.ID = {$topic_id} OR {$table_name}.post_parent = {$topic_id})";
+
+	// Try to replace the search text with the replacement
+	if ( $new_where = str_replace( $search, $replace, $where ) )
+		$where = $new_where;
+
+	return $where;
+}
+
+/** Feeds *********************************************************************/
+
+/**
+ * Output an RSS2 feed of replies, based on the query passed.
+ *
+ * @since bbPress (r3171)
+ *
+ * @uses bbp_version()
+ * @uses bbp_is_single_topic()
+ * @uses bbp_user_can_view_forum()
+ * @uses bbp_get_topic_forum_id()
+ * @uses bbp_show_load_topic()
+ * @uses bbp_topic_permalink()
+ * @uses bbp_topic_title()
+ * @uses bbp_get_topic_reply_count()
+ * @uses bbp_topic_content()
+ * @uses bbp_has_replies()
+ * @uses bbp_replies()
+ * @uses bbp_the_reply()
+ * @uses bbp_reply_url()
+ * @uses bbp_reply_title()
+ * @uses bbp_reply_content()
+ * @uses get_wp_title_rss()
+ * @uses get_option()
+ * @uses bloginfo_rss
+ * @uses self_link()
+ * @uses the_author()
+ * @uses get_post_time()
+ * @uses rss_enclosure()
+ * @uses do_action()
+ * @uses apply_filters()
+ *
+ * @param array $replies_query
+ */
+function bbp_display_replies_feed_rss2( $replies_query = array() ) {
+
+	// User cannot access forum this topic is in
+	if ( bbp_is_single_topic() && !bbp_user_can_view_forum( array( 'forum_id' => bbp_get_topic_forum_id() ) ) )
+		return;
+
+	// Adjust the title based on context
+	if ( bbp_is_single_topic() && bbp_user_can_view_forum( array( 'forum_id' => bbp_get_topic_forum_id() ) ) )
+		$title = apply_filters( 'wp_title_rss', get_wp_title_rss( ' &#187; ' ) );
+	elseif ( !bbp_show_lead_topic() )
+		$title = ' &#187; ' .  __( 'All Posts',   'bbpress' );
+	else
+		$title = ' &#187; ' .  __( 'All Replies', 'bbpress' );
+
+	// Display the feed
+	header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
+	header( 'Status: 200 OK' );
+	echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?>
+
+	<rss version="2.0"
+		xmlns:content="http://purl.org/rss/1.0/modules/content/"
+		xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+		xmlns:dc="http://purl.org/dc/elements/1.1/"
+		xmlns:atom="http://www.w3.org/2005/Atom"
+
+		<?php do_action( 'bbp_feed' ); ?>
+	>
+
+	<channel>
+		<title><?php bloginfo_rss('name'); echo $title; ?></title>
+		<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
+		<link><?php self_link(); ?></link>
+		<description><?php //?></description>
+		<pubDate><?php echo mysql2date( 'D, d M Y H:i:s O', current_time( 'mysql' ), false ); ?></pubDate>
+		<generator>http://bbpress.org/?v=<?php bbp_version(); ?></generator>
+		<language><?php echo get_option( 'rss_language' ); ?></language>
+
+		<?php do_action( 'bbp_feed_head' ); ?>
+
+		<?php if ( bbp_is_single_topic() ) : ?>
+			<?php if ( bbp_user_can_view_forum( array( 'forum_id' => bbp_get_topic_forum_id() ) ) ) : ?>
+				<?php if ( bbp_show_lead_topic() ) : ?>
+
+					<item>
+						<guid><?php bbp_topic_permalink(); ?></guid>
+						<title><![CDATA[<?php bbp_topic_title(); ?>]]></title>
+						<link><?php bbp_topic_permalink(); ?></link>
+						<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate>
+						<dc:creator><?php the_author(); ?></dc:creator>
+
+						<description>
+							<![CDATA[
+							<p><?php printf( __( 'Replies: %s', 'bbpress' ), bbp_get_topic_reply_count() ); ?></p>
+							<?php bbp_topic_content(); ?>
+							]]>
+						</description>
+
+						<?php rss_enclosure(); ?>
+
+						<?php do_action( 'bbp_feed_item' ); ?>
+
+					</item>
+
+				<?php endif; ?>
+			<?php endif; ?>
+		<?php endif; ?>
+
+		<?php if ( bbp_has_replies( $replies_query ) ) : ?>
+			<?php while ( bbp_replies() ) : bbp_the_reply(); ?>
+
+				<item>
+					<guid><?php bbp_reply_url(); ?></guid>
+					<title><![CDATA[<?php bbp_reply_title(); ?>]]></title>
+					<link><?php bbp_reply_url(); ?></link>
+					<pubDate><?php echo mysql2date( 'D, d M Y H:i:s +0000', get_post_time( 'Y-m-d H:i:s', true ), false ); ?></pubDate>
+					<dc:creator><?php the_author() ?></dc:creator>
+
+					<description>
+						<![CDATA[
+						<?php bbp_reply_content(); ?>
+						]]>
+					</description>
+
+					<?php rss_enclosure(); ?>
+
+					<?php do_action( 'bbp_feed_item' ); ?>
+
+				</item>
+
+			<?php endwhile; ?>
+		<?php endif; ?>
+
+		<?php do_action( 'bbp_feed_footer' ); ?>
+
+	</channel>
+	</rss>
+
+<?php
+
+	// We're done here
+	exit();
+}
+
+/** Permissions ***************************************************************/
+
+/**
+ * Redirect if unathorized user is attempting to edit a reply
+ *
+ * @since bbPress (r3605)
+ *
+ * @uses bbp_is_reply_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_id()
+ * @uses wp_safe_redirect()
+ * @uses bbp_get_topic_permalink()
+ */
+function bbp_check_reply_edit() {
+
+	// Bail if not editing a topic
+	if ( !bbp_is_reply_edit() )
+		return;
+
+	// User cannot edit topic, so redirect back to reply
+	if ( !current_user_can( 'edit_reply', bbp_get_reply_id() ) ) {
+		wp_safe_redirect( bbp_get_reply_url() );
+		exit();
+	}
+}
+
+/** Reply Position ************************************************************/
+
+/**
+ * Update the position of the reply.
+ *
+ * The reply position is stored in the menu_order column of the posts table.
+ * This is done to prevent using a meta_query to retrieve posts in the proper
+ * freshness order. By updating the menu_order accordingly, we're able to
+ * leverage core WordPress query ordering much more effectively.
+ *
+ * @since bbPress (r3933)
+ *
+ * @global type $wpdb
+ * @param type $reply_id
+ * @param type $reply_position
+ * @return mixed
+ */
+function bbp_update_reply_position( $reply_id = 0, $reply_position = 0 ) {
+
+	// Bail if reply_id is empty
+	$reply_id = bbp_get_reply_id( $reply_id );
+	if ( empty( $reply_id ) )
+		return false;
+
+	// If no position was passed, get it from the db and update the menu_order
+	if ( empty( $reply_position ) ) {
+		$reply_position = bbp_get_reply_position_raw( $reply_id, bbp_get_reply_topic_id( $reply_id ) );
+	}
+
+	// Update the replies' 'menp_order' with the reply position
+	global $wpdb;
+	$wpdb->update( $wpdb->posts, array( 'menu_order' => $reply_position ), array( 'ID' => $reply_id ) );
+
+	return (int) $reply_position;
+}
+
+/**
+ * Get the position of a reply by querying the DB directly for the replies
+ * of a given topic.
+ *
+ * @since bbPress (r3933)
+ *
+ * @param int $reply_id
+ * @param int $topic_id
+ */
+function bbp_get_reply_position_raw( $reply_id = 0, $topic_id = 0 ) {
+
+	// Get required data
+	$reply_id       = bbp_get_reply_id( $reply_id );
+	$topic_id       = !empty( $topic_id ) ? bbp_get_topic_id( $topic_id ) : bbp_get_reply_topic_id( $reply_id );
+	$reply_position = 0;
+
+	// If reply is actually the first post in a topic, return 0
+	if ( $reply_id != $topic_id ) {
+
+		// Make sure the topic has replies before running another query
+		$reply_count = bbp_get_topic_reply_count( $topic_id, false );
+		if ( !empty( $reply_count ) ) {
+
+			// Get reply id's
+			$topic_replies = bbp_get_all_child_ids( $topic_id, bbp_get_reply_post_type() );
+			if ( !empty( $topic_replies ) ) {
+
+				// Reverse replies array and search for current reply position
+				$topic_replies  = array_reverse( $topic_replies );
+				$reply_position = array_search( (string) $reply_id, $topic_replies );
+
+				// Bump the position to compensate for the lead topic post
+				$reply_position++;
+			}
+		}
+	}
+
+	return (int) $reply_position;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/replies/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/replies/template-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2043 @@
+<?php
+
+/**
+ * bbPress Reply Template Tags
+ *
+ * @package bbPress
+ * @subpackage TemplateTags
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Post Type *****************************************************************/
+
+/**
+ * Return the unique id of the custom post type for replies
+ *
+ * @since bbPress (r2857)
+ *
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ */
+function bbp_reply_post_type() {
+	echo bbp_get_reply_post_type();
+}
+	/**
+	 * Return the unique id of the custom post type for replies
+	 *
+	 * @since bbPress (r2857)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_forum_post_type' with the forum
+	 *                        post type id
+	 * @return string The unique reply post type id
+	 */
+	function bbp_get_reply_post_type() {
+		return apply_filters( 'bbp_get_reply_post_type', bbpress()->reply_post_type );
+	}
+
+/** Reply Loop Functions ******************************************************/
+
+/**
+ * The main reply loop. WordPress makes this easy for us
+ *
+ * @since bbPress (r2553)
+ *
+ * @param mixed $args All the arguments supported by {@link WP_Query}
+ * @uses bbp_show_lead_topic() Are we showing the topic as a lead?
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses bbp_is_query_name() To check if we are getting replies for a widget
+ * @uses get_option() To get the replies per page option
+ * @uses bbp_get_paged() To get the current page value
+ * @uses current_user_can() To check if the current user is capable of editing
+ *                           others' replies
+ * @uses WP_Query To make query and get the replies
+ * @uses WP_Rewrite::using_permalinks() To check if the blog is using permalinks
+ * @uses get_permalink() To get the permalink
+ * @uses add_query_arg() To add custom args to the url
+ * @uses apply_filters() Calls 'bbp_replies_pagination' with the pagination args
+ * @uses paginate_links() To paginate the links
+ * @uses apply_filters() Calls 'bbp_has_replies' with
+ *                        bbPres::reply_query::have_posts()
+ *                        and bbPres::reply_query
+ * @return object Multidimensional array of reply information
+ */
+function bbp_has_replies( $args = '' ) {
+	global $wp_rewrite;
+
+	// What are the default allowed statuses (based on user caps)
+	if ( bbp_get_view_all( 'edit_others_replies' ) ) {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id(), bbp_get_spam_status_id(), bbp_get_trash_status_id() );
+	} else {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id() );
+	}
+
+	$default_reply_search = !empty( $_REQUEST['rs'] ) ? $_REQUEST['rs'] : false;
+	$default_post_parent  = ( bbp_is_single_topic() ) ? bbp_get_topic_id() : 'any';
+	$default_post_type    = ( bbp_is_single_topic() && bbp_show_lead_topic() ) ? bbp_get_reply_post_type() : array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$default_post_status  = join( ',', $post_statuses );
+
+	// Default query args
+	$default = array(
+		'post_type'      => $default_post_type,         // Only replies
+		'post_parent'    => $default_post_parent,       // Of this topic
+		'post_status'    => $default_post_status,       // Of this status
+		'posts_per_page' => bbp_get_replies_per_page(), // This many
+		'paged'          => bbp_get_paged(),            // On this page
+		'orderby'        => 'date',                     // Sorted by date
+		'order'          => 'ASC',                      // Oldest to newest
+		's'              => $default_reply_search,      // Maybe search
+	);
+
+	// Set up topic variables
+	$bbp_r = bbp_parse_args( $args, $default, 'has_replies' );
+
+	// Extract the query variables
+	extract( $bbp_r );
+
+	// Get bbPress
+	$bbp = bbpress();
+
+	// Call the query
+	$bbp->reply_query = new WP_Query( $bbp_r );
+	
+	// Add pagination values to query object
+	$bbp->reply_query->posts_per_page = $posts_per_page;
+	$bbp->reply_query->paged          = $paged;
+
+	// Never home, regardless of what parse_query says
+	$bbp->reply_query->is_home        = false;
+
+	// Reset is_single if single topic
+	if ( bbp_is_single_topic() ) {
+		$bbp->reply_query->is_single = true;
+	}
+
+	// Only add pagination if query returned results
+	if ( (int) $bbp->reply_query->found_posts && (int) $bbp->reply_query->posts_per_page ) {
+
+		// If pretty permalinks are enabled, make our pagination pretty
+		if ( $wp_rewrite->using_permalinks() ) {
+
+			// Page or single
+			if ( is_page() || is_single() ) {
+				$base = get_permalink();
+
+			// User's replies
+			} elseif ( bbp_is_single_user_replies() ) {
+				$base = bbp_get_user_replies_created_url( bbp_get_displayed_user_id() );
+
+			// Single topic
+			} else {
+				$base = get_permalink( bbp_get_topic_id() );
+			}
+
+			$base = trailingslashit( $base ) . user_trailingslashit( $wp_rewrite->pagination_base . '/%#%/' );
+
+		// Unpretty permalinks
+		} else {
+			$base = add_query_arg( 'paged', '%#%' );
+		}
+
+		// Add pagination to query object
+		$bbp->reply_query->pagination_links = paginate_links(
+			apply_filters( 'bbp_replies_pagination', array(
+				'base'      => $base,
+				'format'    => '',
+				'total'     => ceil( (int) $bbp->reply_query->found_posts / (int) $posts_per_page ),
+				'current'   => (int) $bbp->reply_query->paged,
+				'prev_text' => '&larr;',
+				'next_text' => '&rarr;',
+				'mid_size'  => 1,
+				'add_args'  => ( bbp_get_view_all() ) ? array( 'view' => 'all' ) : false
+			) )
+		);
+
+		// Remove first page from pagination
+		if ( $wp_rewrite->using_permalinks() ) {
+			$bbp->reply_query->pagination_links = str_replace( $wp_rewrite->pagination_base . '/1/', '', $bbp->reply_query->pagination_links );
+		} else {
+			$bbp->reply_query->pagination_links = str_replace( '&#038;paged=1', '', $bbp->reply_query->pagination_links );
+		}
+	}
+
+	// Return object
+	return apply_filters( 'bbp_has_replies', $bbp->reply_query->have_posts(), $bbp->reply_query );
+}
+
+/**
+ * Whether there are more replies available in the loop
+ *
+ * @since bbPress (r2553)
+ *
+ * @uses WP_Query bbPress::reply_query::have_posts() To check if there are more
+ *                                                    replies available
+ * @return object Replies information
+ */
+function bbp_replies() {
+
+	// Put into variable to check against next
+	$have_posts = bbpress()->reply_query->have_posts();
+
+	// Reset the post data when finished
+	if ( empty( $have_posts ) )
+		wp_reset_postdata();
+
+	return $have_posts;
+}
+
+/**
+ * Loads up the current reply in the loop
+ *
+ * @since bbPress (r2553)
+ *
+ * @uses WP_Query bbPress::reply_query::the_post() To get the current reply
+ * @return object Reply information
+ */
+function bbp_the_reply() {
+	return bbpress()->reply_query->the_post();
+}
+
+/**
+ * Output reply id
+ *
+ * @since bbPress (r2553)
+ *
+ * @param $reply_id Optional. Used to check emptiness
+ * @uses bbp_get_reply_id() To get the reply id
+ */
+function bbp_reply_id( $reply_id = 0 ) {
+	echo bbp_get_reply_id( $reply_id );
+}
+	/**
+	 * Return the id of the reply in a replies loop
+	 *
+	 * @since bbPress (r2553)
+	 *
+	 * @param $reply_id Optional. Used to check emptiness
+	 * @uses bbPress::reply_query::post::ID To get the reply id
+	 * @uses bbp_is_reply() To check if it's a reply page
+	 * @uses bbp_is_reply_edit() To check if it's a reply edit page
+	 * @uses get_post_field() To get the post's post type
+	 * @uses WP_Query::post::ID To get the reply id
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses apply_filters() Calls 'bbp_get_reply_id' with the reply id and
+	 *                        supplied reply id
+	 * @return int The reply id
+	 */
+	function bbp_get_reply_id( $reply_id = 0 ) {
+		global $wp_query;
+
+		$bbp = bbpress();
+
+		// Easy empty checking
+		if ( !empty( $reply_id ) && is_numeric( $reply_id ) ) {
+			$bbp_reply_id = $reply_id;
+
+		// Currently inside a replies loop
+		} elseif ( !empty( $bbp->reply_query->in_the_loop ) && isset( $bbp->reply_query->post->ID ) ) {
+			$bbp_reply_id = $bbp->reply_query->post->ID;
+
+		// Currently viewing a forum
+		} elseif ( ( bbp_is_single_reply() || bbp_is_reply_edit() ) && !empty( $bbp->current_reply_id ) ) {
+			$bbp_reply_id = $bbp->current_reply_id;
+
+		// Currently viewing a reply
+		} elseif ( ( bbp_is_single_reply() || bbp_is_reply_edit() ) && isset( $wp_query->post->ID ) ) {
+			$bbp_reply_id = $wp_query->post->ID;
+
+		// Fallback
+		} else {
+			$bbp_reply_id = 0;
+		}
+
+		return (int) apply_filters( 'bbp_get_reply_id', $bbp_reply_id, $reply_id );
+	}
+
+/**
+ * Gets a reply
+ *
+ * @since bbPress (r2787)
+ *
+ * @param int|object $reply reply id or reply object
+ * @param string $output Optional. OBJECT, ARRAY_A, or ARRAY_N. Default = OBJECT
+ * @param string $filter Optional Sanitation filter. See {@link sanitize_post()}
+ * @uses get_post() To get the reply
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses apply_filters() Calls 'bbp_get_reply' with the reply, output type and
+ *                        sanitation filter
+ * @return mixed Null if error or reply (in specified form) if success
+ */
+function bbp_get_reply( $reply, $output = OBJECT, $filter = 'raw' ) {
+	if ( empty( $reply ) || is_numeric( $reply ) )
+		$reply = bbp_get_reply_id( $reply );
+
+	$reply = get_post( $reply, OBJECT, $filter );
+	if ( empty( $reply ) )
+		return $reply;
+
+	if ( $reply->post_type !== bbp_get_reply_post_type() )
+		return null;
+
+	if ( $output == OBJECT ) {
+		return $reply;
+
+	} elseif ( $output == ARRAY_A ) {
+		$_reply = get_object_vars( $reply );
+		return $_reply;
+
+	} elseif ( $output == ARRAY_N ) {
+		$_reply = array_values( get_object_vars( $reply ) );
+		return $_reply;
+
+	}
+
+	return apply_filters( 'bbp_get_reply', $reply, $output, $filter );
+}
+
+/**
+ * Output the link to the reply in the reply loop
+ *
+ * @since bbPress (r2553)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_permalink() To get the reply permalink
+ */
+function bbp_reply_permalink( $reply_id = 0 ) {
+	echo bbp_get_reply_permalink( $reply_id );
+}
+	/**
+	 * Return the link to the reply
+	 *
+	 * @since bbPress (r2553)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_permalink() To get the permalink of the reply
+	 * @uses apply_filters() Calls 'bbp_get_reply_permalink' with the link
+	 *                        and reply id
+	 * @return string Permanent link to reply
+	 */
+	function bbp_get_reply_permalink( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		return apply_filters( 'bbp_get_reply_permalink', get_permalink( $reply_id ), $reply_id );
+	}
+/**
+ * Output the paginated url to the reply in the reply loop
+ *
+ * @since bbPress (r2679)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_url() To get the reply url
+ */
+function bbp_reply_url( $reply_id = 0 ) {
+	echo bbp_get_reply_url( $reply_id );
+}
+	/**
+	 * Return the paginated url to the reply in the reply loop
+	 *
+	 * @since bbPress (r2679)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @param $string $redirect_to Optional. Pass a redirect value for use with
+	 *                              shortcodes and other fun things.
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_topic_id() To get the reply topic id
+	 * @uses bbp_get_topic_permalink() To get the topic permalink
+	 * @uses bbp_get_reply_position() To get the reply position
+	 * @uses get_option() To get the replies per page option
+	 * @uses WP_Rewrite::using_permalinks() To check if the blog uses
+	 *                                       permalinks
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_reply_url' with the reply url,
+	 *                        reply id and bool count hidden
+	 * @return string Link to reply relative to paginated topic
+	 */
+	function bbp_get_reply_url( $reply_id = 0, $redirect_to = '' ) {
+
+		// Set needed variables
+		$reply_id   = bbp_get_reply_id      ( $reply_id );
+		$topic_id   = bbp_get_reply_topic_id( $reply_id );
+		$reply_page = ceil( (int) bbp_get_reply_position( $reply_id, $topic_id ) / (int) bbp_get_replies_per_page() );
+		$reply_hash = '#post-' . $reply_id;
+		$topic_link = bbp_get_topic_permalink( $topic_id, $redirect_to );
+		$topic_url  = remove_query_arg( 'view', $topic_link );
+
+		// Don't include pagination if on first page
+		if ( 1 >= $reply_page ) {
+			$url = trailingslashit( $topic_url ) . $reply_hash;
+
+		// Include pagination
+		} else {
+			global $wp_rewrite;
+
+			// Pretty permalinks
+			if ( $wp_rewrite->using_permalinks() ) {
+				$url = trailingslashit( $topic_url ) . trailingslashit( $wp_rewrite->pagination_base ) . trailingslashit( $reply_page ) . $reply_hash;
+
+			// Yucky links
+			} else {
+				$url = add_query_arg( 'paged', $reply_page, $topic_url ) . $reply_hash;
+			}
+		}
+
+		// Add topic view query arg back to end if it is set
+		if ( bbp_get_view_all() )
+			$url = bbp_add_view_all( $url );
+
+		return apply_filters( 'bbp_get_reply_url', $url, $reply_id, $redirect_to );
+	}
+
+/**
+ * Output the title of the reply
+ *
+ * @since bbPress (r2553)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_title() To get the reply title
+ */
+function bbp_reply_title( $reply_id = 0 ) {
+	echo bbp_get_reply_title( $reply_id );
+}
+
+	/**
+	 * Return the title of the reply
+	 *
+	 * @since bbPress (r2553)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_the_title() To get the reply title
+	 * @uses apply_filters() Calls 'bbp_get_reply_title' with the title and
+	 *                        reply id
+	 * @return string Title of reply
+	 */
+	function bbp_get_reply_title( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		return apply_filters( 'bbp_get_reply_title', get_the_title( $reply_id ), $reply_id );
+	}
+
+/**
+ * Output the content of the reply
+ *
+ * @since bbPress (r2553)
+ *
+ * @param int $reply_id Optional. reply id
+ * @uses bbp_get_reply_content() To get the reply content
+ */
+function bbp_reply_content( $reply_id = 0 ) {
+	echo bbp_get_reply_content( $reply_id );
+}
+	/**
+	 * Return the content of the reply
+	 *
+	 * @since bbPress (r2780)
+	 *
+	 * @param int $reply_id Optional. reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses post_password_required() To check if the reply requires pass
+	 * @uses get_the_password_form() To get the password form
+	 * @uses get_post_field() To get the content post field
+	 * @uses apply_filters() Calls 'bbp_get_reply_content' with the content
+	 *                        and reply id
+	 * @return string Content of the reply
+	 */
+	function bbp_get_reply_content( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// Check if password is required
+		if ( post_password_required( $reply_id ) )
+			return get_the_password_form();
+
+		$content = get_post_field( 'post_content', $reply_id );
+
+		return apply_filters( 'bbp_get_reply_content', $content, $reply_id );
+	}
+
+/**
+ * Output the excerpt of the reply
+ *
+ * @since bbPress (r2751)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param int $length Optional. Length of the excerpt. Defaults to 100 letters
+ * @uses bbp_get_reply_excerpt() To get the reply excerpt
+ */
+function bbp_reply_excerpt( $reply_id = 0, $length = 100 ) {
+	echo bbp_get_reply_excerpt( $reply_id, $length );
+}
+	/**
+	 * Return the excerpt of the reply
+	 *
+	 * @since bbPress (r2751)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @param int $length Optional. Length of the excerpt. Defaults to 100
+	 *                     letters
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_field() To get the excerpt
+	 * @uses bbp_get_reply_content() To get the reply content
+	 * @uses apply_filters() Calls 'bbp_get_reply_excerpt' with the excerpt,
+	 *                        reply id and length
+	 * @return string Reply Excerpt
+	 */
+	function bbp_get_reply_excerpt( $reply_id = 0, $length = 100 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+		$length   = (int) $length;
+		$excerpt  = get_post_field( $reply_id, 'post_excerpt' );
+
+		if ( empty( $excerpt ) )
+			$excerpt = bbp_get_reply_content( $reply_id );
+
+		$excerpt = trim ( strip_tags( $excerpt ) );
+
+		if ( !empty( $length ) && strlen( $excerpt ) > $length ) {
+			$excerpt  = substr( $excerpt, 0, $length - 1 );
+			$excerpt .= '&hellip;';
+		}
+
+		return apply_filters( 'bbp_get_reply_excerpt', $excerpt, $reply_id, $length );
+	}
+
+/**
+ * Output the post date and time of a reply
+ *
+ * @since bbPress (r4155)
+ *
+ * @param int $reply_id Optional. Reply id.
+ * @param bool $humanize Optional. Humanize output using time_since
+ * @param bool $gmt Optional. Use GMT
+ * @uses bbp_get_reply_post_date() to get the output
+ */
+function bbp_reply_post_date( $reply_id = 0, $humanize = false, $gmt = false ) {
+	echo bbp_get_reply_post_date( $reply_id, $humanize, $gmt );
+}
+	/**
+	 * Return the post date and time of a reply
+	 *
+	 * @since bbPress (r4155)
+	 *
+	 * @param int $reply_id Optional. Reply id.
+	 * @param bool $humanize Optional. Humanize output using time_since
+	 * @param bool $gmt Optional. Use GMT
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_time() to get the reply post time
+	 * @uses bbp_time_since() to maybe humanize the reply post time
+	 * @return string
+	 */
+	function bbp_get_reply_post_date( $reply_id = 0, $humanize = false, $gmt = false ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// 4 days, 4 hours ago
+		if ( !empty( $humanize ) ) {
+			$gmt    = !empty( $gmt ) ? 'G' : 'U';
+			$date   = get_post_time( $gmt, $reply_id );
+			$time   = false; // For filter below
+			$result = bbp_time_since( $date );
+
+		// August 4, 2012 at 2:37 pm
+		} else {
+			$date   = get_post_time( get_option( 'date_format' ), $gmt, $reply_id );
+			$time   = get_post_time( get_option( 'time_format' ), $gmt, $reply_id );
+			$result = sprintf( _x( '%1$s at %2$s', 'date at time', 'bbpress' ), $date, $time );
+		}
+
+		return apply_filters( 'bbp_get_reply_post_date', $result, $reply_id, $humanize, $gmt, $date, $time );
+	}
+
+/**
+ * Append revisions to the reply content
+ *
+ * @since bbPress (r2782)
+ *
+ * @param string $content Optional. Content to which we need to append the revisions to
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_revision_log() To get the reply revision log
+ * @uses apply_filters() Calls 'bbp_reply_append_revisions' with the processed
+ *                        content, original content and reply id
+ * @return string Content with the revisions appended
+ */
+function bbp_reply_content_append_revisions( $content = '', $reply_id = 0 ) {
+
+	// Bail if in admin or feed
+	if ( is_admin() || is_feed() )
+		return $content;
+
+	// Validate the ID
+	$reply_id = bbp_get_reply_id( $reply_id );
+
+	return apply_filters( 'bbp_reply_append_revisions', $content . bbp_get_reply_revision_log( $reply_id ), $content, $reply_id );
+}
+
+/**
+ * Output the revision log of the reply
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_revision_log() To get the reply revision log
+ */
+function bbp_reply_revision_log( $reply_id = 0 ) {
+	echo bbp_get_reply_revision_log( $reply_id );
+}
+	/**
+	 * Return the formatted revision log of the reply
+	 *
+	 * @since bbPress (r2782)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_revisions() To get the reply revisions
+	 * @uses bbp_get_reply_raw_revision_log() To get the raw revision log
+	 * @uses bbp_get_reply_author_display_name() To get the reply author
+	 * @uses bbp_get_reply_author_link() To get the reply author link
+	 * @uses bbp_convert_date() To convert the date
+	 * @uses bbp_get_time_since() To get the time in since format
+	 * @uses apply_filters() Calls 'bbp_get_reply_revision_log' with the
+	 *                        log and reply id
+	 * @return string Revision log of the reply
+	 */
+	function bbp_get_reply_revision_log( $reply_id = 0 ) {
+
+		// Create necessary variables
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// Show the topic reply log if this is a topic in a reply loop
+		if ( bbp_is_topic( $reply_id ) ) {
+			return bbp_get_topic_revision_log( $reply_id );
+		}
+
+		// Get the reply revision log (out of post meta
+		$revision_log = bbp_get_reply_raw_revision_log( $reply_id );
+
+		// Check reply and revision log exist
+		if ( empty( $reply_id ) || empty( $revision_log ) || !is_array( $revision_log ) )
+			return false;
+
+		// Get the actual revisions
+		$revisions = bbp_get_reply_revisions( $reply_id );
+		if ( empty( $revisions ) )
+			return false;
+
+		$r = "\n\n" . '<ul id="bbp-reply-revision-log-' . $reply_id . '" class="bbp-reply-revision-log">' . "\n\n";
+
+		// Loop through revisions
+		foreach ( (array) $revisions as $revision ) {
+
+			if ( empty( $revision_log[$revision->ID] ) ) {
+				$author_id = $revision->post_author;
+				$reason    = '';
+			} else {
+				$author_id = $revision_log[$revision->ID]['author'];
+				$reason    = $revision_log[$revision->ID]['reason'];
+			}
+
+			$author = bbp_get_author_link( array( 'size' => 14, 'link_text' => bbp_get_reply_author_display_name( $revision->ID ), 'post_id' => $revision->ID ) );
+			$since  = bbp_get_time_since( bbp_convert_date( $revision->post_modified ) );
+
+			$r .= "\t" . '<li id="bbp-reply-revision-log-' . $reply_id . '-item-' . $revision->ID . '" class="bbp-reply-revision-log-item">' . "\n";
+			if ( !empty( $reason ) ) {
+				$r .= "\t\t" . sprintf( __( 'This reply was modified %1$s by %2$s. Reason: %3$s', 'bbpress' ), $since, $author, $reason ) . "\n";
+			} else {
+				$r .= "\t\t" . sprintf( __( 'This reply was modified %1$s by %2$s.', 'bbpress' ), $since, $author ) . "\n";
+			}
+			$r .= "\t" . '</li>' . "\n";
+
+		}
+
+		$r .= "\n" . '</ul>' . "\n\n";
+
+		return apply_filters( 'bbp_get_reply_revision_log', $r, $reply_id );
+	}
+		/**
+		 * Return the raw revision log of the reply
+		 *
+		 * @since bbPress (r2782)
+		 *
+		 * @param int $reply_id Optional. Reply id
+		 * @uses bbp_get_reply_id() To get the reply id
+		 * @uses get_post_meta() To get the revision log meta
+		 * @uses apply_filters() Calls 'bbp_get_reply_raw_revision_log'
+		 *                        with the log and reply id
+		 * @return string Raw revision log of the reply
+		 */
+		function bbp_get_reply_raw_revision_log( $reply_id = 0 ) {
+			$reply_id     = bbp_get_reply_id( $reply_id );
+			$revision_log = get_post_meta( $reply_id, '_bbp_revision_log', true );
+			$revision_log = empty( $revision_log ) ? array() : $revision_log;
+
+			return apply_filters( 'bbp_get_reply_raw_revision_log', $revision_log, $reply_id );
+		}
+
+/**
+ * Return the revisions of the reply
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses wp_get_post_revisions() To get the reply revisions
+ * @uses apply_filters() Calls 'bbp_get_reply_revisions'
+ *                        with the revisions and reply id
+ * @return string reply revisions
+ */
+function bbp_get_reply_revisions( $reply_id = 0 ) {
+	$reply_id  = bbp_get_reply_id( $reply_id );
+	$revisions = wp_get_post_revisions( $reply_id, array( 'order' => 'ASC' ) );
+
+	return apply_filters( 'bbp_get_reply_revisions', $revisions, $reply_id );
+}
+
+/**
+ * Return the revision count of the reply
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_reply_revisions() To get the reply revisions
+ * @uses apply_filters() Calls 'bbp_get_reply_revision_count'
+ *                        with the revision count and reply id
+ * @return string reply revision count
+ */
+function bbp_get_reply_revision_count( $reply_id = 0, $integer = false ) {
+	$count  = (int) count( bbp_get_reply_revisions( $reply_id ) );
+	$filter = ( true === $integer ) ? 'bbp_get_reply_revision_count_int' : 'bbp_get_reply_revision_count';
+
+	return apply_filters( $filter, $count, $reply_id );
+}
+
+/**
+ * Output the status of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_status() To get the reply status
+ */
+function bbp_reply_status( $reply_id = 0 ) {
+	echo bbp_get_reply_status( $reply_id );
+}
+	/**
+	 * Return the status of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_status() To get the reply status
+	 * @uses apply_filters() Calls 'bbp_get_reply_status' with the reply id
+	 * @return string Status of reply
+	 */
+	function bbp_get_reply_status( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+		return apply_filters( 'bbp_get_reply_status', get_post_status( $reply_id ), $reply_id );
+	}
+
+/**
+ * Is the reply not spam or deleted?
+ *
+ * @since bbPress (r3496)
+ *
+ * @param int $reply_id Optional. Topic id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_status() To get the reply status
+ * @return bool True if published, false if not.
+ */
+function bbp_is_reply_published( $reply_id = 0 ) {
+	$reply_status = bbp_get_reply_status( bbp_get_reply_id( $reply_id ) ) == bbp_get_public_status_id();
+	return (bool) apply_filters( 'bbp_is_reply_published', (bool) $reply_status, $reply_id );
+}
+
+/**
+ * Is the reply marked as spam?
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_status() To get the reply status
+ * @return bool True if spam, false if not.
+ */
+function bbp_is_reply_spam( $reply_id = 0 ) {
+	$reply_status = bbp_get_reply_status( bbp_get_reply_id( $reply_id ) ) == bbp_get_spam_status_id();
+	return (bool) apply_filters( 'bbp_is_reply_spam', (bool) $reply_status, $reply_id );
+}
+
+/**
+ * Is the reply trashed?
+ *
+ * @since bbPress (r2884)
+ *
+ * @param int $reply_id Optional. Topic id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_status() To get the reply status
+ * @return bool True if spam, false if not.
+ */
+function bbp_is_reply_trash( $reply_id = 0 ) {
+	$reply_status = bbp_get_reply_status( bbp_get_reply_id( $reply_id ) ) == bbp_get_trash_status_id();
+	return (bool) apply_filters( 'bbp_is_reply_trash', (bool) $reply_status, $reply_id );
+}
+
+/**
+ * Is the reply by an anonymous user?
+ *
+ * @since bbPress (r2753)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_author_id() To get the reply author id
+ * @uses get_post_meta() To get the anonymous name and email metas
+ * @return bool True if the post is by an anonymous user, false if not.
+ */
+function bbp_is_reply_anonymous( $reply_id = 0 ) {
+	$reply_id = bbp_get_reply_id( $reply_id );
+	$retval   = false;
+
+	if ( !bbp_get_reply_author_id( $reply_id ) )
+		$retval = true;
+
+	elseif ( get_post_meta( $reply_id, '_bbp_anonymous_name', true ) )
+		$retval = true;
+
+	elseif ( get_post_meta( $reply_id, '_bbp_anonymous_email', true ) )
+		$retval = true;
+
+	return (bool) apply_filters( 'bbp_is_reply_anonymous', $retval, $reply_id );
+}
+
+/**
+ * Output the author of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_author() To get the reply author
+ */
+function bbp_reply_author( $reply_id = 0 ) {
+	echo bbp_get_reply_author( $reply_id );
+}
+	/**
+	 * Return the author of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an
+	 *                                 anonymous user
+	 * @uses get_the_author_meta() To get the reply author display name
+	 * @uses get_post_meta() To get the anonymous poster name
+	 * @uses apply_filters() Calls 'bbp_get_reply_author' with the reply
+	 *                        author and reply id
+	 * @return string Author of reply
+	 */
+	function bbp_get_reply_author( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		if ( !bbp_is_reply_anonymous( $reply_id ) )
+			$author = get_the_author_meta( 'display_name', bbp_get_reply_author_id( $reply_id ) );
+		else
+			$author = get_post_meta( $reply_id, '_bbp_anonymous_name', true );
+
+		return apply_filters( 'bbp_get_reply_author', $author, $reply_id );
+	}
+
+/**
+ * Output the author ID of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_author_id() To get the reply author id
+ */
+function bbp_reply_author_id( $reply_id = 0 ) {
+	echo bbp_get_reply_author_id( $reply_id );
+}
+	/**
+	 * Return the author ID of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_field() To get the reply author id
+	 * @uses apply_filters() Calls 'bbp_get_reply_author_id' with the author
+	 *                        id and reply id
+	 * @return string Author id of reply
+	 */
+	function bbp_get_reply_author_id( $reply_id = 0 ) {
+		$reply_id  = bbp_get_reply_id( $reply_id );
+		$author_id = get_post_field( 'post_author', $reply_id );
+
+		return (int) apply_filters( 'bbp_get_reply_author_id', $author_id, $reply_id );
+	}
+
+/**
+ * Output the author display_name of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_author_display_name()
+ */
+function bbp_reply_author_display_name( $reply_id = 0 ) {
+	echo bbp_get_reply_author_display_name( $reply_id );
+}
+	/**
+	 * Return the author display_name of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses get_the_author_meta() To get the reply author's display name
+	 * @uses get_post_meta() To get the anonymous poster's name
+	 * @uses apply_filters() Calls 'bbp_get_reply_author_display_name' with
+	 *                        the author display name and reply id
+	 * @return string Reply's author's display name
+	 */
+	function bbp_get_reply_author_display_name( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// User is not a guest
+		if ( !bbp_is_reply_anonymous( $reply_id ) ) {
+
+			// Get the author ID
+			$author_id = bbp_get_reply_author_id( $reply_id );
+
+			// Try to get a display name
+			$author_name = get_the_author_meta( 'display_name', $author_id );
+
+			// Fall back to user login
+			if ( empty( $author_name ) ) {
+				$author_name = get_the_author_meta( 'user_login', $author_id );
+			}
+
+		// User does not have an account
+		} else {
+			$author_name = get_post_meta( $reply_id, '_bbp_anonymous_name', true );
+		}
+
+		// If nothing could be found anywhere, use Anonymous
+		if ( empty( $author_name ) )
+			$author_name = __( 'Anonymous', 'bbpress' );
+
+		return apply_filters( 'bbp_get_reply_author_display_name', esc_attr( $author_name ), $reply_id );
+	}
+
+/**
+ * Output the author avatar of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param int $size Optional. Size of the avatar. Defaults to 40
+ * @uses bbp_get_reply_author_avatar() To get the reply author id
+ */
+function bbp_reply_author_avatar( $reply_id = 0, $size = 40 ) {
+	echo bbp_get_reply_author_avatar( $reply_id, $size );
+}
+	/**
+	 * Return the author avatar of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @param int $size Optional. Size of the avatar. Defaults to 40
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses get_post_meta() To get the anonymous poster's email id
+	 * @uses get_avatar() To get the avatar
+	 * @uses apply_filters() Calls 'bbp_get_reply_author_avatar' with the
+	 *                        author avatar, reply id and size
+	 * @return string Avatar of author of the reply
+	 */
+	function bbp_get_reply_author_avatar( $reply_id = 0, $size = 40 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+		if ( !empty( $reply_id ) ) {
+			// Check for anonymous user
+			if ( !bbp_is_reply_anonymous( $reply_id ) ) {
+				$author_avatar = get_avatar( bbp_get_reply_author_id( $reply_id ), $size );
+			} else {
+				$author_avatar = get_avatar( get_post_meta( $reply_id, '_bbp_anonymous_email', true ), $size );
+			}
+		} else {
+			$author_avatar = '';
+		}
+
+		return apply_filters( 'bbp_get_reply_author_avatar', $author_avatar, $reply_id, $size );
+	}
+
+/**
+ * Output the author link of the reply
+ *
+ * @since bbPress (r2717)
+ *
+ * @param mixed $args Optional. If it is an integer, it is used as reply id.
+ * @uses bbp_get_reply_author_link() To get the reply author link
+ */
+function bbp_reply_author_link( $args = '' ) {
+	echo bbp_get_reply_author_link( $args );
+}
+	/**
+	 * Return the author link of the reply
+	 *
+	 * @since bbPress (r2717)
+	 *
+	 * @param mixed $args Optional. If an integer, it is used as reply id.
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_reply_author() To get the reply author name
+	 * @uses bbp_get_reply_author_url() To get the reply author url
+	 * @uses bbp_get_reply_author_avatar() To get the reply author avatar
+	 * @uses bbp_get_reply_author_display_name() To get the reply author display
+	 *                                      name
+	 * @uses bbp_get_user_display_role() To get the reply author display role
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses apply_filters() Calls 'bbp_get_reply_author_link' with the
+	 *                        author link and args
+	 * @return string Author link of reply
+	 */
+	function bbp_get_reply_author_link( $args = '' ) {
+		$defaults = array (
+			'post_id'    => 0,
+			'link_title' => '',
+			'type'       => 'both',
+			'size'       => 80,
+			'sep'        => '&nbsp;',
+			'show_role'  => false
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_reply_author_link' );
+		extract( $r );
+
+		// Used as reply_id
+		if ( is_numeric( $args ) )
+			$reply_id = bbp_get_reply_id( $args );
+		else
+			$reply_id = bbp_get_reply_id( $post_id );
+
+		if ( !empty( $reply_id ) ) {
+			if ( empty( $link_title ) ) {
+				$link_title = sprintf( !bbp_is_reply_anonymous( $reply_id ) ? __( 'View %s\'s profile', 'bbpress' ) : __( 'Visit %s\'s website', 'bbpress' ), bbp_get_reply_author_display_name( $reply_id ) );
+			}
+
+			$link_title = !empty( $link_title ) ? ' title="' . $link_title . '"' : '';
+			$author_url = bbp_get_reply_author_url( $reply_id );
+			$anonymous  = bbp_is_reply_anonymous( $reply_id );
+
+			// Get avatar
+			if ( 'avatar' == $type || 'both' == $type ) {
+				$author_links['avatar'] = bbp_get_reply_author_avatar( $reply_id, $size );
+			}
+
+			// Get display name
+			if ( 'name' == $type   || 'both' == $type ) {
+				$author_links['name'] = bbp_get_reply_author_display_name( $reply_id );
+			}
+
+			// Add links if not anonymous
+			if ( empty( $anonymous ) && bbp_user_has_profile( bbp_get_reply_author_id( $reply_id ) ) ) {
+				foreach ( $author_links as $link => $link_text ) {
+					$link_class = ' class="bbp-author-' . $link . '"';
+					$author_link[] = sprintf( '<a href="%1$s"%2$s%3$s>%4$s</a>', $author_url, $link_title, $link_class, $link_text );
+				}
+
+				if ( true === $show_role ) {
+					$author_link[] = bbp_get_reply_author_role( array( 'reply_id' => $reply_id ) );
+				}
+
+				$author_link = join( $sep, $author_link );
+
+			// No links if anonymous
+			} else {
+				$author_link = join( $sep, $author_links );
+			}
+
+		// No replies so link is empty
+		} else {
+			$author_link = '';
+		}
+
+		return apply_filters( 'bbp_get_reply_author_link', $author_link, $args );
+	}
+
+/**
+ * Output the author url of the reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_author_url() To get the reply author url
+ */
+function bbp_reply_author_url( $reply_id = 0 ) {
+	echo bbp_get_reply_author_url( $reply_id );
+}
+	/**
+	 * Return the author url of the reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an anonymous
+	 *                                 user
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses bbp_get_user_profile_url() To get the user profile url
+	 * @uses get_post_meta() To get the anonymous poster's website url
+	 * @uses apply_filters() Calls bbp_get_reply_author_url with the author
+	 *                        url & reply id
+	 * @return string Author URL of the reply
+	 */
+	function bbp_get_reply_author_url( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// Check for anonymous user
+		if ( !bbp_is_reply_anonymous( $reply_id ) ) {
+			$author_url = bbp_get_user_profile_url( bbp_get_reply_author_id( $reply_id ) );
+		} else {
+			$author_url = get_post_meta( $reply_id, '_bbp_anonymous_website', true );
+			if ( empty( $author_url ) ) {
+				$author_url = '';
+			}
+		}
+
+		return apply_filters( 'bbp_get_reply_author_url', $author_url, $reply_id );
+	}
+
+/**
+ * Output the reply author email address
+ *
+ * @since bbPress (r3445)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_author_email() To get the reply author email
+ */
+function bbp_reply_author_email( $reply_id = 0 ) {
+	echo bbp_get_reply_author_email( $reply_id );
+}
+	/**
+	 * Return the reply author email address
+	 *
+	 * @since bbPress (r3445)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an anonymous
+	 *                                 user
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses get_userdata() To get the user data
+	 * @uses get_post_meta() To get the anonymous poster's website email
+	 * @uses apply_filters() Calls bbp_get_reply_author_email with the author
+	 *                        email & reply id
+	 * @return string Reply author email address
+	 */
+	function bbp_get_reply_author_email( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+
+		// Not anonymous
+		if ( !bbp_is_reply_anonymous( $reply_id ) ) {
+
+			// Use reply author email address
+			$user_id      = bbp_get_reply_author_id( $reply_id );
+			$user         = get_userdata( $user_id );
+			$author_email = !empty( $user->user_email ) ? $user->user_email : '';
+
+		// Anonymous
+		} else {
+
+			// Get email from post meta
+			$author_email = get_post_meta( $reply_id, '_bbp_anonymous_email', true );
+
+			// Sanity check for missing email address
+			if ( empty( $author_email ) ) {
+				$author_email = '';
+			}
+		}
+
+		return apply_filters( 'bbp_get_reply_author_email', $author_email, $reply_id );
+	}
+
+/**
+ * Output the reply author role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param array $args Optional.
+ * @uses bbp_get_reply_author_role() To get the reply author role
+ */
+function bbp_reply_author_role( $args = array() ) {
+	echo bbp_get_reply_author_role( $args );
+}
+	/**
+	 * Return the reply author role
+	 *
+	 * @since bbPress (r3860)
+	 *
+	 * @param array $args Optional.
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_user_display_role() To get the user display role
+	 * @uses bbp_get_reply_author_id() To get the reply author id
+	 * @uses apply_filters() Calls bbp_get_reply_author_role with the author
+	 *                        role & args
+	 * @return string Reply author role
+	 */
+	function bbp_get_reply_author_role( $args = array() ) {
+		$defaults = array(
+			'reply_id' => 0,
+			'class'    => 'bbp-author-role',
+			'before'   => '',
+			'after'    => ''
+		);
+		$args = bbp_parse_args( $args, $defaults, 'get_reply_author_role' );
+		extract( $args, EXTR_SKIP );
+
+		$reply_id    = bbp_get_reply_id( $reply_id );
+		$role        = bbp_get_user_display_role( bbp_get_reply_author_id( $reply_id ) );
+		$author_role = sprintf( '%1$s<div class="%2$s">%3$s</div>%4$s', $before, $class, $role, $after );
+
+		return apply_filters( 'bbp_get_reply_author_role', $author_role, $args );
+	}
+
+/**
+ * Output the topic title a reply belongs to
+ *
+ * @since bbPress (r2553)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_topic_title() To get the reply topic title
+ */
+function bbp_reply_topic_title( $reply_id = 0 ) {
+	echo bbp_get_reply_topic_title( $reply_id );
+}
+	/**
+	 * Return the topic title a reply belongs to
+	 *
+	 * @since bbPress (r2553)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_topic_id() To get the reply topic id
+	 * @uses bbp_get_topic_title() To get the reply topic title
+	 * @uses apply_filters() Calls 'bbp_get_reply_topic_title' with the
+	 *                        topic title and reply id
+	 * @return string Reply's topic's title
+	 */
+	function bbp_get_reply_topic_title( $reply_id = 0 ) {
+		$reply_id = bbp_get_reply_id( $reply_id );
+		$topic_id = bbp_get_reply_topic_id( $reply_id );
+
+		return apply_filters( 'bbp_get_reply_topic_title', bbp_get_topic_title( $topic_id ), $reply_id );
+	}
+
+/**
+ * Output the topic id a reply belongs to
+ *
+ * @since bbPress (r2553)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ */
+function bbp_reply_topic_id( $reply_id = 0 ) {
+	echo bbp_get_reply_topic_id( $reply_id );
+}
+	/**
+	 * Return the topic id a reply belongs to
+	 *
+	 * @since bbPress (r2553)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_meta() To get the reply topic id from meta
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses apply_filters() Calls 'bbp_get_reply_topic_id' with the topic
+	 *                        id and reply id
+	 * @return int Reply's topic id
+	 */
+	function bbp_get_reply_topic_id( $reply_id = 0 ) {
+
+		// Assume there is no topic id
+		$topic_id = 0;
+
+		// Check that reply_id is valid
+		if ( $reply_id = bbp_get_reply_id( $reply_id ) )
+
+			// Get topic_id from reply
+			if ( $topic_id = get_post_meta( $reply_id, '_bbp_topic_id', true ) )
+
+				// Validate the topic_id
+				$topic_id = bbp_get_topic_id( $topic_id );
+
+		return (int) apply_filters( 'bbp_get_reply_topic_id', $topic_id, $reply_id );
+	}
+
+/**
+ * Output the forum id a reply belongs to
+ *
+ * @since bbPress (r2679)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_forum_id() To get the reply forum id
+ */
+function bbp_reply_forum_id( $reply_id = 0 ) {
+	echo bbp_get_reply_forum_id( $reply_id );
+}
+	/**
+	 * Return the forum id a reply belongs to
+	 *
+	 * @since bbPress (r2679)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses get_post_meta() To get the reply forum id
+	 * @uses apply_filters() Calls 'bbp_get_reply_forum_id' with the forum
+	 *                        id and reply id
+	 * @return int Reply's forum id
+	 */
+	function bbp_get_reply_forum_id( $reply_id = 0 ) {
+
+		// Assume there is no forum
+		$forum_id = 0;
+
+		// Check that reply_id is valid
+		if ( $reply_id = bbp_get_reply_id( $reply_id ) )
+
+			// Get forum_id from reply
+			if ( $forum_id = get_post_meta( $reply_id, '_bbp_forum_id', true ) )
+
+				// Validate the forum_id
+				$forum_id = bbp_get_forum_id( $forum_id );
+
+		return (int) apply_filters( 'bbp_get_reply_forum_id', $forum_id, $reply_id );
+	}
+
+/**
+ * Output the numeric position of a reply within a topic
+ *
+ * @since bbPress (r2984)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_reply_position() To get the reply position
+ */
+function bbp_reply_position( $reply_id = 0, $topic_id = 0 ) {
+	echo bbp_get_reply_position( $reply_id, $topic_id );
+}
+	/**
+	 * Return the numeric position of a reply within a topic
+	 *
+	 * @since bbPress (r2984)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_topic_id() Get the topic id of the reply id
+	 * @uses bbp_get_topic_reply_count() To get the topic reply count
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses bbp_get_reply_position_raw() To get calculate the reply position
+	 * @uses bbp_update_reply_position() To update the reply position
+	 * @uses bbp_show_lead_topic() Bump the count if lead topic is included
+	 * @uses apply_filters() Calls 'bbp_get_reply_position' with the reply
+	 *                        position, reply id and topic id
+	 * @return int Reply position
+	 */
+	function bbp_get_reply_position( $reply_id = 0, $topic_id = 0 ) {
+
+		// Get required data
+		$reply_id       = bbp_get_reply_id( $reply_id );
+		$reply_position = get_post_field( 'menu_order', $reply_id );
+
+		// Reply doesn't have a position so get the raw value
+		if ( empty( $reply_position ) ) {
+			$topic_id = !empty( $topic_id ) ? bbp_get_topic_id( $topic_id ) : bbp_get_reply_topic_id( $reply_id );
+
+			// Post is not the topic
+			if ( $reply_id != $topic_id ) {
+				$reply_position = bbp_get_reply_position_raw( $reply_id, $topic_id );
+
+				// Update the reply position in the posts table so we'll never have
+				// to hit the DB again.
+				if ( !empty( $reply_position ) ) {
+					bbp_update_reply_position( $reply_id, $reply_position );
+				}
+
+			// Topic's position is always 0
+			} else {
+				$reply_position = 0;
+			}
+		}
+
+		// Bump the position by one if the lead topic is in the replies loop
+		if ( ! bbp_show_lead_topic() )
+			$reply_position++;
+
+		return (int) apply_filters( 'bbp_get_reply_position', $reply_position, $reply_id, $topic_id );
+	}
+
+/** Reply Admin Links *********************************************************/
+
+/**
+ * Output admin links for reply
+ *
+ * @since bbPress (r2667)
+ *
+ * @param mixed $args See {@link bbp_get_reply_admin_links()}
+ * @uses bbp_get_reply_admin_links() To get the reply admin links
+ */
+function bbp_reply_admin_links( $args = '' ) {
+	echo bbp_get_reply_admin_links( $args );
+}
+	/**
+	 * Return admin links for reply
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Optional. Reply id
+	 *  - before: HTML before the links. Defaults to
+	 *             '<span class="bbp-admin-links">'
+	 *  - after: HTML after the links. Defaults to '</span>'
+	 *  - sep: Separator. Defaults to ' | '
+	 *  - links: Array of the links to display. By default, edit, trash,
+	 *            spam and topic split links are displayed
+	 * @uses bbp_is_topic() To check if it's the topic page
+	 * @uses bbp_is_reply() To check if it's the reply page
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply_edit_link() To get the reply edit link
+	 * @uses bbp_get_reply_trash_link() To get the reply trash link
+	 * @uses bbp_get_reply_spam_link() To get the reply spam link
+	 * @uses bbp_get_topic_split_link() To get the topic split link
+	 * @uses current_user_can() To check if the current user can edit or
+	 *                           delete the reply
+	 * @uses apply_filters() Calls 'bbp_get_reply_admin_links' with the
+	 *                        reply admin links and args
+	 * @return string Reply admin links
+	 */
+	function bbp_get_reply_admin_links( $args = '' ) {
+
+		$defaults = array (
+			'id'     => 0,
+			'before' => '<span class="bbp-admin-links">',
+			'after'  => '</span>',
+			'sep'    => ' | ',
+			'links'  => array()
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_reply_admin_links' );
+
+		$r['id'] = bbp_get_reply_id( (int) $r['id'] );
+
+		// If post is a topic, return the topic admin links instead
+		if ( bbp_is_topic( $r['id'] ) )
+			return bbp_get_topic_admin_links( $args );
+
+		// If post is not a reply, return
+		if ( !bbp_is_reply( $r['id'] ) )
+			return;
+
+		// Make sure user can edit this reply
+		if ( !current_user_can( 'edit_reply', $r['id'] ) )
+			return;
+
+		// If topic is trashed, do not show admin links
+		if ( bbp_is_topic_trash( bbp_get_reply_topic_id( $r['id'] ) ) )
+			return;
+
+		// If no links were passed, default to the standard
+		if ( empty( $r['links'] ) ) {
+			$r['links'] = array (
+				'edit'  => bbp_get_reply_edit_link ( $r ),
+				'split' => bbp_get_topic_split_link( $r ),
+				'trash' => bbp_get_reply_trash_link( $r ),
+				'spam'  => bbp_get_reply_spam_link ( $r ),
+			);
+		}
+
+		// Check caps for trashing the topic
+		if ( !current_user_can( 'delete_reply', $r['id'] ) && !empty( $r['links']['trash'] ) )
+			unset( $r['links']['trash'] );
+
+		// See if links need to be unset
+		$reply_status = bbp_get_reply_status( $r['id'] );
+		if ( in_array( $reply_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ) ) {
+
+			// Spam link shouldn't be visible on trashed topics
+			if ( $reply_status == bbp_get_trash_status_id() ) {
+				unset( $r['links']['spam'] );
+
+			// Trash link shouldn't be visible on spam topics
+			} elseif ( isset( $r['links']['trash'] ) && ( bbp_get_spam_status_id() == $reply_status ) ) {
+				unset( $r['links']['trash'] );
+			}
+		}
+
+		// Process the admin links
+		$links  = implode( $r['sep'], array_filter( $r['links'] ) );
+		$retval = $r['before'] . $links . $r['after'];
+
+		return apply_filters( 'bbp_get_reply_admin_links', $retval, $args );
+	}
+
+/**
+ * Output the edit link of the reply
+ *
+ * @since bbPress (r2740)
+ *
+ * @param mixed $args See {@link bbp_get_reply_edit_link()}
+ * @uses bbp_get_reply_edit_link() To get the reply edit link
+ */
+function bbp_reply_edit_link( $args = '' ) {
+	echo bbp_get_reply_edit_link( $args );
+}
+
+	/**
+	 * Return the edit link of the reply
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Reply id
+	 *  - link_before: HTML before the link
+	 *  - link_after: HTML after the link
+	 *  - edit_text: Edit text. Defaults to 'Edit'
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           reply
+	 * @uses bbp_get_reply_edit_url() To get the reply edit url
+	 * @uses apply_filters() Calls 'bbp_get_reply_edit_link' with the reply
+	 *                        edit link and args
+	 * @return string Reply edit link
+	 */
+	function bbp_get_reply_edit_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'edit_text'    => __( 'Edit', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_reply_edit_link' );
+		extract( $r );
+
+		$reply = bbp_get_reply( bbp_get_reply_id( (int) $id ) );
+
+		// Bypass check if user has caps
+		if ( !current_user_can( 'edit_others_replies' ) ) {
+
+			// User cannot edit or it is past the lock time
+			if ( empty( $reply ) || !current_user_can( 'edit_reply', $reply->ID ) || bbp_past_edit_lock( $reply->post_date_gmt ) )
+				return;
+		}
+
+		// Get uri
+		$uri = bbp_get_reply_edit_url( $id );
+
+		// Bail if no uri
+		if ( empty( $uri ) )
+			return;
+
+		$retval = $link_before . '<a href="' . $uri . '">' . $edit_text . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_reply_edit_link', $retval, $args );
+	}
+
+/**
+ * Output URL to the reply edit page
+ *
+ * @since bbPress (r2753)
+ *
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_get_reply_edit_url() To get the reply edit url
+ */
+function bbp_reply_edit_url( $reply_id = 0 ) {
+	echo bbp_get_reply_edit_url( $reply_id );
+}
+	/**
+	 * Return URL to the reply edit page
+	 *
+	 * @since bbPress (r2753)
+	 *
+	 * @param int $reply_id Optional. Reply id
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses bbp_get_reply_post_type() To get the reply post type
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_reply_edit_url' with the edit
+	 *                        url and reply id
+	 * @return string Reply edit url
+	 */
+	function bbp_get_reply_edit_url( $reply_id = 0 ) {
+		global $wp_rewrite;
+
+		$bbp   = bbpress();
+		$reply = bbp_get_reply( bbp_get_reply_id( $reply_id ) );
+		if ( empty( $reply ) )
+			return;
+
+		$reply_link = bbp_remove_view_all( bbp_get_reply_permalink( $reply_id ) );
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = trailingslashit( $reply_link ) . $bbp->edit_id;
+			$url = trailingslashit( $url );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array( bbp_get_reply_post_type() => $reply->post_name, $bbp->edit_id => '1' ), $reply_link );
+		}
+
+		// Maybe add view all
+		$url = bbp_add_view_all( $url );
+
+		return apply_filters( 'bbp_get_reply_edit_url', $url, $reply_id );
+	}
+
+/**
+ * Output the trash link of the reply
+ *
+ * @since bbPress (r2740)
+ *
+ * @param mixed $args See {@link bbp_get_reply_trash_link()}
+ * @uses bbp_get_reply_trash_link() To get the reply trash link
+ */
+function bbp_reply_trash_link( $args = '' ) {
+	echo bbp_get_reply_trash_link( $args );
+}
+
+	/**
+	 * Return the trash link of the reply
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Reply id
+	 *  - link_before: HTML before the link
+	 *  - link_after: HTML after the link
+	 *  - sep: Separator
+	 *  - trash_text: Trash text
+	 *  - restore_text: Restore text
+	 *  - delete_text: Delete text
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can delete the
+	 *                           reply
+	 * @uses bbp_is_reply_trash() To check if the reply is trashed
+	 * @uses bbp_get_reply_status() To get the reply status
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses bbp_get_reply_edit_url() To get the reply edit url
+	 * @uses apply_filters() Calls 'bbp_get_reply_trash_link' with the reply
+	 *                        trash link and args
+	 * @return string Reply trash link
+	 */
+	function bbp_get_reply_trash_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'sep'          => ' | ',
+			'trash_text'   => __( 'Trash',   'bbpress' ),
+			'restore_text' => __( 'Restore', 'bbpress' ),
+			'delete_text'  => __( 'Delete',  'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_reply_trash_link' );
+		extract( $r );
+
+		$actions = array();
+		$reply   = bbp_get_reply( bbp_get_reply_id( (int) $id ) );
+
+		if ( empty( $reply ) || !current_user_can( 'delete_reply', $reply->ID ) ) {
+			return;
+		}
+
+		if ( bbp_is_reply_trash( $reply->ID ) ) {
+			$actions['untrash'] = '<a title="' . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'untrash', 'reply_id' => $reply->ID ) ), 'untrash-' . $reply->post_type . '_' . $reply->ID ) ) . '">' . esc_html( $restore_text ) . '</a>';
+		} elseif ( EMPTY_TRASH_DAYS ) {
+			$actions['trash']   = '<a title="' . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'trash', 'reply_id' => $reply->ID ) ), 'trash-' . $reply->post_type . '_' . $reply->ID ) ) . '">' . esc_html( $trash_text ) . '</a>';
+		}
+
+		if ( bbp_is_reply_trash( $reply->ID ) || !EMPTY_TRASH_DAYS ) {
+			$actions['delete']  = '<a title="' . esc_attr__( 'Delete this item permanently', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_reply_trash', 'sub_action' => 'delete', 'reply_id' => $reply->ID ) ), 'delete-' . $reply->post_type . '_' . $reply->ID ) ) . '" onclick="return confirm(\'' . esc_js( __( 'Are you sure you want to delete that permanently?', 'bbpress' ) ) . '\' );">' . esc_html( $delete_text ) . '</a>';
+		}
+
+		// Process the admin links
+		$retval = $link_before . implode( $sep, $actions ) . $link_after;
+
+		return apply_filters( 'bbp_get_reply_trash_link', $retval, $args );
+	}
+
+/**
+ * Output the spam link of the reply
+ *
+ * @since bbPress (r2740)
+ *
+ * @param mixed $args See {@link bbp_get_reply_spam_link()}
+ * @uses bbp_get_reply_spam_link() To get the reply spam link
+ */
+function bbp_reply_spam_link( $args = '' ) {
+	echo bbp_get_reply_spam_link( $args );
+}
+
+	/**
+	 * Return the spam link of the reply
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Reply id
+	 *  - link_before: HTML before the link
+	 *  - link_after: HTML after the link
+	 *  - spam_text: Spam text
+	 *  - unspam_text: Unspam text
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           reply
+	 * @uses bbp_is_reply_spam() To check if the reply is marked as spam
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses bbp_get_reply_edit_url() To get the reply edit url
+	 * @uses apply_filters() Calls 'bbp_get_reply_spam_link' with the reply
+	 *                        spam link and args
+	 * @return string Reply spam link
+	 */
+	function bbp_get_reply_spam_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'spam_text'    => __( 'Spam',   'bbpress' ),
+			'unspam_text'  => __( 'Unspam', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_reply_spam_link' );
+		extract( $r );
+
+		$reply = bbp_get_reply( bbp_get_reply_id( (int) $id ) );
+
+		if ( empty( $reply ) || !current_user_can( 'moderate', $reply->ID ) )
+			return;
+
+		$display  = bbp_is_reply_spam( $reply->ID ) ? $unspam_text : $spam_text;
+		$uri      = add_query_arg( array( 'action' => 'bbp_toggle_reply_spam', 'reply_id' => $reply->ID ) );
+		$uri      = esc_url( wp_nonce_url( $uri, 'spam-reply_' . $reply->ID ) );
+		$retval   = $link_before . '<a href="' . $uri . '">' . $display . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_reply_spam_link', $retval, $args );
+	}
+
+/**
+ * Split topic link
+ *
+ * Output the split link of the topic (but is bundled with each topic)
+ *
+ * @since bbPress (r2756)
+ *
+ * @param mixed $args See {@link bbp_get_topic_split_link()}
+ * @uses bbp_get_topic_split_link() To get the topic split link
+ */
+function bbp_topic_split_link( $args = '' ) {
+	echo bbp_get_topic_split_link( $args );
+}
+
+	/**
+	 * Get split topic link
+	 *
+	 * Return the split link of the topic (but is bundled with each reply)
+	 *
+	 * @since bbPress (r2756)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Reply id
+	 *  - link_before: HTML before the link
+	 *  - link_after: HTML after the link
+	 *  - split_text: Split text
+	 *  - split_title: Split title attribute
+	 * @uses bbp_get_reply_id() To get the reply id
+	 * @uses bbp_get_reply() To get the reply
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           topic
+	 * @uses bbp_get_reply_topic_id() To get the reply topic id
+	 * @uses bbp_get_topic_edit_url() To get the topic edit url
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_split_link' with the topic
+	 *                        split link and args
+	 * @return string Reply spam link
+	 */
+	function bbp_get_topic_split_link( $args = '' ) {
+		$defaults = array (
+			'id'          => 0,
+			'link_before' => '',
+			'link_after'  => '',
+			'split_text'  => __( 'Split',                           'bbpress' ),
+			'split_title' => __( 'Split the topic from this reply', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_split_link' );
+		extract( $r );
+
+		$reply_id = bbp_get_reply_id( $id );
+		$topic_id = bbp_get_reply_topic_id( $reply_id );
+
+		if ( empty( $reply_id ) || !current_user_can( 'moderate', $topic_id ) )
+			return;
+
+		$uri = esc_url(
+			add_query_arg(
+				array(
+					'action'   => 'split',
+					'reply_id' => $reply_id
+				),
+			bbp_get_topic_edit_url( $topic_id )
+		) );
+
+		$retval = $link_before . '<a href="' . $uri . '" title="' . esc_attr( $split_title ) . '">' . $split_text . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_topic_split_link', $retval, $args );
+	}
+
+/**
+ * Output the row class of a reply
+ *
+ * @since bbPress (r2678)
+ *
+ * @param int $reply_id Optional. Reply ID
+ * @uses bbp_get_reply_class() To get the reply class
+ */
+function bbp_reply_class( $reply_id = 0 ) {
+	echo bbp_get_reply_class( $reply_id );
+}
+	/**
+	 * Return the row class of a reply
+	 *
+	 * @since bbPress (r2678)
+	 *
+	 * @param int $reply_id Optional. Reply ID
+	 * @uses bbp_get_reply_id() To validate the reply id
+	 * @uses bbp_get_reply_forum_id() To get the reply's forum id
+	 * @uses bbp_get_reply_topic_id() To get the reply's topic id
+	 * @uses get_post_class() To get all the classes including ours
+	 * @uses apply_filters() Calls 'bbp_get_reply_class' with the classes
+	 * @return string Row class of the reply
+	 */
+	function bbp_get_reply_class( $reply_id = 0 ) {
+		$bbp       = bbpress();
+		$reply_id  = bbp_get_reply_id( $reply_id );
+		$count     = isset( $bbp->reply_query->current_post ) ? $bbp->reply_query->current_post : 1;
+		$classes   = array();
+		$classes[] = ( (int) $count % 2 ) ? 'even' : 'odd';
+		$classes[] = 'bbp-parent-forum-'   . bbp_get_reply_forum_id( $reply_id );
+		$classes[] = 'bbp-parent-topic-'   . bbp_get_reply_topic_id( $reply_id );
+		$classes[] = 'bbp-reply-position-' . bbp_get_reply_position( $reply_id );
+		$classes[] = 'user-id-' . bbp_get_reply_author_id( $reply_id );
+		$classes[] = ( bbp_get_reply_author_id( $reply_id ) == bbp_get_topic_author_id( bbp_get_reply_topic_id( $reply_id ) ) ? 'topic-author' : '' );
+		$classes   = array_filter( $classes );
+		$classes   = get_post_class( $classes, $reply_id );
+		$classes   = apply_filters( 'bbp_get_reply_class', $classes, $reply_id );
+		$retval    = 'class="' . join( ' ', $classes ) . '"';
+
+		return $retval;
+	}
+
+/**
+ * Output the topic pagination count
+ *
+ * @since bbPress (r2519)
+ *
+ * @uses bbp_get_topic_pagination_count() To get the topic pagination count
+ */
+function bbp_topic_pagination_count() {
+	echo bbp_get_topic_pagination_count();
+}
+	/**
+	 * Return the topic pagination count
+	 *
+	 * @since bbPress (r2519)
+	 *
+	 * @uses bbp_number_format() To format the number value
+	 * @uses bbp_show_lead_topic() Are we showing the topic as a lead?
+	 * @uses apply_filters() Calls 'bbp_get_topic_pagination_count' with the
+	 *                        pagination count
+	 * @return string Topic pagination count
+	 */
+	function bbp_get_topic_pagination_count() {
+		$bbp = bbpress();
+
+		// Define local variable(s)
+		$retstr = '';
+
+		// Set pagination values
+		$start_num = intval( ( $bbp->reply_query->paged - 1 ) * $bbp->reply_query->posts_per_page ) + 1;
+		$from_num  = bbp_number_format( $start_num );
+		$to_num    = bbp_number_format( ( $start_num + ( $bbp->reply_query->posts_per_page - 1 ) > $bbp->reply_query->found_posts ) ? $bbp->reply_query->found_posts : $start_num + ( $bbp->reply_query->posts_per_page - 1 ) );
+		$total_int = (int) $bbp->reply_query->found_posts;
+		$total     = bbp_number_format( $total_int );
+
+		// We are not including the lead topic
+		if ( bbp_show_lead_topic() ) {
+
+			// Several replies in a topic with a single page
+			if ( empty( $to_num ) ) {
+				$retstr = sprintf( _n( 'Viewing %1$s reply', 'Viewing %1$s replies', $total_int, 'bbpress' ), $total );
+
+			// Several replies in a topic with several pages
+			} else {
+				$retstr = sprintf( _n( 'Viewing %2$s replies (of %4$s total)', 'Viewing %1$s replies - %2$s through %3$s (of %4$s total)', $bbp->reply_query->post_count, 'bbpress' ), $bbp->reply_query->post_count, $from_num, $to_num, $total );
+			}
+
+		// We are including the lead topic
+		} else {
+
+			// Several posts in a topic with a single page
+			if ( empty( $to_num ) ) {
+				$retstr = sprintf( _n( 'Viewing %1$s post', 'Viewing %1$s posts', $total_int, 'bbpress' ), $total );
+
+			// Several posts in a topic with several pages
+			} else {
+				$retstr = sprintf( _n( 'Viewing %2$s post (of %4$s total)', 'Viewing %1$s posts - %2$s through %3$s (of %4$s total)', $bbp->reply_query->post_count, 'bbpress' ), $bbp->reply_query->post_count, $from_num, $to_num, $total );
+			}
+		}
+
+		// Filter and return
+		return apply_filters( 'bbp_get_topic_pagination_count', $retstr );
+	}
+
+/**
+ * Output topic pagination links
+ *
+ * @since bbPress (r2519)
+ *
+ * @uses bbp_get_topic_pagination_links() To get the topic pagination links
+ */
+function bbp_topic_pagination_links() {
+	echo bbp_get_topic_pagination_links();
+}
+	/**
+	 * Return topic pagination links
+	 *
+	 * @since bbPress (r2519)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_topic_pagination_links' with the
+	 *                        pagination links
+	 * @return string Topic pagination links
+	 */
+	function bbp_get_topic_pagination_links() {
+		$bbp = bbpress();
+
+		if ( !isset( $bbp->reply_query->pagination_links ) || empty( $bbp->reply_query->pagination_links ) )
+			return false;
+
+		return apply_filters( 'bbp_get_topic_pagination_links', $bbp->reply_query->pagination_links );
+	}
+
+/** Forms *********************************************************************/
+
+/**
+ * Output the value of reply content field
+ *
+ * @since bbPress (r31301)
+ *
+ * @uses bbp_get_form_reply_content() To get value of reply content field
+ */
+function bbp_form_reply_content() {
+	echo bbp_get_form_reply_content();
+}
+	/**
+	 * Return the value of reply content field
+	 *
+	 * @since bbPress (r31301)
+	 *
+	 * @uses bbp_is_reply_edit() To check if it's the reply edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_reply_content' with the content
+	 * @return string Value of reply content field
+	 */
+	function bbp_get_form_reply_content() {
+
+		// Get _POST data
+		if ( 'POST' == strtoupper( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_reply_content'] ) )
+			$reply_content = $_POST['bbp_reply_content'];
+
+		// Get edit data
+		elseif ( bbp_is_reply_edit() )
+			$reply_content = bbp_get_global_post_field( 'post_content', 'raw' );
+
+		// No data
+		else
+			$reply_content = '';
+
+		return apply_filters( 'bbp_get_form_reply_content', esc_textarea( $reply_content ) );
+	}
+
+/**
+ * Output checked value of reply log edit field
+ *
+ * @since bbPress (r31301)
+ *
+ * @uses bbp_get_form_reply_log_edit() To get the reply log edit value
+ */
+function bbp_form_reply_log_edit() {
+	echo bbp_get_form_reply_log_edit();
+}
+	/**
+	 * Return checked value of reply log edit field
+	 *
+	 * @since bbPress (r31301)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_form_reply_log_edit' with the
+	 *                        log edit value
+	 * @return string Reply log edit checked value
+	 */
+	function bbp_get_form_reply_log_edit() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_log_reply_edit'] ) )
+			$reply_revision = $_POST['bbp_log_reply_edit'];
+
+		// No data
+		else
+			$reply_revision = 1;
+
+		return apply_filters( 'bbp_get_form_reply_log_edit', checked( $reply_revision, true, false ) );
+	}
+
+/**
+ * Output the value of the reply edit reason
+ *
+ * @since bbPress (r31301)
+ *
+ * @uses bbp_get_form_reply_edit_reason() To get the reply edit reason value
+ */
+function bbp_form_reply_edit_reason() {
+	echo bbp_get_form_reply_edit_reason();
+}
+	/**
+	 * Return the value of the reply edit reason
+	 *
+	 * @since bbPress (r31301)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_form_reply_edit_reason' with the
+	 *                        reply edit reason value
+	 * @return string Reply edit reason value
+	 */
+	function bbp_get_form_reply_edit_reason() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_reply_edit_reason'] ) )
+			$reply_edit_reason = $_POST['bbp_reply_edit_reason'];
+
+		// No data
+		else
+			$reply_edit_reason = '';
+
+		return apply_filters( 'bbp_get_form_reply_edit_reason', esc_attr( $reply_edit_reason ) );
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/topics/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,232 @@
+<?php
+
+/**
+ * bbPress Topic Capabilites
+ *
+ * Used to map topic capabilities to WordPress's existing capabilities.
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+/**
+ * Return topic capabilities
+ *
+ * @since bbPress (r2593)
+ *
+ * @uses apply_filters() Calls 'bbp_get_topic_caps' with the capabilities
+ * @return array Topic capabilities
+ */
+function bbp_get_topic_caps() {
+	return apply_filters( 'bbp_get_topic_caps', array (
+		'edit_posts'          => 'edit_topics',
+		'edit_others_posts'   => 'edit_others_topics',
+		'publish_posts'       => 'publish_topics',
+		'read_private_posts'  => 'read_private_topics',
+		'read_hidden_posts'   => 'read_hidden_topics',
+		'delete_posts'        => 'delete_topics',
+		'delete_others_posts' => 'delete_others_topics'
+	) );
+}
+
+/**
+ * Return topic tag capabilities
+ *
+ * @since bbPress (r2593)
+ *
+ * @uses apply_filters() Calls 'bbp_get_topic_tag_caps' with the capabilities
+ * @return array Topic tag capabilities
+ */
+function bbp_get_topic_tag_caps() {
+	return apply_filters( 'bbp_get_topic_tag_caps', array (
+		'manage_terms' => 'manage_topic_tags',
+		'edit_terms'   => 'edit_topic_tags',
+		'delete_terms' => 'delete_topic_tags',
+		'assign_terms' => 'assign_topic_tags'
+	) );
+}
+
+/**
+ * Maps topic capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses get_post() To get the post
+ * @uses get_post_type_object() To get the post type object
+ * @uses apply_filters() Filter capability map results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_topic_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+
+		/** Reading ***********************************************************/
+
+		case 'read_topic' :
+
+			// User cannot spectate
+			if ( ! user_can( $user_id, 'spectate' ) ) {
+				$caps = array( 'do_not_allow' );
+
+			// Do some post ID based logic
+			} else {
+
+				// Get the post
+				$_post = get_post( $args[0] );
+				if ( !empty( $_post ) ) {
+
+					// Get caps for post type object
+					$post_type = get_post_type_object( $_post->post_type );
+
+					// Post is public
+					if ( bbp_get_public_status_id() == $_post->post_status ) {
+						$caps = array( 'spectate' );
+
+					// User is author so allow read
+					} elseif ( (int) $user_id == (int) $_post->post_author ) {
+						$caps = array( 'spectate' );
+
+					// Unknown so map to private posts
+					} else {
+						$caps = array( $post_type->cap->read_private_posts );
+					}
+				}
+			}
+
+			break;
+
+		/** Publishing ********************************************************/
+
+		case 'publish_topics'  :
+
+			// Moderators can always publish
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+
+			break;
+
+		/** Editing ***********************************************************/
+
+		// Used primarily in wp-admin
+		case 'edit_topics'        :
+		case 'edit_others_topics' :
+
+			// Moderators can always edit
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( $cap );
+			}
+
+			break;
+
+		// Used everywhere
+		case 'edit_topic' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// User is author so allow edit
+				} elseif ( (int) $user_id == (int) $_post->post_author ) {
+					$caps[] = $post_type->cap->edit_posts;
+
+				// Unknown, so map to edit_others_posts
+				} else {
+					$caps[] = $post_type->cap->edit_others_posts;
+				}
+			}
+
+			break;
+
+		/** Deleting **********************************************************/
+
+		case 'delete_topic' :
+
+			// Get the post
+			$_post = get_post( $args[0] );
+			if ( !empty( $_post ) ) {
+
+				// Get caps for post type object
+				$post_type = get_post_type_object( $_post->post_type );
+				$caps      = array();
+
+				// Add 'do_not_allow' cap if user is spam or deleted
+				if ( bbp_is_user_inactive( $user_id ) ) {
+					$caps[] = 'do_not_allow';
+
+				// Moderators can always edit forum content
+				} elseif ( user_can( $user_id, 'moderate' ) ) {
+					$caps[] = 'moderate';
+
+				// Unknown so map to delete_others_posts
+				} else {
+					$caps[] = $post_type->cap->delete_others_posts;
+				}
+			}
+
+			break;
+
+		// Moderation override
+		case 'delete_topics'         :
+		case 'delete_others_topics'  :
+
+			// Moderators can always delete
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( $cap );
+			}
+
+			break;
+
+		/** Admin *************************************************************/
+
+		case 'bbp_topics_admin' :
+			$caps = array( 'moderate' );
+			break;
+	}
+
+	return apply_filters( 'bbp_map_topic_meta_caps', $caps, $cap, $user_id, $args );
+}
+
+/**
+ * Maps topic tag capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses apply_filters() Filter capability map results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_topic_tag_meta_caps( $caps, $cap, $user_id, $args ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+		case 'manage_topic_tags'    :
+		case 'edit_topic_tags'      :
+		case 'delete_topic_tags'    :
+		case 'assign_topic_tags'    :
+		case 'bbp_topic_tags_admin' :
+
+			// Moderators can always edit
+			if ( user_can( $user_id, 'moderate' ) ) {
+				$caps = array( 'moderate' );
+			}
+	}
+
+	return apply_filters( 'bbp_map_topic_tag_meta_caps', $caps, $cap, $user_id, $args );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/topics/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,3338 @@
+<?php
+
+/**
+ * bbPress Topic Functions
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Insert ********************************************************************/
+
+/**
+ * A wrapper for wp_insert_post() that also includes the necessary meta values
+ * for the topic to function properly.
+ *
+ * @since bbPress (r3349)
+ *
+ * @uses bbp_parse_args()
+ * @uses bbp_get_topic_post_type()
+ * @uses wp_insert_post()
+ * @uses update_post_meta()
+ *
+ * @param array $topic_data Forum post data
+ * @param arrap $topic_meta Forum meta data
+ */
+function bbp_insert_topic( $topic_data = array(), $topic_meta = array() ) {
+
+	// Forum
+	$default_topic = array(
+		'post_parent'    => 0, // forum ID
+		'post_status'    => bbp_get_public_status_id(),
+		'post_type'      => bbp_get_topic_post_type(),
+		'post_author'    => bbp_get_current_user_id(),
+		'post_password'  => '',
+		'post_content'   => '',
+		'post_title'     => '',
+		'comment_status' => 'closed',
+		'menu_order'     => 0,
+	);
+
+	// Parse args
+	$topic_data = bbp_parse_args( $topic_data, $default_topic, 'insert_topic' );
+
+	// Insert topic
+	$topic_id   = wp_insert_post( $topic_data );
+
+	// Bail if no topic was added
+	if ( empty( $topic_id ) )
+		return false;
+
+	// Forum meta
+	$default_meta = array(
+		'author_ip'          => bbp_current_author_ip(),
+		'forum_id'           => 0,
+		'topic_id'           => $topic_id,
+		'voice_count'        => 1,
+		'reply_count'        => 0,
+		'reply_count_hidden' => 0,
+		'last_reply_id'      => 0,
+		'last_active_id'     => $topic_id,
+		'last_active_time'   => get_post_field( 'post_date', $topic_id, 'db' ),
+	);
+
+	// Parse args
+	$topic_meta = bbp_parse_args( $topic_meta, $default_meta, 'insert_topic_meta' );
+
+	// Insert topic meta
+	foreach ( $topic_meta as $meta_key => $meta_value )
+		update_post_meta( $topic_id, '_bbp_' . $meta_key, $meta_value );
+
+	// Update the forum
+	$forum_id = bbp_get_topic_forum_id( $topic_id );
+	if ( !empty( $forum_id ) )
+		bbp_update_forum( array( 'forum_id' => $forum_id ) );
+
+	// Return new topic ID
+	return $topic_id;
+}
+
+/** Post Form Handlers ********************************************************/
+
+/**
+ * Handles the front end topic submission
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the referer
+ * @uses bbp_is_anonymous() To check if an anonymous post is being made
+ * @uses current_user_can() To check if the current user can publish topic
+ * @uses bbp_get_current_user_id() To get the current user id
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses bbp_set_current_anonymous_user_data() To set the anonymous user cookies
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses esc_attr() For sanitization
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @uses bbp_is_forum_private() To check if the forum is private
+ * @uses bbp_check_for_flood() To check for flooding
+ * @uses bbp_check_for_duplicate() To check for duplicates
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses apply_filters() Calls 'bbp_new_topic_pre_title' with the content
+ * @uses apply_filters() Calls 'bbp_new_topic_pre_content' with the content
+ * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
+ * @uses wp_insert_post() To insert the topic
+ * @uses do_action() Calls 'bbp_new_topic' with the topic id, forum id,
+ *                    anonymous data and reply author
+ * @uses bbp_stick_topic() To stick or super stick the topic
+ * @uses bbp_unstick_topic() To unstick the topic
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the topic link
+ * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
+ *                                              messages
+ */
+function bbp_new_topic_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-new-topic
+	if ( empty( $_POST['action'] ) || ( 'bbp-new-topic' !== $_POST['action'] ) )
+		return;
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-new-topic' ) ) {
+		bbp_add_error( 'bbp_new_topic_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Define local variable(s)
+	$view_all = false;
+	$forum_id = $topic_author = $anonymous_data = 0;
+	$topic_title = $topic_content = '';
+	$terms = array( bbp_get_topic_tag_tax_id() => array() );
+
+	/** Topic Author **********************************************************/
+
+	// User is anonymous
+	if ( bbp_is_anonymous() ) {
+
+		// Filter anonymous data
+		$anonymous_data = bbp_filter_anonymous_post_data();
+
+		// Anonymous data checks out, so set cookies, etc...
+		if ( !empty( $anonymous_data ) && is_array( $anonymous_data ) ) {
+			bbp_set_current_anonymous_user_data( $anonymous_data );
+		}
+
+	// User is logged in
+	} else {
+
+		// User cannot create topics
+		if ( !current_user_can( 'publish_topics' ) ) {
+			bbp_add_error( 'bbp_topic_permissions', __( '<strong>ERROR</strong>: You do not have permission to create new topics.', 'bbpress' ) );
+			return;
+		}
+
+		// Topic author is current user
+		$topic_author = bbp_get_current_user_id();
+	}
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_topic'] ) && wp_create_nonce( 'bbp-unfiltered-html-topic_new' ) == $_POST['_bbp_unfiltered_html_topic'] ) {
+		remove_filter( 'bbp_new_topic_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_new_topic_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Topic Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_topic_title'] ) )
+		$topic_title = esc_attr( strip_tags( $_POST['bbp_topic_title'] ) );
+
+	// Filter and sanitize
+	$topic_title = apply_filters( 'bbp_new_topic_pre_title', $topic_title );
+
+	// No topic title
+	if ( empty( $topic_title ) )
+		bbp_add_error( 'bbp_topic_title', __( '<strong>ERROR</strong>: Your topic needs a title.', 'bbpress' ) );
+
+	/** Topic Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_topic_content'] ) )
+		$topic_content = $_POST['bbp_topic_content'];
+
+	// Filter and sanitize
+	$topic_content = apply_filters( 'bbp_new_topic_pre_content', $topic_content );
+
+	// No topic content
+	if ( empty( $topic_content ) )
+		bbp_add_error( 'bbp_topic_content', __( '<strong>ERROR</strong>: Your topic cannot be empty.', 'bbpress' ) );
+
+	/** Topic Forum ***********************************************************/
+
+	// Forum id was not passed
+	if ( empty( $_POST['bbp_forum_id'] ) )
+		bbp_add_error( 'bbp_topic_forum_id', __( '<strong>ERROR</strong>: Forum ID is missing.', 'bbpress' ) );
+
+	// Forum id was passed
+	elseif ( is_numeric( $_POST['bbp_forum_id'] ) )
+		$forum_id = (int) $_POST['bbp_forum_id'];
+
+	// Forum exists
+	if ( !empty( $forum_id ) ) {
+
+		// Forum is a category
+		if ( bbp_is_forum_category( $forum_id ) )
+			bbp_add_error( 'bbp_edit_topic_forum_category', __( '<strong>ERROR</strong>: This forum is a category. No topics can be created in this forum.', 'bbpress' ) );
+
+		// Forum is closed and user cannot access
+		if ( bbp_is_forum_closed( $forum_id ) && !current_user_can( 'edit_forum', $forum_id ) )
+			bbp_add_error( 'bbp_edit_topic_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new topics.', 'bbpress' ) );
+
+		// Forum is private and user cannot access
+		if ( bbp_is_forum_private( $forum_id ) && !current_user_can( 'read_private_forums' ) )
+			bbp_add_error( 'bbp_edit_topic_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
+
+		// Forum is hidden and user cannot access
+		if ( bbp_is_forum_hidden( $forum_id ) && !current_user_can( 'read_hidden_forums' ) )
+			bbp_add_error( 'bbp_edit_topic_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
+	}
+
+	/** Topic Flooding ********************************************************/
+
+	if ( !bbp_check_for_flood( $anonymous_data, $topic_author ) )
+		bbp_add_error( 'bbp_topic_flood', __( '<strong>ERROR</strong>: Slow down; you move too fast.', 'bbpress' ) );
+
+	/** Topic Duplicate *******************************************************/
+
+	if ( !bbp_check_for_duplicate( array( 'post_type' => bbp_get_topic_post_type(), 'post_author' => $topic_author, 'post_content' => $topic_content, 'anonymous_data' => $anonymous_data ) ) )
+		bbp_add_error( 'bbp_topic_duplicate', __( '<strong>ERROR</strong>: Duplicate topic detected; it looks as though you&#8217;ve already said that!', 'bbpress' ) );
+
+	/** Topic Blacklist *******************************************************/
+	
+	if ( !bbp_check_for_blacklist( $anonymous_data, $topic_author, $topic_title, $topic_content ) )
+		bbp_add_error( 'bbp_topic_blacklist', __( '<strong>ERROR</strong>: Your topic cannot be created at this time.', 'bbpress' ) );
+
+	/** Topic Status **********************************************************/
+
+	// Maybe put into moderation
+	if ( !bbp_check_for_moderation( $anonymous_data, $topic_author, $topic_title, $topic_content ) ) {
+		$topic_status = bbp_get_pending_status_id();
+
+	// Default to published
+	} else {
+		$topic_status = bbp_get_public_status_id();
+	}
+
+	/** Topic Tags ************************************************************/
+
+	if ( bbp_allow_topic_tags() && !empty( $_POST['bbp_topic_tags'] ) ) {
+
+		// Escape tag input
+		$terms = esc_attr( strip_tags( $_POST['bbp_topic_tags'] ) );
+
+		// Explode by comma
+		if ( strstr( $terms, ',' ) ) {
+			$terms = explode( ',', $terms );
+		}
+
+		// Add topic tag ID as main key
+		$terms = array( bbp_get_topic_tag_tax_id() => $terms );
+	}
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_new_topic_pre_extras', $forum_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $topic_data as an array.
+	// Just in time manipulation of topic data before being created
+	$topic_data = apply_filters( 'bbp_new_topic_pre_insert', array(
+		'post_author'    => $topic_author,
+		'post_title'     => $topic_title,
+		'post_content'   => $topic_content,
+		'post_status'    => $topic_status,
+		'post_parent'    => $forum_id,
+		'post_type'      => bbp_get_topic_post_type(),
+		'tax_input'      => $terms,
+		'comment_status' => 'closed'
+	) );
+
+	// Insert topic
+	$topic_id = wp_insert_post( $topic_data );
+
+	/** No Errors *************************************************************/
+
+	if ( !empty( $topic_id ) && !is_wp_error( $topic_id ) ) {
+
+		/** Stickies **********************************************************/
+
+		if ( !empty( $_POST['bbp_stick_topic'] ) && in_array( $_POST['bbp_stick_topic'], array( 'stick', 'super', 'unstick' ) ) ) {
+
+			// What's the haps?
+			switch ( $_POST['bbp_stick_topic'] ) {
+
+				// Sticky in this forum
+				case 'stick'   :
+					bbp_stick_topic( $topic_id );
+					break;
+
+				// Super sticky in all forums
+				case 'super'   :
+					bbp_stick_topic( $topic_id, true );
+					break;
+
+				// We can avoid this as it is a new topic
+				case 'unstick' :
+				default        :
+					break;
+			}
+		}
+
+		/** Trash Check *******************************************************/
+
+		// If the forum is trash, or the topic_status is switched to
+		// trash, trash it properly
+		if ( ( get_post_field( 'post_status', $forum_id ) == bbp_get_trash_status_id() ) || ( $topic_data['post_status'] == bbp_get_trash_status_id() ) ) {
+
+			// Trash the reply
+			wp_trash_post( $topic_id );
+
+			// Force view=all
+			$view_all = true;
+		}
+
+		/** Spam Check ********************************************************/
+
+		// If reply or topic are spam, officially spam this reply
+		if ( $topic_data['post_status'] == bbp_get_spam_status_id() ) {
+			add_post_meta( $topic_id, '_bbp_spam_meta_status', bbp_get_public_status_id() );
+
+			// Force view=all
+			$view_all = true;
+		}
+
+		/** Update counts, etc... *********************************************/
+
+		do_action( 'bbp_new_topic', $topic_id, $forum_id, $anonymous_data, $topic_author );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_new_topic_post_extras', $topic_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// Get the topic URL
+		$redirect_url = bbp_get_topic_permalink( $topic_id, $redirect_to );
+
+		// Add view all?
+		if ( bbp_get_view_all() || !empty( $view_all ) ) {
+
+			// User can moderate, so redirect to topic with view all set
+			if ( current_user_can( 'moderate' ) ) {
+				$redirect_url = bbp_add_view_all( $redirect_url );
+
+			// User cannot moderate, so redirect to forum
+			} else {
+				$redirect_url = bbp_get_forum_permalink( $forum_id );
+			}
+		}
+
+		// Allow to be filtered
+		$redirect_url = apply_filters( 'bbp_new_topic_redirect_to', $redirect_url, $redirect_to, $topic_id );
+
+		/** Successful Save ***************************************************/
+
+		// Redirect back to new topic
+		wp_safe_redirect( $redirect_url );
+
+		// For good measure
+		exit();
+
+	// Errors
+	} else {
+		$append_error = ( is_wp_error( $topic_id ) && $topic_id->get_error_message() ) ? $topic_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_topic_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your topic:' . $append_error, 'bbpress' ) );
+	}
+}
+
+/**
+ * Handles the front end edit topic submission
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_get_topic() To get the topic
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses bbp_is_topic_anonymous() To check if topic is by an anonymous user
+ * @uses current_user_can() To check if the current user can edit the topic
+ * @uses bbp_filter_anonymous_post_data() To filter anonymous data
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses esc_attr() For sanitization
+ * @uses bbp_is_forum_category() To check if the forum is a category
+ * @uses bbp_is_forum_closed() To check if the forum is closed
+ * @uses bbp_is_forum_private() To check if the forum is private
+ * @uses remove_filter() To remove 'wp_filter_kses' filters if needed
+ * @uses apply_filters() Calls 'bbp_edit_topic_pre_title' with the title and
+ *                        topic id
+ * @uses apply_filters() Calls 'bbp_edit_topic_pre_content' with the content
+ *                        and topic id
+ * @uses bbPress::errors::get_error_codes() To get the {@link WP_Error} errors
+ * @uses wp_save_post_revision() To save a topic revision
+ * @uses bbp_update_topic_revision_log() To update the topic revision log
+ * @uses bbp_stick_topic() To stick or super stick the topic
+ * @uses bbp_unstick_topic() To unstick the topic
+ * @uses wp_update_post() To update the topic
+ * @uses do_action() Calls 'bbp_edit_topic' with the topic id, forum id,
+ *                    anonymous data and reply author
+ * @uses bbp_move_topic_handler() To handle movement of a topic from one forum
+ *                                 to another
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the topic link
+ * @uses bbPress::errors::get_error_messages() To get the {@link WP_Error} error
+ *                                              messages
+ */
+function bbp_edit_topic_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-edit-topic
+	if ( empty( $_POST['action'] ) || ( 'bbp-edit-topic' !== $_POST['action'] ) )
+		return;
+
+	// Define local variable(s)
+	$revisions_removed = false;
+	$topic = $topic_id = $topic_author = $forum_id = $anonymous_data = 0;
+	$topic_title = $topic_content = $topic_edit_reason = '';
+
+	/** Topic *****************************************************************/
+
+	// Topic id was not passed
+	if ( empty( $_POST['bbp_topic_id'] ) ) {
+		bbp_add_error( 'bbp_edit_topic_id', __( '<strong>ERROR</strong>: Topic ID not found.', 'bbpress' ) );
+		return;
+
+	// Topic id was passed
+	} elseif ( is_numeric( $_POST['bbp_topic_id'] ) ) {
+		$topic_id = (int) $_POST['bbp_topic_id'];
+		$topic    = bbp_get_topic( $topic_id );
+	}
+
+	// Topic does not exist
+	if ( empty( $topic ) ) {
+		bbp_add_error( 'bbp_edit_topic_not_found', __( '<strong>ERROR</strong>: The topic you want to edit was not found.', 'bbpress' ) );
+		return;
+
+	// Topic exists
+	} else {
+
+		// Check users ability to create new topic
+		if ( ! bbp_is_topic_anonymous( $topic_id ) ) {
+
+			// User cannot edit this topic
+			if ( !current_user_can( 'edit_topic', $topic_id ) ) {
+				bbp_add_error( 'bbp_edit_topic_permissions', __( '<strong>ERROR</strong>: You do not have permission to edit that topic.', 'bbpress' ) );
+			}
+
+			// Set topic author
+			$topic_author = bbp_get_topic_author_id( $topic_id );
+
+		// It is an anonymous post
+		} else {
+
+			// Filter anonymous data
+			$anonymous_data = bbp_filter_anonymous_post_data( array(), true );
+		}
+	}
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-edit-topic_' . $topic_id ) ) {
+		bbp_add_error( 'bbp_edit_topic_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Remove wp_filter_kses filters from title and content for capable users and if the nonce is verified
+	if ( current_user_can( 'unfiltered_html' ) && !empty( $_POST['_bbp_unfiltered_html_topic'] ) && ( wp_create_nonce( 'bbp-unfiltered-html-topic_' . $topic_id ) == $_POST['_bbp_unfiltered_html_topic'] ) ) {
+		remove_filter( 'bbp_edit_topic_pre_title',   'wp_filter_kses' );
+		remove_filter( 'bbp_edit_topic_pre_content', 'wp_filter_kses' );
+	}
+
+	/** Topic Forum ***********************************************************/
+
+	// Forum id was not passed
+	if ( empty( $_POST['bbp_forum_id'] ) ) {
+		bbp_add_error( 'bbp_topic_forum_id', __( '<strong>ERROR</strong>: Forum ID is missing.', 'bbpress' ) );
+
+	// Forum id was passed
+	} elseif ( is_numeric( $_POST['bbp_forum_id'] ) ) {
+		$forum_id = (int) $_POST['bbp_forum_id'];
+	}
+
+	// Current forum this topic is in
+	$current_forum_id = bbp_get_topic_forum_id( $topic_id );
+
+	// Forum exists
+	if ( !empty( $forum_id ) && ( $forum_id !== $current_forum_id ) ) {
+
+		// Forum is a category
+		if ( bbp_is_forum_category( $forum_id ) )
+			bbp_add_error( 'bbp_edit_topic_forum_category', __( '<strong>ERROR</strong>: This forum is a category. No topics can be created in it.', 'bbpress' ) );
+
+		// Forum is closed and user cannot access
+		if ( bbp_is_forum_closed( $forum_id ) && !current_user_can( 'edit_forum', $forum_id ) )
+			bbp_add_error( 'bbp_edit_topic_forum_closed', __( '<strong>ERROR</strong>: This forum has been closed to new topics.', 'bbpress' ) );
+
+		// Forum is private and user cannot access
+		if ( bbp_is_forum_private( $forum_id ) && !current_user_can( 'read_private_forums' ) )
+			bbp_add_error( 'bbp_edit_topic_forum_private', __( '<strong>ERROR</strong>: This forum is private and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
+
+		// Forum is hidden and user cannot access
+		if ( bbp_is_forum_hidden( $forum_id ) && !current_user_can( 'read_hidden_forums' ) )
+			bbp_add_error( 'bbp_edit_topic_forum_hidden', __( '<strong>ERROR</strong>: This forum is hidden and you do not have the capability to read or create new topics in it.', 'bbpress' ) );
+	}
+
+	/** Topic Title ***********************************************************/
+
+	if ( !empty( $_POST['bbp_topic_title'] ) )
+		$topic_title = esc_attr( strip_tags( $_POST['bbp_topic_title'] ) );
+
+	// Filter and sanitize
+	$topic_title = apply_filters( 'bbp_edit_topic_pre_title', $topic_title, $topic_id );
+
+	// No topic title
+	if ( empty( $topic_title ) )
+		bbp_add_error( 'bbp_edit_topic_title', __( '<strong>ERROR</strong>: Your topic needs a title.', 'bbpress' ) );
+
+	/** Topic Content *********************************************************/
+
+	if ( !empty( $_POST['bbp_topic_content'] ) )
+		$topic_content = $_POST['bbp_topic_content'];
+
+	// Filter and sanitize
+	$topic_content = apply_filters( 'bbp_edit_topic_pre_content', $topic_content, $topic_id );
+
+	// No topic content
+	if ( empty( $topic_content ) )
+		bbp_add_error( 'bbp_edit_topic_content', __( '<strong>ERROR</strong>: Your topic cannot be empty.', 'bbpress' ) );
+
+	/** Topic Blacklist *******************************************************/
+	
+	if ( !bbp_check_for_blacklist( $anonymous_data, $topic_author, $topic_title, $topic_content ) )
+		bbp_add_error( 'bbp_topic_blacklist', __( '<strong>ERROR</strong>: Your topic cannot be edited at this time.', 'bbpress' ) );
+
+	/** Topic Status **********************************************************/
+	
+	// Maybe put into moderation
+	if ( !bbp_check_for_moderation( $anonymous_data, $topic_author, $topic_title, $topic_content ) ) {
+
+		// Set post status to pending if public or closed
+		if ( in_array( $topic->post_status, array( bbp_get_public_status_id(), bbp_get_closed_status_id() ) ) ) {
+			$topic_status = bbp_get_pending_status_id();
+		}
+
+	// Use existing post_status
+	} else {
+		$topic_status = $topic->post_status;
+	}
+
+	/** Topic Tags ************************************************************/
+
+	// Either replace terms
+	if ( bbp_allow_topic_tags() && current_user_can( 'assign_topic_tags' ) && ! empty( $_POST['bbp_topic_tags'] ) ) {
+
+		// Escape tag input
+		$terms = esc_attr( strip_tags( $_POST['bbp_topic_tags'] ) );
+
+		// Explode by comma
+		if ( strstr( $terms, ',' ) )
+			$terms = explode( ',', $terms );
+
+		// Add topic tag ID as main key
+		$terms = array( bbp_get_topic_tag_tax_id() => $terms );
+
+	// ...or remove them.
+	} elseif ( isset( $_POST['bbp_topic_tags'] ) ) {
+		$terms = array( bbp_get_topic_tag_tax_id() => array() );
+
+	// Existing terms
+	} else {
+		$terms = array( bbp_get_topic_tag_tax_id() => explode( ',', bbp_get_topic_tag_names( $topic_id, ',' ) ) );
+	}
+
+	/** Additional Actions (Before Save) **************************************/
+
+	do_action( 'bbp_edit_topic_pre_extras', $topic_id );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Add the content of the form to $topic_data as an array
+	// Just in time manipulation of topic data before being edited
+	$topic_data = apply_filters( 'bbp_edit_topic_pre_insert', array(
+		'ID'           => $topic_id,
+		'post_title'   => $topic_title,
+		'post_content' => $topic_content,
+		'post_status'  => $topic_status,
+		'post_parent'  => $forum_id,
+		'post_author'  => $topic_author,
+		'post_type'    => bbp_get_topic_post_type(),
+		'tax_input'    => $terms,
+	) );
+
+	// Toggle revisions to avoid duplicates
+	if ( post_type_supports( bbp_get_topic_post_type(), 'revisions' ) ) {
+		$revisions_removed = true;
+		remove_post_type_support( bbp_get_topic_post_type(), 'revisions' );
+	}
+
+	// Insert topic
+	$topic_id = wp_update_post( $topic_data );
+
+	// Toggle revisions back on
+	if ( true === $revisions_removed ) {
+		$revisions_removed = true;
+		add_post_type_support( bbp_get_topic_post_type(), 'revisions' );
+	}
+
+	/** Stickies **************************************************************/
+
+	if ( !empty( $_POST['bbp_stick_topic'] ) && in_array( $_POST['bbp_stick_topic'], array( 'stick', 'super', 'unstick' ) ) ) {
+
+		// What's the dilly?
+		switch ( $_POST['bbp_stick_topic'] ) {
+
+			// Sticky in forum
+			case 'stick'   :
+				bbp_stick_topic( $topic_id );
+				break;
+
+			// Sticky in all forums
+			case 'super'   :
+				bbp_stick_topic( $topic_id, true );
+				break;
+
+			// Normal
+			case 'unstick' :
+			default        :
+				bbp_unstick_topic( $topic_id );
+				break;
+		}
+	}
+
+	/** Revisions *************************************************************/
+
+	// Revision Reason
+	if ( !empty( $_POST['bbp_topic_edit_reason'] ) )
+		$topic_edit_reason = esc_attr( strip_tags( $_POST['bbp_topic_edit_reason'] ) );
+
+	// Update revision log
+	if ( !empty( $_POST['bbp_log_topic_edit'] ) && ( 1 == $_POST['bbp_log_topic_edit'] ) )  {
+		$revision_id = wp_save_post_revision( $topic_id );
+		if ( ! empty( $revision_id ) ) {
+			bbp_update_topic_revision_log( array(
+				'topic_id'    => $topic_id,
+				'revision_id' => $revision_id,
+				'author_id'   => bbp_get_current_user_id(),
+				'reason'      => $topic_edit_reason
+			) );
+		}
+	}
+
+	/** No Errors *************************************************************/
+
+	if ( !empty( $topic_id ) && !is_wp_error( $topic_id ) ) {
+
+		// Update counts, etc...
+		do_action( 'bbp_edit_topic', $topic_id, $forum_id, $anonymous_data, $topic_author , true /* Is edit */ );
+
+		// If the new forum id is not equal to the old forum id, run the
+		// bbp_move_topic action and pass the topic's forum id as the
+		// first arg and topic id as the second to update counts.
+		if ( $forum_id != $topic->post_parent )
+			bbp_move_topic_handler( $topic_id, $topic->post_parent, $forum_id );
+
+		/** Additional Actions (After Save) ***********************************/
+
+		do_action( 'bbp_edit_topic_post_extras', $topic_id );
+
+		/** Redirect **********************************************************/
+
+		// Redirect to
+		$redirect_to = !empty( $_REQUEST['redirect_to'] ) ? $_REQUEST['redirect_to'] : '';
+
+		// View all?
+		$view_all = bbp_get_view_all();
+
+		// Get the topic URL
+		$topic_url = bbp_get_topic_permalink( $topic_id, $redirect_to );
+
+		// Add view all?
+		if ( !empty( $view_all ) )
+			$topic_url = bbp_add_view_all( $topic_url );
+
+		// Allow to be filtered
+		$topic_url = apply_filters( 'bbp_edit_topic_redirect_to', $topic_url, $view_all, $redirect_to );
+
+		/** Successful Edit ***************************************************/
+
+		// Redirect back to new topic
+		wp_safe_redirect( $topic_url );
+
+		// For good measure
+		exit();
+
+	/** Errors ****************************************************************/
+
+	} else {
+		$append_error = ( is_wp_error( $topic_id ) && $topic_id->get_error_message() ) ? $topic_id->get_error_message() . ' ' : '';
+		bbp_add_error( 'bbp_topic_error', __( '<strong>ERROR</strong>: The following problem(s) have been found with your topic:' . $append_error . 'Please try again.', 'bbpress' ) );
+	}
+}
+
+/**
+ * Handle all the extra meta stuff from posting a new topic
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param int $forum_id Optional. Forum id
+ * @param bool|array $anonymous_data Optional. If it is an array, it is
+ *                    extracted and anonymous user info is saved
+ * @param int $author_id Author id
+ * @param bool $is_edit Optional. Is the post being edited? Defaults to false.
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_current_user_id() To get the current user id
+ * @yses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses update_post_meta() To update the topic metas
+ * @uses set_transient() To update the flood check transient for the ip
+ * @uses bbp_update_user_last_posted() To update the users last posted time
+ * @uses bbp_is_subscriptions_active() To check if the subscriptions feature is
+ *                                      activated or not
+ * @uses bbp_is_user_subscribed() To check if the user is subscribed
+ * @uses bbp_remove_user_subscription() To remove the user's subscription
+ * @uses bbp_add_user_subscription() To add the user's subscription
+ * @uses bbp_update_topic_forum_id() To update the topic's forum id
+ * @uses bbp_update_topic_topic_id() To update the topic's topic id
+ * @uses bbp_update_topic_last_reply_id() To update the last reply id topic meta
+ * @uses bbp_update_topic_last_active_id() To update the topic last active id
+ * @uses bbp_update_topic_last_active_time() To update the last active topic meta
+ * @uses bbp_update_topic_reply_count() To update the topic reply count
+ * @uses bbp_update_topic_reply_count_hidden() To udpate the topic hidden reply count
+ * @uses bbp_update_topic_voice_count() To update the topic voice count
+ * @uses bbp_update_topic_walker() To udpate the topic's ancestors
+ */
+function bbp_update_topic( $topic_id = 0, $forum_id = 0, $anonymous_data = false, $author_id = 0, $is_edit = false ) {
+
+	// Validate the ID's passed from 'bbp_new_topic' action
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$forum_id = bbp_get_forum_id( $forum_id );
+
+	// Bail if there is no topic
+	if ( empty( $topic_id ) )
+		return;
+
+	// Check author_id
+	if ( empty( $author_id ) )
+		$author_id = bbp_get_current_user_id();
+
+	// Check forum_id
+	if ( empty( $forum_id ) )
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+	// If anonymous post, store name, email, website and ip in post_meta.
+	// It expects anonymous_data to be sanitized.
+	// Check bbp_filter_anonymous_post_data() for sanitization.
+	if ( !empty( $anonymous_data ) && is_array( $anonymous_data ) ) {
+
+		// Always set at least these three values to empty
+		$defaults = array(
+			'bbp_anonymous_name'    => '',
+			'bbp_anonymous_email'   => '',
+			'bbp_anonymous_website' => '',
+		);
+		$r = bbp_parse_args( $anonymous_data, $defaults, 'update_topic' );
+
+		// Update all anonymous metas
+		foreach( $r as $anon_key => $anon_value ) {
+			update_post_meta( $topic_id, '_' . $anon_key, (string) $anon_value, false );
+		}
+
+		// Set transient for throttle check (only on new, not edit)
+		if ( empty( $is_edit ) ) {
+			set_transient( '_bbp_' . bbp_current_author_ip() . '_last_posted', time() );
+		}
+
+	} else {
+		if ( empty( $is_edit ) && !current_user_can( 'throttle' ) ) {
+			bbp_update_user_last_posted( $author_id );
+		}
+	}
+
+	// Handle Subscription Checkbox
+	if ( bbp_is_subscriptions_active() && !empty( $author_id ) ) {
+		$subscribed = bbp_is_user_subscribed( $author_id, $topic_id );
+		$subscheck  = ( !empty( $_POST['bbp_topic_subscription'] ) && ( 'bbp_subscribe' == $_POST['bbp_topic_subscription'] ) ) ? true : false;
+
+		// Subscribed and unsubscribing
+		if ( true == $subscribed && false == $subscheck ) {
+			bbp_remove_user_subscription( $author_id, $topic_id );
+
+		// Subscribing
+		} elseif ( false == $subscribed && true == $subscheck ) {
+			bbp_add_user_subscription( $author_id, $topic_id );
+		}
+	}
+
+	// Forum topic meta
+	bbp_update_topic_forum_id( $topic_id, $forum_id );
+	bbp_update_topic_topic_id( $topic_id, $topic_id );
+
+	// Update associated topic values if this is a new topic
+	if ( empty( $is_edit ) ) {
+
+		// Update poster IP if not editing
+		update_post_meta( $topic_id, '_bbp_author_ip', bbp_current_author_ip(), false );
+
+		// Last active time
+		$last_active = current_time( 'mysql' );
+
+		// Reply topic meta
+		bbp_update_topic_last_reply_id      ( $topic_id, 0            );
+		bbp_update_topic_last_active_id     ( $topic_id, $topic_id    );
+		bbp_update_topic_last_active_time   ( $topic_id, $last_active );
+		bbp_update_topic_reply_count        ( $topic_id, 0            );
+		bbp_update_topic_reply_count_hidden ( $topic_id, 0            );
+		bbp_update_topic_voice_count        ( $topic_id               );
+
+		// Walk up ancestors and do the dirty work
+		bbp_update_topic_walker( $topic_id, $last_active, $forum_id, 0, false );
+	}
+}
+
+/**
+ * Walks up the post_parent tree from the current topic_id, and updates the
+ * counts of forums above it. This calls a few internal functions that all run
+ * manual queries against the database to get their results. As such, this
+ * function can be costly to run but is necessary to keep everything accurate.
+ *
+ * @since bbPress (r2800)
+ * @param int $topic_id Topic id
+ * @param string $last_active_time Optional. Last active time
+ * @param int $forum_id Optional. Forum id
+ * @param int $reply_id Optional. Reply id
+ * @param bool $refresh Reset all the previous parameters? Defaults to true.
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses get_post_ancestors() To get the topic's ancestors
+ * @uses bbp_is_forum() To check if the ancestor is a forum
+ * @uses bbp_update_forum() To update the forum
+ */
+function bbp_update_topic_walker( $topic_id, $last_active_time = '', $forum_id = 0, $reply_id = 0, $refresh = true ) {
+
+	// Validate topic_id
+	$topic_id  = bbp_get_topic_id( $topic_id );
+
+	// Define local variable(s)
+	$active_id = 0;
+
+	// Topic was passed
+	if ( !empty( $topic_id ) ) {
+
+		// Get the forum ID if none was passed
+		if ( empty( $forum_id )  ) {
+			$forum_id = bbp_get_topic_forum_id( $topic_id );
+		}
+
+		// Set the active_id based on topic_id/reply_id
+		$active_id = empty( $reply_id ) ? $topic_id : $reply_id;
+	}
+
+	// Get topic ancestors
+	$ancestors = array_values( array_unique( array_merge( array( $forum_id ), (array) get_post_ancestors( $topic_id ) ) ) );
+
+	// Topic status
+	$topic_status = get_post_status( $topic_id );
+
+	// If we want a full refresh, unset any of the possibly passed variables
+	if ( true == $refresh ) {
+		$forum_id = $topic_id = $reply_id = $active_id = $last_active_time = 0;
+		$topic_status = bbp_get_public_status_id();
+	}
+
+	// Loop through ancestors
+	if ( !empty( $ancestors ) ) {
+		foreach ( $ancestors as $ancestor ) {
+
+			// If ancestor is a forum, update counts
+			if ( bbp_is_forum( $ancestor ) ) {
+
+				// Update the forum
+				bbp_update_forum( array(
+					'forum_id'           => $ancestor,
+					'last_topic_id'      => $topic_id,
+					'last_reply_id'      => $reply_id,
+					'last_active_id'     => $active_id,
+					'last_active_time'   => 0,
+					'last_active_status' => $topic_status
+				) );
+			}
+		}
+	}
+}
+
+/**
+ * Handle the moving of a topic from one forum to another. This includes walking
+ * up the old and new branches and updating the counts.
+ *
+ * @param int $topic_id Topic id
+ * @param int $old_forum_id Old forum id
+ * @param int $new_forum_id New forum id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_stickies() To get the old forums sticky topics
+ * @uses delete_post_meta() To delete the forum sticky meta
+ * @uses update_post_meta() To update the old forum sticky meta
+ * @uses bbp_stick_topic() To stick the topic in the new forum
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_all_child_ids() To get the public child ids
+ * @uses bbp_update_reply_forum_id() To update the reply forum id
+ * @uses bbp_update_topic_forum_id() To update the topic forum id
+ * @uses get_post_ancestors() To get the topic's ancestors
+ * @uses bbp_is_forum() To check if the ancestor is a forum
+ * @uses bbp_update_forum() To update the forum
+ */
+function bbp_move_topic_handler( $topic_id, $old_forum_id, $new_forum_id ) {
+
+	// Validate parameters
+	$topic_id     = bbp_get_topic_id( $topic_id     );
+	$old_forum_id = bbp_get_forum_id( $old_forum_id );
+	$new_forum_id = bbp_get_forum_id( $new_forum_id );
+
+	/** Stickies **************************************************************/
+
+	// Get forum stickies
+	$old_stickies = bbp_get_stickies( $old_forum_id );
+
+	// Only proceed if stickies are found
+	if ( !empty( $old_stickies ) ) {
+
+		// Define local variables
+		$updated_stickies = array();
+
+		// Loop through stickies of forum
+		foreach ( $old_stickies as $sticky_topic_id ) {
+
+			// Add non-matches to the updated array
+			if ( $topic_id != $sticky_topic_id ) {
+				$updated_stickies[] = $sticky_topic_id;
+			}
+		}
+
+		// No more stickies so delete the beta
+		if ( empty( $updated_stickies ) ) {
+			delete_post_meta ( $old_forum_id, '_bbp_sticky_topics' );
+
+		// Still stickies so update the meta
+		} else {
+			update_post_meta( $old_forum_id, '_bbp_sticky_topics', $updated_stickies );
+		}
+
+		// Topic was sticky, so restick in new forum
+		bbp_stick_topic( $topic_id );
+	}
+	
+	/** Topic Replies *********************************************************/
+
+	// Get the topics replies
+	$replies = bbp_get_all_child_ids( $topic_id, bbp_get_reply_post_type() );
+
+	// Update the forum_id of all replies in the topic
+	foreach ( $replies as $reply_id )
+		bbp_update_reply_forum_id( $reply_id, $new_forum_id );
+
+	// Forum topic meta
+	bbp_update_topic_forum_id( $topic_id, $new_forum_id );
+
+	/** Old forum_id **********************************************************/
+
+	// Get topic ancestors
+	$ancestors = array_values( array_unique( array_merge( array( $old_forum_id ), (array) get_post_ancestors( $old_forum_id ) ) ) );
+
+	// Loop through ancestors
+	if ( !empty( $ancestors ) ) {
+		foreach ( $ancestors as $ancestor ) {
+
+			// If ancestor is a forum, update counts
+			if ( bbp_is_forum( $ancestor ) ) {
+
+				// Update the forum
+				bbp_update_forum( array(
+					'forum_id' => $ancestor,
+				) );
+			}
+		}
+	}
+
+	/** New forum_id **********************************************************/
+
+	// Make sure we're not walking twice
+	if ( !in_array( $new_forum_id, $ancestors ) ) {
+
+		// Get topic ancestors
+		$ancestors = array_values( array_unique( array_merge( array( $new_forum_id ), (array) get_post_ancestors( $new_forum_id ) ) ) );
+
+		// Loop through ancestors
+		if ( !empty( $ancestors ) ) {
+			foreach ( $ancestors as $ancestor ) {
+
+				// If ancestor is a forum, update counts
+				if ( bbp_is_forum( $ancestor ) ) {
+
+					// Update the forum
+					bbp_update_forum( array(
+						'forum_id' => $ancestor,
+					) );
+				}
+			}
+		}
+	}
+}
+
+/**
+ * Merge topic handler
+ *
+ * Handles the front end merge topic submission
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_get_topic() To get the topics
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit the topics
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses do_action() Calls 'bbp_merge_topic' with the destination and source
+ *                    topic ids
+ * @uses bbp_get_topic_subscribers() To get the source topic subscribers
+ * @uses bbp_add_user_subscription() To add the user subscription
+ * @uses bbp_remove_user_subscription() To remove the user subscription
+ * @uses bbp_get_topic_favoriters() To get the source topic favoriters
+ * @uses bbp_add_user_favorite() To add the user favorite
+ * @uses bbp_remove_user_favorite() To remove the user favorite
+ * @uses wp_get_post_terms() To get the source topic tags
+ * @uses wp_set_post_terms() To set the topic tags
+ * @uses wp_delete_object_term_relationships() To delete the topic tags
+ * @uses bbp_open_topic() To open the topic
+ * @uses bbp_unstick_topic() To unstick the topic
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses get_posts() To get the replies
+ * @uses wp_update_post() To update the topic
+ * @uses bbp_update_reply_topic_id() To update the reply topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_update_reply_forum_id() To update the reply forum id
+ * @uses do_action() Calls 'bbp_merged_topic_reply' with the reply id and
+ *                    destination topic id
+ * @uses do_action() Calls 'bbp_merged_topic' with the destination and source
+ *                    topic ids and source topic's forum id
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the topic link
+ */
+function bbp_merge_topic_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not bbp-merge-topic
+	if ( empty( $_POST['action'] ) || ( 'bbp-merge-topic' !== $_POST['action'] ) )
+		return;
+
+	// Define local variable(s)
+	$source_topic_id = $destination_topic_id = 0;
+	$source_topic = $destination_topic = 0;
+	$subscribers = $favoriters = $replies = array();
+
+	/** Source Topic **********************************************************/
+
+	// Topic id
+	if ( empty( $_POST['bbp_topic_id'] ) )
+		bbp_add_error( 'bbp_merge_topic_source_id', __( '<strong>ERROR</strong>: Topic ID not found.', 'bbpress' ) );
+	else
+		$source_topic_id = (int) $_POST['bbp_topic_id'];
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'bbp-merge-topic_' . $source_topic_id ) ) {
+		bbp_add_error( 'bbp_merge_topic_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+
+	// Source topic not found
+	} elseif ( !$source_topic = bbp_get_topic( $source_topic_id ) ) {
+		bbp_add_error( 'bbp_merge_topic_source_not_found', __( '<strong>ERROR</strong>: The topic you want to merge was not found.', 'bbpress' ) );
+		return;
+	}
+
+	// Cannot edit source topic
+	if ( !current_user_can( 'edit_topic', $source_topic->ID ) ) {
+		bbp_add_error( 'bbp_merge_topic_source_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the source topic.', 'bbpress' ) );
+		return;
+	}
+
+	/** Destination Topic *****************************************************/
+
+	// Topic id
+	if ( empty( $_POST['bbp_destination_topic'] ) )
+		bbp_add_error( 'bbp_merge_topic_destination_id', __( '<strong>ERROR</strong>: Destination topic ID not found.', 'bbpress' ) );
+	else
+		$destination_topic_id = (int) $_POST['bbp_destination_topic'];
+
+	// Destination topic not found
+	if ( !$destination_topic = bbp_get_topic( $destination_topic_id ) )
+		bbp_add_error( 'bbp_merge_topic_destination_not_found', __( '<strong>ERROR</strong>: The topic you want to merge to was not found.', 'bbpress' ) );
+
+	// Cannot edit destination topic
+	if ( !current_user_can( 'edit_topic', $destination_topic->ID ) )
+		bbp_add_error( 'bbp_merge_topic_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the destination topic.', 'bbpress' ) );
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors *************************************************************/
+
+	// Update counts, etc...
+	do_action( 'bbp_merge_topic', $destination_topic->ID, $source_topic->ID );
+
+	/** Date Check ************************************************************/
+
+	// Check if the destination topic is older than the source topic
+	if ( strtotime( $source_topic->post_date ) < strtotime( $destination_topic->post_date ) ) {
+
+		// Set destination topic post_date to 1 second before source topic
+		$destination_post_date = date( 'Y-m-d H:i:s', strtotime( $source_topic->post_date ) - 1 );
+
+		$postarr = array(
+			'ID'            => $destination_topic_id,
+			'post_date'     => $destination_post_date,
+			'post_date_gmt' => get_gmt_from_date( $destination_post_date )
+		);
+
+		// Update destination topic
+		wp_update_post( $postarr );
+	}
+
+	/** Subscriptions *********************************************************/
+
+	// Get subscribers from source topic
+	$subscribers = bbp_get_topic_subscribers( $source_topic->ID );
+
+	// Remove the topic from everybody's subscriptions
+	if ( !empty( $subscribers ) ) {
+
+		// Loop through each user
+		foreach ( (array) $subscribers as $subscriber ) {
+
+			// Shift the subscriber if told to
+			if ( !empty( $_POST['bbp_topic_subscribers'] ) && ( 1 == $_POST['bbp_topic_subscribers'] ) && bbp_is_subscriptions_active() )
+				bbp_add_user_subscription( $subscriber, $destination_topic->ID );
+
+			// Remove old subscription
+			bbp_remove_user_subscription( $subscriber, $source_topic->ID );
+		}
+	}
+
+	/** Favorites *************************************************************/
+
+	// Get favoriters from source topic
+	$favoriters = bbp_get_topic_favoriters( $source_topic->ID );
+
+	// Remove the topic from everybody's favorites
+	if ( !empty( $favoriters ) ) {
+
+		// Loop through each user
+		foreach ( (array) $favoriters as $favoriter ) {
+
+			// Shift the favoriter if told to
+			if ( !empty( $_POST['bbp_topic_favoriters'] ) && 1 == $_POST['bbp_topic_favoriters'] )
+				bbp_add_user_favorite( $favoriter, $destination_topic->ID );
+
+			// Remove old favorite
+			bbp_remove_user_favorite( $favoriter, $source_topic->ID );
+		}
+	}
+
+	/** Tags ******************************************************************/
+
+	// Get the source topic tags
+	$source_topic_tags = wp_get_post_terms( $source_topic->ID, bbp_get_topic_tag_tax_id(), array( 'fields' => 'names' ) );
+
+	// Tags to possibly merge
+	if ( !empty( $source_topic_tags ) && !is_wp_error( $source_topic_tags ) ) {
+
+		// Shift the tags if told to
+		if ( !empty( $_POST['bbp_topic_tags'] ) && ( 1 == $_POST['bbp_topic_tags'] ) )
+			wp_set_post_terms( $destination_topic->ID, $source_topic_tags, bbp_get_topic_tag_tax_id(), true );
+
+		// Delete the tags from the source topic
+		wp_delete_object_term_relationships( $source_topic->ID, bbp_get_topic_tag_tax_id() );
+	}
+
+	/** Source Topic **********************************************************/
+
+	// Status
+	bbp_open_topic( $source_topic->ID );
+
+	// Sticky
+	bbp_unstick_topic( $source_topic->ID );
+
+	// Get the replies of the source topic
+	$replies = (array) get_posts( array(
+		'post_parent'    => $source_topic->ID,
+		'post_type'      => bbp_get_reply_post_type(),
+		'posts_per_page' => -1,
+		'order'          => 'ASC'
+	) );
+
+	// Prepend the source topic to its replies array for processing
+	array_unshift( $replies, $source_topic );
+
+	if ( !empty( $replies ) ) {
+
+		/** Merge Replies *****************************************************/
+
+		// Change the post_parent of each reply to the destination topic id
+		foreach ( $replies as $reply ) {
+			$postarr = array(
+				'ID'          => $reply->ID,
+				'post_title'  => sprintf( __( 'Reply To: %s', 'bbpress' ), $destination_topic->post_title ),
+				'post_name'   => false,
+				'post_type'   => bbp_get_reply_post_type(),
+				'post_parent' => $destination_topic->ID,
+				'guid'        => ''
+			);
+
+			wp_update_post( $postarr );
+
+			// Adjust reply meta values
+			bbp_update_reply_topic_id( $reply->ID, $destination_topic->ID                           );
+			bbp_update_reply_forum_id( $reply->ID, bbp_get_topic_forum_id( $destination_topic->ID ) );
+
+			// Do additional actions per merged reply
+			do_action( 'bbp_merged_topic_reply', $reply->ID, $destination_topic->ID );
+		}
+	}
+
+	/** Successful Merge ******************************************************/
+
+	// Update topic's last meta data
+	bbp_update_topic_last_reply_id   ( $destination_topic->ID );
+	bbp_update_topic_last_active_id  ( $destination_topic->ID );
+	bbp_update_topic_last_active_time( $destination_topic->ID );
+
+	// Send the post parent of the source topic as it has been shifted
+	// (possibly to a new forum) so we need to update the counts of the
+	// old forum as well as the new one
+	do_action( 'bbp_merged_topic', $destination_topic->ID, $source_topic->ID, $source_topic->post_parent );
+
+	// Redirect back to new topic
+	wp_safe_redirect( bbp_get_topic_permalink( $destination_topic->ID ) );
+
+	// For good measure
+	exit();
+}
+
+/**
+ * Fix counts on topic merge
+ *
+ * When a topic is merged, update the counts of source and destination topic
+ * and their forums.
+ *
+ * @since bbPress (r2756)
+ *
+ * @param int $destination_topic_id Destination topic id
+ * @param int $source_topic_id Source topic id
+ * @param int $source_topic_forum Source topic's forum id
+ * @uses bbp_update_forum_topic_count() To update the forum topic counts
+ * @uses bbp_update_forum_reply_count() To update the forum reply counts
+ * @uses bbp_update_topic_reply_count() To update the topic reply counts
+ * @uses bbp_update_topic_voice_count() To update the topic voice counts
+ * @uses bbp_update_topic_reply_count_hidden() To update the topic hidden reply
+ *                                              count
+ * @uses do_action() Calls 'bbp_merge_topic_count' with the destination topic
+ *                    id, source topic id & source topic forum id
+ */
+function bbp_merge_topic_count( $destination_topic_id, $source_topic_id, $source_topic_forum_id ) {
+
+	/** Source Topic **********************************************************/
+
+	// Forum Topic Counts
+	bbp_update_forum_topic_count( $source_topic_forum_id );
+
+	// Forum Reply Counts
+	bbp_update_forum_reply_count( $source_topic_forum_id );
+
+	/** Destination Topic *****************************************************/
+
+	// Topic Reply Counts
+	bbp_update_topic_reply_count( $destination_topic_id );
+
+	// Topic Hidden Reply Counts
+	bbp_update_topic_reply_count_hidden( $destination_topic_id );
+
+	// Topic Voice Counts
+	bbp_update_topic_voice_count( $destination_topic_id );
+
+	do_action( 'bbp_merge_topic_count', $destination_topic_id, $source_topic_id, $source_topic_forum_id );
+}
+
+/**
+ * Split topic handler
+ *
+ * Handles the front end split topic submission
+ *
+ * @since bbPress (r2756)
+ *
+ * @uses bbPress:errors::add() To log various error messages
+ * @uses bbp_get_reply() To get the reply
+ * @uses bbp_get_topic() To get the topics
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit the topics
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses do_action() Calls 'bbp_pre_split_topic' with the from reply id, source
+ *                    and destination topic ids
+ * @uses bbp_get_topic_subscribers() To get the source topic subscribers
+ * @uses bbp_add_user_subscription() To add the user subscription
+ * @uses bbp_get_topic_favoriters() To get the source topic favoriters
+ * @uses bbp_add_user_favorite() To add the user favorite
+ * @uses wp_get_post_terms() To get the source topic tags
+ * @uses wp_set_post_terms() To set the topic tags
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::prepare() To prepare our sql query
+ * @uses wpdb::get_results() To execute the sql query and get results
+ * @uses wp_update_post() To update the replies
+ * @uses bbp_update_reply_topic_id() To update the reply topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_update_reply_forum_id() To update the reply forum id
+ * @uses do_action() Calls 'bbp_split_topic_reply' with the reply id and
+ *                    destination topic id
+ * @uses bbp_update_topic_last_reply_id() To update the topic last reply id
+ * @uses bbp_update_topic_last_active_time() To update the topic last active meta
+ * @uses do_action() Calls 'bbp_post_split_topic' with the destination and
+ *                    source topic ids and source topic's forum id
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the topic link
+ */
+function bbp_split_topic_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not 'bbp-split-topic'
+	if ( empty( $_POST['action'] ) || ( 'bbp-split-topic' !== $_POST['action'] ) )
+		return;
+
+	global $wpdb;
+
+	// Prevent debug notices
+	$from_reply_id = $destination_topic_id = 0;
+	$destination_topic_title = '';
+	$destination_topic = $from_reply = $source_topic = '';
+	$split_option = false;
+
+	/** Split Reply ***********************************************************/
+
+	if ( empty( $_POST['bbp_reply_id'] ) )
+		bbp_add_error( 'bbp_split_topic_reply_id', __( '<strong>ERROR</strong>: Reply ID to split the topic from not found!', 'bbpress' ) );
+	else
+		$from_reply_id = (int) $_POST['bbp_reply_id'];
+
+	$from_reply = bbp_get_reply( $from_reply_id );
+
+	// Reply exists
+	if ( empty( $from_reply ) )
+		bbp_add_error( 'bbp_split_topic_r_not_found', __( '<strong>ERROR</strong>: The reply you want to split from was not found.', 'bbpress' ) );
+
+	/** Topic to Split ********************************************************/
+
+	// Get the topic being split
+	$source_topic = bbp_get_topic( $from_reply->post_parent );
+
+	// No topic
+	if ( empty( $source_topic ) )
+		bbp_add_error( 'bbp_split_topic_source_not_found', __( '<strong>ERROR</strong>: The topic you want to split was not found.', 'bbpress' ) );
+
+	// Nonce check failed
+	if ( ! bbp_verify_nonce_request( 'bbp-split-topic_' . $source_topic->ID ) ) {
+		bbp_add_error( 'bbp_split_topic_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Use cannot edit topic
+	if ( !current_user_can( 'edit_topic', $source_topic->ID ) )
+		bbp_add_error( 'bbp_split_topic_source_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the source topic.', 'bbpress' ) );
+
+	// How to Split
+	if ( !empty( $_POST['bbp_topic_split_option'] ) )
+		$split_option = (string) trim( $_POST['bbp_topic_split_option'] );
+
+	// Invalid split option
+	if ( empty( $split_option ) || !in_array( $split_option, array( 'existing', 'reply' ) ) ) {
+		bbp_add_error( 'bbp_split_topic_option', __( '<strong>ERROR</strong>: You need to choose a valid split option.', 'bbpress' ) );
+
+	// Valid Split Option
+	} else {
+
+		// What kind of split
+		switch ( $split_option ) {
+
+			// Into an existing topic
+			case 'existing' :
+
+				// Get destination topic id
+				if ( empty( $_POST['bbp_destination_topic'] ) )
+					bbp_add_error( 'bbp_split_topic_destination_id', __( '<strong>ERROR</strong>: Destination topic ID not found!', 'bbpress' ) );
+				else
+					$destination_topic_id = (int) $_POST['bbp_destination_topic'];
+
+				// Get the destination topic
+				$destination_topic = bbp_get_topic( $destination_topic_id );
+
+				// No destination topic
+				if ( empty( $destination_topic ) )
+					bbp_add_error( 'bbp_split_topic_destination_not_found', __( '<strong>ERROR</strong>: The topic you want to split to was not found!', 'bbpress' ) );
+
+				// User cannot edit the destination topic
+				if ( !current_user_can( 'edit_topic', $destination_topic->ID ) )
+					bbp_add_error( 'bbp_split_topic_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to edit the destination topic!', 'bbpress' ) );
+
+				break;
+
+			// Split at reply into a new topic
+			case 'reply' :
+			default :
+
+				// User needs to be able to publish topics
+				if ( current_user_can( 'publish_topics' ) ) {
+
+					// Use the new title that was passed
+					if ( !empty( $_POST['bbp_topic_split_destination_title'] ) ) {
+						$destination_topic_title = esc_attr( strip_tags( $_POST['bbp_topic_split_destination_title'] ) );
+
+					// Use the source topic title
+					} else {
+						$destination_topic_title = $source_topic->post_title;
+					}
+
+					// Setup the updated topic parameters
+					$postarr = array(
+						'ID'          => $from_reply->ID,
+						'post_title'  => $destination_topic_title,
+						'post_name'   => false,
+						'post_type'   => bbp_get_topic_post_type(),
+						'post_parent' => $source_topic->post_parent,
+						'guid'        => ''
+					);
+
+					// Update the topic
+					$destination_topic_id = wp_update_post( $postarr );
+					$destination_topic    = bbp_get_topic( $destination_topic_id );
+
+					// Make sure the new topic knows its a topic
+					bbp_update_topic_topic_id( $from_reply->ID );
+
+					// Shouldn't happen
+					if ( false == $destination_topic_id || is_wp_error( $destination_topic_id ) || empty( $destination_topic ) ) {
+						bbp_add_error( 'bbp_split_topic_destination_reply', __( '<strong>ERROR</strong>: There was a problem converting the reply into the topic. Please try again.', 'bbpress' ) );
+					}
+
+				// User cannot publish posts
+				} else {
+					bbp_add_error( 'bbp_split_topic_destination_permission', __( '<strong>ERROR</strong>: You do not have the permissions to create new topics. The reply could not be converted into a topic.', 'bbpress' ) );
+				}
+
+				break;
+		}
+	}
+
+	// Bail if there are errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No Errors - Do the Spit ***********************************************/
+
+	// Update counts, etc...
+	do_action( 'bbp_pre_split_topic', $from_reply->ID, $source_topic->ID, $destination_topic->ID );
+
+	/** Date Check ************************************************************/
+
+	// Check if the destination topic is older than the from reply
+	if ( strtotime( $from_reply->post_date ) < strtotime( $destination_topic->post_date ) ) {
+
+		// Set destination topic post_date to 1 second before from reply
+		$destination_post_date = date( 'Y-m-d H:i:s', strtotime( $from_reply->post_date ) - 1 );
+
+		$postarr = array(
+			'ID'            => $destination_topic_id,
+			'post_date'     => $destination_post_date,
+			'post_date_gmt' => get_gmt_from_date( $destination_post_date )
+		);
+
+		// Update destination topic
+		wp_update_post( $postarr );
+	}
+
+	/** Subscriptions *********************************************************/
+
+	// Copy the subscribers
+	if ( !empty( $_POST['bbp_topic_subscribers'] ) && 1 == $_POST['bbp_topic_subscribers'] && bbp_is_subscriptions_active() ) {
+
+		// Get the subscribers
+		$subscribers = bbp_get_topic_subscribers( $source_topic->ID );
+
+		if ( !empty( $subscribers ) ) {
+
+			// Add subscribers to new topic
+			foreach ( (array) $subscribers as $subscriber ) {
+				bbp_add_user_subscription( $subscriber, $destination_topic->ID );
+			}
+		}
+	}
+
+	/** Favorites *************************************************************/
+
+	// Copy the favoriters if told to
+	if ( !empty( $_POST['bbp_topic_favoriters'] ) && 1 == $_POST['bbp_topic_favoriters'] ) {
+
+		// Get the favoriters
+		$favoriters = bbp_get_topic_favoriters( $source_topic->ID );
+
+		if ( !empty( $favoriters ) ) {
+
+			// Add the favoriters to new topic
+			foreach ( (array) $favoriters as $favoriter ) {
+				bbp_add_user_favorite( $favoriter, $destination_topic->ID );
+			}
+		}
+	}
+
+	/** Tags ******************************************************************/
+
+	// Copy the tags if told to
+	if ( !empty( $_POST['bbp_topic_tags'] ) && ( 1 == $_POST['bbp_topic_tags'] ) ) {
+
+		// Get the source topic tags
+		$source_topic_tags = wp_get_post_terms( $source_topic->ID, bbp_get_topic_tag_tax_id(), array( 'fields' => 'names' ) );
+
+		if ( !empty( $source_topic_tags ) ) {
+			wp_set_post_terms( $destination_topic->ID, $source_topic_tags, bbp_get_topic_tag_tax_id(), true );
+		}
+	}
+
+	/** Split Replies *********************************************************/
+
+	// get_posts() is not used because it doesn't allow us to use '>='
+	// comparision without a filter.
+	$replies = (array) $wpdb->get_results( $wpdb->prepare( "SELECT * FROM {$wpdb->posts} WHERE {$wpdb->posts}.post_date >= %s AND {$wpdb->posts}.post_parent = %d AND {$wpdb->posts}.post_type = %s ORDER BY {$wpdb->posts}.post_date ASC", $from_reply->post_date, $source_topic->ID, bbp_get_reply_post_type() ) );
+
+	// Make sure there are replies to loop through
+	if ( !empty( $replies ) && !is_wp_error( $replies ) ) {
+
+		// Calculate starting point for reply positions
+		switch ( $split_option ) {
+
+			// Get topic reply count for existing topic
+			case 'existing' :
+				$reply_position = bbp_get_topic_reply_count( $destination_topic->ID );
+				break;
+
+			// Account for new lead topic
+			case 'reply'    :
+				$reply_position = 1;
+				break;
+		}
+
+		// Change the post_parent of each reply to the destination topic id
+		foreach ( $replies as $reply ) {
+
+			// Bump the reply position each iteration through the loop
+			$reply_position++;
+
+			// New reply data
+			$postarr = array(
+				'ID'            => $reply->ID,
+				'post_title'    => sprintf( __( 'Reply To: %s', 'bbpress' ), $destination_topic->post_title ),
+				'post_name'     => false, // will be automatically generated
+				'post_parent'   => $destination_topic->ID,
+				'post_position' => $reply_position,
+				'guid'          => ''
+			);
+
+			// Update the reply
+			wp_update_post( $postarr );
+
+			// Adjust reply meta values
+			bbp_update_reply_topic_id( $reply->ID, $destination_topic->ID                           );
+			bbp_update_reply_forum_id( $reply->ID, bbp_get_topic_forum_id( $destination_topic->ID ) );
+
+			// Do additional actions per split reply
+			do_action( 'bbp_split_topic_reply', $reply->ID, $destination_topic->ID );
+		}
+
+		// Set the last reply ID and freshness
+		$last_reply_id = $reply->ID;
+		$freshness     = $reply->post_date;
+
+	// Set the last reply ID and freshness to the from_reply
+	} else {
+		$last_reply_id = $from_reply->ID;
+		$freshness     = $from_reply->post_date;
+	}
+
+	// It is a new topic and we need to set some default metas to make
+	// the topic display in bbp_has_topics() list
+	if ( 'reply' == $split_option ) {
+		bbp_update_topic_last_reply_id   ( $destination_topic->ID, $last_reply_id );
+		bbp_update_topic_last_active_id  ( $destination_topic->ID, $last_reply_id );
+		bbp_update_topic_last_active_time( $destination_topic->ID, $freshness     );
+	}
+
+	// Update source topic ID last active
+	bbp_update_topic_last_reply_id   ( $source_topic->ID );
+	bbp_update_topic_last_active_id  ( $source_topic->ID );
+	bbp_update_topic_last_active_time( $source_topic->ID );
+	
+	/** Successful Split ******************************************************/
+
+	// Update counts, etc...
+	do_action( 'bbp_post_split_topic', $from_reply->ID, $source_topic->ID, $destination_topic->ID );
+
+	// Redirect back to the topic
+	wp_safe_redirect( bbp_get_topic_permalink( $destination_topic->ID ) );
+
+	// For good measure
+	exit();
+}
+
+/**
+ * Fix counts on topic split
+ *
+ * When a topic is split, update the counts of source and destination topic
+ * and their forums.
+ *
+ * @since bbPress (r2756)
+ *
+ * @param int $from_reply_id From reply id
+ * @param int $source_topic_id Source topic id
+ * @param int $destination_topic_id Destination topic id
+ * @uses bbp_update_forum_topic_count() To update the forum topic counts
+ * @uses bbp_update_forum_reply_count() To update the forum reply counts
+ * @uses bbp_update_topic_reply_count() To update the topic reply counts
+ * @uses bbp_update_topic_voice_count() To update the topic voice counts
+ * @uses bbp_update_topic_reply_count_hidden() To update the topic hidden reply
+ *                                              count
+ * @uses do_action() Calls 'bbp_split_topic_count' with the from reply id,
+ *                    source topic id & destination topic id
+ */
+function bbp_split_topic_count( $from_reply_id, $source_topic_id, $destination_topic_id ) {
+
+	// Forum Topic Counts
+	bbp_update_forum_topic_count( $destination_topic_id );
+
+	// Forum Reply Counts
+	bbp_update_forum_reply_count( $destination_topic_id );
+
+	// Topic Reply Counts
+	bbp_update_topic_reply_count( $source_topic_id      );
+	bbp_update_topic_reply_count( $destination_topic_id );
+
+	// Topic Hidden Reply Counts
+	bbp_update_topic_reply_count_hidden( $source_topic_id      );
+	bbp_update_topic_reply_count_hidden( $destination_topic_id );
+
+	// Topic Voice Counts
+	bbp_update_topic_voice_count( $source_topic_id      );
+	bbp_update_topic_voice_count( $destination_topic_id );
+
+	do_action( 'bbp_split_topic_count', $from_reply_id, $source_topic_id, $destination_topic_id );
+}
+
+/**
+ * Handles the front end tag management (renaming, merging, destroying)
+ *
+ * @since bbPress (r2768)
+ *
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit/delete tags
+ * @uses bbPress::errors::add() To log the error messages
+ * @uses wp_update_term() To update the topic tag
+ * @uses get_term_link() To get the topic tag url
+ * @uses term_exists() To check if the topic tag already exists
+ * @uses wp_insert_term() To insert a topic tag
+ * @uses wp_delete_term() To delete the topic tag
+ * @uses home_url() To get the blog's home page url
+ * @uses do_action() Calls actions based on the actions with associated args
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ * @uses wp_safe_redirect() To redirect to the url
+ */
+function bbp_edit_topic_tag_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if required POST actions aren't passed
+	if ( empty( $_POST['tag-id'] ) || empty( $_POST['action'] ) )
+		return;
+
+	// Setup possible get actions
+	$possible_actions = array(
+		'bbp-update-topic-tag',
+		'bbp-merge-topic-tag',
+		'bbp-delete-topic-tag'
+	);
+
+	// Bail if actions aren't meant for this function
+	if ( !in_array( $_POST['action'], $possible_actions ) )
+		return;
+
+	// Setup vars
+	$action = $_POST['action'];
+	$tag_id = (int) $_POST['tag-id'];
+	$tag    = get_term( $tag_id, bbp_get_topic_tag_tax_id() );
+
+	// Tag does not exist
+	if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
+		bbp_add_error( 'bbp_manage_topic_invalid_tag', sprintf( __( '<strong>ERROR</strong>: The following problem(s) have been found while getting the tag: %s', 'bbpress' ), $tag->get_error_message() ) );
+		return;
+	}
+
+	// What action are we trying to perform?
+	switch ( $action ) {
+
+		// Update tag
+		case 'bbp-update-topic-tag' :
+
+			// Nonce check
+			if ( ! bbp_verify_nonce_request( 'update-tag_' . $tag_id ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_update_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+				return;
+			}
+
+			// Can user edit topic tags?
+			if ( !current_user_can( 'edit_topic_tags' ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_update_permissions', __( '<strong>ERROR</strong>: You do not have the permissions to edit the topic tags.', 'bbpress' ) );
+				return;
+			}
+
+			// No tag name was provided
+			if ( empty( $_POST['tag-name'] ) || !$name = $_POST['tag-name'] ) {
+				bbp_add_error( 'bbp_manage_topic_tag_update_name', __( '<strong>ERROR</strong>: You need to enter a tag name.', 'bbpress' ) );
+				return;
+			}
+
+			// Attempt to update the tag
+			$slug = !empty( $_POST['tag-slug'] ) ? $_POST['tag-slug'] : '';
+			$tag  = wp_update_term( $tag_id, bbp_get_topic_tag_tax_id(), array( 'name' => $name, 'slug' => $slug ) );
+
+			// Cannot update tag
+			if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
+				bbp_add_error( 'bbp_manage_topic_tag_update_error', sprintf( __( '<strong>ERROR</strong>: The following problem(s) have been found while updating the tag: %s', 'bbpress' ), $tag->get_error_message() ) );
+				return;
+			}
+
+			// Redirect
+			$redirect = get_term_link( $tag_id, bbp_get_topic_tag_tax_id() );
+
+			// Update counts, etc...
+			do_action( 'bbp_update_topic_tag', $tag_id, $tag, $name, $slug );
+
+			break;
+
+		// Merge two tags
+		case 'bbp-merge-topic-tag'  :
+
+			// Nonce check
+			if ( ! bbp_verify_nonce_request( 'merge-tag_' . $tag_id ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+				return;
+			}
+
+			// Can user edit topic tags?
+			if ( !current_user_can( 'edit_topic_tags' ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_permissions', __( '<strong>ERROR</strong>: You do not have the permissions to edit the topic tags.', 'bbpress' ) );
+				return;
+			}
+
+			// No tag name was provided
+			if ( empty( $_POST['tag-existing-name'] ) || !$name = $_POST['tag-existing-name'] ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_name', __( '<strong>ERROR</strong>: You need to enter a tag name.', 'bbpress' ) );
+				return;
+			}
+
+			// If term does not exist, create it
+			if ( !$tag = term_exists( $name, bbp_get_topic_tag_tax_id() ) )
+				$tag = wp_insert_term( $name, bbp_get_topic_tag_tax_id() );
+
+			// Problem inserting the new term
+			if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_error', sprintf( __( '<strong>ERROR</strong>: The following problem(s) have been found while merging the tags: %s', 'bbpress' ), $tag->get_error_message() ) );
+				return;
+			}
+
+			// Merging in to...
+			$to_tag = $tag['term_id'];
+
+			// Attempting to merge a tag into itself
+			if ( $tag_id == $to_tag ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_same', __( '<strong>ERROR</strong>: The tags which are being merged can not be the same.', 'bbpress' ) );
+				return;
+			}
+
+			// Delete the old term
+			$tag = wp_delete_term( $tag_id, bbp_get_topic_tag_tax_id(), array( 'default' => $to_tag, 'force_default' => true ) );
+
+			// Error merging the terms
+			if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
+				bbp_add_error( 'bbp_manage_topic_tag_merge_error', sprintf( __( '<strong>ERROR</strong>: The following problem(s) have been found while merging the tags: %s', 'bbpress' ), $tag->get_error_message() ) );
+				return;
+			}
+
+			// Redirect
+			$redirect = get_term_link( (int) $to_tag, bbp_get_topic_tag_tax_id() );
+
+			// Update counts, etc...
+			do_action( 'bbp_merge_topic_tag', $tag_id, $to_tag, $tag );
+
+			break;
+
+		// Delete tag
+		case 'bbp-delete-topic-tag' :
+
+			// Nonce check
+			if ( ! bbp_verify_nonce_request( 'delete-tag_' . $tag_id ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_delete_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+				return;
+			}
+
+			// Can user delete topic tags?
+			if ( !current_user_can( 'delete_topic_tags' ) ) {
+				bbp_add_error( 'bbp_manage_topic_tag_delete_permissions', __( '<strong>ERROR</strong>: You do not have the permissions to delete the topic tags.', 'bbpress' ) );
+				return;
+			}
+
+			// Attempt to delete term
+			$tag = wp_delete_term( $tag_id, bbp_get_topic_tag_tax_id() );
+
+			// Error deleting term
+			if ( is_wp_error( $tag ) && $tag->get_error_message() ) {
+				bbp_add_error( 'bbp_manage_topic_tag_delete_error', sprintf( __( '<strong>ERROR</strong>: The following problem(s) have been found while deleting the tag: %s', 'bbpress' ), $tag->get_error_message() ) );
+				return;
+			}
+
+			// We don't have any other place to go other than home! Or we may die because of the 404 disease
+			$redirect = home_url();
+
+			// Update counts, etc...
+			do_action( 'bbp_delete_topic_tag', $tag_id, $tag );
+
+			break;
+	}
+
+	/** Successful Moderation *************************************************/
+
+	// Redirect back
+	$redirect = ( !empty( $redirect ) && !is_wp_error( $redirect ) ) ? $redirect : home_url();
+	wp_safe_redirect( $redirect );
+
+	// For good measure
+	exit();
+}
+
+/** Stickies ******************************************************************/
+
+/**
+ * Return sticky topics of a forum
+ *
+ * @since bbPress (r2592)
+ *
+ * @param int $forum_id Optional. If not passed, super stickies are returned.
+ * @uses bbp_get_super_stickies() To get the super stickies
+ * @uses get_post_meta() To get the forum stickies
+ * @uses apply_filters() Calls 'bbp_get_stickies' with the stickies and forum id
+ * @return array IDs of sticky topics of a forum or super stickies
+ */
+function bbp_get_stickies( $forum_id = 0 ) {
+	$stickies = empty( $forum_id ) ? bbp_get_super_stickies() : get_post_meta( $forum_id, '_bbp_sticky_topics', true );
+	$stickies = ( empty( $stickies ) || !is_array( $stickies ) ) ? array() : $stickies;
+
+	return apply_filters( 'bbp_get_stickies', $stickies, (int) $forum_id );
+}
+
+/**
+ * Return topics stuck to front page of the forums
+ *
+ * @since bbPress (r2592)
+ *
+ * @uses get_option() To get super sticky topics
+ * @uses apply_filters() Calls 'bbp_get_super_stickies' with the stickies
+ * @return array IDs of super sticky topics
+ */
+function bbp_get_super_stickies() {
+	$stickies = get_option( '_bbp_super_sticky_topics', array() );
+	$stickies = ( empty( $stickies ) || !is_array( $stickies ) ) ? array() : $stickies;
+
+	return apply_filters( 'bbp_get_super_stickies', $stickies );
+}
+
+/** Topics Actions ************************************************************/
+
+/**
+ * Handles the front end opening/closing, spamming/unspamming,
+ * sticking/unsticking and trashing/untrashing/deleting of topics
+ *
+ * @since bbPress (r2727)
+ *
+ * @uses bbp_get_topic() To get the topic
+ * @uses current_user_can() To check if the user is capable of editing or
+ *                           deleting the topic
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses check_ajax_referer() To verify the nonce and check the referer
+ * @uses bbp_is_topic_open() To check if the topic is open
+ * @uses bbp_close_topic() To close the topic
+ * @uses bbp_open_topic() To open the topic
+ * @uses bbp_is_topic_sticky() To check if the topic is a sticky
+ * @uses bbp_unstick_topic() To unstick the topic
+ * @uses bbp_stick_topic() To stick the topic
+ * @uses bbp_is_topic_spam() To check if the topic is marked as spam
+ * @uses bbp_spam_topic() To make the topic as spam
+ * @uses bbp_unspam_topic() To unmark the topic as spam
+ * @uses wp_trash_post() To trash the topic
+ * @uses wp_untrash_post() To untrash the topic
+ * @uses wp_delete_post() To delete the topic
+ * @uses do_action() Calls 'bbp_toggle_topic_handler' with success, post data
+ *                    and action
+ * @uses bbp_get_forum_permalink() To get the forum link
+ * @uses bbp_get_topic_permalink() To get the topic link
+ * @uses add_query_arg() To add args to the url
+ * @uses wp_safe_redirect() To redirect to the topic
+ * @uses bbPress::errors:add() To log the error messages
+ */
+function bbp_toggle_topic_handler() {
+
+	// Bail if not a GET action
+	if ( 'GET' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if required GET actions aren't passed
+	if ( empty( $_GET['topic_id'] ) || empty( $_GET['action'] ) )
+		return;
+
+	// Setup possible get actions
+	$possible_actions = array(
+		'bbp_toggle_topic_close',
+		'bbp_toggle_topic_stick',
+		'bbp_toggle_topic_spam',
+		'bbp_toggle_topic_trash'
+	);
+
+	// Bail if actions aren't meant for this function
+	if ( !in_array( $_GET['action'], $possible_actions ) )
+		return;
+
+	$failure   = '';                         // Empty failure string
+	$view_all  = false;                      // Assume not viewing all
+	$action    = $_GET['action'];            // What action is taking place?
+	$topic_id  = (int) $_GET['topic_id'];    // What's the topic id?
+	$success   = false;                      // Flag
+	$post_data = array( 'ID' => $topic_id ); // Prelim array
+	$redirect  = '';                         // Empty redirect URL
+
+	// Make sure topic exists
+	$topic = bbp_get_topic( $topic_id );
+	if ( empty( $topic ) )
+		return;
+
+	// What is the user doing here?
+	if ( !current_user_can( 'edit_topic', $topic->ID ) || ( 'bbp_toggle_topic_trash' == $action && !current_user_can( 'delete_topic', $topic->ID ) ) ) {
+		bbp_add_error( 'bbp_toggle_topic_permission', __( '<strong>ERROR:</strong> You do not have the permission to do that.', 'bbpress' ) );
+		return;
+	}
+
+	// What action are we trying to perform?
+	switch ( $action ) {
+
+		// Toggle open/close
+		case 'bbp_toggle_topic_close' :
+			check_ajax_referer( 'close-topic_' . $topic_id );
+
+			$is_open = bbp_is_topic_open( $topic_id );
+			$success = $is_open ? bbp_close_topic( $topic_id ) : bbp_open_topic( $topic_id );
+			$failure = $is_open ? __( '<strong>ERROR</strong>: There was a problem closing the topic.', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem opening the topic.', 'bbpress' );
+
+			break;
+
+		// Toggle sticky/super-sticky/unstick
+		case 'bbp_toggle_topic_stick' :
+			check_ajax_referer( 'stick-topic_' . $topic_id );
+
+			$is_sticky = bbp_is_topic_sticky( $topic_id );
+			$is_super  = ( empty( $is_sticky ) && !empty( $_GET['super'] ) && 1 == (int) $_GET['super'] ) ? true : false;
+			$success   = $is_sticky ? bbp_unstick_topic( $topic_id ) : bbp_stick_topic( $topic_id, $is_super );
+			$failure   = $is_sticky ? __( '<strong>ERROR</strong>: There was a problem unsticking the topic.', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem sticking the topic.', 'bbpress' );
+
+			break;
+
+		// Toggle spam
+		case 'bbp_toggle_topic_spam' :
+			check_ajax_referer( 'spam-topic_' . $topic_id );
+
+			$is_spam  = bbp_is_topic_spam( $topic_id );
+			$success  = $is_spam ? bbp_unspam_topic( $topic_id ) : bbp_spam_topic( $topic_id );
+			$failure  = $is_spam ? __( '<strong>ERROR</strong>: There was a problem unmarking the topic as spam.', 'bbpress' ) : __( '<strong>ERROR</strong>: There was a problem marking the topic as spam.', 'bbpress' );
+			$view_all = !$is_spam;
+
+			break;
+
+		// Toggle trash
+		case 'bbp_toggle_topic_trash' :
+
+			$sub_action = in_array( $_GET['sub_action'], array( 'trash', 'untrash', 'delete' ) ) ? $_GET['sub_action'] : false;
+
+			if ( empty( $sub_action ) )
+				break;
+
+			switch ( $sub_action ) {
+				case 'trash':
+					check_ajax_referer( 'trash-' . bbp_get_topic_post_type() . '_' . $topic_id );
+
+					$view_all = true;
+					$success  = wp_trash_post( $topic_id );
+					$failure  = __( '<strong>ERROR</strong>: There was a problem trashing the topic.', 'bbpress' );
+
+					break;
+
+				case 'untrash':
+					check_ajax_referer( 'untrash-' . bbp_get_topic_post_type() . '_' . $topic_id );
+
+					$success = wp_untrash_post( $topic_id );
+					$failure = __( '<strong>ERROR</strong>: There was a problem untrashing the topic.', 'bbpress' );
+
+					break;
+
+				case 'delete':
+					check_ajax_referer( 'delete-' . bbp_get_topic_post_type() . '_' . $topic_id );
+
+					$success = wp_delete_post( $topic_id );
+					$failure = __( '<strong>ERROR</strong>: There was a problem deleting the topic.', 'bbpress' );
+
+					break;
+			}
+
+			break;
+	}
+
+	// Do additional topic toggle actions
+	do_action( 'bbp_toggle_topic_handler', $success, $post_data, $action );
+
+	// No errors
+	if ( false != $success && !is_wp_error( $success ) ) {
+
+		// Redirect back to the topic's forum
+		if ( isset( $sub_action ) && ( 'delete' == $sub_action ) ) {
+			$redirect = bbp_get_forum_permalink( $success->post_parent );
+
+		// Redirect back to the topic
+		} else {
+
+			// Get the redirect detination
+			$permalink = bbp_get_topic_permalink( $topic_id );
+			$redirect  = bbp_add_view_all( $permalink, $view_all );
+		}
+
+		wp_safe_redirect( $redirect );
+
+		// For good measure
+		exit();
+
+	// Handle errors
+	} else {
+		bbp_add_error( 'bbp_toggle_topic', $failure );
+	}
+}
+
+/** Favorites & Subscriptions *************************************************/
+
+/**
+ * Remove a deleted topic from all users' favorites
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $topic_id Topic ID to remove
+ * @uses bbp_get_topic_favoriters() To get the topic's favoriters
+ * @uses bbp_remove_user_favorite() To remove the topic from user's favorites
+ */
+function bbp_remove_topic_from_all_favorites( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Bail if no topic
+	if ( empty( $topic_id ) )
+		return;
+
+	// Get users
+	$users = (array) bbp_get_topic_favoriters( $topic_id );
+
+	// Users exist
+	if ( !empty( $users ) ) {
+
+		// Loop through users
+		foreach ( $users as $user ) {
+
+			// Remove each user
+			bbp_remove_user_favorite( $user, $topic_id );
+		}
+	}
+}
+
+/**
+ * Remove a deleted topic from all users' subscriptions
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $topic_id Topic ID to remove
+ * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
+ * @uses bbp_get_topic_subscribers() To get the topic subscribers
+ * @uses bbp_remove_user_subscription() To remove the user subscription
+ */
+function bbp_remove_topic_from_all_subscriptions( $topic_id = 0 ) {
+
+	// Subscriptions are not active
+	if ( !bbp_is_subscriptions_active() )
+		return;
+
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Bail if no topic
+	if ( empty( $topic_id ) )
+		return;
+
+	// Get users
+	$users = (array) bbp_get_topic_subscribers( $topic_id );
+
+	// Users exist
+	if ( !empty( $users ) ) {
+
+		// Loop through users
+		foreach ( $users as $user ) {
+
+			// Remove each user
+			bbp_remove_user_subscription( $user, $topic_id );
+		}
+	}
+}
+
+/** Count Bumpers *************************************************************/
+
+/**
+ * Bump the total reply count of a topic
+ *
+ * @since bbPress (r3825)
+ *
+ * @param int $topic_id Optional. Forum id.
+ * @param int $difference Optional. Default 1
+ * @param bool $update_ancestors Optional. Default true
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses update_post_meta() To update the topic's reply count meta
+ * @uses apply_filters() Calls 'bbp_bump_topic_reply_count' with the reply
+ *                        count, topic id, and difference
+ * @return int Forum reply count
+ */
+function bbp_bump_topic_reply_count( $topic_id = 0, $difference = 1 ) {
+
+	// Get counts
+	$topic_id    = bbp_get_topic_id( $topic_id );
+	$reply_count = bbp_get_topic_reply_count( $topic_id, false );
+	$new_count   = (int) $reply_count + (int) $difference;
+
+	// Update this topic id's reply count
+	update_post_meta( $topic_id, '_bbp_reply_count', (int) $new_count );
+
+	return (int) apply_filters( 'bbp_bump_topic_reply_count', (int) $new_count, $topic_id, (int) $difference );
+}
+
+/**
+ * Bump the total hidden reply count of a topic
+ *
+ * @since bbPress (r3825)
+ *
+ * @param int $topic_id Optional. Forum id.
+ * @param int $difference Optional. Default 1
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses update_post_meta() To update the topic's reply count meta
+ * @uses apply_filters() Calls 'bbp_bump_topic_reply_count_hidden' with the
+ *                        reply count, topic id, and difference
+ * @return int Forum hidden reply count
+ */
+function bbp_bump_topic_reply_count_hidden( $topic_id = 0, $difference = 1 ) {
+
+	// Get counts
+	$topic_id    = bbp_get_topic_id( $topic_id );
+	$reply_count = bbp_get_topic_reply_count_hidden( $topic_id, false );
+	$new_count   = (int) $reply_count + (int) $difference;
+
+	// Update this topic id's hidder reply count
+	update_post_meta( $topic_id, '_bbp_reply_count_hidden', (int) $new_count );
+
+	return (int) apply_filters( 'bbp_bump_topic_reply_count_hidden', (int) $new_count, $topic_id, (int) $difference );
+}
+
+/** Topic Updaters ************************************************************/
+
+/**
+ * Update the topic's forum id
+ *
+ * @since bbPress (r2855)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @param int $forum_id Optional. Forum id
+ * @uses bbp_is_reply() TO check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses get_post_field() To get the post parent of the topic id
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses update_post_meta() To update the topic forum id meta
+ * @uses apply_filters() Calls 'bbp_update_topic_forum_id' with the forum id
+ *                        and topic id
+ * @return int Forum id
+ */
+function bbp_update_topic_forum_id( $topic_id = 0, $forum_id = 0 ) {
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	else
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $forum_id ) )
+		$forum_id = get_post_field( 'post_parent', $topic_id );
+
+	update_post_meta( $topic_id, '_bbp_forum_id', (int) $forum_id );
+
+	return apply_filters( 'bbp_update_topic_forum_id', (int) $forum_id, $topic_id );
+}
+
+/**
+ * Update the topic's topic id
+ *
+ * @since bbPress (r2954)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses update_post_meta() To update the topic's topic id meta
+ * @uses apply_filters() Calls 'bbp_update_topic_topic_id' with the topic id
+ * @return int Topic id
+ */
+function bbp_update_topic_topic_id( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	update_post_meta( $topic_id, '_bbp_topic_id', (int) $topic_id );
+
+	return apply_filters( 'bbp_update_topic_topic_id', (int) $topic_id );
+}
+
+/**
+ * Adjust the total reply count of a topic
+ *
+ * @since bbPress (r2467)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @param int $reply_count Optional. Set the reply count manually.
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_public_child_count() To get the reply count
+ * @uses update_post_meta() To update the topic reply count meta
+ * @uses apply_filters() Calls 'bbp_update_topic_reply_count' with the reply
+ *                        count and topic id
+ * @return int Topic reply count
+ */
+function bbp_update_topic_reply_count( $topic_id = 0, $reply_count = 0 ) {
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	else
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Get replies of topic if not passed
+	if ( empty( $reply_count ) )
+		$reply_count = bbp_get_public_child_count( $topic_id, bbp_get_reply_post_type() );
+
+	update_post_meta( $topic_id, '_bbp_reply_count', (int) $reply_count );
+
+	return apply_filters( 'bbp_update_topic_reply_count', (int) $reply_count, $topic_id );
+}
+
+/**
+ * Adjust the total hidden reply count of a topic (hidden includes trashed and spammed replies)
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @param int $reply_count Optional. Set the reply count manually
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses wpdb::prepare() To prepare our sql query
+ * @uses wpdb::get_var() To execute our query and get the var back
+ * @uses update_post_meta() To update the topic hidden reply count meta
+ * @uses apply_filters() Calls 'bbp_update_topic_reply_count_hidden' with the
+ *                        hidden reply count and topic id
+ * @return int Topic hidden reply count
+ */
+function bbp_update_topic_reply_count_hidden( $topic_id = 0, $reply_count = 0 ) {
+	global $wpdb;
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	else
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Get replies of topic
+	if ( empty( $reply_count ) )
+		$reply_count = $wpdb->get_var( $wpdb->prepare( "SELECT COUNT(ID) FROM {$wpdb->posts} WHERE post_parent = %d AND post_status IN ( '" . join( '\',\'', array( bbp_get_trash_status_id(), bbp_get_spam_status_id() ) ) . "') AND post_type = '%s';", $topic_id, bbp_get_reply_post_type() ) );
+
+	update_post_meta( $topic_id, '_bbp_reply_count_hidden', (int) $reply_count );
+
+	return apply_filters( 'bbp_update_topic_reply_count_hidden', (int) $reply_count, $topic_id );
+}
+
+/**
+ * Update the topic with the last active post ID
+ *
+ * @since bbPress (r2888)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @param int $active_id Optional. active id
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_public_child_last_id() To get the last public reply id
+ * @uses bbp_get_active_id() To get the active id
+ * @uses update_post_meta() To update the topic last active id meta
+ * @uses apply_filters() Calls 'bbp_update_topic_last_active_id' with the active
+ *                        id and topic id
+ * @return int Active id
+ */
+function bbp_update_topic_last_active_id( $topic_id = 0, $active_id = 0 ) {
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	else
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $active_id ) )
+		$active_id = bbp_get_public_child_last_id( $topic_id, bbp_get_reply_post_type() );
+
+	// Adjust last_id's based on last_reply post_type
+	if ( empty( $active_id ) || !bbp_is_reply( $active_id ) )
+		$active_id = $topic_id;
+
+	// Update only if published
+	if ( bbp_get_public_status_id() == get_post_status( $active_id ) )
+		update_post_meta( $topic_id, '_bbp_last_active_id', (int) $active_id );
+
+	return apply_filters( 'bbp_update_topic_last_active_id', (int) $active_id, $topic_id );
+}
+
+/**
+ * Update the topics last active date/time (aka freshness)
+ *
+ * @since bbPress (r2680)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param string $new_time Optional. New time in mysql format
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses current_time() To get the current time
+ * @uses update_post_meta() To update the topic last active meta
+ * @return bool True on success, false on failure
+ */
+function bbp_update_topic_last_active_time( $topic_id = 0, $new_time = '' ) {
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	else
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Check time and use current if empty
+	if ( empty( $new_time ) )
+		$new_time = get_post_field( 'post_date', bbp_get_public_child_last_id( $topic_id, bbp_get_reply_post_type() ) );
+
+	// Update only if published
+	if ( !empty( $new_time ) )
+		update_post_meta( $topic_id, '_bbp_last_active_time', $new_time );
+
+	return apply_filters( 'bbp_update_topic_last_active_time', $new_time, $topic_id );
+}
+
+/**
+ * Update the topic with the most recent reply ID
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @param int $reply_id Optional. Reply id
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_public_child_last_id() To get the last public reply id
+ * @uses update_post_meta() To update the topic last reply id meta
+ * @uses apply_filters() Calls 'bbp_update_topic_last_reply_id' with the reply
+ *                        id and topic id
+ * @return int Reply id
+ */
+function bbp_update_topic_last_reply_id( $topic_id = 0, $reply_id = 0 ) {
+
+	// If it's a reply, then get the parent (topic id)
+	if ( empty( $reply_id ) && bbp_is_reply( $topic_id ) ) {
+		$reply_id = bbp_get_reply_id( $topic_id );
+		$topic_id = bbp_get_reply_topic_id( $reply_id );
+	} else {
+		$reply_id = bbp_get_reply_id( $reply_id );
+		$topic_id = bbp_get_topic_id( $topic_id );
+	}
+
+	if ( empty( $reply_id ) )
+		$reply_id = bbp_get_public_child_last_id( $topic_id, bbp_get_reply_post_type() );
+
+	// Adjust last_id's based on last_reply post_type
+	if ( empty( $reply_id ) || !bbp_is_reply( $reply_id ) )
+		$reply_id = 0;
+
+	// Update if reply is published
+	if ( bbp_is_reply_published( $reply_id ) )
+		update_post_meta( $topic_id, '_bbp_last_reply_id', (int) $reply_id );
+
+	return apply_filters( 'bbp_update_topic_last_reply_id', (int) $reply_id, $topic_id );
+}
+
+/**
+ * Adjust the total voice count of a topic
+ *
+ * @since bbPress (r2567)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wpdb::prepare() To prepare our sql query
+ * @uses wpdb::get_col() To execute our query and get the column back
+ * @uses update_post_meta() To update the topic voice count meta
+ * @uses apply_filters() Calls 'bbp_update_topic_voice_count' with the voice
+ *                        count and topic id
+ * @return int Voice count
+ */
+function bbp_update_topic_voice_count( $topic_id = 0 ) {
+	global $wpdb;
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	elseif ( bbp_is_topic( $topic_id ) )
+		$topic_id = bbp_get_topic_id( $topic_id );
+	else
+		return;
+
+	// Query the DB to get voices in this topic
+	$voices = $wpdb->get_col( $wpdb->prepare( "SELECT COUNT( DISTINCT post_author ) FROM {$wpdb->posts} WHERE ( post_parent = %d AND post_status = '%s' AND post_type = '%s' ) OR ( ID = %d AND post_type = '%s' );", $topic_id, bbp_get_public_status_id(), bbp_get_reply_post_type(), $topic_id, bbp_get_topic_post_type() ) );
+
+	// If there's an error, make sure we have at least have 1 voice
+	$voices = ( empty( $voices ) || is_wp_error( $voices ) ) ? 1 : $voices[0];
+
+	// Update the voice count for this topic id
+	update_post_meta( $topic_id, '_bbp_voice_count', (int) $voices );
+
+	return apply_filters( 'bbp_update_topic_voice_count', (int) $voices, $topic_id );
+}
+
+/**
+ * Adjust the total anonymous reply count of a topic
+ *
+ * @since bbPress (r2567)
+ *
+ * @param int $topic_id Optional. Topic id to update
+ * @uses bbp_is_reply() To check if the passed topic id is a reply
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_reply_topic_id() To get the reply topic id
+ * @uses bbp_get_reply_post_type() To get the reply post type
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses wpdb::prepare() To prepare our sql query
+ * @uses wpdb::get_col() To execute our query and get the column back
+ * @uses update_post_meta() To update the topic anonymous reply count meta
+ * @uses apply_filters() Calls 'bbp_update_topic_anonymous_reply_count' with the
+ *                        anonymous reply count and topic id
+ * @return int Anonymous reply count
+ */
+function bbp_update_topic_anonymous_reply_count( $topic_id = 0 ) {
+	global $wpdb;
+
+	// If it's a reply, then get the parent (topic id)
+	if ( bbp_is_reply( $topic_id ) )
+		$topic_id = bbp_get_reply_topic_id( $topic_id );
+	elseif ( bbp_is_topic( $topic_id ) )
+		$topic_id = bbp_get_topic_id( $topic_id );
+	else
+		return;
+
+	$anonymous_replies = (int) $wpdb->get_var( $wpdb->prepare( "SELECT COUNT( ID ) FROM {$wpdb->posts} WHERE ( post_parent = %d AND post_status = '%s' AND post_type = '%s' AND post_author = 0 ) OR ( ID = %d AND post_type = '%s' AND post_author = 0 );", $topic_id, bbp_get_public_status_id(), bbp_get_reply_post_type(), $topic_id, bbp_get_topic_post_type() ) );
+
+	update_post_meta( $topic_id, '_bbp_anonymous_reply_count', (int) $anonymous_replies );
+
+	return apply_filters( 'bbp_update_topic_anonymous_reply_count', (int) $anonymous_replies, $topic_id );
+}
+
+/**
+ * Update the revision log of the topic
+ *
+ * @since bbPress (r2782)
+ *
+ * @param mixed $args Supports these args:
+ *  - topic_id: Topic id
+ *  - author_id: Author id
+ *  - reason: Reason for editing
+ *  - revision_id: Revision id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_format_revision_reason() To format the reason
+ * @uses bbp_get_topic_raw_revision_log() To get the raw topic revision log
+ * @uses update_post_meta() To update the topic revision log meta
+ * @return mixed False on failure, true on success
+ */
+function bbp_update_topic_revision_log( $args = '' ) {
+	$defaults = array (
+		'reason'      => '',
+		'topic_id'    => 0,
+		'author_id'   => 0,
+		'revision_id' => 0
+	);
+	$r = bbp_parse_args( $args, $defaults, 'update_topic_revision_log' );
+	extract( $r );
+
+	// Populate the variables
+	$reason      = bbp_format_revision_reason( $reason );
+	$topic_id    = bbp_get_topic_id( $topic_id );
+	$author_id   = bbp_get_user_id ( $author_id, false, true );
+	$revision_id = (int) $revision_id;
+
+	// Get the logs and append the new one to those
+	$revision_log               = bbp_get_topic_raw_revision_log( $topic_id );
+	$revision_log[$revision_id] = array( 'author' => $author_id, 'reason' => $reason );
+
+	// Finally, update
+	return update_post_meta( $topic_id, '_bbp_revision_log', $revision_log );
+}
+
+/** Topic Actions *************************************************************/
+
+/**
+ * Closes a topic
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Topic id
+ * @uses get_post() To get the topic
+ * @uses do_action() Calls 'bbp_close_topic' with the topic id
+ * @uses add_post_meta() To add the previous status to a meta
+ * @uses wp_insert_post() To update the topic with the new status
+ * @uses do_action() Calls 'bbp_opened_topic' with the topic id
+ * @return mixed False or {@link WP_Error} on failure, topic id on success
+ */
+function bbp_close_topic( $topic_id = 0 ) {
+
+	// Get topic
+	if ( !$topic = get_post( $topic_id, ARRAY_A ) )
+		return $topic;
+
+	// Bail if already closed
+	if ( bbp_get_closed_status_id() == $topic['post_status'] )
+		return false;
+
+	// Execute pre close code
+	do_action( 'bbp_close_topic', $topic_id );
+
+	// Add pre close status
+	add_post_meta( $topic_id, '_bbp_status', $topic['post_status'] );
+
+	// Set closed status
+	$topic['post_status'] = bbp_get_closed_status_id();
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Update topic
+	$topic_id = wp_insert_post( $topic );
+
+	// Execute post close code
+	do_action( 'bbp_closed_topic', $topic_id );
+
+	// Return topic_id
+	return $topic_id;
+}
+
+/**
+ * Opens a topic
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Topic id
+ * @uses get_post() To get the topic
+ * @uses do_action() Calls 'bbp_open_topic' with the topic id
+ * @uses get_post_meta() To get the previous status
+ * @uses delete_post_meta() To delete the previous status meta
+ * @uses wp_insert_post() To update the topic with the new status
+ * @uses do_action() Calls 'bbp_opened_topic' with the topic id
+ * @return mixed False or {@link WP_Error} on failure, topic id on success
+ */
+function bbp_open_topic( $topic_id = 0 ) {
+
+	// Get topic
+	if ( !$topic = get_post( $topic_id, ARRAY_A ) )
+		return $topic;
+
+	// Bail if already open
+	if ( bbp_get_closed_status_id() != $topic['post_status'])
+		return false;
+
+	// Execute pre open code
+	do_action( 'bbp_open_topic', $topic_id );
+
+	// Get previous status
+	$topic_status         = get_post_meta( $topic_id, '_bbp_status', true );
+
+	// Set previous status
+	$topic['post_status'] = $topic_status;
+
+	// Remove old status meta
+	delete_post_meta( $topic_id, '_bbp_status' );
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Update topic
+	$topic_id = wp_insert_post( $topic );
+
+	// Execute post open code
+	do_action( 'bbp_opened_topic', $topic_id );
+
+	// Return topic_id
+	return $topic_id;
+}
+
+/**
+ * Marks a topic as spam
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Topic id
+ * @uses get_post() To get the topic
+ * @uses do_action() Calls 'bbp_spam_topic' with the topic id
+ * @uses add_post_meta() To add the previous status to a meta
+ * @uses wp_insert_post() To update the topic with the new status
+ * @uses do_action() Calls 'bbp_spammed_topic' with the topic id
+ * @return mixed False or {@link WP_Error} on failure, topic id on success
+ */
+function bbp_spam_topic( $topic_id = 0 ) {
+
+	// Get the topic
+	if ( !$topic = get_post( $topic_id, ARRAY_A ) )
+		return $topic;
+
+	// Bail if topic is spam
+	if ( bbp_get_spam_status_id() == $topic['post_status'] )
+		return false;
+
+	// Execute pre spam code
+	do_action( 'bbp_spam_topic', $topic_id );
+
+	// Add the original post status as post meta for future restoration
+	add_post_meta( $topic_id, '_bbp_spam_meta_status', $topic['post_status'] );
+
+	// Get topic tags
+	$terms = get_the_terms( $topic_id, bbp_get_topic_tag_tax_id() );
+
+	// Define local variable(s)
+	$term_names = array();
+
+	// Topic has tags
+	if ( !empty( $terms ) ) {
+
+		// Loop through and collect term names
+		foreach( $terms as $term ) {
+			$term_names[] = $term->name;
+		}
+
+		// Topic terms have slugs
+		if ( !empty( $term_names ) ) {
+
+			// Add the original post status as post meta for future restoration
+			add_post_meta( $topic_id, '_bbp_spam_topic_tags', $term_names );
+
+			// Empty the topic of its tags
+			$topic['tax_input'] = array( bbp_get_topic_tag_tax_id() => '' );
+		}
+	}
+	
+	// Set post status to spam
+	$topic['post_status'] = bbp_get_spam_status_id();
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Update the topic
+	$topic_id = wp_insert_post( $topic );
+
+	// Execute post spam code
+	do_action( 'bbp_spammed_topic', $topic_id );
+
+	// Return topic_id
+	return $topic_id;
+}
+
+/**
+ * Unspams a topic
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Topic id
+ * @uses get_post() To get the topic
+ * @uses do_action() Calls 'bbp_unspam_topic' with the topic id
+ * @uses get_post_meta() To get the previous status
+ * @uses delete_post_meta() To delete the previous status meta
+ * @uses wp_insert_post() To update the topic with the new status
+ * @uses do_action() Calls 'bbp_unspammed_topic' with the topic id
+ * @return mixed False or {@link WP_Error} on failure, topic id on success
+ */
+function bbp_unspam_topic( $topic_id = 0 ) {
+
+	// Get the topic
+	if ( !$topic = get_post( $topic_id, ARRAY_A ) )
+		return $topic;
+
+	// Bail if already not spam
+	if ( bbp_get_spam_status_id() != $topic['post_status'] )
+		return false;
+
+	// Execute pre unspam code
+	do_action( 'bbp_unspam_topic', $topic_id );
+
+	// Get pre spam status
+	$topic_status = get_post_meta( $topic_id, '_bbp_spam_meta_status', true );
+
+	// Set post status to pre spam
+	$topic['post_status'] = $topic_status;
+
+	// Delete pre spam meta
+	delete_post_meta( $topic_id, '_bbp_spam_meta_status' );
+
+	// No revisions
+	remove_action( 'pre_post_update', 'wp_save_post_revision' );
+
+	// Get pre-spam topic tags
+	$terms = get_post_meta( $topic_id, '_bbp_spam_topic_tags', true );
+
+	// Topic had tags before it was spammed
+	if ( !empty( $terms ) ) {
+
+		// Set the tax_input of the topic
+		$topic['tax_input'] = array( bbp_get_topic_tag_tax_id() => $terms );
+
+		// Delete pre-spam topic tag meta
+		delete_post_meta( $topic_id, '_bbp_spam_topic_tags' );
+	}
+
+	// Update the topic
+	$topic_id = wp_insert_post( $topic );
+
+	// Execute post unspam code
+	do_action( 'bbp_unspammed_topic', $topic_id );
+
+	// Return topic_id
+	return $topic_id;
+}
+
+/**
+ * Sticks a topic to a forum or front
+ *
+ * @since bbPress (r2754)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param int $super Should we make the topic a super sticky?
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_unstick_topic() To unstick the topic
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_stickies() To get the stickies
+ * @uses do_action() 'bbp_stick_topic' with topic id and bool super
+ * @uses update_option() To update the super stickies option
+ * @uses update_post_meta() To update the forum stickies meta
+ * @uses do_action() Calls 'bbp_sticked_topic' with the topic id, bool super
+ *                    and success
+ * @return bool True on success, false on failure
+ */
+function bbp_stick_topic( $topic_id = 0, $super = false ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	// Bail if a topic is not a topic (prevents revisions as stickies)
+	if ( ! bbp_is_topic( $topic_id ) )
+		return false;
+
+	// We may have a super sticky to which we want to convert into a normal
+	// sticky and vice versa; unstick the topic first to avoid any possible error.
+	bbp_unstick_topic( $topic_id );
+
+	$forum_id = empty( $super ) ? bbp_get_topic_forum_id( $topic_id ) : 0;
+	$stickies = bbp_get_stickies( $forum_id );
+
+	do_action( 'bbp_stick_topic', $topic_id, $super );
+
+	if ( !is_array( $stickies ) ) {
+		$stickies   = array( $topic_id );
+	} else {
+		$stickies[] = $topic_id;
+	}
+
+	// Pull out duplicates and empties
+	$stickies = array_unique( array_filter( $stickies ) );
+
+	// Unset incorrectly stuck revisions
+	foreach ( (array) $stickies as $key => $id ) {
+		if ( ! bbp_is_topic( $id ) ) {
+			unset( $stickies[$key] );
+		}
+	}
+
+	// Reset keys
+	$stickies = array_values( $stickies );
+	$success  = !empty( $super ) ? update_option( '_bbp_super_sticky_topics', $stickies ) : update_post_meta( $forum_id, '_bbp_sticky_topics', $stickies );
+
+	do_action( 'bbp_sticked_topic', $topic_id, $super, $success );
+
+	return (bool) $success;
+}
+
+/**
+ * Unsticks a topic both from front and it's forum
+ *
+ * @since bbPress (r2754)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic_super_sticky() To check if the topic is a super sticky
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_stickies() To get the forum stickies
+ * @uses do_action() Calls 'bbp_unstick_topic' with the topic id
+ * @uses delete_option() To delete the super stickies option
+ * @uses update_option() To update the super stickies option
+ * @uses delete_post_meta() To delete the forum stickies meta
+ * @uses update_post_meta() To update the forum stickies meta
+ * @uses do_action() Calls 'bbp_unsticked_topic' with the topic id and success
+ * @return bool Always true.
+ */
+function bbp_unstick_topic( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$super    = bbp_is_topic_super_sticky( $topic_id );
+	$forum_id = empty( $super ) ? bbp_get_topic_forum_id( $topic_id ) : 0;
+	$stickies = bbp_get_stickies( $forum_id );
+	$offset   = array_search( $topic_id, $stickies );
+
+	do_action( 'bbp_unstick_topic', $topic_id );
+
+	if ( empty( $stickies ) ) {
+		$success = true;
+	} elseif ( !in_array( $topic_id, $stickies ) ) {
+		$success = true;
+	} elseif ( false === $offset ) {
+		$success = true;
+	} else {
+		array_splice( $stickies, $offset, 1 );
+		if ( empty( $stickies ) ) {
+			$success = !empty( $super ) ? delete_option( '_bbp_super_sticky_topics'            ) : delete_post_meta( $forum_id, '_bbp_sticky_topics'            );
+		} else {
+			$success = !empty( $super ) ? update_option( '_bbp_super_sticky_topics', $stickies ) : update_post_meta( $forum_id, '_bbp_sticky_topics', $stickies );
+		}
+	}
+
+	do_action( 'bbp_unsticked_topic', $topic_id, $success );
+
+	return (bool) $success;
+}
+
+/** Before Delete/Trash/Untrash ***********************************************/
+
+/**
+ * Called before deleting a topic.
+ * 
+ * This function is supplemental to the actual topic deletion which is
+ * handled by WordPress core API functions. It is used to clean up after
+ * a topic that is being deleted.
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_delete_topic' with the topic id
+ * @uses bbp_has_replies() To check if the topic has replies
+ * @uses bbp_replies() To loop through the replies
+ * @uses bbp_the_reply() To set a reply as the current reply in the loop
+ * @uses bbp_get_reply_id() To get the reply id
+ * @uses wp_delete_post() To delete the reply
+ */
+function bbp_delete_topic( $topic_id = 0 ) {
+
+	// Validate topic ID
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_delete_topic', $topic_id );
+
+	// Topic is being permanently deleted, so its replies gotta go too
+	if ( $replies = new WP_Query( array(
+		'suppress_filters' => true,
+		'post_type'        => bbp_get_reply_post_type(),
+		'post_status'      => 'any',
+		'post_parent'      => $topic_id,
+		'posts_per_page'   => -1,
+		'nopaging'         => true,
+		'fields'           => 'id=>parent'
+	) ) ) {
+		foreach ( $replies->posts as $reply ) {
+			wp_delete_post( $reply->ID, true );
+		}
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+}
+
+/**
+ * Called before trashing a topic
+ *
+ * This function is supplemental to the actual topic being trashed which is
+ * handled by WordPress core API functions. It is used to clean up after
+ * a topic that is being trashed.
+ * 
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_trash_topic' with the topic id
+ * @uses wp_trash_post() To trash the reply
+ * @uses update_post_meta() To save a list of just trashed replies for future use
+ */
+function bbp_trash_topic( $topic_id = 0 ) {
+
+	// Validate topic ID
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_trash_topic', $topic_id );
+
+	// Topic is being trashed, so its replies are trashed too
+	if ( $replies = new WP_Query( array(
+		'suppress_filters' => true,
+		'post_type'        => bbp_get_reply_post_type(),
+		'post_status'      => bbp_get_public_status_id(),
+		'post_parent'      => $topic_id,
+		'posts_per_page'   => -1,
+		'nopaging'         => true,
+		'fields'           => 'id=>parent'
+	) ) ) {
+
+		// Prevent debug notices
+		$pre_trashed_replies = array();
+
+		// Loop through replies, trash them, and add them to array
+		foreach ( $replies->posts as $reply ) {
+			wp_trash_post( $reply->ID );
+			$pre_trashed_replies[] = $reply->ID;
+		}
+
+		// Set a post_meta entry of the replies that were trashed by this action.
+		// This is so we can possibly untrash them, without untrashing replies
+		// that were purposefully trashed before.
+		update_post_meta( $topic_id, '_bbp_pre_trashed_replies', $pre_trashed_replies );
+
+		// Reset the $post global
+		wp_reset_postdata();
+	}
+}
+
+/**
+ * Called before untrashing a topic
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_untrash_topic' with the topic id
+ * @uses get_post_meta() To get the list of replies which were trashed with the
+ *                        topic
+ * @uses wp_untrash_post() To untrash the reply
+ */
+function bbp_untrash_topic( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_untrash_topic', $topic_id );
+
+	// Get the replies that were not previously trashed
+	$pre_trashed_replies = get_post_meta( $topic_id, '_bbp_pre_trashed_replies', true );
+
+	// There are replies to untrash
+	if ( !empty( $pre_trashed_replies ) ) {
+
+		// Maybe reverse the trashed replies array
+		if ( is_array( $pre_trashed_replies ) )
+			$pre_trashed_replies = array_reverse( $pre_trashed_replies );
+
+		// Loop through replies
+		foreach ( (array) $pre_trashed_replies as $reply ) {
+			wp_untrash_post( $reply );
+		}
+	}
+}
+
+/** After Delete/Trash/Untrash ************************************************/
+
+/**
+ * Called after deleting a topic
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_deleted_topic' with the topic id
+ */
+function bbp_deleted_topic( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_deleted_topic', $topic_id );
+}
+
+/**
+ * Called after trashing a topic
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_trashed_topic' with the topic id
+ */
+function bbp_trashed_topic( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_trashed_topic', $topic_id );
+}
+
+/**
+ * Called after untrashing a topic
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_topic() To check if the passed id is a topic
+ * @uses do_action() Calls 'bbp_untrashed_topic' with the topic id
+ */
+function bbp_untrashed_topic( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	if ( empty( $topic_id ) || !bbp_is_topic( $topic_id ) )
+		return false;
+
+	do_action( 'bbp_untrashed_topic', $topic_id );
+}
+
+/** Settings ******************************************************************/
+
+/**
+ * Return the topics per page setting
+ *
+ * @since bbPress (r3540)
+ *
+ * @param int $default Default replies per page (15)
+ * @uses get_option() To get the setting
+ * @uses apply_filters() To allow the return value to be manipulated
+ * @return int
+ */
+function bbp_get_topics_per_page( $default = 15 ) {
+
+	// Get database option and cast as integer
+	$retval = get_option( '_bbp_topics_per_page', $default );
+
+	// If return val is empty, set it to default
+	if ( empty( $retval ) )
+		$retval = $default;
+
+	// Filter and return
+	return (int) apply_filters( 'bbp_get_topics_per_page', $retval, $default );
+}
+
+/**
+ * Return the topics per RSS page setting
+ *
+ * @since bbPress (r3540)
+ *
+ * @param int $default Default replies per page (25)
+ * @uses get_option() To get the setting
+ * @uses apply_filters() To allow the return value to be manipulated
+ * @return int
+ */
+function bbp_get_topics_per_rss_page( $default = 25 ) {
+
+	// Get database option and cast as integer
+	$retval = get_option( '_bbp_topics_per_rss_page', $default );
+
+	// If return val is empty, set it to default
+	if ( empty( $retval ) )
+		$retval = $default;
+
+	// Filter and return
+	return (int) apply_filters( 'bbp_get_topics_per_rss_page', $retval, $default );
+}
+
+/** Topic Tags ****************************************************************/
+
+/**
+ * Get topic tags for a specific topic ID
+ *
+ * @since bbPress (r4165)
+ *
+ * @param int $topic_id
+ * @param string $sep
+ * @return string
+ */
+function bbp_get_topic_tag_names( $topic_id = 0, $sep = ', ' ) {
+	$topic_id   = bbp_get_topic_id( $topic_id );
+	$topic_tags = array_filter( (array) get_the_terms( $topic_id, bbp_get_topic_tag_tax_id() ) );
+	$terms      = array();
+	foreach( $topic_tags as $term ) {
+		$terms[] = $term->name;
+	}
+	$terms = !empty( $terms ) ? implode( $sep, $terms ) : '';
+
+	return apply_filters( 'bbp_get_topic_tags', $terms, $topic_id );
+}
+
+/** Autoembed *****************************************************************/
+
+/**
+ * Check if autoembeds are enabled and hook them in if so
+ *
+ * @since bbPress (r3752)
+ * @global WP_Embed $wp_embed
+ */
+function bbp_topic_content_autoembed() {
+	global $wp_embed;
+
+	if ( bbp_use_autoembed() && is_a( $wp_embed, 'WP_Embed' ) ) {
+		add_filter( 'bbp_get_topic_content', array( $wp_embed, 'autoembed' ), 8 );		
+	}
+}
+
+/** Feeds *********************************************************************/
+
+/**
+ * Output an RSS2 feed of topics, based on the query passed.
+ *
+ * @since bbPress (r3171)
+ *
+ * @uses bbp_version()
+ * @uses bbp_is_single_topic()
+ * @uses bbp_user_can_view_forum()
+ * @uses bbp_get_topic_forum_id()
+ * @uses bbp_show_load_topic()
+ * @uses bbp_topic_permalink()
+ * @uses bbp_topic_title()
+ * @uses bbp_get_topic_reply_count()
+ * @uses bbp_topic_content()
+ * @uses bbp_has_topics()
+ * @uses bbp_topics()
+ * @uses bbp_the_topic()
+ * @uses get_wp_title_rss()
+ * @uses get_option()
+ * @uses bloginfo_rss
+ * @uses self_link()
+ * @uses the_author()
+ * @uses get_post_time()
+ * @uses rss_enclosure()
+ * @uses do_action()
+ * @uses apply_filters()
+ *
+ * @param array $topics_query
+ */
+function bbp_display_topics_feed_rss2( $topics_query = array() ) {
+
+	// User cannot access this forum
+	if ( bbp_is_single_forum() && !bbp_user_can_view_forum( array( 'forum_id' => bbp_get_forum_id() ) ) )
+		return;
+
+	// Display the feed
+	header( 'Content-Type: text/xml; charset=' . get_option( 'blog_charset' ), true );
+	header( 'Status: 200 OK' );
+	echo '<?xml version="1.0" encoding="' . get_option( 'blog_charset' ) . '"?' . '>'; ?>
+
+	<rss version="2.0"
+		xmlns:content="http://purl.org/rss/1.0/modules/content/"
+		xmlns:wfw="http://wellformedweb.org/CommentAPI/"
+		xmlns:dc="http://purl.org/dc/elements/1.1/"
+		xmlns:atom="http://www.w3.org/2005/Atom"
+
+		<?php do_action( 'bbp_feed' ); ?>
+	>
+
+	<channel>
+
+		<title><?php bloginfo_rss( 'name' ); ?> &#187; <?php _e( 'All Topics', 'bbpress' ); ?></title>
+		<atom:link href="<?php self_link(); ?>" rel="self" type="application/rss+xml" />
+		<link><?php self_link(); ?></link>
+		<description><?php //?></description>
+		<pubDate><?php echo mysql2date( 'D, d M Y H:i:s O', current_time( 'mysql' ), false ); ?></pubDate>
+		<generator>http://bbpress.org/?v=<?php bbp_version(); ?></generator>
+		<language><?php echo get_option( 'rss_language' ); ?></language>
+
+		<?php do_action( 'bbp_feed_head' ); ?>
+
+		<?php if ( bbp_has_topics( $topics_query ) ) : ?>
+
+			<?php while ( bbp_topics() ) : bbp_the_topic(); ?>
+
+				<item>
+					<guid><?php bbp_topic_permalink(); ?></guid>
+					<title><![CDATA[<?php bbp_topic_title(); ?>]]></title>
+					<link><?php bbp_topic_permalink(); ?></link>
+					<pubDate><?php echo mysql2date('D, d M Y H:i:s +0000', get_post_meta( bbp_get_topic_id(), '_bbp_last_active_time', true ) ); ?></pubDate>
+					<dc:creator><?php the_author() ?></dc:creator>
+
+					<?php if ( !post_password_required() ) : ?>
+
+					<description>
+						<![CDATA[
+						<p><?php printf( __( 'Replies: %s', 'bbpress' ), bbp_get_topic_reply_count() ); ?></p>
+						<?php bbp_topic_content(); ?>
+						]]>
+					</description>
+
+					<?php rss_enclosure(); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_feed_item' ); ?>
+
+				</item>
+
+				<?php endwhile; ?>
+			<?php endif; ?>
+
+		<?php do_action( 'bbp_feed_footer' ); ?>
+
+	</channel>
+	</rss>
+
+<?php
+	exit();
+}
+
+/** Permissions ***************************************************************/
+
+/**
+ * Redirect if unathorized user is attempting to edit a topic
+ * 
+ * @since bbPress (r3605)
+ *
+ * @uses bbp_is_topic_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_id()
+ * @uses wp_safe_redirect()
+ * @uses bbp_get_topic_permalink()
+ */
+function bbp_check_topic_edit() {
+
+	// Bail if not editing a topic
+	if ( !bbp_is_topic_edit() )
+		return;
+
+	// User cannot edit topic, so redirect back to topic
+	if ( !current_user_can( 'edit_topic', bbp_get_topic_id() ) ) {
+		wp_safe_redirect( bbp_get_topic_permalink() );
+		exit();
+	}
+}
+
+/**
+ * Redirect if unathorized user is attempting to edit a topic tag
+ * 
+ * @since bbPress (r3605)
+ *
+ * @uses bbp_is_topic_tag_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_tag_id()
+ * @uses wp_safe_redirect()
+ * @uses bbp_get_topic_tag_link()
+ */
+function bbp_check_topic_tag_edit() {
+
+	// Bail if not editing a topic tag
+	if ( !bbp_is_topic_tag_edit() )
+		return;
+
+	// Bail if current user cannot edit topic tags
+	if ( !current_user_can( 'edit_topic_tags', bbp_get_topic_tag_id() ) ) {
+		wp_safe_redirect( bbp_get_topic_tag_link() );
+		exit();
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/topics/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/topics/template-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,3588 @@
+<?php
+
+/**
+ * bbPress Topic Template Tags
+ *
+ * @package bbPress
+ * @subpackage TemplateTags
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Post Type *****************************************************************/
+
+/**
+ * Output the unique id of the custom post type for topics
+ *
+ * @since bbPress (r2857)
+ *
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ */
+function bbp_topic_post_type() {
+	echo bbp_get_topic_post_type();
+}
+	/**
+	 * Return the unique id of the custom post type for topics
+	 *
+	 * @since bbPress (r2857)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_topic_post_type' with the topic
+	 *                        post type id
+	 * @return string The unique topic post type id
+	 */
+	function bbp_get_topic_post_type() {
+		return apply_filters( 'bbp_get_topic_post_type', bbpress()->topic_post_type );
+	}
+
+/**
+ * The plugin version of bbPress comes with two topic display options:
+ * - Traditional: Topics are included in the reply loop (default)
+ * - New Style: Topics appear as "lead" posts, ahead of replies
+ *
+ * @since bbPress (r2954)
+ * @param $show_lead Optional. Default false
+ * @return bool Yes if the topic appears as a lead, otherwise false
+ */
+function bbp_show_lead_topic( $show_lead = false ) {
+
+	// Never separate the lead topic in feeds
+	if ( is_feed() )
+		return false;
+
+	return (bool) apply_filters( 'bbp_show_lead_topic', (bool) $show_lead );
+}
+
+/** Topic Loop ****************************************************************/
+
+/**
+ * The main topic loop. WordPress makes this easy for us
+ *
+ * @since bbPress (r2485)
+ *
+ * @param mixed $args All the arguments supported by {@link WP_Query}
+ * @uses current_user_can() To check if the current user can edit other's topics
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ * @uses WP_Query To make query and get the topics
+ * @uses is_page() To check if it's a page
+ * @uses bbp_is_single_forum() To check if it's a forum
+ * @uses bbp_get_forum_id() To get the forum id
+ * @uses bbp_get_paged() To get the current page value
+ * @uses bbp_get_super_stickies() To get the super stickies
+ * @uses bbp_get_stickies() To get the forum stickies
+ * @uses wpdb::get_results() To execute our query and get the results
+ * @uses WP_Rewrite::using_permalinks() To check if the blog is using permalinks
+ * @uses get_permalink() To get the permalink
+ * @uses add_query_arg() To add custom args to the url
+ * @uses apply_filters() Calls 'bbp_topics_pagination' with the pagination args
+ * @uses paginate_links() To paginate the links
+ * @uses apply_filters() Calls 'bbp_has_topics' with
+ *                        bbPres::topic_query::have_posts()
+ *                        and bbPres::topic_query
+ * @return object Multidimensional array of topic information
+ */
+function bbp_has_topics( $args = '' ) {
+	global $wp_rewrite;
+
+	// What are the default allowed statuses (based on user caps)
+	if ( bbp_get_view_all() ) {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id(), bbp_get_spam_status_id(), bbp_get_trash_status_id() );
+	} else {
+		$post_statuses = array( bbp_get_public_status_id(), bbp_get_closed_status_id() );
+	}
+
+	$default_topic_search  = !empty( $_REQUEST['ts'] ) ? $_REQUEST['ts'] : false;
+	$default_show_stickies = (bool) ( bbp_is_single_forum() || bbp_is_topic_archive() ) && ( false === $default_topic_search );
+	$default_post_parent   = bbp_is_single_forum() ? bbp_get_forum_id() : 'any';
+	$default_post_status   = join( ',', $post_statuses );
+
+	// Default argument array
+	$default = array(
+		'post_type'      => bbp_get_topic_post_type(), // Narrow query down to bbPress topics
+		'post_parent'    => $default_post_parent,      // Forum ID
+		'post_status'    => $default_post_status,      // Post Status
+		'meta_key'       => '_bbp_last_active_time',   // Make sure topic has some last activity time
+		'orderby'        => 'meta_value',              // 'meta_value', 'author', 'date', 'title', 'modified', 'parent', rand',
+		'order'          => 'DESC',                    // 'ASC', 'DESC'
+		'posts_per_page' => bbp_get_topics_per_page(), // Topics per page
+		'paged'          => bbp_get_paged(),           // Page Number
+		's'              => $default_topic_search,     // Topic Search
+		'show_stickies'  => $default_show_stickies,    // Ignore sticky topics?
+		'max_num_pages'  => false,                     // Maximum number of pages to show
+	);
+
+	// Maybe query for topic tags
+	if ( bbp_is_topic_tag() ) {
+		$default['term']     = bbp_get_topic_tag_slug();
+		$default['taxonomy'] = bbp_get_topic_tag_tax_id();
+	}
+	$bbp_t = bbp_parse_args( $args, $default, 'has_topics' );
+
+	// Extract the query variables
+	extract( $bbp_t );
+
+	// Get bbPress
+	$bbp = bbpress();
+
+	// Call the query
+	$bbp->topic_query = new WP_Query( $bbp_t );
+
+	// Set post_parent back to 0 if originally set to 'any'
+	if ( 'any' == $bbp_t['post_parent'] )
+		$bbp_t['post_parent'] = $post_parent = 0;
+
+	// Limited the number of pages shown
+	if ( !empty( $max_num_pages ) )
+		$bbp->topic_query->max_num_pages = $max_num_pages;
+
+	// Put sticky posts at the top of the posts array
+	if ( !empty( $show_stickies ) && $paged <= 1 ) {
+
+		// Get super stickies and stickies in this forum
+		$stickies = bbp_get_super_stickies();
+		$stickies = !empty( $post_parent ) ? array_merge( $stickies, bbp_get_stickies( $post_parent ) ) : $stickies;
+		$stickies = array_unique( $stickies );
+
+		// We have stickies
+		if ( is_array( $stickies ) && !empty( $stickies ) ) {
+
+			// Setup the number of stickies and reset offset to 0
+			$num_topics    = count( $bbp->topic_query->posts );
+			$sticky_offset = 0;
+
+			// Loop over topics and relocate stickies to the front.
+			for ( $i = 0; $i < $num_topics; $i++ ) {
+				if ( in_array( $bbp->topic_query->posts[$i]->ID, $stickies ) ) {
+					$sticky = $bbp->topic_query->posts[$i];
+
+					// Remove sticky from current position
+					array_splice( $bbp->topic_query->posts, $i, 1 );
+
+					// Move to front, after other stickies
+					array_splice( $bbp->topic_query->posts, $sticky_offset, 0, array( $sticky ) );
+
+					// Increment the sticky offset.  The next sticky will be placed at this offset.
+					$sticky_offset++;
+
+					// Remove post from sticky posts array
+					$offset = array_search( $sticky->ID, $stickies );
+
+					// Cleanup
+					unset( $stickies[$offset] );
+					unset( $sticky            );
+				}
+			}
+
+			// If any posts have been excluded specifically, Ignore those that are sticky.
+			if ( !empty( $stickies ) && !empty( $post__not_in ) ) {
+				$stickies = array_diff( $stickies, $post__not_in );
+			}
+
+			// Fetch sticky posts that weren't in the query results
+			if ( !empty( $stickies ) ) {
+
+				// Query to use in get_posts to get sticky posts
+				$sticky_query = array(
+					'post_type'   => bbp_get_topic_post_type(),
+					'post_parent' => 'any',
+					'post_status' => $default_post_status,
+					'meta_key'    => '_bbp_last_active_time',
+					'orderby'     => 'meta_value',
+					'order'       => 'DESC',
+					'include'     => $stickies
+				);
+
+				// Get all stickies
+				$sticky_posts = get_posts( $sticky_query );
+				if ( !empty( $sticky_posts ) ) {
+
+					// Get a count of the visible stickies
+					$sticky_count = count( $sticky_posts );
+
+					// Loop through stickies and add them to beginning of array
+					foreach ( $sticky_posts as $sticky )
+						$topics[] = $sticky;
+
+					// Loop through topics and add them to end of array
+					foreach ( $bbp->topic_query->posts as $topic )
+						$topics[] = $topic;
+
+					// Adjust loop and counts for new sticky positions
+					$bbp->topic_query->posts       = $topics;
+					$bbp->topic_query->found_posts = (int) $bbp->topic_query->found_posts + (int) $sticky_count;
+					$bbp->topic_query->post_count  = (int) $bbp->topic_query->post_count  + (int) $sticky_count;
+
+					// Cleanup
+					unset( $topics       );
+					unset( $stickies     );
+					unset( $sticky_posts );
+				}
+			}
+		}
+	}
+
+	// If no limit to posts per page, set it to the current post_count
+	if ( -1 == $posts_per_page )
+		$posts_per_page = $bbp->topic_query->post_count;
+
+	// Add pagination values to query object
+	$bbp->topic_query->posts_per_page = $posts_per_page;
+	$bbp->topic_query->paged          = $paged;
+
+	// Only add pagination if query returned results
+	if ( ( (int) $bbp->topic_query->post_count || (int) $bbp->topic_query->found_posts ) && (int) $bbp->topic_query->posts_per_page ) {
+
+		// Limit the number of topics shown based on maximum allowed pages
+		if ( ( !empty( $max_num_pages ) ) && $bbp->topic_query->found_posts > $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count )
+			$bbp->topic_query->found_posts = $bbp->topic_query->max_num_pages * $bbp->topic_query->post_count;
+
+		// If pretty permalinks are enabled, make our pagination pretty
+		if ( $wp_rewrite->using_permalinks() ) {
+
+			// User's topics
+			if ( bbp_is_single_user_topics() ) {
+				$base = bbp_get_user_topics_created_url( bbp_get_displayed_user_id() );
+
+			// User's favorites
+			} elseif ( bbp_is_favorites() ) {
+				$base = bbp_get_favorites_permalink( bbp_get_displayed_user_id() );
+
+			// User's subscriptions
+			} elseif ( bbp_is_subscriptions() ) {
+				$base = bbp_get_subscriptions_permalink( bbp_get_displayed_user_id() );
+
+			// Root profile page
+			} elseif ( bbp_is_single_user() ) {
+				$base = bbp_get_user_profile_url( bbp_get_displayed_user_id() );
+
+			// View
+			} elseif ( bbp_is_single_view() ) {
+				$base = bbp_get_view_url();
+
+			// Topic tag
+			} elseif ( bbp_is_topic_tag() ) {
+				$base = bbp_get_topic_tag_link();
+
+			// Page or single post
+			} elseif ( is_page() || is_single() ) {
+				$base = get_permalink();
+
+			// Topic archive
+			} elseif ( bbp_is_topic_archive() ) {
+				$base = bbp_get_topics_url();
+
+			// Default
+			} else {
+				$base = get_permalink( $post_parent );
+			}
+
+			// Use pagination base
+			$base = trailingslashit( $base ) . user_trailingslashit( $wp_rewrite->pagination_base . '/%#%/' );
+
+		// Unpretty pagination
+		} else {
+			$base = add_query_arg( 'paged', '%#%' );
+		}
+
+		// Pagination settings with filter
+		$bbp_topic_pagination = apply_filters( 'bbp_topic_pagination', array (
+			'base'      => $base,
+			'format'    => '',
+			'total'     => $posts_per_page == $bbp->topic_query->found_posts ? 1 : ceil( (int) $bbp->topic_query->found_posts / (int) $posts_per_page ),
+			'current'   => (int) $bbp->topic_query->paged,
+			'prev_text' => '&larr;',
+			'next_text' => '&rarr;',
+			'mid_size'  => 1
+		) );
+
+		// Add pagination to query object
+		$bbp->topic_query->pagination_links = paginate_links ( $bbp_topic_pagination );
+
+		// Remove first page from pagination
+		$bbp->topic_query->pagination_links = str_replace( $wp_rewrite->pagination_base . "/1/'", "'", $bbp->topic_query->pagination_links );
+	}
+
+	// Return object
+	return apply_filters( 'bbp_has_topics', $bbp->topic_query->have_posts(), $bbp->topic_query );
+}
+
+/**
+ * Whether there are more topics available in the loop
+ *
+ * @since bbPress (r2485)
+ *
+ * @uses WP_Query bbPress::topic_query::have_posts()
+ * @return object Topic information
+ */
+function bbp_topics() {
+
+	// Put into variable to check against next
+	$have_posts = bbpress()->topic_query->have_posts();
+
+	// Reset the post data when finished
+	if ( empty( $have_posts ) )
+		wp_reset_postdata();
+
+	return $have_posts;
+}
+
+/**
+ * Loads up the current topic in the loop
+ *
+ * @since bbPress (r2485)
+ *
+ * @uses WP_Query bbPress::topic_query::the_post()
+ * @return object Topic information
+ */
+function bbp_the_topic() {
+	return bbpress()->topic_query->the_post();
+}
+
+/**
+ * Output the topic id
+ *
+ * @since bbPress (r2485)
+ *
+ * @uses bbp_get_topic_id() To get the topic id
+ */
+function bbp_topic_id( $topic_id = 0) {
+	echo bbp_get_topic_id( $topic_id );
+}
+	/**
+	 * Return the topic id
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param $topic_id Optional. Used to check emptiness
+	 * @uses bbPress::topic_query::post::ID To get the topic id
+	 * @uses bbp_is_single_topic() To check if it's a topic page
+	 * @uses bbp_is_topic_edit() To check if it's a topic edit page
+	 * @uses bbp_is_single_reply() To check if it it's a reply page
+	 * @uses bbp_is_reply_edit() To check if it's a reply edit page
+	 * @uses bbp_get_reply_topic_edit() To get the reply topic id
+	 * @uses get_post_field() To get the post's post type
+	 * @uses WP_Query::post::ID To get the topic id
+	 * @uses bbp_get_topic_post_type() To get the topic post type
+	 * @uses apply_filters() Calls 'bbp_get_topic_id' with the topic id and
+	 *                        supplied topic id
+	 * @return int The topic id
+	 */
+	function bbp_get_topic_id( $topic_id = 0 ) {
+		global $wp_query;
+
+		$bbp = bbpress();
+
+		// Easy empty checking
+		if ( !empty( $topic_id ) && is_numeric( $topic_id ) )
+			$bbp_topic_id = $topic_id;
+
+		// Currently inside a topic loop
+		elseif ( !empty( $bbp->topic_query->in_the_loop ) && isset( $bbp->topic_query->post->ID ) )
+			$bbp_topic_id = $bbp->topic_query->post->ID;
+
+		// Currently viewing a forum
+		elseif ( ( bbp_is_single_topic() || bbp_is_topic_edit() ) && !empty( $bbp->current_topic_id ) )
+			$bbp_topic_id = $bbp->current_topic_id;
+
+		// Currently viewing a topic
+		elseif ( ( bbp_is_single_topic() || bbp_is_topic_edit() ) && isset( $wp_query->post->ID ) )
+			$bbp_topic_id = $wp_query->post->ID;
+
+		// Currently viewing a topic
+		elseif ( bbp_is_single_reply() )
+			$bbp_topic_id = bbp_get_reply_topic_id();
+
+		// Fallback
+		else
+			$bbp_topic_id = 0;
+
+		return (int) apply_filters( 'bbp_get_topic_id', (int) $bbp_topic_id, $topic_id );
+	}
+
+/**
+ * Gets a topic
+ *
+ * @since bbPress (r2787)
+ *
+ * @param int|object $topic Topic id or topic object
+ * @param string $output Optional. OBJECT, ARRAY_A, or ARRAY_N. Default = OBJECT
+ * @param string $filter Optional Sanitation filter. See {@link sanitize_post()}
+ * @uses get_post() To get the topic
+ * @uses apply_filters() Calls 'bbp_get_topic' with the topic, output type and
+ *                        sanitation filter
+ * @return mixed Null if error or topic (in specified form) if success
+ */
+function bbp_get_topic( $topic, $output = OBJECT, $filter = 'raw' ) {
+
+	// Use topic ID
+	if ( empty( $topic ) || is_numeric( $topic ) )
+		$topic = bbp_get_topic_id( $topic );
+
+	// Attempt to load the topic
+	$topic = get_post( $topic, OBJECT, $filter );
+	if ( empty( $topic ) )
+		return $topic;
+
+	// Bail if post_type is not a topic
+	if ( $topic->post_type !== bbp_get_topic_post_type() )
+		return null;
+
+	// Tweak the data type to return
+	if ( $output == OBJECT ) {
+		return $topic;
+
+	} elseif ( $output == ARRAY_A ) {
+		$_topic = get_object_vars( $topic );
+		return $_topic;
+
+	} elseif ( $output == ARRAY_N ) {
+		$_topic = array_values( get_object_vars( $topic ) );
+		return $_topic;
+
+	}
+
+	return apply_filters( 'bbp_get_topic', $topic, $output, $filter );
+}
+
+/**
+ * Output the link to the topic in the topic loop
+ *
+ * @since bbPress (r2485)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param $string $redirect_to Optional. Pass a redirect value for use with
+ *                              shortcodes and other fun things.
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ */
+function bbp_topic_permalink( $topic_id = 0, $redirect_to = '' ) {
+	echo bbp_get_topic_permalink( $topic_id, $redirect_to );
+}
+	/**
+	 * Return the link to the topic
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param $string $redirect_to Optional. Pass a redirect value for use with
+	 *                              shortcodes and other fun things.
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_permalink() To get the topic permalink
+	 * @uses esc_url_raw() To clean the redirect_to url
+	 * @uses apply_filters() Calls 'bbp_get_topic_permalink' with the link
+	 *                        and topic id
+	 * @return string Permanent link to topic
+	 */
+	function bbp_get_topic_permalink( $topic_id = 0, $redirect_to = '' ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Use the redirect address
+		if ( !empty( $redirect_to ) ) {
+			$topic_permalink = esc_url_raw( $redirect_to );
+
+		// Use the topic permalink
+		} else {
+			$topic_permalink = get_permalink( $topic_id );
+		}
+
+		return apply_filters( 'bbp_get_topic_permalink', $topic_permalink, $topic_id );
+	}
+
+/**
+ * Output the title of the topic
+ *
+ * @since bbPress (r2485)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_title() To get the topic title
+ */
+function bbp_topic_title( $topic_id = 0 ) {
+	echo bbp_get_topic_title( $topic_id );
+}
+	/**
+	 * Return the title of the topic
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_the_title() To get the title
+	 * @uses apply_filters() Calls 'bbp_get_topic_title' with the title and
+	 *                        topic id
+	 * @return string Title of topic
+	 */
+	function bbp_get_topic_title( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$title    = get_the_title( $topic_id );
+
+		return apply_filters( 'bbp_get_topic_title', $title, $topic_id );
+	}
+
+/**
+ * Output the topic archive title
+ *
+ * @since bbPress (r3249)
+ *
+ * @param string $title Default text to use as title
+ */
+function bbp_topic_archive_title( $title = '' ) {
+	echo bbp_get_topic_archive_title( $title );
+}
+	/**
+	 * Return the topic archive title
+	 *
+	 * @since bbPress (r3249)
+	 *
+	 * @param string $title Default text to use as title
+	 *
+	 * @uses bbp_get_page_by_path() Check if page exists at root path
+	 * @uses get_the_title() Use the page title at the root path
+	 * @uses get_post_type_object() Load the post type object
+	 * @uses bbp_get_topic_post_type() Get the topic post type ID
+	 * @uses get_post_type_labels() Get labels for topic post type
+	 * @uses apply_filters() Allow output to be manipulated
+	 *
+	 * @return string The topic archive title
+	 */
+	function bbp_get_topic_archive_title( $title = '' ) {
+
+		// If no title was passed
+		if ( empty( $title ) ) {
+
+			// Set root text to page title
+			$page = bbp_get_page_by_path( bbp_get_topic_archive_slug() );
+			if ( !empty( $page ) ) {
+				$title = get_the_title( $page->ID );
+
+			// Default to topic post type name label
+			} else {
+				$tto    = get_post_type_object( bbp_get_topic_post_type() );
+				$title  = $tto->labels->name;
+			}
+		}
+
+		return apply_filters( 'bbp_get_topic_archive_title', $title );
+	}
+
+/**
+ * Output the content of the topic
+ *
+ * @since bbPress (r2780)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_content() To get the topic content
+ */
+function bbp_topic_content( $topic_id = 0 ) {
+	echo bbp_get_topic_content( $topic_id );
+}
+	/**
+	 * Return the content of the topic
+	 *
+	 * @since bbPress (r2780)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses post_password_required() To check if the topic requires pass
+	 * @uses get_the_password_form() To get the password form
+	 * @uses get_post_field() To get the content post field
+	 * @uses apply_filters() Calls 'bbp_get_topic_content' with the content
+	 *                        and topic id
+	 * @return string Content of the topic
+	 */
+	function bbp_get_topic_content( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Check if password is required
+		if ( post_password_required( $topic_id ) )
+			return get_the_password_form();
+
+		$content = get_post_field( 'post_content', $topic_id );
+
+		return apply_filters( 'bbp_get_topic_content', $content, $topic_id );
+	}
+
+/**
+ * Output the excerpt of the topic
+ *
+ * @since bbPress (r2780)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param int $length Optional. Length of the excerpt. Defaults to 100 letters
+ * @uses bbp_get_topic_excerpt() To get the topic excerpt
+ */
+function bbp_topic_excerpt( $topic_id = 0, $length = 100 ) {
+	echo bbp_get_topic_excerpt( $topic_id, $length );
+}
+	/**
+	 * Return the excerpt of the topic
+	 *
+	 * @since bbPress (r2780)
+	 *
+	 * @param int $topic_id Optional. topic id
+	 * @param int $length Optional. Length of the excerpt. Defaults to 100
+	 *                     letters
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_field() To get the excerpt
+	 * @uses bbp_get_topic_content() To get the topic content
+	 * @uses apply_filters() Calls 'bbp_get_topic_excerpt' with the excerpt,
+	 *                        topic id and length
+	 * @return string topic Excerpt
+	 */
+	function bbp_get_topic_excerpt( $topic_id = 0, $length = 100 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$length   = (int) $length;
+		$excerpt  = get_post_field( $topic_id, 'post_excerpt' );
+
+		if ( empty( $excerpt ) )
+			$excerpt = bbp_get_topic_content( $topic_id );
+
+		$excerpt = trim( strip_tags( $excerpt ) );
+
+		if ( !empty( $length ) && strlen( $excerpt ) > $length ) {
+			$excerpt  = substr( $excerpt, 0, $length - 1 );
+			$excerpt .= '&hellip;';
+		}
+
+		return apply_filters( 'bbp_get_topic_excerpt', $excerpt, $topic_id, $length );
+	}
+
+/**
+ * Output the post date and time of a topic
+ *
+ * @since bbPress (r4155)
+ *
+ * @param int $topic_id Optional. Topic id.
+ * @param bool $humanize Optional. Humanize output using time_since
+ * @param bool $gmt Optional. Use GMT
+ * @uses bbp_get_topic_post_date() to get the output
+ */
+function bbp_topic_post_date( $topic_id = 0, $humanize = false, $gmt = false ) {
+	echo bbp_get_topic_post_date( $topic_id, $humanize, $gmt );
+}
+	/**
+	 * Return the post date and time of a topic
+	 *
+	 * @since bbPress (r4155)
+	 *
+	 * @param int $topic_id Optional. Topic id.
+	 * @param bool $humanize Optional. Humanize output using time_since
+	 * @param bool $gmt Optional. Use GMT
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_time() to get the topic post time
+	 * @uses bbp_time_since() to maybe humanize the topic post time
+	 * @return string
+	 */
+	function bbp_get_topic_post_date( $topic_id = 0, $humanize = false, $gmt = false ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// 4 days, 4 hours ago
+		if ( !empty( $humanize ) ) {
+			$gmt    = !empty( $gmt ) ? 'G' : 'U';
+			$date   = get_post_time( $gmt, $topic_id );
+			$time   = false; // For filter below
+			$result = bbp_time_since( $date );
+
+		// August 4, 2012 at 2:37 pm
+		} else {
+			$date   = get_post_time( get_option( 'date_format' ), $gmt, $topic_id );
+			$time   = get_post_time( get_option( 'time_format' ), $gmt, $topic_id );
+			$result = sprintf( _x( '%1$s at %2$s', 'date at time', 'bbpress' ), $date, $time );
+		}
+
+		return apply_filters( 'bbp_get_topic_post_date', $result, $topic_id, $humanize, $gmt, $date, $time );
+	}
+
+/**
+ * Output pagination links of a topic within the topic loop
+ *
+ * @since bbPress (r2966)
+ *
+ * @param mixed $args See {@link bbp_get_topic_pagination()}
+ * @uses bbp_get_topic_pagination() To get the topic pagination links
+ */
+function bbp_topic_pagination( $args = '' ) {
+	echo bbp_get_topic_pagination( $args );
+}
+	/**
+	 * Returns pagination links of a topic within the topic loop
+	 *
+	 * @since bbPress (r2966)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - topic_id: Topic id
+	 *  - before: Before the links
+	 *  - after: After the links
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses WP_Rewrite::using_permalinks() To check if the blog is using
+	 *                                       permalinks
+	 * @uses user_trailingslashit() To add a trailing slash
+	 * @uses trailingslashit() To add a trailing slash
+	 * @uses get_permalink() To get the permalink of the topic
+	 * @uses add_query_arg() To add query args
+	 * @uses bbp_get_topic_reply_count() To get topic reply count
+	 * @uses bbp_show_topic_lead() Are we showing the topic as a lead?
+	 * @uses get_option() To get replies per page option
+	 * @uses paginate_links() To paginate the links
+	 * @uses apply_filters() Calls 'bbp_get_topic_pagination' with the links
+	 *                        and arguments
+	 * @return string Pagination links
+	 */
+	function bbp_get_topic_pagination( $args = '' ) {
+		global $wp_rewrite;
+
+		$defaults = array(
+			'topic_id' => bbp_get_topic_id(),
+			'before'   => '<span class="bbp-topic-pagination">',
+			'after'    => '</span>',
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_pagination' );
+		extract( $r );
+
+		// If pretty permalinks are enabled, make our pagination pretty
+		if ( $wp_rewrite->using_permalinks() )
+			$base = trailingslashit( get_permalink( $topic_id ) ) . user_trailingslashit( $wp_rewrite->pagination_base . '/%#%/' );
+		else
+			$base = add_query_arg( 'paged', '%#%', get_permalink( $topic_id ) );
+
+		// Get total and add 1 if topic is included in the reply loop
+		$total = bbp_get_topic_reply_count( $topic_id, true );
+
+		// Bump if topic is in loop
+		if ( !bbp_show_lead_topic() )
+			$total++;
+
+		// Pagination settings
+		$pagination = array(
+			'base'      => $base,
+			'format'    => '',
+			'total'     => ceil( (int) $total / (int) bbp_get_replies_per_page() ),
+			'current'   => 0,
+			'prev_next' => false,
+			'mid_size'  => 2,
+			'end_size'  => 3,
+			'add_args'  => ( bbp_get_view_all() ) ? array( 'view' => 'all' ) : false
+		);
+
+		// Add pagination to query object
+		$pagination_links = paginate_links( $pagination );
+		if ( !empty( $pagination_links ) ) {
+
+			// Remove first page from pagination
+			if ( $wp_rewrite->using_permalinks() ) {
+				$pagination_links = str_replace( $wp_rewrite->pagination_base . '/1/', '', $pagination_links );
+			} else {
+				$pagination_links = str_replace( '&#038;paged=1', '', $pagination_links );
+			}
+
+			// Add before and after to pagination links
+			$pagination_links = $before . $pagination_links . $after;
+		}
+
+		return apply_filters( 'bbp_get_topic_pagination', $pagination_links, $args );
+	}
+
+/**
+ * Append revisions to the topic content
+ *
+ * @since bbPress (r2782)
+ *
+ * @param string $content Optional. Content to which we need to append the revisions to
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_revision_log() To get the topic revision log
+ * @uses apply_filters() Calls 'bbp_topic_append_revisions' with the processed
+ *                        content, original content and topic id
+ * @return string Content with the revisions appended
+ */
+function bbp_topic_content_append_revisions( $content = '', $topic_id = 0 ) {
+
+	// Bail if in admin or feed
+	if ( is_admin() || is_feed() )
+		return;
+
+	// Validate the ID
+	$topic_id = bbp_get_topic_id( $topic_id );
+
+	return apply_filters( 'bbp_topic_append_revisions', $content . bbp_get_topic_revision_log( $topic_id ), $content, $topic_id );
+}
+
+/**
+ * Output the revision log of the topic
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_revision_log() To get the topic revision log
+ */
+function bbp_topic_revision_log( $topic_id = 0 ) {
+	echo bbp_get_topic_revision_log( $topic_id );
+}
+	/**
+	 * Return the formatted revision log of the topic
+	 *
+	 * @since bbPress (r2782)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_revisions() To get the topic revisions
+	 * @uses bbp_get_topic_raw_revision_log() To get the raw revision log
+	 * @uses bbp_get_topic_author_display_name() To get the topic author
+	 * @uses bbp_get_author_link() To get the topic author link
+	 * @uses bbp_convert_date() To convert the date
+	 * @uses bbp_get_time_since() To get the time in since format
+	 * @uses apply_filters() Calls 'bbp_get_topic_revision_log' with the
+	 *                        log and topic id
+	 * @return string Revision log of the topic
+	 */
+	function bbp_get_topic_revision_log( $topic_id = 0 ) {
+		// Create necessary variables
+		$topic_id     = bbp_get_topic_id( $topic_id );
+		$revision_log = bbp_get_topic_raw_revision_log( $topic_id );
+
+		if ( empty( $topic_id ) || empty( $revision_log ) || !is_array( $revision_log ) )
+			return false;
+
+		$revisions = bbp_get_topic_revisions( $topic_id );
+		if ( empty( $revisions ) )
+			return false;
+
+		$r = "\n\n" . '<ul id="bbp-topic-revision-log-' . $topic_id . '" class="bbp-topic-revision-log">' . "\n\n";
+
+		// Loop through revisions
+		foreach ( (array) $revisions as $revision ) {
+
+			if ( empty( $revision_log[$revision->ID] ) ) {
+				$author_id = $revision->post_author;
+				$reason    = '';
+			} else {
+				$author_id = $revision_log[$revision->ID]['author'];
+				$reason    = $revision_log[$revision->ID]['reason'];
+			}
+
+			$author = bbp_get_author_link( array( 'size' => 14, 'link_text' => bbp_get_topic_author_display_name( $revision->ID ), 'post_id' => $revision->ID ) );
+			$since  = bbp_get_time_since( bbp_convert_date( $revision->post_modified ) );
+
+			$r .= "\t" . '<li id="bbp-topic-revision-log-' . $topic_id . '-item-' . $revision->ID . '" class="bbp-topic-revision-log-item">' . "\n";
+			if ( !empty( $reason ) ) {
+				$r .= "\t\t" . sprintf( __( 'This topic was modified %1$s by %2$s. Reason: %3$s', 'bbpress' ), $since, $author, $reason ) . "\n";
+			} else {
+				$r .= "\t\t" . sprintf( __( 'This topic was modified %1$s by %2$s.', 'bbpress' ), $since, $author ) . "\n";
+			}
+			$r .= "\t" . '</li>' . "\n";
+
+		}
+
+		$r .= "\n" . '</ul>' . "\n\n";
+
+		return apply_filters( 'bbp_get_topic_revision_log', $r, $topic_id );
+	}
+		/**
+		 * Return the raw revision log of the topic
+		 *
+		 * @since bbPress (r2782)
+		 *
+		 * @param int $topic_id Optional. Topic id
+		 * @uses bbp_get_topic_id() To get the topic id
+		 * @uses get_post_meta() To get the revision log meta
+		 * @uses apply_filters() Calls 'bbp_get_topic_raw_revision_log'
+		 *                        with the log and topic id
+		 * @return string Raw revision log of the topic
+		 */
+		function bbp_get_topic_raw_revision_log( $topic_id = 0 ) {
+			$topic_id = bbp_get_topic_id( $topic_id );
+
+			$revision_log = get_post_meta( $topic_id, '_bbp_revision_log', true );
+			$revision_log = empty( $revision_log ) ? array() : $revision_log;
+
+			return apply_filters( 'bbp_get_topic_raw_revision_log', $revision_log, $topic_id );
+		}
+
+/**
+ * Return the revisions of the topic
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses wp_get_post_revisions() To get the topic revisions
+ * @uses apply_filters() Calls 'bbp_get_topic_revisions'
+ *                        with the revisions and topic id
+ * @return string Topic revisions
+ */
+function bbp_get_topic_revisions( $topic_id = 0 ) {
+	$topic_id  = bbp_get_topic_id( $topic_id );
+	$revisions = wp_get_post_revisions( $topic_id, array( 'order' => 'ASC' ) );
+
+	return apply_filters( 'bbp_get_topic_revisions', $revisions, $topic_id );
+}
+
+/**
+ * Return the revision count of the topic
+ *
+ * @since bbPress (r2782)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_revisions() To get the topic revisions
+ * @uses apply_filters() Calls 'bbp_get_topic_revision_count'
+ *                        with the revision count and topic id
+ * @return string Topic revision count
+ */
+function bbp_get_topic_revision_count( $topic_id = 0, $integer = false ) {
+	$count  = (int) count( bbp_get_topic_revisions( $topic_id ) );
+	$filter = ( true === $integer ) ? 'bbp_get_topic_revision_count_int' : 'bbp_get_topic_revision_count';
+
+	return apply_filters( $filter, $count, $topic_id );
+}
+
+/**
+ * Output the status of the topic
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_status() To get the topic status
+ */
+function bbp_topic_status( $topic_id = 0 ) {
+	echo bbp_get_topic_status( $topic_id );
+}
+	/**
+	 * Return the status of the topic
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_status() To get the topic status
+	 * @uses apply_filters() Calls 'bbp_get_topic_status' with the status
+	 *                        and topic id
+	 * @return string Status of topic
+	 */
+	function bbp_get_topic_status( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		return apply_filters( 'bbp_get_topic_status', get_post_status( $topic_id ), $topic_id );
+	}
+
+/**
+ * Is the topic open to new replies?
+ *
+ * @since bbPress (r2727)
+ *
+ * @uses bbp_get_topic_status()
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_is_topic_closed() To check if the topic is closed
+ * @return bool True if open, false if closed.
+ */
+function bbp_is_topic_open( $topic_id = 0 ) {
+	return !bbp_is_topic_closed( $topic_id );
+}
+
+	/**
+	 * Is the topic closed to new replies?
+	 *
+	 * @since bbPress (r2746)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_status() To get the topic status
+	 * @uses apply_filters() Calls 'bbp_is_topic_closed' with the topic id
+	 *
+	 * @return bool True if closed, false if not.
+	 */
+	function bbp_is_topic_closed( $topic_id = 0 ) {
+		$closed = bbp_get_topic_status( $topic_id ) == bbp_get_closed_status_id();
+		return (bool) apply_filters( 'bbp_is_topic_closed', (bool) $closed, $topic_id );
+	}
+
+/**
+ * Is the topic a sticky or super sticky?
+ *
+ * @since bbPress (r2754)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param int $check_super Optional. If set to true and if the topic is not a
+ *                           normal sticky, it is checked if it is a super
+ *                           sticky or not. Defaults to true.
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_forum_id() To get the topic forum id
+ * @uses bbp_get_stickies() To get the stickies
+ * @uses bbp_is_topic_super_sticky() To check if the topic is a super sticky
+ * @return bool True if sticky or super sticky, false if not.
+ */
+function bbp_is_topic_sticky( $topic_id = 0, $check_super = true ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$forum_id = bbp_get_topic_forum_id( $topic_id );
+	$stickies = bbp_get_stickies( $forum_id );
+
+	if ( in_array( $topic_id, $stickies ) || ( !empty( $check_super ) && bbp_is_topic_super_sticky( $topic_id ) ) )
+		return true;
+
+	return false;
+}
+
+/**
+ * Is the topic a super sticky?
+ *
+ * @since bbPress (r2754)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_super_stickies() To get the super stickies
+ * @return bool True if super sticky, false if not.
+ */
+function bbp_is_topic_super_sticky( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$stickies = bbp_get_super_stickies( $topic_id );
+
+	return in_array( $topic_id, $stickies );
+}
+
+/**
+ * Is the topic not spam or deleted?
+ *
+ * @since bbPress (r3496)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_status() To get the topic status
+ * @uses apply_filters() Calls 'bbp_is_topic_published' with the topic id
+ * @return bool True if published, false if not.
+ */
+function bbp_is_topic_published( $topic_id = 0 ) {
+	$topic_status = bbp_get_topic_status( bbp_get_topic_id( $topic_id ) ) == bbp_get_public_status_id();
+	return (bool) apply_filters( 'bbp_is_topic_published', (bool) $topic_status, $topic_id );
+}
+
+/**
+ * Is the topic marked as spam?
+ *
+ * @since bbPress (r2727)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_status() To get the topic status
+ * @uses apply_filters() Calls 'bbp_is_topic_spam' with the topic id
+ * @return bool True if spam, false if not.
+ */
+function bbp_is_topic_spam( $topic_id = 0 ) {
+	$topic_status = bbp_get_topic_status( bbp_get_topic_id( $topic_id ) ) == bbp_get_spam_status_id();
+	return (bool) apply_filters( 'bbp_is_topic_spam', (bool) $topic_status, $topic_id );
+}
+
+/**
+ * Is the topic trashed?
+ *
+ * @since bbPress (r2888)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_status() To get the topic status
+ * @uses apply_filters() Calls 'bbp_is_topic_trash' with the topic id
+ * @return bool True if trashed, false if not.
+ */
+function bbp_is_topic_trash( $topic_id = 0 ) {
+	$topic_status = bbp_get_topic_status( bbp_get_topic_id( $topic_id ) ) == bbp_get_trash_status_id();
+	return (bool) apply_filters( 'bbp_is_topic_trash', (bool) $topic_status, $topic_id );
+}
+
+/**
+ * Is the posted by an anonymous user?
+ *
+ * @since bbPress (r2753)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_get_topic_author_id() To get the topic author id
+ * @uses get_post_meta() To get the anonymous user name and email meta
+ * @uses apply_filters() Calls 'bbp_is_topic_anonymous' with the topic id
+ * @return bool True if the post is by an anonymous user, false if not.
+ */
+function bbp_is_topic_anonymous( $topic_id = 0 ) {
+	$topic_id = bbp_get_topic_id( $topic_id );
+	$retval   = false;
+
+	if ( !bbp_get_topic_author_id( $topic_id ) )
+		$retval = true;
+
+	elseif ( get_post_meta( $topic_id, '_bbp_anonymous_name',  true ) )
+		$retval = true;
+
+	elseif ( get_post_meta( $topic_id, '_bbp_anonymous_email', true ) )
+		$retval = true;
+
+	// The topic is by an anonymous user
+	return (bool) apply_filters( 'bbp_is_topic_anonymous', $retval, $topic_id );
+}
+
+/**
+ * Output the author of the topic
+ *
+ * @since bbPress (r2590)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_author() To get the topic author
+ */
+function bbp_topic_author( $topic_id = 0 ) {
+	echo bbp_get_topic_author( $topic_id );
+}
+	/**
+	 * Return the author of the topic
+	 *
+	 * @since bbPress (r2590)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses get_the_author_meta() To get the display name of the author
+	 * @uses get_post_meta() To get the name of the anonymous poster
+	 * @uses apply_filters() Calls 'bbp_get_topic_author' with the author
+	 *                        and topic id
+	 * @return string Author of topic
+	 */
+	function bbp_get_topic_author( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		if ( !bbp_is_topic_anonymous( $topic_id ) )
+			$author = get_the_author_meta( 'display_name', bbp_get_topic_author_id( $topic_id ) );
+		else
+			$author = get_post_meta( $topic_id, '_bbp_anonymous_name', true );
+
+		return apply_filters( 'bbp_get_topic_author', $author, $topic_id );
+	}
+
+/**
+ * Output the author ID of the topic
+ *
+ * @since bbPress (r2590)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_author_id() To get the topic author id
+ */
+function bbp_topic_author_id( $topic_id = 0 ) {
+	echo bbp_get_topic_author_id( $topic_id );
+}
+	/**
+	 * Return the author ID of the topic
+	 *
+	 * @since bbPress (r2590)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_field() To get the topic author id
+	 * @uses apply_filters() Calls 'bbp_get_topic_author_id' with the author
+	 *                        id and topic id
+	 * @return string Author of topic
+	 */
+	function bbp_get_topic_author_id( $topic_id = 0 ) {
+		$topic_id  = bbp_get_topic_id( $topic_id );
+		$author_id = get_post_field( 'post_author', $topic_id );
+
+		return (int) apply_filters( 'bbp_get_topic_author_id', (int) $author_id, $topic_id );
+	}
+
+/**
+ * Output the author display_name of the topic
+ *
+ * @since bbPress (r2590)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_author_display_name() To get the topic author's display
+ *                                            name
+ */
+function bbp_topic_author_display_name( $topic_id = 0 ) {
+	echo bbp_get_topic_author_display_name( $topic_id );
+}
+	/**
+	 * Return the author display_name of the topic
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses get_the_author_meta() To get the author meta
+	 * @uses get_post_meta() To get the anonymous user name
+	 * @uses apply_filters() Calls 'bbp_get_topic_author_id' with the
+	 *                        display name and topic id
+	 * @return string Topic's author's display name
+	 */
+	function bbp_get_topic_author_display_name( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Check for anonymous user
+		if ( !bbp_is_topic_anonymous( $topic_id ) ) {
+
+			// Get the author ID
+			$author_id = bbp_get_topic_author_id( $topic_id );
+
+			// Try to get a display name
+			$author_name = get_the_author_meta( 'display_name', $author_id );
+
+			// Fall back to user login
+			if ( empty( $author_name ) ) {
+				$author_name = get_the_author_meta( 'user_login', $author_id );
+			}
+
+		// User does not have an account
+		} else {
+			$author_name = get_post_meta( $topic_id, '_bbp_anonymous_name', true );
+		}
+
+		// If nothing could be found anywhere, use Anonymous
+		if ( empty( $author_name ) )
+			$author_name = __( 'Anonymous', 'bbpress' );
+
+		return apply_filters( 'bbp_get_topic_author_display_name', esc_attr( $author_name ), $topic_id );
+	}
+
+/**
+ * Output the author avatar of the topic
+ *
+ * @since bbPress (r2590)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param int $size Optional. Avatar size. Defaults to 40
+ * @uses bbp_get_topic_author_avatar() To get the topic author avatar
+ */
+function bbp_topic_author_avatar( $topic_id = 0, $size = 40 ) {
+	echo bbp_get_topic_author_avatar( $topic_id, $size );
+}
+	/**
+	 * Return the author avatar of the topic
+	 *
+	 * @since bbPress (r2590)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param int $size Optional. Avatar size. Defaults to 40
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses get_post_meta() To get the anonymous user's email
+	 * @uses get_avatar() To get the avatar
+	 * @uses apply_filters() Calls 'bbp_get_topic_author_avatar' with the
+	 *                        avatar, topic id and size
+	 * @return string Avatar of the author of the topic
+	 */
+	function bbp_get_topic_author_avatar( $topic_id = 0, $size = 40 ) {
+		$author_avatar = '';
+
+		$topic_id = bbp_get_topic_id( $topic_id );
+		if ( !empty( $topic_id ) ) {
+			if ( !bbp_is_topic_anonymous( $topic_id ) ) {
+				$author_avatar = get_avatar( bbp_get_topic_author_id( $topic_id ), $size );
+			} else {
+				$author_avatar = get_avatar( get_post_meta( $topic_id, '_bbp_anonymous_email', true ), $size );
+			}
+		}
+
+		return apply_filters( 'bbp_get_topic_author_avatar', $author_avatar, $topic_id, $size );
+	}
+
+/**
+ * Output the author link of the topic
+ *
+ * @since bbPress (r2717)
+ *
+ * @param mixed|int $args If it is an integer, it is used as topic_id. Optional.
+ * @uses bbp_get_topic_author_link() To get the topic author link
+ */
+function bbp_topic_author_link( $args = '' ) {
+	echo bbp_get_topic_author_link( $args );
+}
+	/**
+	 * Return the author link of the topic
+	 *
+	 * @since bbPress (r2717)
+	 *
+	 * @param mixed|int $args If it is an integer, it is used as topic id.
+	 *                         Optional.
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_author_display_name() To get the topic author
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an
+	 *                                 anonymous user
+	 * @uses bbp_get_topic_author_url() To get the topic author url
+	 * @uses bbp_get_topic_author_avatar() To get the topic author avatar
+	 * @uses bbp_get_topic_author_display_name() To get the topic author display
+	 *                                      name
+	 * @uses bbp_get_user_display_role() To get the topic author display role
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses apply_filters() Calls 'bbp_get_topic_author_link' with the link
+	 *                        and args
+	 * @return string Author link of topic
+	 */
+	function bbp_get_topic_author_link( $args = '' ) {
+		$defaults = array (
+			'post_id'    => 0,
+			'link_title' => '',
+			'type'       => 'both',
+			'size'       => 80,
+			'sep'        => '&nbsp;',
+			'show_role'  => false
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_author_link' );
+		extract( $r );
+
+		// Used as topic_id
+		if ( is_numeric( $args ) ) {
+			$topic_id = bbp_get_topic_id( $args );
+		} else {
+			$topic_id = bbp_get_topic_id( $post_id );
+		}
+
+		// Topic ID is good
+		if ( !empty( $topic_id ) ) {
+
+			// Tweak link title if empty
+			if ( empty( $link_title ) ) {
+				$link_title = sprintf( !bbp_is_topic_anonymous( $topic_id ) ? __( 'View %s\'s profile', 'bbpress' ) : __( 'Visit %s\'s website', 'bbpress' ), bbp_get_topic_author_display_name( $topic_id ) );
+			}
+
+			$link_title   = !empty( $link_title ) ? ' title="' . $link_title . '"' : '';
+			$author_url   = bbp_get_topic_author_url( $topic_id );
+			$anonymous    = bbp_is_topic_anonymous( $topic_id );
+			$author_links = array();
+
+			// Get avatar
+			if ( 'avatar' == $type || 'both' == $type ) {
+				$author_links['avatar'] = bbp_get_topic_author_avatar( $topic_id, $size );
+			}
+
+			// Get display name
+			if ( 'name' == $type   || 'both' == $type ) {
+				$author_links['name'] = bbp_get_topic_author_display_name( $topic_id );
+			}
+
+			// Link class
+			$link_class = ' class="bbp-author-' . $type . '"';
+
+			// Add links if not anonymous
+			if ( empty( $anonymous ) && bbp_user_has_profile( bbp_get_topic_author_id( $topic_id ) ) ) {
+
+				// Assemble the links
+				foreach ( $author_links as $link => $link_text ) {
+					$link_class = ' class="bbp-author-' . $link . '"';
+					$author_link[] = sprintf( '<a href="%1$s"%2$s%3$s>%4$s</a>', $author_url, $link_title, $link_class, $link_text );
+				}
+
+				if ( true === $show_role ) {
+					$author_link[] = bbp_get_topic_author_role( array( 'topic_id' => $topic_id ) );
+				}
+
+				$author_link = join( $sep, $author_link );
+
+			// No links if anonymous
+			} else {
+				$author_link = join( $sep, $author_links );
+			}
+
+		} else {
+			$author_link = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_author_link', $author_link, $args );
+	}
+
+/**
+ * Output the author url of the topic
+ *
+ * @since bbPress (r2590)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_author_url() To get the topic author url
+ */
+function bbp_topic_author_url( $topic_id = 0 ) {
+	echo bbp_get_topic_author_url( $topic_id );
+}
+
+	/**
+	 * Return the author url of the topic
+	 *
+	 * @since bbPress (r2590)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an anonymous
+	 *                                 user or not
+	 * @uses bbp_get_topic_author_id() To get topic author id
+	 * @uses bbp_get_user_profile_url() To get profile url
+	 * @uses get_post_meta() To get anonmous user's website
+	 * @uses apply_filters() Calls 'bbp_get_topic_author_url' with the link &
+	 *                        topic id
+	 * @return string Author URL of topic
+	 */
+	function bbp_get_topic_author_url( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Check for anonymous user
+		if ( !bbp_is_topic_anonymous( $topic_id ) ) {
+			$author_url = bbp_get_user_profile_url( bbp_get_topic_author_id( $topic_id ) );
+		} else {
+			$author_url = get_post_meta( $topic_id, '_bbp_anonymous_website', true );
+
+			// Set empty author_url as empty string
+			if ( empty( $author_url ) ) {
+				$author_url = '';
+			}
+		}
+
+		return apply_filters( 'bbp_get_topic_author_url', $author_url, $topic_id );
+	}
+
+/**
+ * Output the topic author email address
+ *
+ * @since bbPress (r3445)
+ *
+ * @param int $topic_id Optional. Reply id
+ * @uses bbp_get_topic_author_email() To get the topic author email
+ */
+function bbp_topic_author_email( $topic_id = 0 ) {
+	echo bbp_get_topic_author_email( $topic_id );
+}
+	/**
+	 * Return the topic author email address
+	 *
+	 * @since bbPress (r3445)
+	 *
+	 * @param int $topic_id Optional. Reply id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_topic_anonymous() To check if the topic is by an anonymous
+	 *                                 user
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses get_userdata() To get the user data
+	 * @uses get_post_meta() To get the anonymous poster's email
+	 * @uses apply_filters() Calls bbp_get_topic_author_email with the author
+	 *                        email & topic id
+	 * @return string Topic author email address
+	 */
+	function bbp_get_topic_author_email( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Not anonymous user
+		if ( !bbp_is_topic_anonymous( $topic_id ) ) {
+
+			// Use topic author email address
+			$user_id      = bbp_get_topic_author_id( $topic_id );
+			$user         = get_userdata( $user_id );
+			$author_email = !empty( $user->user_email ) ? $user->user_email : '';
+
+		// Anonymous
+		} else {
+
+			// Get email from post meta
+			$author_email = get_post_meta( $topic_id, '_bbp_anonymous_email', true );
+
+			// Sanity check for missing email address
+			if ( empty( $author_email ) ) {
+				$author_email = '';
+			}
+		}
+
+		return apply_filters( 'bbp_get_topic_author_email', $author_email, $topic_id );
+	}
+
+/**
+ * Output the topic author role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param array $args Optional.
+ * @uses bbp_get_topic_author_role() To get the topic author role
+ */
+function bbp_topic_author_role( $args = array() ) {
+	echo bbp_get_topic_author_role( $args );
+}
+	/**
+	 * Return the topic author role
+	 *
+	 * @since bbPress (r3860)
+	 *
+	 * @param array $args Optional.
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_user_display_role() To get the user display role
+	 * @uses bbp_get_topic_author_id() To get the topic author id
+	 * @uses apply_filters() Calls bbp_get_topic_author_role with the author
+	 *                        role & args
+	 * @return string topic author role
+	 */
+	function bbp_get_topic_author_role( $args = array() ) {
+		$defaults = array(
+			'topic_id' => 0,
+			'class'    => 'bbp-author-role',
+			'before'   => '',
+			'after'    => ''
+		);
+		$args = bbp_parse_args( $args, $defaults, 'get_topic_author_role' );
+		extract( $args, EXTR_SKIP );
+
+		$topic_id    = bbp_get_topic_id( $topic_id );
+		$role        = bbp_get_user_display_role( bbp_get_topic_author_id( $topic_id ) );
+		$author_role = sprintf( '%1$s<div class="%2$s">%3$s</div>%4$s', $before, $class, $role, $after );
+
+		return apply_filters( 'bbp_get_topic_author_role', $author_role, $args );
+	}
+
+
+/**
+ * Output the title of the forum a topic belongs to
+ *
+ * @since bbPress (r2485)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_forum_title() To get the topic's forum title
+ */
+function bbp_topic_forum_title( $topic_id = 0 ) {
+	echo bbp_get_topic_forum_title( $topic_id );
+}
+	/**
+	 * Return the title of the forum a topic belongs to
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get topic id
+	 * @uses bbp_get_topic_forum_id() To get topic's forum id
+	 * @uses apply_filters() Calls 'bbp_get_topic_forum' with the forum
+	 *                        title and topic id
+	 * @return string Topic forum title
+	 */
+	function bbp_get_topic_forum_title( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$forum_id = bbp_get_topic_forum_id( $topic_id );
+
+		return apply_filters( 'bbp_get_topic_forum', bbp_get_forum_title( $forum_id ), $topic_id, $forum_id );
+	}
+
+/**
+ * Output the forum id a topic belongs to
+ *
+ * @since bbPress (r2491)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_forum_id()
+ */
+function bbp_topic_forum_id( $topic_id = 0 ) {
+	echo bbp_get_topic_forum_id( $topic_id );
+}
+	/**
+	 * Return the forum id a topic belongs to
+	 *
+	 * @since bbPress (r2491)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get topic id
+	 * @uses get_post_meta() To retrieve get topic's forum id meta
+	 * @uses apply_filters() Calls 'bbp_get_topic_forum_id' with the forum
+	 *                        id and topic id
+	 * @return int Topic forum id
+	 */
+	function bbp_get_topic_forum_id( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$forum_id = get_post_meta( $topic_id, '_bbp_forum_id', true );
+
+		return (int) apply_filters( 'bbp_get_topic_forum_id', (int) $forum_id, $topic_id );
+	}
+
+/**
+ * Output the topics last active ID
+ *
+ * @since bbPress (r2860)
+ *
+ * @param int $topic_id Optional. Forum id
+ * @uses bbp_get_topic_last_active_id() To get the topic's last active id
+ */
+function bbp_topic_last_active_id( $topic_id = 0 ) {
+	echo bbp_get_topic_last_active_id( $topic_id );
+}
+	/**
+	 * Return the topics last active ID
+	 *
+	 * @since bbPress (r2860)
+	 *
+	 * @param int $topic_id Optional. Forum id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the topic's last active id
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_active_id' with
+	 *                        the last active id and topic id
+	 * @return int Forum's last active id
+	 */
+	function bbp_get_topic_last_active_id( $topic_id = 0 ) {
+		$topic_id  = bbp_get_topic_id( $topic_id );
+		$active_id = get_post_meta( $topic_id, '_bbp_last_active_id', true );
+
+		return (int) apply_filters( 'bbp_get_topic_last_active_id', (int) $active_id, $topic_id );
+	}
+
+/**
+ * Output the topics last update date/time (aka freshness)
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_last_active_time() To get topic freshness
+ */
+function bbp_topic_last_active_time( $topic_id = 0 ) {
+	echo bbp_get_topic_last_active_time( $topic_id );
+}
+	/**
+	 * Return the topics last update date/time (aka freshness)
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get topic id
+	 * @uses get_post_meta() To get the topic lst active meta
+	 * @uses bbp_get_topic_last_reply_id() To get topic last reply id
+	 * @uses get_post_field() To get the post date of topic/reply
+	 * @uses bbp_convert_date() To convert date
+	 * @uses bbp_get_time_since() To get time in since format
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_active' with topic
+	 *                        freshness and topic id
+	 * @return string Topic freshness
+	 */
+	function bbp_get_topic_last_active_time( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Try to get the most accurate freshness time possible
+		$last_active = get_post_meta( $topic_id, '_bbp_last_active_time', true );
+		if ( empty( $last_active ) ) {
+			$reply_id = bbp_get_topic_last_reply_id( $topic_id );
+			if ( !empty( $reply_id ) ) {
+				$last_active = get_post_field( 'post_date', $reply_id );
+			} else {
+				$last_active = get_post_field( 'post_date', $topic_id );
+			}
+		}
+
+		$last_active = !empty( $last_active ) ? bbp_get_time_since( bbp_convert_date( $last_active ) ) : '';
+
+		// Return the time since
+		return apply_filters( 'bbp_get_topic_last_active', $last_active, $topic_id );
+	}
+
+/** Topic Last Reply **********************************************************/
+
+/**
+ * Output the id of the topics last reply
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_last_reply_id() To get the topic last reply id
+ */
+function bbp_topic_last_reply_id( $topic_id = 0 ) {
+	echo bbp_get_topic_last_reply_id( $topic_id );
+}
+	/**
+	 * Return the topics last update date/time (aka freshness)
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the last reply id meta
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_reply_id' with the
+	 *                        last reply id and topic id
+	 * @return int Topic last reply id
+	 */
+	function bbp_get_topic_last_reply_id( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$reply_id = get_post_meta( $topic_id, '_bbp_last_reply_id', true );
+
+		if ( empty( $reply_id ) )
+			$reply_id = $topic_id;
+
+		return (int) apply_filters( 'bbp_get_topic_last_reply_id', (int) $reply_id, $topic_id );
+	}
+
+/**
+ * Output the title of the last reply inside a topic
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_last_reply_title() To get the topic last reply title
+ */
+function bbp_topic_last_reply_title( $topic_id = 0 ) {
+	echo bbp_get_topic_last_reply_title( $topic_id );
+}
+	/**
+	 * Return the title of the last reply inside a topic
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_last_reply_id() To get the topic last reply id
+	 * @uses bbp_get_reply_title() To get the reply title
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_topic_title' with
+	 *                        the reply title and topic id
+	 * @return string Topic last reply title
+	 */
+	function bbp_get_topic_last_reply_title( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		return apply_filters( 'bbp_get_topic_last_topic_title', bbp_get_reply_title( bbp_get_topic_last_reply_id( $topic_id ) ), $topic_id );
+	}
+
+/**
+ * Output the link to the last reply in a topic
+ *
+ * @since bbPress (r2464)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_last_reply_permalink() To get the topic's last reply link
+ */
+function bbp_topic_last_reply_permalink( $topic_id = 0 ) {
+	echo bbp_get_topic_last_reply_permalink( $topic_id );
+}
+	/**
+	 * Return the link to the last reply in a topic
+	 *
+	 * @since bbPress (r2464)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_last_reply_id() To get the topic last reply id
+	 * @uses bbp_get_reply_permalink() To get the reply permalink
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_topic_permalink' with
+	 *                        the reply permalink and topic id
+	 * @return string Permanent link to the reply
+	 */
+	function bbp_get_topic_last_reply_permalink( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		return apply_filters( 'bbp_get_topic_last_reply_permalink', bbp_get_reply_permalink( bbp_get_topic_last_reply_id( $topic_id ) ) );
+	}
+
+/**
+ * Output the link to the last reply in a topic
+ *
+ * @since bbPress (r2683)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_last_reply_url() To get the topic last reply url
+ */
+function bbp_topic_last_reply_url( $topic_id = 0 ) {
+	echo bbp_get_topic_last_reply_url( $topic_id );
+}
+	/**
+	 * Return the link to the last reply in a topic
+	 *
+	 * @since bbPress (r2683)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_last_reply_id() To get the topic last reply id
+	 * @uses bbp_get_reply_url() To get the reply url
+	 * @uses bbp_get_reply_permalink() To get the reply permalink
+	 * @uses apply_filters() Calls 'bbp_get_topic_last_topic_url' with
+	 *                        the reply url and topic id
+	 * @return string Topic last reply url
+	 */
+	function bbp_get_topic_last_reply_url( $topic_id = 0 ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$reply_id = bbp_get_topic_last_reply_id( $topic_id );
+
+		if ( !empty( $reply_id ) && ( $reply_id != $topic_id ) )
+			$reply_url = bbp_get_reply_url( $reply_id );
+		else
+			$reply_url = bbp_get_topic_permalink( $topic_id );
+
+		return apply_filters( 'bbp_get_topic_last_reply_url', $reply_url );
+	}
+
+/**
+ * Output link to the most recent activity inside a topic, complete with link
+ * attributes and content.
+ *
+ * @since bbPress (r2625)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_freshness_link() To get the topic freshness link
+ */
+function bbp_topic_freshness_link( $topic_id = 0 ) {
+	echo bbp_get_topic_freshness_link( $topic_id );
+}
+	/**
+	 * Returns link to the most recent activity inside a topic, complete
+	 * with link attributes and content.
+	 *
+	 * @since bbPress (r2625)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_last_reply_url() To get the topic last reply url
+	 * @uses bbp_get_topic_last_reply_title() To get the reply title
+	 * @uses bbp_get_topic_last_active_time() To get the topic freshness
+	 * @uses apply_filters() Calls 'bbp_get_topic_freshness_link' with the
+	 *                        link and topic id
+	 * @return string Topic freshness link
+	 */
+	function bbp_get_topic_freshness_link( $topic_id = 0 ) {
+		$topic_id   = bbp_get_topic_id( $topic_id );
+		$link_url   = bbp_get_topic_last_reply_url( $topic_id );
+		$title      = bbp_get_topic_last_reply_title( $topic_id );
+		$time_since = bbp_get_topic_last_active_time( $topic_id );
+
+		if ( !empty( $time_since ) )
+			$anchor = '<a href="' . $link_url . '" title="' . esc_attr( $title ) . '">' . $time_since . '</a>';
+		else
+			$anchor = __( 'No Replies', 'bbpress' );
+
+		return apply_filters( 'bbp_get_topic_freshness_link', $anchor, $topic_id );
+	}
+
+/**
+ * Output the replies link of the topic
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_replies_link() To get the topic replies link
+ */
+function bbp_topic_replies_link( $topic_id = 0 ) {
+	echo bbp_get_topic_replies_link( $topic_id );
+}
+
+	/**
+	 * Return the replies link of the topic
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_topic_reply_count() To get the topic reply count
+	 * @uses bbp_get_topic_permalink() To get the topic permalink
+	 * @uses remove_query_arg() To remove args from the url
+	 * @uses bbp_get_topic_reply_count_hidden() To get the topic hidden
+	 *                                           reply count
+	 * @uses current_user_can() To check if the current user can edit others
+	 *                           replies
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_replies_link' with the
+	 *                        replies link and topic id
+	 */
+	function bbp_get_topic_replies_link( $topic_id = 0 ) {
+
+		$topic    = bbp_get_topic( bbp_get_topic_id( (int) $topic_id ) );
+		$topic_id = $topic->ID;
+		$replies  = sprintf( _n( '%s reply', '%s replies', bbp_get_topic_reply_count( $topic_id, true ), 'bbpress' ), bbp_get_topic_reply_count( $topic_id ) );
+		$retval   = '';
+
+		// First link never has view=all
+		if ( bbp_get_view_all( 'edit_others_replies' ) )
+			$retval .= "<a href='" . esc_url( bbp_remove_view_all( bbp_get_topic_permalink( $topic_id ) ) ) . "'>$replies</a>";
+		else
+			$retval .= $replies;
+
+		// Any deleted replies?
+		$deleted = bbp_get_topic_reply_count_hidden( $topic_id );
+
+		// This forum has hidden topics
+		if ( !empty( $deleted ) && current_user_can( 'edit_others_replies' ) ) {
+
+			// Extra text
+			$extra = sprintf( __( ' (+ %d hidden)', 'bbpress' ), $deleted );
+
+			// No link
+			if ( bbp_get_view_all() ) {
+				$retval .= " $extra";
+
+			// Link
+			} else {
+				$retval .= " <a href='" . esc_url( bbp_add_view_all( bbp_get_topic_permalink( $topic_id ), true ) ) . "'>$extra</a>";
+			}
+		}
+
+		return apply_filters( 'bbp_get_topic_replies_link', $retval, $topic_id );
+	}
+
+/**
+ * Output total reply count of a topic
+ *
+ * @since bbPress (r2485)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_topic_reply_count() To get the topic reply count
+ */
+function bbp_topic_reply_count( $topic_id = 0, $integer = false ) {
+	echo bbp_get_topic_reply_count( $topic_id, $integer );
+}
+	/**
+	 * Return total reply count of a topic
+	 *
+	 * @since bbPress (r2485)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the topic reply count meta
+	 * @uses apply_filters() Calls 'bbp_get_topic_reply_count' with the
+	 *                        reply count and topic id
+	 * @return int Reply count
+	 */
+	function bbp_get_topic_reply_count( $topic_id = 0, $integer = false ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$replies  = (int) get_post_meta( $topic_id, '_bbp_reply_count', true );
+		$filter   = ( true === $integer ) ? 'bbp_get_topic_reply_count_int' : 'bbp_get_topic_reply_count';
+
+		return apply_filters( $filter, $replies, $topic_id );
+	}
+
+/**
+ * Output total post count of a topic
+ *
+ * @since bbPress (r2954)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_topic_post_count() To get the topic post count
+ */
+function bbp_topic_post_count( $topic_id = 0, $integer = false ) {
+	echo bbp_get_topic_post_count( $topic_id, $integer );
+}
+	/**
+	 * Return total post count of a topic
+	 *
+	 * @since bbPress (r2954)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the topic post count meta
+	 * @uses apply_filters() Calls 'bbp_get_topic_post_count' with the
+	 *                        post count and topic id
+	 * @return int Post count
+	 */
+	function bbp_get_topic_post_count( $topic_id = 0, $integer = false ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$replies  = (int) get_post_meta( $topic_id, '_bbp_reply_count', true ) + 1;
+		$filter   = ( true === $integer ) ? 'bbp_get_topic_post_count_int' : 'bbp_get_topic_post_count';
+
+		return apply_filters( $filter, $replies, $topic_id );
+	}
+
+/**
+ * Output total hidden reply count of a topic (hidden includes trashed and
+ * spammed replies)
+ *
+ * @since bbPress (r2740)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_topic_reply_count_hidden() To get the topic hidden reply count
+ */
+function bbp_topic_reply_count_hidden( $topic_id = 0, $integer = false ) {
+	echo bbp_get_topic_reply_count_hidden( $topic_id, $integer );
+}
+	/**
+	 * Return total hidden reply count of a topic (hidden includes trashed
+	 * and spammed replies)
+	 *
+	 * @since bbPress (r2740)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the hidden reply count
+	 * @uses apply_filters() Calls 'bbp_get_topic_reply_count_hidden' with
+	 *                        the hidden reply count and topic id
+	 * @return int Topic hidden reply count
+	 */
+	function bbp_get_topic_reply_count_hidden( $topic_id = 0, $integer = false ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$replies  = (int) get_post_meta( $topic_id, '_bbp_reply_count_hidden', true );
+		$filter   = ( true === $integer ) ? 'bbp_get_topic_reply_count_hidden_int' : 'bbp_get_topic_reply_count_hidden';
+
+		return apply_filters( $filter, $replies, $topic_id );
+	}
+
+/**
+ * Output total voice count of a topic
+ *
+ * @since bbPress (r2567)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_voice_count() To get the topic voice count
+ */
+function bbp_topic_voice_count( $topic_id = 0, $integer = false ) {
+	echo bbp_get_topic_voice_count( $topic_id, $integer );
+}
+	/**
+	 * Return total voice count of a topic
+	 *
+	 * @since bbPress (r2567)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_post_meta() To get the voice count meta
+	 * @uses apply_filters() Calls 'bbp_get_topic_voice_count' with the
+	 *                        voice count and topic id
+	 * @return int Voice count of the topic
+	 */
+	function bbp_get_topic_voice_count( $topic_id = 0, $integer = false ) {
+		$topic_id = bbp_get_topic_id( $topic_id );
+		$voices   = (int) get_post_meta( $topic_id, '_bbp_voice_count', true );
+		$filter   = ( true === $integer ) ? 'bbp_get_topic_voice_count_int' : 'bbp_get_topic_voice_count';
+
+		return apply_filters( $filter, $voices, $topic_id );
+	}
+
+/**
+ * Output a the tags of a topic
+ *
+ * @param int $topic_id Optional. Topic id
+ * @param mixed $args See {@link bbp_get_topic_tag_list()}
+ * @uses bbp_get_topic_tag_list() To get the topic tag list
+ */
+function bbp_topic_tag_list( $topic_id = 0, $args = '' ) {
+	echo bbp_get_topic_tag_list( $topic_id, $args );
+}
+	/**
+	 * Return the tags of a topic
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @param array $args This function supports these arguments:
+	 *  - before: Before the tag list
+	 *  - sep: Tag separator
+	 *  - after: After the tag list
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses get_the_term_list() To get the tags list
+	 * @return string Tag list of the topic
+	 */
+	function bbp_get_topic_tag_list( $topic_id = 0, $args = '' ) {
+
+		// Bail if topic-tags are off
+		if ( ! bbp_allow_topic_tags() )
+			return;
+
+		$defaults = array(
+			'before' => '<div class="bbp-topic-tags"><p>' . __( 'Tagged:', 'bbpress' ) . '&nbsp;',
+			'sep'    => ', ',
+			'after'  => '</p></div>'
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_tag_list' );
+		extract( $r );
+
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Topic is spammed, so display pre-spam terms
+		if ( bbp_is_topic_spam( $topic_id ) ) {
+
+			// Get pre-spam terms
+			$terms = get_post_meta( $topic_id, '_bbp_spam_topic_tags', true );
+
+			// If terms exist, explode them and compile the return value
+			if ( !empty( $terms ) ) {
+				$terms  = implode( $sep, $terms );
+				$retval = $before . $terms . $after;
+
+			// No terms so return emty string
+			} else {
+				$retval = '';
+			}
+
+		// Topic is not spam so display a clickable term list
+		} else {
+			$retval = get_the_term_list( $topic_id, bbp_get_topic_tag_tax_id(), $before, $sep, $after );
+		}
+
+		return $retval;
+	}
+
+/**
+ * Output the row class of a topic
+ *
+ * @since bbPress (r2667)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_class() To get the topic class
+ */
+function bbp_topic_class( $topic_id = 0 ) {
+	echo bbp_get_topic_class( $topic_id );
+}
+	/**
+	 * Return the row class of a topic
+	 *
+	 * @since bbPress (r2667)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_is_topic_sticky() To check if the topic is a sticky
+	 * @uses bbp_is_topic_super_sticky() To check if the topic is a super sticky
+	 * @uses bbp_get_topic_forum_id() To get the topic forum id
+	 * @uses get_post_class() To get the topic classes
+	 * @uses apply_filters() Calls 'bbp_get_topic_class' with the classes
+	 *                        and topic id
+	 * @return string Row class of a topic
+	 */
+	function bbp_get_topic_class( $topic_id = 0 ) {
+		$bbp       = bbpress();
+		$topic_id  = bbp_get_topic_id( $topic_id );
+		$count     = isset( $bbp->topic_query->current_post ) ? $bbp->topic_query->current_post : 1;
+		$classes   = array();
+		$classes[] = ( (int) $count % 2 )                    ? 'even'         : 'odd';
+		$classes[] = bbp_is_topic_sticky( $topic_id, false ) ? 'sticky'       : '';
+		$classes[] = bbp_is_topic_super_sticky( $topic_id  ) ? 'super-sticky' : '';
+		$classes[] = 'bbp-parent-forum-' . bbp_get_topic_forum_id( $topic_id );
+		$classes[] = 'user-id-' . bbp_get_topic_author_id( $topic_id );
+		$classes   = array_filter( $classes );
+		$classes   = get_post_class( $classes, $topic_id );
+		$classes   = apply_filters( 'bbp_get_topic_class', $classes, $topic_id );
+		$retval    = 'class="' . join( ' ', $classes ) . '"';
+
+		return $retval;
+	}
+
+/** Topic Admin Links *********************************************************/
+
+/**
+ * Output admin links for topic
+ *
+ * @param mixed $args See {@link bbp_get_topic_admin_links()}
+ * @uses bbp_get_topic_admin_links() To get the topic admin links
+ */
+function bbp_topic_admin_links( $args = '' ) {
+	echo bbp_get_topic_admin_links( $args );
+}
+	/**
+	 * Return admin links for topic.
+	 *
+	 * Move topic functionality is handled by the edit topic page.
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - id: Optional. Topic id
+	 *  - before: Before the links
+	 *  - after: After the links
+	 *  - sep: Links separator
+	 *  - links: Topic admin links array
+	 * @uses current_user_can() To check if the current user can edit/delete
+	 *                           the topic
+	 * @uses bbp_get_topic_edit_link() To get the topic edit link
+	 * @uses bbp_get_topic_trash_link() To get the topic trash link
+	 * @uses bbp_get_topic_close_link() To get the topic close link
+	 * @uses bbp_get_topic_spam_link() To get the topic spam link
+	 * @uses bbp_get_topic_stick_link() To get the topic stick link
+	 * @uses bbp_get_topic_merge_link() To get the topic merge link
+	 * @uses bbp_get_topic_status() To get the topic status
+	 * @uses apply_filters() Calls 'bbp_get_topic_admin_links' with the
+	 *                        topic admin links and args
+	 * @return string Topic admin links
+	 */
+	function bbp_get_topic_admin_links( $args = '' ) {
+
+		if ( !bbp_is_single_topic() )
+			return;
+
+		$defaults = array (
+			'id'     => bbp_get_topic_id(),
+			'before' => '<span class="bbp-admin-links">',
+			'after'  => '</span>',
+			'sep'    => ' | ',
+			'links'  => array()
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_admin_links' );
+
+		if ( !current_user_can( 'edit_topic', $r['id'] ) )
+			return;
+
+		if ( empty( $r['links'] ) ) {
+			$r['links'] = array(
+				'edit'  => bbp_get_topic_edit_link ( $r ),
+				'close' => bbp_get_topic_close_link( $r ),
+				'stick' => bbp_get_topic_stick_link( $r ),
+				'merge' => bbp_get_topic_merge_link( $r ),
+				'trash' => bbp_get_topic_trash_link( $r ),
+				'spam'  => bbp_get_topic_spam_link ( $r ),
+			);
+		}
+
+		// Check caps for trashing the topic
+		if ( !current_user_can( 'delete_topic', $r['id'] ) && !empty( $r['links']['trash'] ) )
+			unset( $r['links']['trash'] );
+
+		// See if links need to be unset
+		$topic_status = bbp_get_topic_status( $r['id'] );
+		if ( in_array( $topic_status, array( bbp_get_spam_status_id(), bbp_get_trash_status_id() ) ) ) {
+
+			// Close link shouldn't be visible on trashed/spammed topics
+			unset( $r['links']['close'] );
+
+			// Spam link shouldn't be visible on trashed topics
+			if ( $topic_status == bbp_get_trash_status_id() )
+				unset( $r['links']['spam'] );
+
+			// Trash link shouldn't be visible on spam topics
+			elseif ( $topic_status == bbp_get_spam_status_id() )
+				unset( $r['links']['trash'] );
+		}
+
+		// Process the admin links
+		$links = implode( $r['sep'], array_filter( $r['links'] ) );
+
+		return apply_filters( 'bbp_get_topic_admin_links', $r['before'] . $links . $r['after'], $args );
+	}
+
+/**
+ * Output the edit link of the topic
+ *
+ * @since bbPress (r2727)
+ *
+ * @param mixed $args See {@link bbp_get_topic_edit_link()}
+ * @uses bbp_get_topic_edit_link() To get the topic edit link
+ */
+function bbp_topic_edit_link( $args = '' ) {
+	echo bbp_get_topic_edit_link( $args );
+}
+
+	/**
+	 * Return the edit link of the topic
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - edit_text: Edit text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           topic
+	 * @uses bbp_get_topic_edit_url() To get the topic edit url
+	 * @uses apply_filters() Calls 'bbp_get_topic_edit_link' with the link
+	 *                        and args
+	 * @return string Topic edit link
+	 */
+	function bbp_get_topic_edit_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'edit_text'    => __( 'Edit', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_edit_link' );
+		extract( $r );
+
+		$topic = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		// Bypass check if user has caps
+		if ( !current_user_can( 'edit_others_topics' ) ) {
+
+			// User cannot edit or it is past the lock time
+			if ( empty( $topic ) || !current_user_can( 'edit_topic', $topic->ID ) || bbp_past_edit_lock( $topic->post_date_gmt ) ) {
+				return;
+			}
+		}
+
+		// Get uri
+		$uri = bbp_get_topic_edit_url( $id );
+
+		// Bail if no uri
+		if ( empty( $uri ) )
+			return;
+
+		$retval = $link_before . '<a href="' . $uri . '">' . $edit_text . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_topic_edit_link', $retval, $args );
+	}
+
+/**
+ * Output URL to the topic edit page
+ *
+ * @since bbPress (r2753)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_topic_edit_url() To get the topic edit url
+ */
+function bbp_topic_edit_url( $topic_id = 0 ) {
+	echo bbp_get_topic_edit_url( $topic_id );
+}
+	/**
+	 * Return URL to the topic edit page
+	 *
+	 * @since bbPress (r2753)
+	 *
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_edit_url' with the edit
+	 *                        url and topic id
+	 * @return string Topic edit url
+	 */
+	function bbp_get_topic_edit_url( $topic_id = 0 ) {
+		global $wp_rewrite;
+
+		$bbp = bbpress();
+
+		$topic = bbp_get_topic( bbp_get_topic_id( $topic_id ) );
+		if ( empty( $topic ) )
+			return;
+
+		// Remove view=all link from edit
+		$topic_link = bbp_remove_view_all( bbp_get_topic_permalink( $topic_id ) );
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = trailingslashit( $topic_link ) . $bbp->edit_id;
+			$url = trailingslashit( $url );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array( bbp_get_topic_post_type() => $topic->post_name, $bbp->edit_id => '1' ), $topic_link );
+		}
+
+		// Maybe add view=all
+		$url = bbp_add_view_all( $url );
+
+		return apply_filters( 'bbp_get_topic_edit_url', $url, $topic_id );
+	}
+
+/**
+ * Output the trash link of the topic
+ *
+ * @since bbPress (r2727)
+ *
+ * @param mixed $args See {@link bbp_get_topic_trash_link()}
+ * @uses bbp_get_topic_trash_link() To get the topic trash link
+ */
+function bbp_topic_trash_link( $args = '' ) {
+	echo bbp_get_topic_trash_link( $args );
+}
+
+	/**
+	 * Return the trash link of the topic
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - sep: Links separator
+	 *  - trash_text: Trash text
+	 *  - restore_text: Restore text
+	 *  - delete_text: Delete text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the current user can delete the
+	 *                           topic
+	 * @uses bbp_is_topic_trash() To check if the topic is trashed
+	 * @uses bbp_get_topic_status() To get the topic status
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_trash_link' with the link
+	 *                        and args
+	 * @return string Topic trash link
+	 */
+	function bbp_get_topic_trash_link( $args = '' ) {
+
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'sep'          => ' | ',
+			'trash_text'   => __( 'Trash',   'bbpress' ),
+			'restore_text' => __( 'Restore', 'bbpress' ),
+			'delete_text'  => __( 'Delete',  'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_trash_link' );
+		extract( $r );
+
+		$actions = array();
+		$topic   = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		if ( empty( $topic ) || !current_user_can( 'delete_topic', $topic->ID ) ) {
+			return;
+		}
+
+		if ( bbp_is_topic_trash( $topic->ID ) ) {
+			$actions['untrash'] = '<a title="' . esc_attr__( 'Restore this item from the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_topic_trash', 'sub_action' => 'untrash', 'topic_id' => $topic->ID ) ), 'untrash-' . $topic->post_type . '_' . $topic->ID ) ) . '">' . esc_html( $restore_text ) . '</a>';
+		} elseif ( EMPTY_TRASH_DAYS ) {
+			$actions['trash']   = '<a title="' . esc_attr__( 'Move this item to the Trash', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_topic_trash', 'sub_action' => 'trash', 'topic_id' => $topic->ID ) ), 'trash-' . $topic->post_type . '_' . $topic->ID ) ) . '">' . esc_html( $trash_text ) . '</a>';
+		}
+
+		if ( bbp_is_topic_trash( $topic->ID ) || !EMPTY_TRASH_DAYS ) {
+			$actions['delete']  = '<a title="' . esc_attr__( 'Delete this item permanently', 'bbpress' ) . '" href="' . esc_url( wp_nonce_url( add_query_arg( array( 'action' => 'bbp_toggle_topic_trash', 'sub_action' => 'delete', 'topic_id' => $topic->ID ) ), 'delete-' . $topic->post_type . '_' . $topic->ID ) ) . '" onclick="return confirm(\'' . esc_js( __( 'Are you sure you want to delete that permanently?', 'bbpress' ) ) . '\' );">' . esc_html( $delete_text ) . '</a>';
+		}
+
+		// Process the admin links
+		$retval = $link_before . implode( $sep, $actions ) . $link_after;
+
+		return apply_filters( 'bbp_get_topic_trash_link', $retval, $args );
+	}
+
+/**
+ * Output the close link of the topic
+ *
+ * @since bbPress (r2727)
+ *
+ * @param mixed $args See {@link bbp_get_topic_close_link()}
+ * @uses bbp_get_topic_close_link() To get the topic close link
+ */
+function bbp_topic_close_link( $args = '' ) {
+	echo bbp_get_topic_close_link( $args );
+}
+
+	/**
+	 * Return the close link of the topic
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - close_text: Close text
+	 *  - open_text: Open text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the current user can edit the topic
+	 * @uses bbp_is_topic_open() To check if the topic is open
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_close_link' with the link
+	 *                        and args
+	 * @return string Topic close link
+	 */
+	function bbp_get_topic_close_link( $args = '' ) {
+		$defaults = array (
+			'id'          => 0,
+			'link_before' => '',
+			'link_after'  => '',
+			'sep'         => ' | ',
+			'close_text'  => _x( 'Close', 'Topic Status', 'bbpress' ),
+			'open_text'   => _x( 'Open',  'Topic Status', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_close_link' );
+		extract( $r );
+
+		$topic = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		if ( empty( $topic ) || !current_user_can( 'moderate', $topic->ID ) )
+			return;
+
+		$display = bbp_is_topic_open( $topic->ID ) ? $close_text : $open_text;
+		$uri     = add_query_arg( array( 'action' => 'bbp_toggle_topic_close', 'topic_id' => $topic->ID ) );
+		$uri     = esc_url( wp_nonce_url( $uri, 'close-topic_' . $topic->ID ) );
+		$retval  = $link_before . '<a href="' . $uri . '">' . $display . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_topic_close_link', $retval, $args );
+	}
+
+/**
+ * Output the stick link of the topic
+ *
+ * @since bbPress (r2754)
+ *
+ * @param mixed $args See {@link bbp_get_topic_stick_link()}
+ * @uses bbp_get_topic_stick_link() To get the topic stick link
+ */
+function bbp_topic_stick_link( $args = '' ) {
+	echo bbp_get_topic_stick_link( $args );
+}
+
+	/**
+	 * Return the stick link of the topic
+	 *
+	 * @since bbPress (r2754)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - stick_text: Stick text
+	 *  - unstick_text: Unstick text
+	 *  - super_text: Stick to front text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the current user can edit the
+	 *                           topic
+	 * @uses bbp_is_topic_sticky() To check if the topic is a sticky
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_stick_link' with the link
+	 *                        and args
+	 * @return string Topic stick link
+	 */
+	function bbp_get_topic_stick_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'stick_text'   => __( 'Stick',    'bbpress' ),
+			'unstick_text' => __( 'Unstick',  'bbpress' ),
+			'super_text'   => __( 'to front', 'bbpress' ),
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_stick_link' );
+		extract( $r );
+
+		$topic = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		if ( empty( $topic ) || !current_user_can( 'moderate', $topic->ID ) )
+			return;
+
+		$is_sticky = bbp_is_topic_sticky( $topic->ID );
+
+		$stick_uri = add_query_arg( array( 'action' => 'bbp_toggle_topic_stick', 'topic_id' => $topic->ID ) );
+		$stick_uri = esc_url( wp_nonce_url( $stick_uri, 'stick-topic_' . $topic->ID ) );
+
+		$stick_display = true == $is_sticky ? $unstick_text : $stick_text;
+		$stick_display = '<a href="' . $stick_uri . '">' . $stick_display . '</a>';
+
+		if ( empty( $is_sticky ) ) {
+			$super_uri = add_query_arg( array( 'action' => 'bbp_toggle_topic_stick', 'topic_id' => $topic->ID, 'super' => 1 ) );
+			$super_uri = esc_url( wp_nonce_url( $super_uri, 'stick-topic_' . $topic->ID ) );
+
+			$super_display = ' (<a href="' . $super_uri . '">' . $super_text . '</a>)';
+		} else {
+			$super_display = '';
+		}
+
+		// Combine the HTML into 1 string
+		$retval = $link_before . $stick_display . $super_display . $link_after;
+
+		return apply_filters( 'bbp_get_topic_stick_link', $retval, $args );
+	}
+
+/**
+ * Output the merge link of the topic
+ *
+ * @since bbPress (r2756)
+ *
+ * @param mixed $args
+ * @uses bbp_get_topic_merge_link() To get the topic merge link
+ */
+function bbp_topic_merge_link( $args = '' ) {
+	echo bbp_get_topic_merge_link( $args );
+}
+
+	/**
+	 * Return the merge link of the topic
+	 *
+	 * @since bbPress (r2756)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - merge_text: Merge text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses bbp_get_topic_edit_url() To get the topic edit url
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_merge_link' with the link
+	 *                        and args
+	 * @return string Topic merge link
+	 */
+	function bbp_get_topic_merge_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'merge_text'   => __( 'Merge', 'bbpress' ),
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_merge_link' );
+		extract( $r );
+
+		$topic = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		if ( empty( $topic ) || !current_user_can( 'moderate', $topic->ID ) )
+			return;
+
+		$uri    = esc_url( add_query_arg( array( 'action' => 'merge' ), bbp_get_topic_edit_url( $topic->ID ) ) );
+		$retval = $link_before . '<a href="' . $uri . '">' . $merge_text . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_topic_merge_link', $retval, $args );
+	}
+
+/**
+ * Output the spam link of the topic
+ *
+ * @since bbPress (r2727)
+ *
+ * @param mixed $args See {@link bbp_get_topic_spam_link()}
+ * @uses bbp_get_topic_spam_link() Topic spam link
+ */
+function bbp_topic_spam_link( $args = '' ) {
+	echo bbp_get_topic_spam_link( $args );
+}
+
+	/**
+	 * Return the spam link of the topic
+	 *
+	 * @since bbPress (r2727)
+	 *
+	 * @param mixed $args This function supports these args:
+	 *  - id: Optional. Topic id
+	 *  - link_before: Before the link
+	 *  - link_after: After the link
+	 *  - spam_text: Spam text
+	 *  - unspam_text: Unspam text
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses current_user_can() To check if the current user can edit the topic
+	 * @uses bbp_is_topic_spam() To check if the topic is marked as spam
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses wp_nonce_url() To nonce the url
+	 * @uses esc_url() To escape the url
+	 * @uses apply_filters() Calls 'bbp_get_topic_spam_link' with the link
+	 *                        and args
+	 * @return string Topic spam link
+	 */
+	function bbp_get_topic_spam_link( $args = '' ) {
+		$defaults = array (
+			'id'           => 0,
+			'link_before'  => '',
+			'link_after'   => '',
+			'sep'          => ' | ',
+			'spam_text'    => __( 'Spam',   'bbpress' ),
+			'unspam_text'  => __( 'Unspam', 'bbpress' )
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_spam_link' );
+		extract( $r );
+
+		$topic = bbp_get_topic( bbp_get_topic_id( (int) $id ) );
+
+		if ( empty( $topic ) || !current_user_can( 'moderate', $topic->ID ) )
+			return;
+
+		$display = bbp_is_topic_spam( $topic->ID ) ? $unspam_text : $spam_text;
+		$uri     = add_query_arg( array( 'action' => 'bbp_toggle_topic_spam', 'topic_id' => $topic->ID ) );
+		$uri     = esc_url( wp_nonce_url( $uri, 'spam-topic_' . $topic->ID ) );
+		$retval  = $link_before . '<a href="' . $uri . '">' . $display . '</a>' . $link_after;
+
+		return apply_filters( 'bbp_get_topic_spam_link', $retval, $args );
+	}
+
+/** Topic Pagination **********************************************************/
+
+/**
+ * Output the pagination count
+ *
+ * @since bbPress (r2519)
+ *
+ * @uses bbp_get_forum_pagination_count() To get the forum pagination count
+ */
+function bbp_forum_pagination_count() {
+	echo bbp_get_forum_pagination_count();
+}
+	/**
+	 * Return the pagination count
+	 *
+	 * @since bbPress (r2519)
+	 *
+	 * @uses bbp_number_format() To format the number value
+	 * @uses apply_filters() Calls 'bbp_get_forum_pagination_count' with the
+	 *                        pagination count
+	 * @return string Forum Pagintion count
+	 */
+	function bbp_get_forum_pagination_count() {
+		$bbp = bbpress();
+
+		if ( empty( $bbp->topic_query ) )
+			return false;
+
+		// Set pagination values
+		$start_num = intval( ( $bbp->topic_query->paged - 1 ) * $bbp->topic_query->posts_per_page ) + 1;
+		$from_num  = bbp_number_format( $start_num );
+		$to_num    = bbp_number_format( ( $start_num + ( $bbp->topic_query->posts_per_page - 1 ) > $bbp->topic_query->found_posts ) ? $bbp->topic_query->found_posts : $start_num + ( $bbp->topic_query->posts_per_page - 1 ) );
+		$total_int = (int) !empty( $bbp->topic_query->found_posts ) ? $bbp->topic_query->found_posts : $bbp->topic_query->post_count;
+		$total     = bbp_number_format( $total_int );
+
+		// Several topics in a forum with a single page
+		if ( empty( $to_num ) ) {
+			$retstr = sprintf( _n( 'Viewing %1$s topic', 'Viewing %1$s topics', $total_int, 'bbpress' ), $total );
+
+		// Several topics in a forum with several pages
+		} else {
+			$retstr = sprintf( _n( 'Viewing topic %2$s (of %4$s total)', 'Viewing %1$s topics - %2$s through %3$s (of %4$s total)', $total_int, 'bbpress' ), $bbp->topic_query->post_count, $from_num, $to_num, $total );
+		}
+
+		// Filter and return
+		return apply_filters( 'bbp_get_topic_pagination_count', $retstr );
+	}
+
+/**
+ * Output pagination links
+ *
+ * @since bbPress (r2519)
+ *
+ * @uses bbp_get_forum_pagination_links() To get the pagination links
+ */
+function bbp_forum_pagination_links() {
+	echo bbp_get_forum_pagination_links();
+}
+	/**
+	 * Return pagination links
+	 *
+	 * @since bbPress (r2519)
+	 *
+	 * @uses bbPress::topic_query::pagination_links To get the links
+	 * @return string Pagination links
+	 */
+	function bbp_get_forum_pagination_links() {
+		$bbp = bbpress();
+
+		if ( empty( $bbp->topic_query ) )
+			return false;
+
+		return apply_filters( 'bbp_get_forum_pagination_links', $bbp->topic_query->pagination_links );
+	}
+
+/**
+ * Displays topic notices
+ *
+ * @since bbPress (r2744)
+ *
+ * @uses bbp_is_single_topic() To check if it's a topic page
+ * @uses bbp_get_topic_status() To get the topic status
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses apply_filters() Calls 'bbp_topic_notices' with the notice text, topic
+ *                        status and topic id
+ * @uses bbPress::errors::add() To add the notices to the error handler
+ */
+function bbp_topic_notices() {
+
+	// Bail if not viewing a topic
+	if ( !bbp_is_single_topic() )
+		return;
+
+	// Get the topic_status
+	$topic_status = bbp_get_topic_status();
+
+	// Get the topic status
+	switch ( $topic_status ) {
+
+		// Spam notice
+		case bbp_get_spam_status_id() :
+			$notice_text = __( 'This topic is marked as spam.', 'bbpress' );
+			break;
+
+		// Trashed notice
+		case bbp_get_trash_status_id() :
+			$notice_text = __( 'This topic is in the trash.',   'bbpress' );
+			break;
+
+		// Standard status
+		default :
+			$notice_text = '';
+			break;
+	}
+
+	// Filter notice text and bail if empty
+	$notice_text = apply_filters( 'bbp_topic_notices', $notice_text, $topic_status, bbp_get_topic_id() );
+	if ( empty( $notice_text ) )
+		return;
+
+	bbp_add_error( 'topic_notice', $notice_text, 'message' );
+}
+
+/**
+ * Displays topic type select box (normal/sticky/super sticky)
+ *
+ * @since bbPress (r2784)
+ *
+ * @param $args This function supports these arguments:
+ *  - stick_text: Sticky text
+ *  - super_text: Super Sticky text
+ *  - unstick_text: Unstick (normal) text
+ *  - select_id: Select id. Defaults to bbp_stick_topic
+ *  - tab: Tabindex
+ *  - topic_id: Topic id
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses bbp_is_single_topic() To check if we're viewing a single topic
+ * @uses bbp_is_topic_edit() To check if it is the topic edit page
+ * @uses bbp_is_topic_super_sticky() To check if the topic is a super sticky
+ * @uses bbp_is_topic_sticky() To check if the topic is a sticky
+ */
+function bbp_topic_type_select( $args = '' ) {
+
+	$defaults = array (
+		'unstick_text' => __( 'Normal',       'bbpress' ),
+		'stick_text'   => __( 'Sticky',       'bbpress' ),
+		'super_text'   => __( 'Super Sticky', 'bbpress' ),
+		'select_id'    => 'bbp_stick_topic',
+		'tab'          => bbp_get_tab_index(),
+		'topic_id'     => 0
+	);
+	$r = bbp_parse_args( $args, $defaults, 'topic_type_select' );
+	extract( $r );
+
+	// Edit topic
+	if ( bbp_is_single_topic() || bbp_is_topic_edit() ) {
+
+		// Get current topic id
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Post value is passed
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST[$select_id] ) ) {
+			$sticky_current = $_POST[$select_id];
+
+		// Topic is super sticky
+		} elseif ( bbp_is_topic_super_sticky( $topic_id ) ) {
+			$sticky_current = 'super';
+
+		// Topic is sticky or normal
+		} else {
+			$sticky_current = bbp_is_topic_sticky( $topic_id, false ) ? 'stick' : 'unstick';
+		}
+
+	// New topic
+	} else {
+
+		// Post value is passed
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST[$select_id] ) ) {
+			$sticky_current = $_POST[$select_id];
+
+		// Default to unstick
+		} else {
+			$sticky_current = 'unstick';
+		}
+	}
+
+	// Used variables
+	$tab             = !empty( $tab ) ? ' tabindex="' . $tab . '"' : '';
+	$select_id       = esc_attr( $select_id );
+	$sticky_statuses = array (
+		'unstick' => $unstick_text,
+		'stick'   => $stick_text,
+		'super'   => $super_text,
+	); ?>
+
+	<select name="<?php echo $select_id; ?>" id="<?php echo $select_id; ?>"<?php echo $tab; ?>>
+
+		<?php foreach ( $sticky_statuses as $sticky_status => $label ) : ?>
+
+			<option value="<?php echo $sticky_status; ?>"<?php selected( $sticky_current, $sticky_status ); ?>><?php echo $label; ?></option>
+
+		<?php endforeach; ?>
+
+	</select>
+
+	<?php
+}
+
+/** Single Topic **************************************************************/
+
+/**
+ * Output a fancy description of the current topic, including total topics,
+ * total replies, and last activity.
+ *
+ * @since bbPress (r2860)
+ *
+ * @param array $args See {@link bbp_get_single_topic_description()}
+ * @uses bbp_get_single_topic_description() Return the eventual output
+ */
+function bbp_single_topic_description( $args = '' ) {
+	echo bbp_get_single_topic_description( $args );
+}
+	/**
+	 * Return a fancy description of the current topic, including total topics,
+	 * total replies, and last activity.
+	 *
+	 * @since bbPress (r2860)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - topic_id: Topic id
+	 *  - before: Before the text
+	 *  - after: After the text
+	 *  - size: Size of the avatar
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_topic_voice_count() To get the topic voice count
+	 * @uses bbp_get_topic_reply_count() To get the topic reply count
+	 * @uses bbp_get_topic_freshness_link() To get the topic freshness link
+	 * @uses bbp_get_topic_last_active_id() To get the topic last active id
+	 * @uses bbp_get_reply_author_link() To get the reply author link
+	 * @uses apply_filters() Calls 'bbp_get_single_topic_description' with
+	 *                        the description and args
+	 * @return string Filtered topic description
+	 */
+	function bbp_get_single_topic_description( $args = '' ) {
+
+		// Default arguments
+		$defaults = array (
+			'topic_id'  => 0,
+			'before'    => '<div class="bbp-template-notice info"><p class="bbp-topic-description">',
+			'after'     => '</p></div>',
+			'size'      => 14
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_single_topic_description' );
+		extract( $r );
+
+		// Validate topic_id
+		$topic_id = bbp_get_topic_id( $topic_id );
+
+		// Unhook the 'view all' query var adder
+		remove_filter( 'bbp_get_topic_permalink', 'bbp_add_view_all' );
+
+		// Build the topic description
+		$voice_count = bbp_get_topic_voice_count   ( $topic_id );
+		$reply_count = bbp_get_topic_replies_link  ( $topic_id );
+		$time_since  = bbp_get_topic_freshness_link( $topic_id );
+
+		// Singular/Plural
+		$voice_count = sprintf( _n( '%s voice', '%s voices', $voice_count, 'bbpress' ), $voice_count );
+
+		// Topic has replies
+		$last_reply = bbp_get_topic_last_active_id( $topic_id );
+		if ( !empty( $last_reply ) ) {
+			$last_updated_by = bbp_get_author_link( array( 'post_id' => $last_reply, 'size' => $size ) );
+			$retstr          = sprintf( __( 'This topic contains %1$s, has %2$s, and was last updated by %3$s %4$s.', 'bbpress' ), $reply_count, $voice_count, $last_updated_by, $time_since );
+
+		// Topic has no replies
+		} elseif ( ! empty( $voice_count ) && ! empty( $reply_count ) ) {
+			$retstr = sprintf( __( 'This topic contains %1$s and has %2$s.', 'bbpress' ), $voice_count, $reply_count );
+
+		// Topic has no replies and no voices
+		} elseif ( empty( $voice_count ) && empty( $reply_count ) ) {
+			$retstr = sprintf( __( 'This topic has no replies.', 'bbpress' ), $voice_count, $reply_count );
+		}
+
+		// Add the 'view all' filter back
+		add_filter( 'bbp_get_topic_permalink', 'bbp_add_view_all' );
+
+		// Combine the elements together
+		$retstr = $before . $retstr . $after;
+
+		// Return filtered result
+		return apply_filters( 'bbp_get_single_topic_description', $retstr, $args );
+	}
+
+/** Topic Tags ****************************************************************/
+
+/**
+ * Output the unique id of the topic tag taxonomy
+ *
+ * @since bbPress (r3348)
+ *
+ * @uses bbp_get_topic_post_type() To get the topic post type
+ */
+function bbp_topic_tag_tax_id() {
+	echo bbp_get_topic_tag_tax_id();
+}
+	/**
+	 * Return the unique id of the topic tag taxonomy
+	 *
+	 * @since bbPress (r3348)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_topic_tag_tax_id' with the topic tax id
+	 * @return string The unique topic tag taxonomy
+	 */
+	function bbp_get_topic_tag_tax_id() {
+		return apply_filters( 'bbp_get_topic_tag_tax_id', bbpress()->topic_tag_tax_id );
+	}
+
+/**
+ * Output the id of the current tag
+ *
+ * @since bbPress (r3109)
+ *
+ * @uses bbp_get_topic_tag_id()
+ */
+function bbp_topic_tag_id( $tag = '' ) {
+	echo bbp_get_topic_tag_id( $tag );
+}
+	/**
+	 * Return the id of the current tag
+	 *
+	 * @since bbPress (r3109)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_id( $tag = '' ) {
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag  = get_query_var( 'term' );
+			$term = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->term_id ) ) {
+			$retval = $term->term_id;
+
+		// No id
+		} else {
+			$retval = '';
+		}
+
+		return (int) apply_filters( 'bbp_get_topic_tag_id', (int) $retval, $tag );
+	}
+
+/**
+ * Output the name of the current tag
+ *
+ * @since bbPress (r3109)
+ *
+ * @uses bbp_get_topic_tag_name()
+ */
+function bbp_topic_tag_name( $tag = '' ) {
+	echo bbp_get_topic_tag_name( $tag );
+}
+	/**
+	 * Return the name of the current tag
+	 *
+	 * @since bbPress (r3109)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_name( $tag = '' ) {
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag  = get_query_var( 'term' );
+			$term = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->name ) ) {
+			$retval = $term->name;
+
+		// No name
+		} else {
+			$retval = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_tag_name', $retval );
+	}
+
+/**
+ * Output the slug of the current tag
+ *
+ * @since bbPress (r3109)
+ *
+ * @uses bbp_get_topic_tag_slug()
+ */
+function bbp_topic_tag_slug( $tag = '' ) {
+	echo bbp_get_topic_tag_slug( $tag );
+}
+	/**
+	 * Return the slug of the current tag
+	 *
+	 * @since bbPress (r3109)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_slug( $tag = '' ) {
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag  = get_query_var( 'term' );
+			$term = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->slug ) ) {
+			$retval = $term->slug;
+
+		// No slug
+		} else {
+			$retval = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_tag_slug', $retval );
+	}
+
+/**
+ * Output the link of the current tag
+ *
+ * @since bbPress (r3348)
+ *
+ * @uses bbp_get_topic_tag_link()
+ */
+function bbp_topic_tag_link( $tag = '' ) {
+	echo bbp_get_topic_tag_link( $tag );
+}
+	/**
+	 * Return the link of the current tag
+	 *
+	 * @since bbPress (r3348)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_link( $tag = '' ) {
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag  = get_query_var( 'term' );
+			$term = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->term_id ) ) {
+			$retval = get_term_link( $term, bbp_get_topic_tag_tax_id() );
+
+		// No link
+		} else {
+			$retval = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_tag_link', $retval, $tag );
+	}
+
+/**
+ * Output the link of the current tag
+ *
+ * @since bbPress (r3348)
+ *
+ * @uses bbp_get_topic_tag_edit_link()
+ */
+function bbp_topic_tag_edit_link( $tag = '' ) {
+	echo bbp_get_topic_tag_edit_link( $tag );
+}
+	/**
+	 * Return the link of the current tag
+	 *
+	 * @since bbPress (r3348)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_edit_link( $tag = '' ) {
+		global $wp_rewrite;
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag  = get_query_var( 'term' );
+			$term = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->term_id ) ) {
+
+			$bbp = bbpress();
+
+			// Pretty
+			if ( $wp_rewrite->using_permalinks() ) {
+				$retval = user_trailingslashit( trailingslashit( bbp_get_topic_tag_link() ) . $bbp->edit_id );
+
+			// Ugly
+			} else {
+				$retval = add_query_arg( array( $bbp->edit_id => '1' ), bbp_get_topic_tag_link() );
+			}
+
+		// No link
+		} else {
+			$retval = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_tag_edit_link', $retval, $tag );
+	}
+
+/**
+ * Output the description of the current tag
+ *
+ * @since bbPress (r3109)
+ *
+ * @uses bbp_get_topic_tag_description()
+ */
+function bbp_topic_tag_description( $args = array() ) {
+	echo bbp_get_topic_tag_description( $args );
+}
+	/**
+	 * Return the description of the current tag
+	 *
+	 * @since bbPress (r3109)
+	 *
+	 * @uses get_term_by()
+	 * @uses get_queried_object()
+	 * @uses get_query_var()
+	 * @uses apply_filters()
+	 * @param array $args before|after|tag
+	 *
+	 * @return string Term Name
+	 */
+	function bbp_get_topic_tag_description( $args = array() ) {
+
+		$defaults = array(
+			'before' => '<div class="bbp-topic-tag-description"><p>',
+			'after'  => '</p></div>',
+			'tag'    => ''
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_topic_tag_description' );
+		extract( $r );
+
+		// Get the term
+		if ( ! empty( $tag ) ) {
+			$term = get_term_by( 'slug', $tag, bbp_get_topic_tag_tax_id() );
+		} else {
+			$tag         = get_query_var( 'term' );
+			$args['tag'] = $tag;
+			$term        = get_queried_object();
+		}
+
+		// Add before and after if description exists
+		if ( !empty( $term->description ) ) {
+			$retval = $before . $term->description . $after;
+
+		// No description, no HTML
+		} else {
+			$retval = '';
+		}
+
+		return apply_filters( 'bbp_get_topic_tag_description', $retval, $args );
+	}
+
+/** Forms *********************************************************************/
+
+/**
+ * Output the value of topic title field
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_title() To get the value of topic title field
+ */
+function bbp_form_topic_title() {
+	echo bbp_get_form_topic_title();
+}
+	/**
+	 * Return the value of topic title field
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's topic edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_title' with the title
+	 * @return string Value of topic title field
+	 */
+	function bbp_get_form_topic_title() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_topic_title'] ) )
+			$topic_title = $_POST['bbp_topic_title'];
+
+		// Get edit data
+		elseif ( bbp_is_topic_edit() )
+			$topic_title = bbp_get_global_post_field( 'post_title', 'raw' );
+
+		// No data
+		else
+			$topic_title = '';
+
+		return apply_filters( 'bbp_get_form_topic_title', esc_attr( $topic_title ) );
+	}
+
+/**
+ * Output the value of topic content field
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_content() To get value of topic content field
+ */
+function bbp_form_topic_content() {
+	echo bbp_get_form_topic_content();
+}
+	/**
+	 * Return the value of topic content field
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_content' with the content
+	 * @return string Value of topic content field
+	 */
+	function bbp_get_form_topic_content() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_topic_content'] ) )
+			$topic_content = $_POST['bbp_topic_content'];
+
+		// Get edit data
+		elseif ( bbp_is_topic_edit() )
+			$topic_content = bbp_get_global_post_field( 'post_content', 'raw' );
+
+		// No data
+		else
+			$topic_content = '';
+
+		return apply_filters( 'bbp_get_form_topic_content', esc_textarea( $topic_content ) );
+	}
+
+/**
+ * Allow topic rows to have adminstrative actions
+ *
+ * @since bbPress (r3653)
+ * @uses do_action()
+ * @todo Links and filter
+ */
+function bbp_topic_row_actions() {
+	do_action( 'bbp_topic_row_actions' );
+}
+
+/**
+ * Output value of topic tags field
+ *
+ * @since bbPress (r2976)
+ * @uses bbp_get_form_topic_tags() To get the value of topic tags field
+ */
+function bbp_form_topic_tags() {
+	echo bbp_get_form_topic_tags();
+}
+	/**
+	 * Return value of topic tags field
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_tags' with the tags
+	 * @return string Value of topic tags field
+	 */
+	function bbp_get_form_topic_tags() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_topic_tags'] ) ) {
+			$topic_tags = $_POST['bbp_topic_tags'];
+
+		// Get edit data
+		} elseif ( bbp_is_single_topic() || bbp_is_single_reply() || bbp_is_topic_edit() || bbp_is_reply_edit() ) {
+
+			// Determine the topic id based on the post type
+			switch ( get_post_type() ) {
+
+				// Post is a topic
+				case bbp_get_topic_post_type() :
+					$topic_id = get_the_ID();
+					break;
+
+				// Post is a reply
+				case bbp_get_reply_post_type() :
+					$topic_id = bbp_get_reply_topic_id( get_the_ID() );
+					break;
+			}
+
+			// Topic exists
+			if ( !empty( $topic_id ) ) {
+
+				// Topic is spammed so display pre-spam terms
+				if ( bbp_is_topic_spam( $topic_id ) ) {
+
+					// Get pre-spam terms
+					$new_terms = get_post_meta( $topic_id, '_bbp_spam_topic_tags', true );
+
+					// If terms exist, explode them and compile the return value
+					if ( empty( $new_terms ) ) {
+						$new_terms = '';
+					}
+
+				// Topic is not spam so get real terms
+				} else {
+					$terms = array_filter( (array) get_the_terms( $topic_id, bbp_get_topic_tag_tax_id() ) );
+
+					// Loop through them
+					foreach( $terms as $term ) {
+						$new_terms[] = $term->name;
+					}
+				}
+
+			// Define local variable(s)
+			} else {
+				$new_terms = '';
+			}
+
+			// Set the return value
+			$topic_tags = ( !empty( $new_terms ) ) ? implode( ', ', $new_terms ) : '';
+
+		// No data
+		} else {
+			$topic_tags = '';
+		}
+
+		return apply_filters( 'bbp_get_form_topic_tags', esc_attr( $topic_tags ) );
+	}
+
+/**
+ * Output value of topic forum
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_forum() To get the topic's forum id
+ */
+function bbp_form_topic_forum() {
+	echo bbp_get_form_topic_forum();
+}
+	/**
+	 * Return value of topic forum
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_get_topic_forum_id() To get the topic forum id
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_forum' with the forum
+	 * @return string Value of topic content field
+	 */
+	function bbp_get_form_topic_forum() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_forum_id'] ) )
+			$topic_forum = $_POST['bbp_forum_id'];
+
+		// Get edit data
+		elseif ( bbp_is_topic_edit() )
+			$topic_forum = bbp_get_topic_forum_id();
+
+		// No data
+		else
+			$topic_forum = 0;
+
+		return apply_filters( 'bbp_get_form_topic_forum', esc_attr( $topic_forum ) );
+	}
+
+/**
+ * Output checked value of topic subscription
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_subscribed() To get the subscribed checkbox value
+ */
+function bbp_form_topic_subscribed() {
+	echo bbp_get_form_topic_subscribed();
+}
+	/**
+	 * Return checked value of topic subscription
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses bbp_is_topic_edit() To check if it's the topic edit page
+	 * @uses bbp_is_user_subscribed() To check if the user is subscribed to
+	 *                                 the topic
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_subscribed' with the
+	 *                        option
+	 * @return string Checked value of topic subscription
+	 */
+	function bbp_get_form_topic_subscribed() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_topic_subscription'] ) ) {
+			$topic_subscribed = $_POST['bbp_topic_subscription'];
+
+		// Get edit data
+		} elseif ( bbp_is_topic_edit() || bbp_is_reply_edit() ) {
+
+			// Get current posts author
+			$post_author = bbp_get_global_post_field( 'post_author', 'raw' );
+
+			// Post author is not the current user
+			if ( bbp_get_current_user_id() != $post_author ) {
+				$topic_subscribed = bbp_is_user_subscribed( $post_author );
+
+			// Post author is the current user
+			} else {
+				$topic_subscribed = bbp_is_user_subscribed( bbp_get_current_user_id() );
+			}
+
+		// Get current status
+		} elseif ( bbp_is_single_topic() ) {
+			$topic_subscribed = bbp_is_user_subscribed( bbp_get_current_user_id() );
+
+		// No data
+		} else {
+			$topic_subscribed = 0;
+		}
+
+		// Get checked output
+		$checked = checked( $topic_subscribed, true, false );
+
+		return apply_filters( 'bbp_get_form_topic_subscribed', $checked, $topic_subscribed );
+	}
+
+/**
+ * Output checked value of topic log edit field
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_log_edit() To get the topic log edit value
+ */
+function bbp_form_topic_log_edit() {
+	echo bbp_get_form_topic_log_edit();
+}
+	/**
+	 * Return checked value of topic log edit field
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_log_edit' with the
+	 *                        log edit value
+	 * @return string Topic log edit checked value
+	 */
+	function bbp_get_form_topic_log_edit() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_log_topic_edit'] ) )
+			$topic_revision = $_POST['bbp_log_topic_edit'];
+
+		// No data
+		else
+			$topic_revision = 1;
+
+		return apply_filters( 'bbp_get_form_topic_log_edit', checked( $topic_revision, true, false ) );
+	}
+
+/**
+ * Output the value of the topic edit reason
+ *
+ * @since bbPress (r2976)
+ *
+ * @uses bbp_get_form_topic_edit_reason() To get the topic edit reason value
+ */
+function bbp_form_topic_edit_reason() {
+	echo bbp_get_form_topic_edit_reason();
+}
+	/**
+	 * Return the value of the topic edit reason
+	 *
+	 * @since bbPress (r2976)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_form_topic_edit_reason' with the
+	 *                        topic edit reason value
+	 * @return string Topic edit reason value
+	 */
+	function bbp_get_form_topic_edit_reason() {
+
+		// Get _POST data
+		if ( 'post' == strtolower( $_SERVER['REQUEST_METHOD'] ) && isset( $_POST['bbp_topic_edit_reason'] ) )
+			$topic_edit_reason = $_POST['bbp_topic_edit_reason'];
+
+		// No data
+		else
+			$topic_edit_reason = '';
+
+		return apply_filters( 'bbp_get_form_topic_edit_reason', esc_attr( $topic_edit_reason ) );
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/capabilities.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,646 @@
+<?php
+
+/**
+ * bbPress User Capabilites
+ *
+ * Used to map user capabilities to WordPress's existing capabilities.
+ *
+ * @package bbPress
+ * @subpackage Capabilities
+ */
+
+/**
+ * Maps primary capabilities
+ *
+ * @since bbPress (r4242)
+ *
+ * @param array $caps Capabilities for meta capability
+ * @param string $cap Capability name
+ * @param int $user_id User id
+ * @param mixed $args Arguments
+ * @uses apply_filters() Filter mapped results
+ * @return array Actual capabilities for meta capability
+ */
+function bbp_map_primary_meta_caps( $caps = array(), $cap = '', $user_id = 0, $args = array() ) {
+
+	// What capability is being checked?
+	switch ( $cap ) {
+		case 'spectate'    :
+		case 'participate' :
+		case 'moderate'    :
+
+			// Do not allow inactive users
+			if ( bbp_is_user_inactive( $user_id ) ) {
+				$caps = array( 'do_not_allow' );
+
+			// Moderators are always participants
+			} else {
+				$caps = array( $cap );
+			}
+
+			break;
+	}
+
+	return apply_filters( 'bbp_map_primary_meta_caps', $caps, $cap, $user_id, $args );
+}
+
+/**
+ * Return a user's main role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_set_user_role' with the role and user id
+ * @return string
+ */
+function bbp_set_user_role( $user_id = 0, $new_role = '' ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id, false, false );
+	$user    = get_userdata( $user_id );
+
+	// User exists
+	if ( !empty( $user ) ) {
+
+		// Get users forum role
+		$role = bbp_get_user_role( $user_id );
+
+		// User already has this role so no new role is set
+		if ( $new_role == $role ) {
+			$new_role = false;
+
+		// Users role is different than the new role
+		} else {
+
+			// Remove the old role
+			if ( ! empty( $role ) ) {
+				$user->remove_role( $role );
+			}
+
+			// Add the new role
+			if ( !empty( $new_role ) ) {
+				$user->add_role( $new_role );
+			}
+		}
+
+	// User does don exist so return false
+	} else {
+		$new_role = false;
+	}
+
+	return apply_filters( 'bbp_set_user_role', $new_role, $user_id, $user );
+}
+
+/**
+ * Return a user's forums role
+ *
+ * @since bbPress (r3860)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_get_user_role' with the role and user id
+ * @return string
+ */
+function bbp_get_user_role( $user_id = 0 ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id, false, false );
+	$user    = get_userdata( $user_id );
+	$role    = false;
+
+	// User has roles so lets
+	if ( ! empty( $user->roles ) ) {
+		$roles = array_intersect( array_values( $user->roles ), array_keys( bbp_get_dynamic_roles() ) );
+
+		// If there's a role in the array, use the first one
+		if ( !empty( $roles ) ) {
+			$role = array_shift( array_values( $roles ) );
+		}
+	}
+
+	return apply_filters( 'bbp_get_user_role', $role, $user_id, $user );
+}
+
+/**
+ * Return a user's blog role
+ *
+ * @since bbPress (r4446)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_userdata() To get the user data
+ * @uses apply_filters() Calls 'bbp_get_user_blog_role' with the role and user id
+ * @return string
+ */
+function bbp_get_user_blog_role( $user_id = 0 ) {
+	global $wp_roles;
+
+	// This really shold not be necessary anymore, and will likely be removed
+	// at a later date. If roles aren't loaded yet, something else is wrong.
+	if ( ! isset( $wp_roles ) )
+		$wp_roles = new WP_Roles();
+
+	// Validate user id
+	$user_id   = bbp_get_user_id( $user_id, false, false );
+	$user      = get_userdata( $user_id );
+	$role      = false;
+	$all_roles = apply_filters( 'editable_roles', $wp_roles->roles );
+
+	// User has roles so lets
+	if ( ! empty( $user->roles ) ) {
+		$roles = array_intersect( array_values( $user->roles ), array_keys( $all_roles ) );
+
+		// If there's a role in the array, use the first one
+		if ( !empty( $roles ) ) {
+			$role = array_shift( array_values( $roles ) );
+		}
+	}
+
+	return apply_filters( 'bbp_get_user_blog_role', $role, $user_id, $user );
+}
+
+/**
+ * Helper function hooked to 'bbp_edit_user_profile_update' action to save or
+ * update user roles and capabilities.
+ *
+ * @since bbPress (r4235)
+ *
+ * @param int $user_id
+ * @uses bbp_reset_user_caps() to reset caps
+ * @usse bbp_save_user_caps() to save caps
+ */
+function bbp_profile_update_role( $user_id = 0 ) {
+
+	// Bail if no user ID was passed
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if no role
+	if ( ! isset( $_POST['bbp-forums-role'] ) )
+		return;
+
+	// Fromus role we want the user to have
+	$new_role    = sanitize_text_field( $_POST['bbp-forums-role'] );
+	$forums_role = bbp_get_user_role( $user_id );
+
+	// Set the new forums role
+	if ( $new_role != $forums_role ) {
+		bbp_set_user_role( $user_id, $new_role );
+	}
+}
+
+/**
+ * Add the default role to the current user if needed
+ *
+ * This function will bail if the forum is not global in a multisite
+ * installation of WordPress, or if the user is marked as spam or deleted.
+ *
+ * @since bbPress (r3380)
+ *
+ * @uses is_user_logged_in() To bail if user is not logged in
+ * @uses bbp_get_user_role() To bail if user already has a role
+ * @uses bbp_is_user_inactive() To bail if user is inactive
+ * @uses bbp_allow_global_access() To know whether to save role to database
+ * @uses bbp_get_user_role_map() To get the WP to BBP role map array
+ * @uses bbp_get_default_role() To get the site's default forums role
+ * @uses get_option()
+ *
+ * @return If not multisite, not global, or user is deleted/spammed
+ */
+function bbp_set_current_user_default_role() {
+
+	/** Sanity ****************************************************************/
+
+	// Bail if deactivating bbPress
+	if ( bbp_is_deactivation() )
+		return;
+
+	// Catch all, to prevent premature user initialization
+	if ( ! did_action( 'set_current_user' ) )
+		return;
+
+	// Bail if not logged in or already a member of this site
+	if ( ! is_user_logged_in() )
+		return;
+
+	// Get the current user ID
+	$user_id = bbp_get_current_user_id();
+
+	// Bail if user already has a forums role
+	if ( bbp_get_user_role( $user_id ) )
+		return;
+
+	// Bail if user is marked as spam or is deleted
+	if ( bbp_is_user_inactive( $user_id ) )
+		return;
+
+	/** Ready *****************************************************************/
+
+	// Load up bbPress once
+	$bbp         = bbpress();
+
+	// Get whether or not to add a role to the user account
+	$add_to_site = bbp_allow_global_access();
+
+	// Get the current user's WordPress role. Set to empty string if none found.
+	$user_role   = bbp_get_user_blog_role( $user_id );
+
+	// Get the role map
+	$role_map    = bbp_get_user_role_map();
+
+	/** Forum Role ************************************************************/
+
+	// Use a mapped role
+	if ( isset( $role_map[$user_role] ) ) {
+		$new_role = $role_map[$user_role];
+
+	// Use the default role
+	} else {
+		$new_role = bbp_get_default_role();
+	}
+
+	/** Add or Map ************************************************************/
+
+	// Add the user to the site
+	if ( true == $add_to_site ) {
+		$bbp->current_user->add_role( $new_role );
+
+	// Don't add the user, but still give them the correct caps dynamically
+	} else {		
+		$bbp->current_user->caps[$new_role] = true;
+		$bbp->current_user->get_role_caps();
+	}
+}
+
+/**
+ * Return a map of WordPress roles to bbPress roles. Used to automatically grant
+ * appropriate bbPress roles to WordPress users that wouldn't already have a
+ * role in the forums. Also guarantees WordPress admins get the Keymaster role.
+ *
+ * @since bbPress (r4334)
+ *
+ * @return array Filtered array of WordPress roles to bbPress roles
+ */
+function bbp_get_user_role_map() {
+
+	// Get the default role once here
+	$default_role = bbp_get_default_role();
+
+	// Return filtered results, forcing admins to keymasters.
+	return (array) apply_filters( 'bbp_get_user_role_map', array (
+		'administrator' => bbp_get_keymaster_role(),
+		'editor'        => $default_role,
+		'author'        => $default_role,
+		'contributor'   => $default_role,
+		'subscriber'    => $default_role
+	) );
+}
+
+/** User Status ***************************************************************/
+
+/**
+ * Checks if the user has been marked as a spammer.
+ *
+ * @since bbPress (r3355)
+ *
+ * @param int $user_id int The ID for the user.
+ * @return bool True if spammer, False if not.
+ */
+function bbp_is_user_spammer( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Assume user is not spam
+	$is_spammer = false;
+
+	// Get user data
+	$user = get_userdata( $user_id );
+
+	// No user found
+	if ( empty( $user ) ) {
+		$is_spammer = false;
+
+	// Check if spam
+	} elseif ( !empty( $user->spam ) ) {
+		$is_spammer = true;
+	}
+
+	return (bool) apply_filters( 'bp_core_is_user_spammer', $is_spammer );
+}
+
+/**
+ * Mark a users topics and replies as spam when the user is marked as spam
+ *
+ * @since bbPress (r3405)
+ *
+ * @global WPDB $wpdb
+ * @param int $user_id Optional. User ID to spam. Defaults to displayed user.
+
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_get_displayed_user_field()
+ * @uses is_super_admin()
+ * @uses get_blogs_of_user()
+ * @uses get_current_blog_id()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ * @uses switch_to_blog()
+ * @uses get_post_type()
+ * @uses bbp_spam_topic()
+ * @uses bbp_spam_reply()
+ * @uses restore_current_blog()
+ *
+ * @return If no user ID passed
+ */
+function bbp_make_spam_user( $user_id = 0 ) {
+
+	// Use displayed user if it's not yourself
+	if ( empty( $user_id ) && bbp_is_single_user() && !bbp_is_user_home() )
+		$user_id = bbp_get_displayed_user_id();
+
+	// Bail if no user ID
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if user ID is super admin
+	if ( is_super_admin( $user_id ) )
+		return;
+
+	// Arm the torpedos
+	global $wpdb;
+
+	// Get the blog IDs of the user to mark as spam
+	$blogs = get_blogs_of_user( $user_id, true );
+
+	// If user has no blogs, they are a guest on this site
+	if ( empty( $blogs ) )
+		$blogs[$wpdb->blogid] = array();
+
+	// Make array of post types to mark as spam
+	$post_types  = array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$post_types  = "'" . implode( "', '", $post_types ) . "'";
+	$status      = bbp_get_public_status_id();
+
+	// Loop through blogs and remove their posts
+	foreach ( (array) array_keys( $blogs ) as $blog_id ) {
+
+		// Switch to the blog ID
+		switch_to_blog( $blog_id );
+
+		// Get topics and replies
+		$posts = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_author = {$user_id} AND post_status = '{$status}' AND post_type IN ({$post_types})" );
+
+		// Loop through posts and spam them
+		if ( !empty( $posts ) ) {
+			foreach ( $posts as $post_id ) {
+
+				// The routines for topics ang replies are different, so use the
+				// correct one based on the post type
+				switch ( get_post_type( $post_id ) ) {
+
+					case bbp_get_topic_post_type() :
+						bbp_spam_topic( $post_id );
+						break;
+
+					case bbp_get_reply_post_type() :
+						bbp_spam_reply( $post_id );
+						break;
+				}
+			}
+		}
+
+		// Switch back to current blog
+		restore_current_blog();
+	}
+}
+
+/**
+ * Mark a users topics and replies as spam when the user is marked as spam
+ *
+ * @since bbPress (r3405)
+ *
+ * @global WPDB $wpdb
+ * @param int $user_id Optional. User ID to unspam. Defaults to displayed user.
+ *
+ * @uses bbp_is_single_user()
+ * @uses bbp_is_user_home()
+ * @uses bbp_get_displayed_user_field()
+ * @uses is_super_admin()
+ * @uses get_blogs_of_user()
+ * @uses bbp_get_topic_post_type()
+ * @uses bbp_get_reply_post_type()
+ * @uses switch_to_blog()
+ * @uses get_post_type()
+ * @uses bbp_unspam_topic()
+ * @uses bbp_unspam_reply()
+ * @uses restore_current_blog()
+ *
+ * @return If no user ID passed
+ */
+function bbp_make_ham_user( $user_id = 0 ) {
+
+	// Use displayed user if it's not yourself
+	if ( empty( $user_id ) && bbp_is_single_user() && !bbp_is_user_home() )
+		$user_id = bbp_get_displayed_user_field();
+
+	// Bail if no user ID
+	if ( empty( $user_id ) )
+		return;
+
+	// Bail if user ID is super admin
+	if ( is_super_admin( $user_id ) )
+		return;
+
+	// Arm the torpedos
+	global $wpdb;
+
+	// Get the blog IDs of the user to mark as spam
+	$blogs = get_blogs_of_user( $user_id, true );
+
+	// If user has no blogs, they are a guest on this site
+	if ( empty( $blogs ) )
+		$blogs[$wpdb->blogid] = array();
+
+	// Make array of post types to mark as spam
+	$post_types = array( bbp_get_topic_post_type(), bbp_get_reply_post_type() );
+	$post_types = "'" . implode( "', '", $post_types ) . "'";
+	$status     = bbp_get_spam_status_id();
+
+	// Loop through blogs and remove their posts
+	foreach ( (array) array_keys( $blogs ) as $blog_id ) {
+
+		// Switch to the blog ID
+		switch_to_blog( $blog_id );
+
+		// Get topics and replies
+		$posts = $wpdb->get_col( "SELECT ID FROM {$wpdb->posts} WHERE post_author = {$user_id} AND post_status = '{$status}' AND post_type IN ({$post_types})" );
+
+		// Loop through posts and spam them
+		if ( !empty( $posts ) ) {
+			foreach ( $posts as $post_id ) {
+
+				// The routines for topics ang replies are different, so use the
+				// correct one based on the post type
+				switch ( get_post_type( $post_id ) ) {
+
+					case bbp_get_topic_post_type() :
+						bbp_unspam_topic( $post_id );
+						break;
+
+					case bbp_get_reply_post_type() :
+						bbp_unspam_reply( $post_id );
+						break;
+				}
+			}
+		}
+
+		// Switch back to current blog
+		restore_current_blog();
+	}
+}
+
+/**
+ * Checks if the user has been marked as deleted.
+ *
+ * @since bbPress (r3355)
+ *
+ * @param int $user_id int The ID for the user.
+ * @return bool True if deleted, False if not.
+ */
+function bbp_is_user_deleted( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Assume user is not deleted
+	$is_deleted = false;
+
+	// Get user data
+	$user = get_userdata( $user_id );
+
+	// No user found
+	if ( empty( $user ) ) {
+		$is_deleted = true;
+
+	// Check if deleted
+	} elseif ( !empty( $user->deleted ) ) {
+		$is_deleted = true;
+	}
+
+	return (bool) apply_filters( 'bp_core_is_user_deleted', $is_deleted );
+}
+
+/**
+ * Checks if user is active
+ *
+ * @since bbPress (r3502)
+ *
+ * @uses is_user_logged_in() To check if user is logged in
+ * @uses bbp_get_displayed_user_id() To get current user ID
+ * @uses bbp_is_user_spammer() To check if user is spammer
+ * @uses bbp_is_user_deleted() To check if user is deleted
+ *
+ * @param int $user_id The user ID to check
+ * @return bool True if public, false if not
+ */
+function bbp_is_user_active( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Check spam
+	if ( bbp_is_user_spammer( $user_id ) )
+		return false;
+
+	// Check deleted
+	if ( bbp_is_user_deleted( $user_id ) )
+		return false;
+
+	// Assume true if not spam or deleted
+	return true;
+}
+
+/**
+ * Checks if user is not active.
+ *
+ * @since bbPress (r3502)
+ *
+ * @uses is_user_logged_in() To check if user is logged in
+ * @uses bbp_get_displayed_user_id() To get current user ID
+ * @uses bbp_is_user_active() To check if user is active
+ *
+ * @param int $user_id The user ID to check. Defaults to current user ID
+ * @return bool True if inactive, false if active
+ */
+function bbp_is_user_inactive( $user_id = 0 ) {
+
+	// Default to current user
+	if ( empty( $user_id ) && is_user_logged_in() )
+		$user_id = bbp_get_current_user_id();
+
+	// No user to check
+	if ( empty( $user_id ) )
+		return false;
+
+	// Return the inverse of active
+	return !bbp_is_user_active( $user_id );
+}
+
+/**
+ * Does a user have a profile for the current site
+ *
+ * @since bbPress (r4362)
+ *
+ * @param int $user_id User ID to check
+ * @param int $blog_id Blog ID to check
+ *
+ * @uses bbp_get_user_id() To verify the user ID
+ * @uses get_userdata() To get the user's data
+ * @uses is_super_admin() To determine if user can see inactive users
+ * @uses bbp_is_user_inactive() To check if user is spammer or deleted
+ * @uses apply_filters() To allow override of this functions result
+ *
+ * @return boolean Whether or not the user has a profile on this blog_id
+ */
+function bbp_user_has_profile( $user_id = 0 ) {
+
+	// Assume every user has a profile
+	$retval  = true;
+
+	// Validate user ID, default to displayed or current user
+	$user_id = bbp_get_user_id( $user_id, true, true );
+
+	// Try to get this user's data
+	$user    = get_userdata( $user_id );
+
+	// No user found, return false
+	if ( empty( $user ) ) {
+		$retval = false;
+
+	// User is inactive, and current user is not a super admin
+	} elseif ( ! is_super_admin() && bbp_is_user_inactive( $user->ID ) ) {
+		$retval = false;
+	}
+
+	// Filter and return
+	return (bool) apply_filters( 'bbp_show_user_profile', $retval, $user_id );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1161 @@
+<?php
+
+/**
+ * bbPress User Functions
+ *
+ * @package bbPress
+ * @subpackage Functions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Redirect back to $url when attempting to use the login page
+ *
+ * @since bbPress (r2815)
+ *
+ * @param string $url The url
+ * @param string $raw_url Raw url
+ * @param object $user User object
+ * @uses is_wp_error() To check if the user param is a {@link WP_Error}
+ * @uses admin_url() To get the admin url
+ * @uses home_url() To get the home url
+ * @uses esc_url() To escape the url
+ * @uses wp_safe_redirect() To redirect
+ */
+function bbp_redirect_login( $url = '', $raw_url = '', $user = '' ) {
+
+	// Raw redirect_to was passed, so use it
+	if ( !empty( $raw_url ) )
+		$url = $raw_url;
+
+	// $url was manually set in wp-login.php to redirect to admin
+	elseif ( admin_url() == $url )
+		$url = home_url();
+
+	// $url is empty
+	elseif ( empty( $url ) )
+		$url = home_url();
+
+	return apply_filters( 'bbp_redirect_login', $url, $raw_url, $user );
+}
+
+/**
+ * Is an anonymous topic/reply being made?
+ *
+ * @since bbPres (r2688)
+ *
+ * @uses is_user_logged_in() Is the user logged in?
+ * @uses bbp_allow_anonymous() Is anonymous posting allowed?
+ * @uses apply_filters() Calls 'bbp_is_anonymous' with the return value
+ * @return bool True if anonymous is allowed and user is not logged in, false if
+ *               anonymous is not allowed or user is logged in
+ */
+function bbp_is_anonymous() {
+	if ( !is_user_logged_in() && bbp_allow_anonymous() )
+		$is_anonymous = true;
+	else
+		$is_anonymous = false;
+
+	return apply_filters( 'bbp_is_anonymous', $is_anonymous );
+}
+
+/**
+ * Echoes the values for current poster (uses WP comment cookies)
+ *
+ * @since bbPress (r2734)
+ *
+ * @param string $key Which value to echo?
+ * @uses bbp_get_current_anonymous_user_data() To get the current anonymous user
+ *                                              data
+ */
+function bbp_current_anonymous_user_data( $key = '' ) {
+	echo bbp_get_current_anonymous_user_data( $key );
+}
+
+	/**
+	 * Get the cookies for current poster (uses WP comment cookies).
+	 *
+	 * @since bbPress (r2734)
+	 *
+	 * @param string $key Optional. Which value to get? If not given, then
+	 *                     an array is returned.
+	 * @uses sanitize_comment_cookies() To sanitize the current poster data
+	 * @uses wp_get_current_commenter() To get the current poster data	 *
+	 * @return string|array Cookie(s) for current poster
+	 */
+	function bbp_get_current_anonymous_user_data( $key = '' ) {
+		$cookie_names = array(
+			'name'    => 'comment_author',
+			'email'   => 'comment_author_email',
+			'website' => 'comment_author_url',
+
+			// Here just for the sake of them, use the above ones
+			'comment_author'       => 'comment_author',
+			'comment_author_email' => 'comment_author_email',
+			'comment_author_url'   => 'comment_author_url',
+		);
+
+		sanitize_comment_cookies();
+
+		$bbp_current_poster = wp_get_current_commenter();
+
+		if ( !empty( $key ) && in_array( $key, array_keys( $cookie_names ) ) )
+			return $bbp_current_poster[$cookie_names[$key]];
+
+		return $bbp_current_poster;
+	}
+
+/**
+ * Set the cookies for current poster (uses WP comment cookies)
+ *
+ * @since bbPress (r2734)
+ *
+ * @param array $anonymous_data With keys 'bbp_anonymous_name',
+ *                               'bbp_anonymous_email', 'bbp_anonymous_website'.
+ *                               Should be sanitized (see
+ *                               {@link bbp_filter_anonymous_post_data()} for
+ *                               sanitization)
+ * @uses apply_filters() Calls 'comment_cookie_lifetime' for cookie lifetime.
+ *                        Defaults to 30000000.
+ */
+function bbp_set_current_anonymous_user_data( $anonymous_data = array() ) {
+	if ( empty( $anonymous_data ) || !is_array( $anonymous_data ) )
+		return;
+
+	$comment_cookie_lifetime = apply_filters( 'comment_cookie_lifetime', 30000000 );
+
+	setcookie( 'comment_author_'       . COOKIEHASH, $anonymous_data['bbp_anonymous_name'],    time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN );
+	setcookie( 'comment_author_email_' . COOKIEHASH, $anonymous_data['bbp_anonymous_email'],   time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN );
+	setcookie( 'comment_author_url_'   . COOKIEHASH, $anonymous_data['bbp_anonymous_website'], time() + $comment_cookie_lifetime, COOKIEPATH, COOKIE_DOMAIN );
+}
+
+/**
+ * Get the poster IP address
+ *
+ * @since bbPress (r3120)
+ *
+ * @return string
+ */
+function bbp_current_author_ip() {
+	$retval = preg_replace( '/[^0-9a-fA-F:., ]/', '', $_SERVER['REMOTE_ADDR'] );
+
+	return apply_filters( 'bbp_current_author_ip', $retval );
+}
+
+/**
+ * Get the poster user agent
+ *
+ * @since bbPress (r3446)
+ *
+ * @return string
+ */
+function bbp_current_author_ua() {
+	$retval = !empty( $_SERVER['HTTP_USER_AGENT'] ) ? substr( $_SERVER['HTTP_USER_AGENT'], 0, 254 ) : '';
+
+	return apply_filters( 'bbp_current_author_ua', $retval );
+}
+
+/** Post Counts ***************************************************************/
+
+/**
+ * Return the raw database count of topics by a user
+ *
+ * @since bbPress (r3633)
+ * @global WPDB $wpdb
+ * @uses bbp_get_user_id()
+ * @uses get_posts_by_author_sql()
+ * @uses bbp_get_topic_post_type()
+ * @uses apply_filters()
+ * @return int Raw DB count of topics
+ */
+function bbp_get_user_topic_count_raw( $user_id = 0 ) {
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	global $wpdb;
+
+	$where = get_posts_by_author_sql( bbp_get_topic_post_type(), true, $user_id );
+	$count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} {$where}" );
+
+	return (int) apply_filters( 'bbp_get_user_topic_count_raw', $count, $user_id );
+}
+
+/**
+ * Return the raw database count of replies by a user
+ *
+ * @since bbPress (r3633)
+ * @global WPDB $wpdb
+ * @uses bbp_get_user_id()
+ * @uses get_posts_by_author_sql()
+ * @uses bbp_get_reply_post_type()
+ * @uses apply_filters()
+ * @return int Raw DB count of replies
+ */
+function bbp_get_user_reply_count_raw( $user_id = 0 ) {
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	global $wpdb;
+
+	$where = get_posts_by_author_sql( bbp_get_reply_post_type(), true, $user_id );
+	$count = (int) $wpdb->get_var( "SELECT COUNT(*) FROM {$wpdb->posts} {$where}" );
+
+	return (int) apply_filters( 'bbp_get_user_reply_count_raw', $count, $user_id );
+}
+
+/** Favorites *****************************************************************/
+
+/**
+ * Get the users who have made the topic favorite
+ *
+ * @since bbPress (r2658)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses wpdb::get_col() To execute our query and get the column back
+ * @uses apply_filters() Calls 'bbp_get_topic_favoriters' with the users and
+ *                        topic id
+ * @return array|bool Results if the topic has any favoriters, otherwise false
+ */
+function bbp_get_topic_favoriters( $topic_id = 0 ) {
+	if ( empty( $topic_id ) )
+		return;
+
+	global $wpdb;
+
+	// Get the users who have favorited the topic
+	$key   = $wpdb->prefix . '_bbp_favorites';
+	$users = $wpdb->get_col( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '{$key}' and FIND_IN_SET('{$topic_id}', meta_value) > 0" );
+	$users = apply_filters( 'bbp_get_topic_favoriters', $users, $topic_id );
+
+	if ( !empty( $users ) )
+		return $users;
+
+	return false;
+}
+
+/**
+ * Get a user's favorite topics
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_favorites_topic_ids() To get the user's favorites
+ * @uses bbp_has_topics() To get the topics
+ * @uses apply_filters() Calls 'bbp_get_user_favorites' with the topic query and
+ *                        user id
+ * @return array|bool Results if user has favorites, otherwise false
+ */
+function bbp_get_user_favorites( $user_id = 0 ) {
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	// If user has favorites, load them
+	$favorites = bbp_get_user_favorites_topic_ids( $user_id );
+	if ( !empty( $favorites ) ) {
+
+		// Setup the topics query
+		$topics_query = bbp_has_topics( array( 'post__in' => $favorites ) );
+
+		return apply_filters( 'bbp_get_user_favorites', $topics_query, $user_id );
+	}
+
+	return false;
+}
+
+/**
+ * Get a user's favorite topics' ids
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_user_option() To get the user favorites
+ * @uses apply_filters() Calls 'bbp_get_user_favorites_topic_ids' with
+ *                        the favorites and user id
+ * @return array|bool Results if user has favorites, otherwise false
+ */
+function bbp_get_user_favorites_topic_ids( $user_id = 0 ) {
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	$favorites = (string) get_user_option( '_bbp_favorites', $user_id );
+	$favorites = (array) explode( ',', $favorites );
+	$favorites = array_filter( $favorites );
+
+	return apply_filters( 'bbp_get_user_favorites_topic_ids', $favorites, $user_id );
+}
+
+/**
+ * Check if a topic is in user's favorites or not
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_get_user_favorites_topic_ids() To get the user favorites
+ * @uses bbp_get_topic() To get the topic
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses apply_filters() Calls 'bbp_is_user_favorite' with the bool, user id,
+ *                        topic id and favorites
+ * @return bool True if the topic is in user's favorites, otherwise false
+ */
+function bbp_is_user_favorite( $user_id = 0, $topic_id = 0 ) {
+
+	$user_id = bbp_get_user_id( $user_id, true, true );
+	if ( empty( $user_id ) )
+		return false;
+
+	$retval    = false;
+	$favorites = bbp_get_user_favorites_topic_ids( $user_id );
+
+	if ( !empty( $favorites ) ) {
+		
+		// Checking a specific topic id
+		if ( !empty( $topic_id ) ) {
+			$topic    = bbp_get_topic( $topic_id );
+			$topic_id = !empty( $topic ) ? $topic->ID : 0;
+
+		// Using the global topic id
+		} elseif ( bbp_get_topic_id() ) {
+			$topic_id = bbp_get_topic_id();
+
+		// Use the current post id
+		} elseif ( !bbp_get_topic_id() ) {
+			$topic_id = get_the_ID();
+		}
+
+		// Is topic_id in the user's favorites
+		if ( !empty( $topic_id ) ) {
+			$retval = in_array( $topic_id, $favorites );
+		}
+	}
+
+	return (bool) apply_filters( 'bbp_is_user_favorite', (bool) $retval, $user_id, $topic_id, $favorites );
+}
+
+/**
+ * Add a topic to user's favorites
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_favorites_topic_ids() To get the user favorites
+ * @uses update_user_option() To update the user favorites
+ * @uses do_action() Calls 'bbp_add_user_favorite' with the user id and topic id
+ * @return bool Always true
+ */
+function bbp_add_user_favorite( $user_id = 0, $topic_id = 0 ) {
+	if ( empty( $user_id ) || empty( $topic_id ) )
+		return false;
+
+	$favorites = (array) bbp_get_user_favorites_topic_ids( $user_id );
+	$topic     = bbp_get_topic( $topic_id );
+	if ( empty( $topic ) )
+		return false;
+
+	if ( !in_array( $topic_id, $favorites ) ) {
+		$favorites[] = $topic_id;
+		$favorites   = array_filter( $favorites );
+		$favorites   = (string) implode( ',', $favorites );
+		update_user_option( $user_id, '_bbp_favorites', $favorites );
+	}
+
+	do_action( 'bbp_add_user_favorite', $user_id, $topic_id );
+
+	return true;
+}
+
+/**
+ * Remove a topic from user's favorites
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_favorites_topic_ids() To get the user favorites
+ * @uses update_user_option() To update the user favorites
+ * @uses delete_user_option() To delete the user favorites meta
+ * @uses do_action() Calls 'bbp_remove_user_favorite' with the user & topic id
+ * @return bool True if the topic was removed from user's favorites, otherwise
+ *               false
+ */
+function bbp_remove_user_favorite( $user_id, $topic_id ) {
+	if ( empty( $user_id ) || empty( $topic_id ) )
+		return false;
+
+	$favorites = (array) bbp_get_user_favorites_topic_ids( $user_id );
+	if ( empty( $favorites ) )
+		return false;
+
+	$pos = array_search( $topic_id, $favorites );
+	if ( is_numeric( $pos ) ) {
+		array_splice( $favorites, $pos, 1 );
+		$favorites = array_filter( $favorites );
+
+		if ( !empty( $favorites ) ) {
+			$favorites = implode( ',', $favorites );
+			update_user_option( $user_id, '_bbp_favorites', $favorites );
+		} else {
+			delete_user_option( $user_id, '_bbp_favorites' );
+		}
+	}
+
+	do_action( 'bbp_remove_user_favorite', $user_id, $topic_id );
+
+	return true;
+}
+
+/**
+ * Handles the front end adding and removing of favorite topics
+ *
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit the user
+ * @uses bbPress:errors:add() To log the error messages
+ * @uses bbp_is_user_favorite() To check if the topic is in user's favorites
+ * @uses bbp_remove_user_favorite() To remove the user favorite
+ * @uses bbp_add_user_favorite() To add the user favorite
+ * @uses do_action() Calls 'bbp_favorites_handler' with success, user id, topic
+ *                    id and action
+ * @uses bbp_is_favorites() To check if it's the favorites page
+ * @uses bbp_get_favorites_link() To get the favorites page link
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the url
+ */
+function bbp_favorites_handler() {
+
+	if ( !bbp_is_favorites_active() )
+		return false;
+
+	// Bail if not a GET action
+	if ( 'GET' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if required GET actions aren't passed
+	if ( empty( $_GET['topic_id'] ) || empty( $_GET['action'] ) )
+		return;
+
+	// Setup possible get actions
+	$possible_actions = array(
+		'bbp_favorite_add',
+		'bbp_favorite_remove',
+	);
+
+	// Bail if actions aren't meant for this function
+	if ( !in_array( $_GET['action'], $possible_actions ) )
+		return;
+
+	// What action is taking place?
+	$action      = $_GET['action'];
+	$topic_id    = intval( $_GET['topic_id'] );
+	$user_id     = bbp_get_user_id( 0, true, true );
+
+	// Check for empty topic
+	if ( empty( $topic_id ) ) {
+		bbp_add_error( 'bbp_favorite_topic_id', __( '<strong>ERROR</strong>: No topic was found! Which topic are you marking/unmarking as favorite?', 'bbpress' ) );
+
+	// Check nonce
+	} elseif ( ! bbp_verify_nonce_request( 'toggle-favorite_' . $topic_id ) ) {
+		bbp_add_error( 'bbp_favorite_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+
+	// Check current user's ability to edit the user
+	} elseif ( !current_user_can( 'edit_user', $user_id ) ) {
+		bbp_add_error( 'bbp_favorite_permissions', __( '<strong>ERROR</strong>: You don\'t have the permission to edit favorites of that user!', 'bbpress' ) );
+	}
+
+	// Bail if errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No errors *************************************************************/
+
+	$is_favorite = bbp_is_user_favorite( $user_id, $topic_id );
+	$success     = false;
+
+	if ( true == $is_favorite && 'bbp_favorite_remove' == $action )
+		$success = bbp_remove_user_favorite( $user_id, $topic_id );
+	elseif ( false == $is_favorite && 'bbp_favorite_add' == $action )
+		$success = bbp_add_user_favorite( $user_id, $topic_id );
+
+	// Do additional favorites actions
+	do_action( 'bbp_favorites_handler', $success, $user_id, $topic_id, $action );
+
+	// Success!
+	if ( true == $success ) {
+
+		// Redirect back from whence we came
+		if ( bbp_is_favorites() ) {
+			$redirect = bbp_get_favorites_permalink( $user_id );
+		} elseif ( bbp_is_single_user() ) {
+			$redirect = bbp_get_user_profile_url();
+		} elseif ( is_singular( bbp_get_topic_post_type() ) ) {
+			$redirect = bbp_get_topic_permalink( $topic_id );
+		} elseif ( is_single() || is_page() ) {
+			$redirect = get_permalink();
+		}
+
+		wp_safe_redirect( $redirect );
+
+		// For good measure
+		exit();
+
+	// Fail! Handle errors
+	} elseif ( true == $is_favorite && 'bbp_favorite_remove' == $action ) {
+		bbp_add_error( 'bbp_favorite_remove', __( '<strong>ERROR</strong>: There was a problem removing that topic from favorites!', 'bbpress' ) );
+	} elseif ( false == $is_favorite && 'bbp_favorite_add' == $action ) {
+		bbp_add_error( 'bbp_favorite_add',    __( '<strong>ERROR</strong>: There was a problem favoriting that topic!', 'bbpress' ) );
+	}
+}
+
+/** Subscriptions *************************************************************/
+
+/**
+ * Get the users who have subscribed to the topic
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $topic_id Optional. Topic id
+ * @uses wpdb::get_col() To execute our query and get the column back
+ * @uses apply_filters() Calls 'bbp_get_topic_subscribers' with the subscribers
+ * @return array|bool Results if the topic has any subscribers, otherwise false
+ */
+function bbp_get_topic_subscribers( $topic_id = 0 ) {
+	if ( empty( $topic_id ) ) return;
+
+	global $wpdb;
+
+	$key   = $wpdb->prefix . '_bbp_subscriptions';
+	$users = wp_cache_get( 'bbp_get_topic_subscribers_' . $topic_id, 'bbpress' );
+	if ( empty( $users ) ) {
+		$users = $wpdb->get_col( "SELECT user_id FROM {$wpdb->usermeta} WHERE meta_key = '{$key}' and FIND_IN_SET('{$topic_id}', meta_value) > 0" );
+		wp_cache_set( 'bbp_get_topic_subscribers_' . $topic_id, $users, 'bbpress' );
+	}
+
+	if ( !empty( $users ) ) {
+		$users = apply_filters( 'bbp_get_topic_subscribers', $users );
+		return $users;
+	}
+
+	return false;
+}
+
+/**
+ * Get a user's subscribed topics
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_subscribed_topic_ids() To get the user's subscriptions
+ * @uses bbp_has_topics() To get the topics
+ * @uses apply_filters() Calls 'bbp_get_user_subscriptions' with the topic query
+ *                        and user id
+ * @return array|bool Results if user has subscriptions, otherwise false
+ */
+function bbp_get_user_subscriptions( $user_id = 0 ) {
+
+	// Default to the displayed user
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	// If user has subscriptions, load them
+	$subscriptions = bbp_get_user_subscribed_topic_ids( $user_id );
+	if ( !empty( $subscriptions ) ) {
+		$query = bbp_has_topics( array( 'post__in' => $subscriptions ) );
+		return apply_filters( 'bbp_get_user_subscriptions', $query, $user_id );
+	}
+
+	return false;
+}
+
+/**
+ * Get a user's subscribed topics' ids
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses get_user_option() To get the user's subscriptions
+ * @uses apply_filters() Calls 'bbp_get_user_subscribed_topic_ids' with
+ *                        the subscriptions and user id
+ * @return array|bool Results if user has subscriptions, otherwise false
+ */
+function bbp_get_user_subscribed_topic_ids( $user_id = 0 ) {
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	$subscriptions = (string) get_user_option( '_bbp_subscriptions', $user_id );
+	$subscriptions = (array) explode( ',', $subscriptions );
+	$subscriptions = array_filter( $subscriptions );
+
+	return apply_filters( 'bbp_get_user_subscribed_topic_ids', $subscriptions, $user_id );
+}
+
+/**
+ * Check if a topic is in user's subscription list or not
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_get_user_subscribed_topic_ids() To get the user's subscriptions
+ * @uses bbp_get_topic() To get the topic
+ * @uses bbp_get_topic_id() To get the topic id
+ * @uses apply_filters() Calls 'bbp_is_user_subscribed' with the bool, user id,
+ *                        topic id and subsriptions
+ * @return bool True if the topic is in user's subscriptions, otherwise false
+ */
+function bbp_is_user_subscribed( $user_id = 0, $topic_id = 0 ) {
+
+	// Validate user
+	$user_id = bbp_get_user_id( $user_id, true, true );
+	if ( empty( $user_id ) )
+		return false;
+
+	$retval        = false;
+	$subscriptions = bbp_get_user_subscribed_topic_ids( $user_id );
+
+	if ( !empty( $subscriptions ) ) {
+
+		// Checking a specific topic id
+		if ( !empty( $topic_id ) ) {
+			$topic     = bbp_get_topic( $topic_id );
+			$topic_id = !empty( $topic ) ? $topic->ID : 0;
+
+		// Using the global topic id
+		} elseif ( bbp_get_topic_id() ) {
+			$topic_id = bbp_get_topic_id();
+
+		// Use the current post id
+		} elseif ( !bbp_get_topic_id() ) {
+			$topic_id = get_the_ID();
+		}
+
+		// Is topic_id in the user's favorites
+		if ( !empty( $topic_id ) ) {
+			$retval = in_array( $topic_id, $subscriptions );
+		}
+	}
+
+	return (bool) apply_filters( 'bbp_is_user_subscribed', (bool) $retval, $user_id, $topic_id, $subscriptions );
+}
+
+/**
+ * Add a topic to user's subscriptions
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_subscribed_topic_ids() To get the user's subscriptions
+ * @uses bbp_get_topic() To get the topic
+ * @uses update_user_option() To update the user's subscriptions
+ * @uses do_action() Calls 'bbp_add_user_subscription' with the user & topic id
+ * @return bool Always true
+ */
+function bbp_add_user_subscription( $user_id = 0, $topic_id = 0 ) {
+	if ( empty( $user_id ) || empty( $topic_id ) )
+		return false;
+
+	$subscriptions = (array) bbp_get_user_subscribed_topic_ids( $user_id );
+
+	$topic = bbp_get_topic( $topic_id );
+	if ( empty( $topic ) )
+		return false;
+
+	if ( !in_array( $topic_id, $subscriptions ) ) {
+		$subscriptions[] = $topic_id;
+		$subscriptions   = array_filter( $subscriptions );
+		$subscriptions   = (string) implode( ',', $subscriptions );
+		update_user_option( $user_id, '_bbp_subscriptions', $subscriptions );
+
+		wp_cache_delete( 'bbp_get_topic_subscribers_' . $topic_id, 'bbpress' );
+	}
+
+	do_action( 'bbp_add_user_subscription', $user_id, $topic_id );
+
+	return true;
+}
+
+/**
+ * Remove a topic from user's subscriptions
+ *
+ * @since bbPress (r2668)
+ *
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_subscribed_topic_ids() To get the user's subscriptions
+ * @uses update_user_option() To update the user's subscriptions
+ * @uses delete_user_option() To delete the user's subscriptions meta
+ * @uses do_action() Calls 'bbp_remove_user_subscription' with the user id and
+ *                    topic id
+ * @return bool True if the topic was removed from user's subscriptions,
+ *               otherwise false
+ */
+function bbp_remove_user_subscription( $user_id, $topic_id ) {
+	if ( empty( $user_id ) || empty( $topic_id ) )
+		return false;
+
+	$subscriptions = (array) bbp_get_user_subscribed_topic_ids( $user_id );
+
+	if ( empty( $subscriptions ) )
+		return false;
+
+	$pos = array_search( $topic_id, $subscriptions );
+	if ( is_numeric( $pos ) ) {
+		array_splice( $subscriptions, $pos, 1 );
+		$subscriptions = array_filter( $subscriptions );
+
+		if ( !empty( $subscriptions ) ) {
+			$subscriptions = implode( ',', $subscriptions );
+			update_user_option( $user_id, '_bbp_subscriptions', $subscriptions );
+		} else {
+			delete_user_option( $user_id, '_bbp_subscriptions' );
+		}
+
+		wp_cache_delete( 'bbp_get_topic_subscribers_' . $topic_id, 'bbpress' );
+	}
+
+	do_action( 'bbp_remove_user_subscription', $user_id, $topic_id );
+
+	return true;
+}
+
+/**
+ * Handles the front end subscribing and unsubscribing topics
+ *
+ * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
+ * @uses bbp_get_user_id() To get the user id
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit the user
+ * @uses bbPress:errors:add() To log the error messages
+ * @uses bbp_is_user_subscribed() To check if the topic is in user's
+ *                                 subscriptions
+ * @uses bbp_remove_user_subscription() To remove the user subscription
+ * @uses bbp_add_user_subscription() To add the user subscription
+ * @uses do_action() Calls 'bbp_subscriptions_handler' with success, user id,
+ *                    topic id and action
+ * @uses bbp_is_subscription() To check if it's the subscription page
+ * @uses bbp_get_subscription_link() To get the subscription page link
+ * @uses bbp_get_topic_permalink() To get the topic permalink
+ * @uses wp_safe_redirect() To redirect to the url
+ */
+function bbp_subscriptions_handler() {
+
+	if ( !bbp_is_subscriptions_active() )
+		return false;
+
+	// Bail if not a GET action
+	if ( 'GET' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if required GET actions aren't passed
+	if ( empty( $_GET['topic_id'] ) || empty( $_GET['action'] ) )
+		return;
+
+	// Setup possible get actions
+	$possible_actions = array(
+		'bbp_subscribe',
+		'bbp_unsubscribe',
+	);
+
+	// Bail if actions aren't meant for this function
+	if ( !in_array( $_GET['action'], $possible_actions ) )
+		return;
+
+	// Get required data
+	$action   = $_GET['action'];
+	$user_id  = bbp_get_user_id( 0, true, true );
+	$topic_id = intval( $_GET['topic_id'] );
+
+	// Check for empty topic
+	if ( empty( $topic_id ) ) {
+		bbp_add_error( 'bbp_subscription_topic_id', __( '<strong>ERROR</strong>: No topic was found! Which topic are you subscribing/unsubscribing to?', 'bbpress' ) );
+
+	// Check nonce
+	} elseif ( ! bbp_verify_nonce_request( 'toggle-subscription_' . $topic_id ) ) {
+		bbp_add_error( 'bbp_subscription_topic_id', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+
+	// Check current user's ability to edit the user
+	} elseif ( !current_user_can( 'edit_user', $user_id ) ) {
+		bbp_add_error( 'bbp_subscription_permissions', __( '<strong>ERROR</strong>: You don\'t have the permission to edit favorites of that user!', 'bbpress' ) );
+	}
+
+	// Bail if we have errors
+	if ( bbp_has_errors() )
+		return;
+
+	/** No errors *************************************************************/
+
+	$is_subscription = bbp_is_user_subscribed( $user_id, $topic_id );
+	$success         = false;
+
+	if ( true == $is_subscription && 'bbp_unsubscribe' == $action )
+		$success = bbp_remove_user_subscription( $user_id, $topic_id );
+	elseif ( false == $is_subscription && 'bbp_subscribe' == $action )
+		$success = bbp_add_user_subscription( $user_id, $topic_id );
+
+	// Do additional subscriptions actions
+	do_action( 'bbp_subscriptions_handler', $success, $user_id, $topic_id, $action );
+
+	// Success!
+	if ( true == $success ) {
+
+		// Redirect back from whence we came
+		if ( bbp_is_subscriptions() ) {
+			$redirect = bbp_get_subscriptions_permalink( $user_id );
+		} elseif ( bbp_is_single_user() ) {
+			$redirect = bbp_get_user_profile_url();
+		} elseif ( is_singular( bbp_get_topic_post_type() ) ) {
+			$redirect = bbp_get_topic_permalink( $topic_id );
+		} elseif ( is_single() || is_page() ) {
+			$redirect = get_permalink();
+		}
+
+		wp_safe_redirect( $redirect );
+
+		// For good measure
+		exit();
+
+	// Fail! Handle errors
+	} elseif ( true == $is_subscription && 'bbp_unsubscribe' == $action ) {
+		bbp_add_error( 'bbp_unsubscribe', __( '<strong>ERROR</strong>: There was a problem unsubscribing from that topic!', 'bbpress' ) );
+	} elseif ( false == $is_subscription && 'bbp_subscribe' == $action ) {
+		bbp_add_error( 'bbp_subscribe',    __( '<strong>ERROR</strong>: There was a problem subscribing to that topic!', 'bbpress' ) );
+	}
+}
+
+/** Edit **********************************************************************/
+
+/**
+ * Handles the front end user editing
+ *
+ * @uses is_multisite() To check if it's a multisite
+ * @uses bbp_is_user_home() To check if the user is at home (the display page
+ *                           is the one of the logged in user)
+ * @uses get_option() To get the displayed user's new email id option
+ * @uses wpdb::prepare() To sanitize our sql query
+ * @uses wpdb::get_var() To execute our query and get back the variable
+ * @uses wpdb::query() To execute our query
+ * @uses wp_update_user() To update the user
+ * @uses delete_option() To delete the displayed user's email id option
+ * @uses bbp_get_user_profile_edit_url() To get the edit profile url
+ * @uses wp_safe_redirect() To redirect to the url
+ * @uses bbp_verify_nonce_request() To verify the nonce and check the request
+ * @uses current_user_can() To check if the current user can edit the user
+ * @uses do_action() Calls 'personal_options_update' or
+ *                   'edit_user_options_update' (based on if it's the user home)
+ *                   with the displayed user id
+ * @uses edit_user() To edit the user based on the post data
+ * @uses get_userdata() To get the user data
+ * @uses is_email() To check if the string is an email id or not
+ * @uses wpdb::get_blog_prefix() To get the blog prefix
+ * @uses is_network_admin() To check if the user is the network admin
+ * @uses is_super_admin() To check if the user is super admin
+ * @uses revoke_super_admin() To revoke super admin priviledges
+ * @uses grant_super_admin() To grant super admin priviledges
+ * @uses is_wp_error() To check if the value retrieved is a {@link WP_Error}
+ */
+function bbp_edit_user_handler() {
+
+	// Bail if not a POST action
+	if ( 'POST' !== strtoupper( $_SERVER['REQUEST_METHOD'] ) )
+		return;
+
+	// Bail if action is not 'bbp-update-user'
+	if ( empty( $_POST['action'] ) || ( 'bbp-update-user' !== $_POST['action'] ) )
+		return;
+
+	// Get the displayed user ID
+	$user_id = bbp_get_displayed_user_id();
+
+	// Execute confirmed email change. See send_confirmation_on_profile_email().
+	if ( is_multisite() && bbp_is_user_home_edit() && isset( $_GET['newuseremail'] ) ) {
+
+		$new_email = get_option( $user_id . '_new_email' );
+
+		if ( $new_email['hash'] == $_GET['newuseremail'] ) {
+			$user             = new stdClass();
+			$user->ID         = $user_id;
+			$user->user_email = esc_html( trim( $new_email['newemail'] ) );
+
+			global $wpdb;
+
+			if ( $wpdb->get_var( $wpdb->prepare( "SELECT user_login FROM {$wpdb->signups} WHERE user_login = %s", bbp_get_displayed_user_field( 'user_login' ) ) ) ) {
+				$wpdb->query( $wpdb->prepare( "UPDATE {$wpdb->signups} SET user_email = %s WHERE user_login = %s", $user->user_email, bbp_get_displayed_user_field( 'user_login' ) ) );
+			}
+
+			wp_update_user( get_object_vars( $user ) );
+			delete_option( $user_id . '_new_email' );
+
+			wp_safe_redirect( add_query_arg( array( 'updated' => 'true' ), bbp_get_user_profile_edit_url( $user_id ) ) );
+			exit();
+		}
+
+	// Delete new email address from user options
+	} elseif ( is_multisite() && bbp_is_user_home_edit() && !empty( $_GET['dismiss'] ) && ( $user_id . '_new_email' == $_GET['dismiss'] ) ) {
+		delete_option( $user_id . '_new_email' );
+		wp_safe_redirect( add_query_arg( array( 'updated' => 'true' ), bbp_get_user_profile_edit_url( $user_id ) ) );
+		exit();
+	}
+
+	// Nonce check
+	if ( ! bbp_verify_nonce_request( 'update-user_' . $user_id ) ) {
+		bbp_add_error( 'bbp_update_user_nonce', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Cap check
+	if ( ! current_user_can( 'edit_user', $user_id ) ) {
+		bbp_add_error( 'bbp_update_user_capability', __( '<strong>ERROR</strong>: Are you sure you wanted to do that?', 'bbpress' ) );
+		return;
+	}
+
+	// Do action based on who's profile you're editing
+	$edit_action = bbp_is_user_home_edit() ? 'personal_options_update' : 'edit_user_profile_update';
+	do_action( $edit_action, $user_id );
+
+	// Handle user edit
+	$edit_user = edit_user( $user_id );
+
+	// Error(s) editng the user, so copy them into the global
+	if ( is_wp_error( $edit_user ) ) {
+		bbpress()->errors = $edit_user;
+
+	// Successful edit to redirect
+	} elseif ( is_integer( $edit_user ) ) {
+
+		// Maybe update super admin ability
+		if ( is_multisite() && ! bbp_is_user_home_edit() ) {
+			empty( $_POST['super_admin'] ) ? revoke_super_admin( $edit_user ) : grant_super_admin( $edit_user );
+		}
+
+		$redirect = add_query_arg( array( 'updated' => 'true' ), bbp_get_user_profile_edit_url( $edit_user ) );
+
+		wp_safe_redirect( $redirect );
+		exit;
+	}
+}
+
+/**
+ * Conditionally hook the core WordPress output actions to the end of the
+ * default user's edit profile template.
+ *
+ * This allows clever plugin authors to conditionally unhook the WordPress core
+ * output actions if they don't want any unexpected junk to appear there, and
+ * also avoids needing to pollute the templates with additional logic and actions.
+ *
+ * @since bbPress (r4273)
+ *
+ * @uses bbp_is_user_home_edit() To switch the action fired
+ * @uses get_userdata() To get the current user's data
+ * @uses bbp_get_displayed_user_id() To get the currently displayed user ID
+ */
+function bbp_user_edit_after() {
+	$action = bbp_is_user_home_edit() ? 'show_user_profile' : 'edit_user_profile';
+
+	do_action( $action, get_userdata( bbp_get_displayed_user_id() ) );
+}
+
+/** User Queries **************************************************************/
+
+/**
+ * Get the topics that a user created
+ *
+ * @since bbPress (r2660)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_id() To get the topic id
+ * @uses bbp_has_topics() To get the topics created by the user
+ * @return array|bool Results if the user has created topics, otherwise false
+ */
+function bbp_get_user_topics_started( $user_id = 0 ) {
+	
+	// Validate user
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	// Query defaults
+	$default_query = array(
+		'author'         => $user_id,
+		'show_stickies'  => false,
+		'order'          => 'DESC',
+	);
+
+	// Try to get the topics
+	$query = bbp_has_topics( $default_query );
+	if ( empty( $query ) )
+		return false;
+
+	return apply_filters( 'bbp_get_user_topics_started', $query, $user_id );
+}
+
+/**
+ * Get the replies that a user created
+ *
+ * @since bbPress (r4225)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_id() To get the topic id
+ * @uses bbp_has_replies() To get the topics created by the user
+ * @return array|bool Results if the user has created topics, otherwise false
+ */
+function bbp_get_user_replies_created( $user_id = 0 ) {
+	
+	// Validate user
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	// Try to get the topics
+	$query = bbp_has_replies( array(
+		'post_type'      => array( bbp_get_topic_post_type(), bbp_get_reply_post_type() ),
+		'post_parent'    => 'any',
+		'posts_per_page' => bbp_get_replies_per_page(),
+		'paged'          => bbp_get_paged(),
+		'orderby'        => 'date',
+		'order'          => 'DESC',
+		'author'         => $user_id,
+		'show_stickies'  => false,
+	) );
+
+	return apply_filters( 'bbp_get_user_replies_created', $query, $user_id );
+}
+
+/**
+ * Get the total number of users on the forums
+ *
+ * @since bbPress (r2769)
+ * @uses wp_cache_get() Check if query is in cache
+ * @uses get_users() To execute our query and get the var back
+ * @uses wp_cache_set() Set the query in the cache
+ * @uses apply_filters() Calls 'bbp_get_total_users' with number of users
+ * @return int Total number of users
+ */
+function bbp_get_total_users() {
+	$user_count = count_users();
+	return apply_filters( 'bbp_get_total_users', (int) $user_count['total_users'] );
+}
+
+/** Premissions ***************************************************************/
+
+/**
+ * Redirect if unathorized user is attempting to edit another user
+ *
+ * This is hooked to 'bbp_template_redirect' and controls the conditions under
+ * which a user can edit another user (or themselves.) If these conditions are
+ * met. We assume a user cannot perform this task, and look for ways they can
+ * earn the ability to access this template.
+ * 
+ * @since bbPress (r3605)
+ *
+ * @uses bbp_is_topic_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_id()
+ * @uses wp_safe_redirect()
+ * @uses bbp_get_topic_permalink()
+ */
+function bbp_check_user_edit() {
+
+	// Bail if not editing a topic
+	if ( ! bbp_is_single_user_edit() )
+		return;
+
+	// Default to false
+	$redirect = true;
+
+	// Allow user to edit their own profile
+	if ( bbp_is_user_home_edit() ) {
+		$redirect = false;
+
+	// Allow if current user can edit the displayed user
+	} elseif ( current_user_can( 'edit_user', bbp_get_displayed_user_id() ) ) {
+		$redirect = false;
+
+	// Allow if user can manage network users, or edit-any is enabled
+	} elseif ( current_user_can( 'manage_network_users' ) || apply_filters( 'enable_edit_any_user_configuration', false ) ) {
+		$redirect = false;
+	}
+
+	// Maybe redirect back to profile page
+	if ( true === $redirect ) {
+		wp_safe_redirect( bbp_get_user_profile_url( bbp_get_displayed_user_id() ) );
+		exit();
+	}
+}
+
+/**
+ * Check if a user is blocked, or cannot spectate the forums.
+ *
+ * @since bbPress (r2996)
+ *
+ * @uses is_user_logged_in() To check if user is logged in
+ * @uses is_super_admin() To check if user is a super admin
+ * @uses current_user_can() To check if the current user can spectate
+ * @uses is_bbpress() To check if in a bbPress section of the site
+ * @uses bbp_set_404() To set a 404 status
+ */
+function bbp_forum_enforce_blocked() {
+
+	// Bail if not logged in or super admin
+	if ( ! is_user_logged_in() || is_super_admin() ) {
+		return;
+	}
+
+	// Set 404 if in bbPress and user cannot spectate
+	if ( is_bbpress() && ! current_user_can( 'spectate' ) ) {
+		bbp_set_404();
+	}
+}
+
+/** Converter *****************************************************************/
+
+/**
+ * Convert passwords from previous platfrom encryption to WordPress encryption.
+ *
+ * @since bbPress (r3813)
+ * @global WPDB $wpdb
+ */
+function bbp_user_maybe_convert_pass() {
+
+	// Bail if no username
+	$username = !empty( $_POST['log'] ) ? $_POST['log'] : '';
+	if ( empty( $username ) )
+		return;
+
+	global $wpdb;
+
+	// Bail if no user password to convert
+	$row = $wpdb->get_row( "SELECT * FROM {$wpdb->users} INNER JOIN {$wpdb->usermeta} ON user_id = ID WHERE meta_key = '_bbp_class' AND user_login = '{$username}' LIMIT 1" );
+	if ( empty( $row ) || is_wp_error( $row ) )
+		return;
+
+	// Setup admin (to include converter)
+	require_once( bbpress()->includes_dir . 'admin/admin.php' );
+
+	// Create the admin object
+	bbp_admin();
+
+	// Convert password
+	require_once( bbpress()->admin->admin_dir . 'converter.php' );
+	require_once( bbpress()->admin->admin_dir . 'converters/' . $row->meta_value . '.php' );
+
+	// Create the converter
+	$converter = bbp_new_converter( $row->meta_value );
+
+	// Try to call the conversion method
+	if ( is_a( $converter, 'BBP_Converter_Base' ) && method_exists( $converter, 'callback_pass' ) ) {
+		$converter->callback_pass( $username, $_POST['pwd'] );
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/options.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,290 @@
+<?php
+
+/**
+ * bbPress User Options
+ *
+ * @package bbPress
+ * @subpackage UserOptions
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/**
+ * Get the default user options and their values
+ *
+ * @since bbPress (r3910)
+ * @return array Filtered user option names and values
+ */
+function bbp_get_default_user_options() {
+
+	// Default options
+	return apply_filters( 'bbp_get_default_user_options', array(
+		'_bbp_last_posted'   => '0', // For checking flooding
+		'_bbp_topic_count'   => '0', // Total topics per site
+		'_bbp_reply_count'   => '0', // Total replies per site
+		'_bbp_favorites'     => '',  // Favorite topics per site
+		'_bbp_subscriptions' => ''   // Subscribed topics per site
+	) );
+}
+
+/**
+ * Add default user options
+ *
+ * This is destructive, so existing bbPress user options will be overridden.
+ *
+ * @since bbPress (r3910)
+ * @uses bbp_get_default_user_options() To get default options
+ * @uses update_user_option() Adds default options
+ * @uses do_action() Calls 'bbp_add_user_options'
+ */
+function bbp_add_user_options( $user_id = 0 ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return;
+
+	// Add default options
+	foreach ( bbp_get_default_user_options() as $key => $value )
+		update_user_option( $user_id, $key, $value );
+
+	// Allow previously activated plugins to append their own user options.
+	do_action( 'bbp_add_user_options', $user_id );
+}
+
+/**
+ * Delete default user options
+ *
+ * Hooked to bbp_uninstall, it is only called once when bbPress is uninstalled.
+ * This is destructive, so existing bbPress user options will be destroyed.
+ *
+ * @since bbPress (r3910)
+ * @uses bbp_get_default_user_options() To get default options
+ * @uses delete_user_option() Removes default options
+ * @uses do_action() Calls 'bbp_delete_options'
+ */
+function bbp_delete_user_options( $user_id = 0 ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return;
+
+	// Add default options
+	foreach ( bbp_get_default_user_options() as $key => $value )
+		delete_user_option( $user_id, $key );
+
+	// Allow previously activated plugins to append their own options.
+	do_action( 'bbp_delete_user_options', $user_id );
+}
+
+/**
+ * Add filters to each bbPress option and allow them to be overloaded from
+ * inside the $bbp->options array.
+ *
+ * @since bbPress (r3910)
+ * @uses bbp_get_default_user_options() To get default options
+ * @uses add_filter() To add filters to 'pre_option_{$key}'
+ * @uses do_action() Calls 'bbp_add_option_filters'
+ */
+function bbp_setup_user_option_filters() {
+
+	// Add filters to each bbPress option
+	foreach ( bbp_get_default_user_options() as $key => $value )
+		add_filter( 'get_user_option_' . $key, 'bbp_filter_get_user_option', 10, 3 );
+
+	// Allow previously activated plugins to append their own options.
+	do_action( 'bbp_setup_user_option_filters' );
+}
+
+/**
+ * Filter default options and allow them to be overloaded from inside the
+ * $bbp->user_options array.
+ *
+ * @since bbPress (r3910)
+ * @param bool $value Optional. Default value false
+ * @return mixed false if not overloaded, mixed if set
+ */
+function bbp_filter_get_user_option( $value = false, $option = '', $user = 0 ) {
+	$bbp = bbpress();
+
+	// Check the options global for preset value
+	if ( isset( $user->ID ) && isset( $bbp->user_options[$user->ID] ) && !empty( $bbp->user_options[$user->ID][$option] ) )
+		$value = $bbp->user_options[$user->ID][$option];
+
+	// Always return a value, even if false
+	return $value;
+}
+
+/** Post Counts ***************************************************************/
+
+/**
+ * Output a users topic count
+ *
+ * @since bbPress (r3632)
+ *
+ * @param int $user_id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_user_topic_count()
+ * @return string
+ */
+function bbp_user_topic_count( $user_id = 0, $integer = false ) {
+	echo bbp_get_user_topic_count( $user_id, $integer );
+}
+	/**
+	 * Return a users reply count
+	 *
+	 * @since bbPress (r3632)
+	 *
+	 * @param int $user_id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_user_id()
+	 * @uses get_user_option()
+	 * @uses apply_filters()
+	 * @return string
+	 */
+	function bbp_get_user_topic_count( $user_id = 0, $integer = false ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$count  = (int) get_user_option( '_bbp_topic_count', $user_id );
+		$filter = ( false == $integer ) ? 'bbp_get_user_topic_count_int' : 'bbp_get_user_topic_count';
+
+		return apply_filters( $filter, $count, $user_id );
+	}
+
+/**
+ * Output a users reply count
+ *
+ * @since bbPress (r3632)
+ *
+ * @param int $user_id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_user_reply_count()
+ * @return string
+ */
+function bbp_user_reply_count( $user_id = 0, $integer = false ) {
+	echo bbp_get_user_reply_count( $user_id, $integer );
+}
+	/**
+	 * Return a users reply count
+	 *
+	 * @since bbPress (r3632)
+	 *
+	 * @param int $user_id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_user_id()
+	 * @uses get_user_option()
+	 * @uses apply_filters()
+	 * @return string
+	 */
+	function bbp_get_user_reply_count( $user_id = 0, $integer = false ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$count  = (int) get_user_option( '_bbp_reply_count', $user_id );
+		$filter = ( true == $integer ) ? 'bbp_get_user_topic_count_int' : 'bbp_get_user_topic_count';
+
+		return apply_filters( $filter, $count, $user_id );
+	}
+
+/**
+ * Output a users total post count
+ *
+ * @since bbPress (r3632)
+ *
+ * @param int $user_id
+ * @param boolean $integer Optional. Whether or not to format the result
+ * @uses bbp_get_user_post_count()
+ * @return string
+ */
+function bbp_user_post_count( $user_id = 0, $integer = false ) {
+	echo bbp_get_user_post_count( $user_id, $integer );
+}
+	/**
+	 * Return a users total post count
+	 *
+	 * @since bbPress (r3632)
+	 *
+	 * @param int $user_id
+	 * @param boolean $integer Optional. Whether or not to format the result
+	 * @uses bbp_get_user_id()
+	 * @uses get_user_option()
+	 * @uses apply_filters()
+	 * @return string
+	 */
+	function bbp_get_user_post_count( $user_id = 0, $integer = false ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$topics  = bbp_get_user_topic_count( $user_id, true );
+		$replies = bbp_get_user_reply_count( $user_id, true );
+		$count   = (int) $topics + $replies;
+		$filter  = ( true == $integer ) ? 'bbp_get_user_post_count_int' : 'bbp_get_user_post_count';
+
+		return apply_filters( $filter, $count, $user_id );
+	}
+
+/** Last Posted ***************************************************************/
+
+/**
+ * Update a users last posted time, for use with post throttling
+ *
+ * @since bbPress (r3910)
+ * @param int $user_id User ID to update
+ * @param int $time Time in time() format
+ * @return bool False if no user or failure, true if successful
+ */
+function bbp_update_user_last_posted( $user_id = 0, $time = 0 ) {
+
+	// Validate user id
+	$user_id = bbp_get_user_id( $user_id );
+	if ( empty( $user_id ) )
+		return false;
+
+	// Set time to now if nothing is passed
+	if ( empty( $time ) )
+		$time = time();
+
+	return update_user_option( $user_id, '_bbp_last_posted', $time );
+}
+
+/**
+ * Output the raw value of the last posted time.
+ *
+ * @since bbPress (r3910)
+ * @param int $user_id User ID to retrieve value for
+ * @uses bbp_get_user_last_posted() To output the last posted time
+ */
+function bbp_user_last_posted( $user_id = 0 ) {
+	echo bbp_get_user_last_posted( $user_id );
+}
+
+	/**
+	 * Return the raw value of teh last posted time.
+	 *
+	 * @since bbPress (r3910)
+	 * @param int $user_id User ID to retrieve value for
+	 * @return mixed False if no user, time() format if exists
+	 */
+	function bbp_get_user_last_posted( $user_id = 0 ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$time = get_user_option( '_bbp_last_posted', $user_id );
+
+		return apply_filters( 'bbp_get_user_last_posted', $time, $user_id );
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/includes/users/template-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1733 @@
+<?php
+
+/**
+ * bbPress User Template Tags
+ *
+ * @package bbPress
+ * @subpackage TemplateTags
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Users *********************************************************************/
+
+/**
+ * Output a validated user id
+ *
+ * @since bbPress (r2729)
+ *
+ * @param int $user_id Optional. User id
+ * @param bool $displayed_user_fallback Fallback on displayed user?
+ * @param bool $current_user_fallback Fallback on current user?
+ * @uses bbp_get_user_id() To get the user id
+ */
+function bbp_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
+	echo bbp_get_user_id( $user_id, $displayed_user_fallback, $current_user_fallback );
+}
+	/**
+	 * Return a validated user id
+	 *
+	 * @since bbPress (r2729)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @param bool $displayed_user_fallback Fallback on displayed user?
+	 * @param bool $current_user_fallback Fallback on current user?
+	 * @uses get_query_var() To get the 'bbp_user_id' query var
+	 * @uses apply_filters() Calls 'bbp_get_user_id' with the user id
+	 * @return int Validated user id
+	 */
+	function bbp_get_user_id( $user_id = 0, $displayed_user_fallback = true, $current_user_fallback = false ) {
+		$bbp = bbpress();
+
+		// Easy empty checking
+		if ( !empty( $user_id ) && is_numeric( $user_id ) ) {
+			$bbp_user_id = $user_id;
+
+		// Currently viewing or editing a user
+		} elseif ( ( true == $displayed_user_fallback ) && !empty( $bbp->displayed_user->ID ) ) {
+			$bbp_user_id = $bbp->displayed_user->ID;
+
+		// Maybe fallback on the current_user ID
+		} elseif ( ( true == $current_user_fallback ) && !empty( $bbp->current_user->ID ) ) {
+			$bbp_user_id = $bbp->current_user->ID;
+
+		// Failsafe
+		} else {
+			$bbp_user_id = get_query_var( 'bbp_user_id' );
+		}
+
+		return (int) apply_filters( 'bbp_get_user_id', (int) $bbp_user_id, $displayed_user_fallback, $current_user_fallback );
+	}
+
+/**
+ * Output ID of current user
+ *
+ * @since bbPress (r2574)
+ *
+ * @uses bbp_get_current_user_id() To get the current user id
+ */
+function bbp_current_user_id() {
+	echo bbp_get_current_user_id();
+}
+	/**
+	 * Return ID of current user
+	 *
+	 * @since bbPress (r2574)
+	 *
+	 * @uses bbp_get_user_id() To get the current user id
+	 * @uses apply_filters() Calls 'bbp_get_current_user_id' with the id
+	 * @return int Current user id
+	 */
+	function bbp_get_current_user_id() {
+		return apply_filters( 'bbp_get_current_user_id', bbp_get_user_id( 0, false, true ) );
+	}
+
+/**
+ * Output ID of displayed user
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses bbp_get_displayed_user_id() To get the displayed user id
+ */
+function bbp_displayed_user_id() {
+	echo bbp_get_displayed_user_id();
+}
+	/**
+	 * Return ID of displayed user
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @uses bbp_get_user_id() To get the displayed user id
+	 * @uses apply_filters() Calls 'bbp_get_displayed_user_id' with the id
+	 * @return int Displayed user id
+	 */
+	function bbp_get_displayed_user_id() {
+		return apply_filters( 'bbp_get_displayed_user_id', bbp_get_user_id( 0, true, false ) );
+	}
+
+/**
+ * Output a sanitized user field value
+ *
+ * @since bbPress (r2688)
+ *
+ * @param string $field Field to get
+ * @uses bbp_get_displayed_user_field() To get the field
+ */
+function bbp_displayed_user_field( $field = '' ) {
+	echo bbp_get_displayed_user_field( $field );
+}
+	/**
+	 * Return a sanitized user field value
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param string $field Field to get
+	 * @uses sanitize_text_field() To sanitize the field
+	 * @uses esc_attr() To sanitize the field
+	 * @uses apply_filters() Calls 'bbp_get_displayed_user_field' with the value
+	 * @return string|bool Value of the field if it exists, else false
+	 */
+	function bbp_get_displayed_user_field( $field = '' ) {
+		$bbp   = bbpress();
+		$value = false;
+
+		// Return field if exists
+		if ( isset( $bbp->displayed_user->$field ) )
+			$value = esc_attr( sanitize_text_field( $bbp->displayed_user->$field ) );
+
+		// Return empty
+		return apply_filters( 'bbp_get_displayed_user_field', $value, $field );
+	}
+
+/**
+ * Output name of current user
+ *
+ * @since bbPress (r2574)
+ *
+ * @uses bbp_get_current_user_name() To get the current user name
+ */
+function bbp_current_user_name() {
+	echo bbp_get_current_user_name();
+}
+	/**
+	 * Return name of current user
+	 *
+	 * @since bbPress (r2574)
+	 *
+	 * @uses apply_filters() Calls 'bbp_get_current_user_name' with the
+	 *                        current user name
+	 * @return string
+	 */
+	function bbp_get_current_user_name() {
+		global $user_identity;
+
+		$current_user_name = is_user_logged_in() ? $user_identity : __( 'Anonymous', 'bbpress' );
+
+		return apply_filters( 'bbp_get_current_user_name', $current_user_name );
+	}
+
+/**
+ * Output avatar of current user
+ *
+ * @since bbPress (r2574)
+ *
+ * @param int $size Size of the avatar. Defaults to 40
+ * @uses bbp_get_current_user_avatar() To get the current user avatar
+ */
+function bbp_current_user_avatar( $size = 40 ) {
+	echo bbp_get_current_user_avatar( $size );
+}
+
+	/**
+	 * Return avatar of current user
+	 *
+	 * @since bbPress (r2574)
+	 *
+	 * @param int $size Size of the avatar. Defaults to 40
+	 * @uses bbp_get_current_user_id() To get the current user id
+	 * @uses bbp_get_current_anonymous_user_data() To get the current
+	 *                                              anonymous user's email
+	 * @uses get_avatar() To get the avatar
+	 * @uses apply_filters() Calls 'bbp_get_current_user_avatar' with the
+	 *                        avatar and size
+	 * @return string Current user avatar
+	 */
+	function bbp_get_current_user_avatar( $size = 40 ) {
+
+		$user = bbp_get_current_user_id();
+		if ( empty( $user ) )
+			$user = bbp_get_current_anonymous_user_data( 'email' );
+
+		$avatar = get_avatar( $user, $size );
+
+		return apply_filters( 'bbp_get_current_user_avatar', $avatar, $size );
+	}
+
+/**
+ * Output link to the profile page of a user
+ *
+ * @since bbPress (r2688)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_profile_link() To get user profile link
+ */
+function bbp_user_profile_link( $user_id = 0 ) {
+	echo bbp_get_user_profile_link( $user_id );
+}
+	/**
+	 * Return link to the profile page of a user
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_id() To get user id
+	 * @uses get_userdata() To get user data
+	 * @uses bbp_get_user_profile_url() To get user profile url
+	 * @uses apply_filters() Calls 'bbp_get_user_profile_link' with the user
+	 *                        profile link and user id
+	 * @return string User profile link
+	 */
+	function bbp_get_user_profile_link( $user_id = 0 ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$user      = get_userdata( $user_id );
+		$name      = esc_attr( $user->display_name );
+		$user_link = '<a href="' . bbp_get_user_profile_url( $user_id ) . '" title="' . $name . '">' . $name . '</a>';
+
+		return apply_filters( 'bbp_get_user_profile_link', $user_link, $user_id );
+	}
+
+/**
+ * Output URL to the profile page of a user
+ *
+ * @since bbPress (r2688)
+ *
+ * @param int $user_id Optional. User id
+ * @param string $user_nicename Optional. User nicename
+ * @uses bbp_get_user_profile_url() To get user profile url
+ */
+function bbp_user_profile_url( $user_id = 0, $user_nicename = '' ) {
+	echo bbp_get_user_profile_url( $user_id, $user_nicename );
+}
+	/**
+	 * Return URL to the profile page of a user
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @param string $user_nicename Optional. User nicename
+	 * @uses bbp_get_user_id() To get user id
+	 * @uses WP_Rewrite::using_permalinks() To check if the blog is using
+	 *                                       permalinks
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses home_url() To get blog home url
+	 * @uses apply_filters() Calls 'bbp_get_user_profile_url' with the user
+	 *                        profile url, user id and user nicename
+	 * @return string User profile url
+	 */
+	function bbp_get_user_profile_url( $user_id = 0, $user_nicename = '' ) {
+		global $wp_rewrite;
+
+		// Use displayed user ID if there is one, and one isn't requested
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Allow early overriding of the profile URL to cut down on processing
+		$early_profile_url = apply_filters( 'bbp_pre_get_user_profile_url', (int) $user_id );
+		if ( is_string( $early_profile_url ) )
+			return $early_profile_url;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = $wp_rewrite->root . bbp_get_user_slug() . '/%' . bbp_get_user_rewrite_id() . '%';
+
+			// Get username if not passed
+			if ( empty( $user_nicename ) ) {
+				$user = get_userdata( $user_id );
+				if ( !empty( $user->user_nicename ) ) {
+					$user_nicename = $user->user_nicename;
+				}
+			}
+
+			$url = str_replace( '%' . bbp_get_user_rewrite_id() . '%', $user_nicename, $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array( bbp_get_user_rewrite_id() => $user_id ), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_user_profile_url', $url, $user_id, $user_nicename );
+	}
+
+/**
+ * Output link to the profile edit page of a user
+ *
+ * @since bbPress (r2688)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_user_profile_edit_link() To get user profile edit link
+ */
+function bbp_user_profile_edit_link( $user_id = 0 ) {
+	echo bbp_get_user_profile_edit_link( $user_id );
+}
+	/**
+	 * Return link to the profile edit page of a user
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_id() To get user id
+	 * @uses get_userdata() To get user data
+	 * @uses bbp_get_user_profile_edit_url() To get user profile edit url
+	 * @uses apply_filters() Calls 'bbp_get_user_profile_link' with the edit
+	 *                        link and user id
+	 * @return string User profile edit link
+	 */
+	function bbp_get_user_profile_edit_link( $user_id = 0 ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		$user      = get_userdata( $user_id );
+		$name      = $user->display_name;
+		$edit_link = '<a href="' . bbp_get_user_profile_url( $user_id ) . '" title="' . esc_attr( $name ) . '">' . $name . '</a>';
+		return apply_filters( 'bbp_get_user_profile_link', $edit_link, $user_id );
+	}
+
+/**
+ * Output URL to the profile edit page of a user
+ *
+ * @since bbPress (r2688)
+ *
+ * @param int $user_id Optional. User id
+ * @param string $user_nicename Optional. User nicename
+ * @uses bbp_get_user_profile_edit_url() To get user profile edit url
+ */
+function bbp_user_profile_edit_url( $user_id = 0, $user_nicename = '' ) {
+	echo bbp_get_user_profile_edit_url( $user_id, $user_nicename );
+}
+	/**
+	 * Return URL to the profile edit page of a user
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @param string $user_nicename Optional. User nicename
+	 * @uses bbp_get_user_id() To get user id
+	 * @uses WP_Rewrite::using_permalinks() To check if the blog is using
+	 *                                       permalinks
+	 * @uses add_query_arg() To add custom args to the url
+	 * @uses home_url() To get blog home url
+	 * @uses apply_filters() Calls 'bbp_get_user_edit_profile_url' with the
+	 *                        edit profile url, user id and user nicename
+	 * @return string
+	 */
+	function bbp_get_user_profile_edit_url( $user_id = 0, $user_nicename = '' ) {
+		global $wp_rewrite;
+
+		$bbp     = bbpress();
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = $wp_rewrite->root . bbp_get_user_slug() . '/%' . $bbp->user_id . '%/' . $bbp->edit_id;
+
+			// Get username if not passed
+			if ( empty( $user_nicename ) ) {
+				$user = get_userdata( $user_id );
+				if ( !empty( $user->user_nicename ) ) {
+					$user_nicename = $user->user_nicename;
+				}
+			}
+
+			$url = str_replace( '%' . $bbp->user_id . '%', $user_nicename, $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array( $bbp->user_id => $user_id, $bbp->edit_id => '1' ), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_user_edit_profile_url', $url, $user_id, $user_nicename );
+
+	}
+
+/**
+ * Output a user's main role for display
+ *
+ * @since bbPress (r3860)
+ *
+ * @param int $user_id
+ * @uses bbp_get_user_display_role To get the user display role
+ */
+function bbp_user_display_role( $user_id = 0 ) {
+	echo bbp_get_user_display_role( $user_id );
+}
+	/**
+	 * Return a user's main role for display
+	 *
+	 * @since bbPress (r3860)
+	 *
+	 * @param int $user_id
+	 * @uses bbp_get_user_id() to verify the user ID
+	 * @uses is_super_admin() to check if user is a super admin
+	 * @uses bbp_is_user_inactive() to check if user is inactive
+	 * @uses user_can() to check if user has special capabilities
+	 * @uses apply_filters() Calls 'bbp_get_user_display_role' with the
+	 *                        display role, user id, and user role
+	 * @return string
+	 */
+	function bbp_get_user_display_role( $user_id = 0 ) {
+
+		// Validate user id
+		$user_id = bbp_get_user_id( $user_id, false, false );
+
+		// Capes earn Vinz Clortho status
+		if ( is_super_admin( $user_id ) ) {
+			$role = __( 'Key Master', 'bbpress' );
+
+		// Inactive
+		} elseif ( bbp_is_user_inactive() ) {
+			$role = __( 'Inactive', 'bbpress' );
+
+		// User is not registered
+		} elseif ( empty( $user_id ) ) {
+			$role = __( 'Guest', 'bbpress' );
+
+		// Moderator
+		} elseif ( user_can( $user_id, 'moderate' ) ) {
+			$role = __( 'Moderator', 'bbpress' );
+
+		// Participant
+		} elseif ( user_can( $user_id, 'participate' ) ) {
+			$role = __( 'Participant', 'bbpress' );
+
+		// Anyone else
+		} else {
+			$role = __( 'Member', 'bbpress' );
+		}
+
+		return apply_filters( 'bbp_get_user_display_role', $role, $user_id );
+	}
+
+/**
+ * Output the link to the admin section
+ *
+ * @since bbPress (r2827)
+ *
+ * @param mixed $args Optional. See {@link bbp_get_admin_link()}
+ * @uses bbp_get_admin_link() To get the admin link
+ */
+function bbp_admin_link( $args = '' ) {
+	echo bbp_get_admin_link( $args );
+}
+	/**
+	 * Return the link to the admin section
+	 *
+	 * @since bbPress (r2827)
+	 *
+	 * @param mixed $args Optional. This function supports these arguments:
+	 *  - text: The text
+	 *  - before: Before the lnk
+	 *  - after: After the link
+	 * @uses current_user_can() To check if the current user can moderate
+	 * @uses admin_url() To get the admin url
+	 * @uses apply_filters() Calls 'bbp_get_admin_link' with the link & args
+	 * @return The link
+	 */
+	function bbp_get_admin_link( $args = '' ) {
+		if ( !current_user_can( 'moderate' ) )
+			return;
+
+		if ( !empty( $args ) && is_string( $args ) && ( false === strpos( $args, '=' ) ) )
+			$args = array( 'text' => $args );
+
+		$defaults = array(
+			'text'   => __( 'Admin', 'bbpress' ),
+			'before' => '',
+			'after'  => ''
+		);
+		$args = bbp_parse_args( $args, $defaults, 'get_admin_link' );
+		extract( $args, EXTR_SKIP );
+
+		$uri    = admin_url();
+		$retval = $before . '<a href="' . $uri . '">' . $text . '</a>' . $after;
+
+		return apply_filters( 'bbp_get_admin_link', $retval, $args );
+	}
+
+/** User IP *******************************************************************/
+
+/**
+ * Output the author IP address of a post
+ *
+ * @since bbPress (r3120)
+ *
+ * @param mixed $args Optional. If it is an integer, it is used as post id.
+ * @uses bbp_get_author_ip() To get the post author link
+ */
+function bbp_author_ip( $args = '' ) {
+	echo bbp_get_author_ip( $args );
+}
+	/**
+	 * Return the author IP address of a post
+	 *
+	 * @since bbPress (r3120)
+	 *
+	 * @param mixed $args Optional. If an integer, it is used as reply id.
+	 * @uses get_post_meta() To check if it's a topic page
+	 * @return string Author link of reply
+	 */
+	function bbp_get_author_ip( $args = '' ) {
+
+		// Default arguments
+		$defaults = array(
+			'post_id' => 0,
+			'before'  => '<span class="bbp-author-ip">(',
+			'after'   => ')</span>'
+		);
+
+		$r = bbp_parse_args( $args, $defaults, 'get_author_ip' );
+		extract( $r );
+
+		// Used as post id
+		if ( is_numeric( $args ) )
+			$post_id = $args;
+
+		// Get the author IP meta value
+		$author_ip = get_post_meta( $post_id, '_bbp_author_ip', true );
+		if ( !empty( $author_ip ) ) {
+			$author_ip = $before . $author_ip . $after;
+
+		// No IP address
+		} else {
+			$author_ip = '';
+		}
+
+		return apply_filters( 'bbp_get_author_ip', $author_ip, $args );
+	}
+
+/** Favorites *****************************************************************/
+
+/**
+ * Output the link to the user's favorites page (profile page)
+ *
+ * @since bbPress (r2652)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_favorites_permalink() To get the favorites permalink
+ */
+function bbp_favorites_permalink( $user_id = 0 ) {
+	echo bbp_get_favorites_permalink( $user_id );
+}
+	/**
+	 * Return the link to the user's favorites page (profile page)
+	 *
+	 * @since bbPress (r2652)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_profile_url() To get the user profile url
+	 * @uses apply_filters() Calls 'bbp_get_favorites_permalink' with the
+	 *                        user profile url and user id
+	 * @return string Permanent link to user profile page
+	 */
+	function bbp_get_favorites_permalink( $user_id = 0 ) {
+		global $wp_rewrite;
+
+		// Use displayed user ID if there is one, and one isn't requested
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Allow early overriding of the profile URL to cut down on processing
+		$early_profile_url = apply_filters( 'bbp_pre_get_favorites_permalink', (int) $user_id );
+		if ( is_string( $early_profile_url ) )
+			return $early_profile_url;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url = $wp_rewrite->root . bbp_get_user_slug() . '/%' . bbp_get_user_rewrite_id() . '%/%' . bbp_get_user_favorites_rewrite_id() . '%';
+			$user = get_userdata( $user_id );
+			if ( ! empty( $user->user_nicename ) ) {
+				$user_nicename = $user->user_nicename;
+			} else {
+				$user_nicename = $user->user_login;
+			}
+			$url = str_replace( '%' . bbp_get_user_rewrite_id() . '%', $user_nicename, $url );
+			$url = str_replace( '%' . bbp_get_user_favorites_rewrite_id() . '%', bbp_get_user_favorites_slug(), $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array(
+				bbp_get_user_rewrite_id()           => $user_id,
+				bbp_get_user_favorites_rewrite_id() => bbp_get_user_favorites_slug(),
+			), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_favorites_permalink', $url, $user_id );
+	}
+
+/**
+ * Output the link to make a topic favorite/remove a topic from favorites
+ *
+ * @since bbPress (r2652)
+ *
+ * @param array $add Optional. Add to favorites args
+ * @param array $rem Optional. Remove from favorites args
+ * @param int $user_id Optional. User id
+ * @param int $topic_id Optional. Topic id
+ * @uses bbp_get_user_favorites_link() To get the user favorites link
+ */
+function bbp_user_favorites_link( $add = array(), $rem = array(), $user_id = 0, $topic_id = 0 ) {
+	echo bbp_get_user_favorites_link( $add, $rem, $user_id, $topic_id );
+}
+	/**
+	 * User favorites link
+	 *
+	 * Return the link to make a topic favorite/remove a topic from
+	 * favorites
+	 *
+	 * @since bbPress (r2652)
+	 *
+	 * @param array $add Optional. Add to favorites args
+	 * @param array $rem Optional. Remove from favorites args
+	 * @param int $user_id Optional. User id
+	 * @param int $topic_id Optional. Topic id
+	 * @uses bbp_get_user_id() To get the user id
+	 * @uses current_user_can() If the current user can edit the user
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_user_favorite() To check if the topic is user's favorite
+	 * @uses bbp_get_favorites_permalink() To get the favorites permalink
+	 * @uses bbp_get_topic_permalink() To get the topic permalink
+	 * @uses bbp_is_favorites() Is it the favorites page?
+	 * @uses apply_filters() Calls 'bbp_get_user_favorites_link' with the
+	 *                        html, add args, remove args, user & topic id
+	 * @return string User favorites link
+	 */
+	function bbp_get_user_favorites_link( $add = array(), $rem = array(), $user_id = 0, $topic_id = 0 ) {
+		if ( !bbp_is_favorites_active() )
+			return false;
+
+		// Validate user and topic ID's
+		$user_id  = bbp_get_user_id( $user_id, true, true );
+		$topic_id = bbp_get_topic_id( $topic_id );
+		if ( empty( $user_id ) || empty( $topic_id ) )
+			return false;
+
+		if ( !current_user_can( 'edit_user', (int) $user_id ) )
+			return false;
+
+		if ( empty( $add ) || !is_array( $add ) ) {
+			$add = array(
+				'mid'  => __( 'Add this topic to your favorites', 'bbpress' ),
+				'post' => __( ' (%?%)', 'bbpress' )
+			);
+		}
+
+		if ( empty( $rem ) || !is_array( $rem ) ) {
+			$rem = array(
+				'pre'  => __( 'This topic is one of your %favorites% [', 'bbpress' ),
+				'mid'  => __( '&times;', 'bbpress' ),
+				'post' => __( ']', 'bbpress' )
+			);
+		}
+
+		$is_fav = bbp_is_user_favorite( $user_id, $topic_id );
+		if ( !empty( $is_fav ) ) {
+			$url   = esc_url( bbp_get_favorites_permalink( $user_id ) );
+			$rem   = preg_replace( '|%(.+)%|', "<a href='$url'>$1</a>", $rem );
+			$favs  = array( 'action' => 'bbp_favorite_remove', 'topic_id' => $topic_id );
+			$pre   = ( is_array( $rem ) && isset( $rem['pre']  ) ) ? $rem['pre']  : '';
+			$mid   = ( is_array( $rem ) && isset( $rem['mid']  ) ) ? $rem['mid']  : ( is_string( $rem ) ? $rem : '' );
+			$_post = ( is_array( $rem ) && isset( $rem['post'] ) ) ? $rem['post'] : '';
+		} else {
+			$url   = esc_url( bbp_get_favorites_permalink( $user_id ) );
+			$add   = preg_replace( '|%(.+)%|', "<a href='$url'>$1</a>", $add );
+			$favs  = array( 'action' => 'bbp_favorite_add', 'topic_id' => $topic_id );
+			$pre   = ( is_array( $add ) && isset( $add['pre']  ) ) ? $add['pre']  : '';
+			$mid   = ( is_array( $add ) && isset( $add['mid']  ) ) ? $add['mid']  : ( is_string( $add ) ? $add : '' );
+			$_post = ( is_array( $add ) && isset( $add['post'] ) ) ? $add['post'] : '';
+		}
+
+		// Create the link based where the user is and if the topic is
+		// already the user's favorite
+		if ( bbp_is_favorites() ) {
+			$permalink = bbp_get_favorites_permalink( $user_id );
+		} elseif ( is_singular( bbp_get_topic_post_type() ) ) {
+			$permalink = bbp_get_topic_permalink( $topic_id );
+		} elseif ( is_singular( bbp_get_reply_post_type() ) ) {
+			$permalink = bbp_get_topic_permalink( $topic_id );
+		} elseif ( bbp_is_query_name( 'bbp_single_topic' ) ) {
+			$permalink = get_permalink();
+		}
+
+		$url    = esc_url( wp_nonce_url( add_query_arg( $favs, $permalink ), 'toggle-favorite_' . $topic_id ) );
+		$is_fav = $is_fav ? 'is-favorite' : '';
+		$html   = '<span id="favorite-toggle"><span id="favorite-' . $topic_id . '" class="' . $is_fav . '">' . $pre . '<a href="' . $url . '" class="dim:favorite-toggle:favorite-' . $topic_id . ':is-favorite">' . $mid . '</a>' . $_post . '</span></span>';
+
+		// Return the link
+		return apply_filters( 'bbp_get_user_favorites_link', $html, $add, $rem, $user_id, $topic_id );
+	}
+
+/** Subscriptions *************************************************************/
+
+/**
+ * Output the link to the user's subscriptions page (profile page)
+ *
+ * @since bbPress (r2688)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_subscriptions_permalink() To get the subscriptions link
+ */
+function bbp_subscriptions_permalink( $user_id = 0 ) {
+	echo bbp_get_subscriptions_permalink( $user_id );
+}
+	/**
+	 * Return the link to the user's subscriptions page (profile page)
+	 *
+	 * @since bbPress (r2688)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_profile_url() To get the user profile url
+	 * @uses apply_filters() Calls 'bbp_get_subscriptions_permalink' with
+	 *                        the user profile url and user id
+	 * @return string Permanent link to user subscriptions page
+	 */
+	function bbp_get_subscriptions_permalink( $user_id = 0 ) {
+		global $wp_rewrite;
+
+		// Use displayed user ID if there is one, and one isn't requested
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Allow early overriding of the profile URL to cut down on processing
+		$early_profile_url = apply_filters( 'bbp_pre_get_subscriptions_permalink', (int) $user_id );
+		if ( is_string( $early_profile_url ) )
+			return $early_profile_url;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url  = $wp_rewrite->root . bbp_get_user_slug() . '/%' . bbp_get_user_rewrite_id() . '%/%' . bbp_get_user_subscriptions_rewrite_id() . '%';
+			$user = get_userdata( $user_id );
+			if ( ! empty( $user->user_nicename ) ) {
+				$user_nicename = $user->user_nicename;
+			} else {
+				$user_nicename = $user->user_login;
+			}
+			$url = str_replace( '%' . bbp_get_user_rewrite_id()               . '%', $user_nicename,                    $url );
+			$url = str_replace( '%' . bbp_get_user_subscriptions_rewrite_id() . '%', bbp_get_user_subscriptions_slug(), $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array(
+				bbp_get_user_rewrite_id()           => $user_id,
+				bbp_get_user_subscriptions_rewrite_id() => bbp_get_user_subscriptions_slug(),
+			), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_subscriptions_permalink', $url, $user_id );
+	}
+
+/**
+ * Output the link to subscribe/unsubscribe from a topic
+ *
+ * @since bbPress (r2668)
+ *
+ * @param mixed $args See {@link bbp_get_user_subscribe_link()}
+ * @uses bbp_get_user_subscribe_link() To get the subscribe link
+ */
+function bbp_user_subscribe_link( $args = '' ) {
+	echo bbp_get_user_subscribe_link( $args );
+}
+	/**
+	 * Return the link to subscribe/unsubscribe from a topic
+	 *
+	 * @since bbPress (r2668)
+	 *
+	 * @param mixed $args This function supports these arguments:
+	 *  - subscribe: Subscribe text
+	 *  - unsubscribe: Unsubscribe text
+	 *  - user_id: User id
+	 *  - topic_id: Topic id
+	 *  - before: Before the link
+	 *  - after: After the link
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_id() To get the user id
+	 * @uses current_user_can() To check if the current user can edit user
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_is_user_subscribed() To check if the user is subscribed
+	 * @uses bbp_is_subscriptions() To check if it's the subscriptions page
+	 * @uses bbp_get_subscriptions_permalink() To get subscriptions link
+	 * @uses bbp_get_topic_permalink() To get topic link
+	 * @uses apply_filters() Calls 'bbp_get_user_subscribe_link' with the
+	 *                        link, args, user id & topic id
+	 * @return string Permanent link to topic
+	 */
+	function bbp_get_user_subscribe_link( $args = '', $user_id = 0 ) {
+		if ( !bbp_is_subscriptions_active() )
+			return;
+
+		$defaults = array (
+			'subscribe'   => __( 'Subscribe',   'bbpress' ),
+			'unsubscribe' => __( 'Unsubscribe', 'bbpress' ),
+			'user_id'     => 0,
+			'topic_id'    => 0,
+			'before'      => '&nbsp;|&nbsp;',
+			'after'       => ''
+		);
+		$args = bbp_parse_args( $args, $defaults, 'get_user_subscribe_link' );
+		extract( $args );
+
+		// Validate user and topic ID's
+		$user_id  = bbp_get_user_id( $user_id, true, true );
+		$topic_id = bbp_get_topic_id( $topic_id );
+		if ( empty( $user_id ) || empty( $topic_id ) ) {
+			return false;
+		}
+
+		// No link if you can't edit yourself
+		if ( !current_user_can( 'edit_user', (int) $user_id ) ) {
+			return false;
+		}
+
+		// Decine which link to show
+		$is_subscribed = bbp_is_user_subscribed( $user_id, $topic_id );
+		if ( !empty( $is_subscribed ) ) {
+			$text       = $unsubscribe;
+			$query_args = array( 'action' => 'bbp_unsubscribe', 'topic_id' => $topic_id );
+		} else {
+			$text       = $subscribe;
+			$query_args = array( 'action' => 'bbp_subscribe', 'topic_id' => $topic_id );
+		}
+
+		// Create the link based where the user is and if the user is
+		// subscribed already
+		if ( bbp_is_subscriptions() ) {
+			$permalink = bbp_get_subscriptions_permalink( $user_id );
+		} elseif ( is_singular( bbp_get_topic_post_type() ) ) {
+			$permalink = bbp_get_topic_permalink( $topic_id );
+		} elseif ( is_singular( bbp_get_reply_post_type() ) ) {
+			$permalink = bbp_get_topic_permalink( $topic_id );
+		} elseif ( bbp_is_query_name( 'bbp_single_topic' ) ) {
+			$permalink = get_permalink();
+		}
+
+		$url           = esc_url( wp_nonce_url( add_query_arg( $query_args, $permalink ), 'toggle-subscription_' . $topic_id ) );
+		$is_subscribed = $is_subscribed ? 'is-subscribed' : '';
+		$html          = '<span id="subscription-toggle">' . $before . '<span id="subscribe-' . $topic_id . '" class="' . $is_subscribed . '"><a href="' . $url . '" class="dim:subscription-toggle:subscribe-' . $topic_id . ':is-subscribed">' . $text . '</a></span>' . $after . '</span>';
+
+		// Return the link
+		return apply_filters( 'bbp_get_user_subscribe_link', $html, $args, $user_id, $topic_id );
+	}
+
+
+/** Edit User *****************************************************************/
+
+/**
+ * Edit profile success message
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses bbp_is_single_user() To check if it's the profile page
+ * @uses bbp_is_single_user_edit() To check if it's the profile edit page
+ */
+function bbp_notice_edit_user_success() {
+	if ( isset( $_GET['updated'] ) && ( bbp_is_single_user() || bbp_is_single_user_edit() ) ) : ?>
+
+	<div class="bbp-template-notice updated">
+		<p><?php _e( 'User updated.', 'bbpress' ); ?></p>
+	</div>
+
+	<?php endif;
+}
+
+/**
+ * Super admin privileges notice
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses is_multisite() To check if the blog is multisite
+ * @uses bbp_is_single_user() To check if it's the profile page
+ * @uses bbp_is_single_user_edit() To check if it's the profile edit page
+ * @uses current_user_can() To check if the current user can manage network
+ *                           options
+ * @uses bbp_get_displayed_user_id() To get the displayed user id
+ * @uses is_super_admin() To check if the user is super admin
+ * @uses bbp_is_user_home() To check if it's the user home
+ * @uses bbp_is_user_home_edit() To check if it's the user home edit
+ */
+function bbp_notice_edit_user_is_super_admin() {
+	if ( is_multisite() && ( bbp_is_single_user() || bbp_is_single_user_edit() ) && current_user_can( 'manage_network_options' ) && is_super_admin( bbp_get_displayed_user_id() ) ) : ?>
+
+	<div class="bbp-template-notice important">
+		<p><?php bbp_is_user_home() || bbp_is_user_home_edit() ? _e( 'You have super admin privileges.', 'bbpress' ) : _e( 'This user has super admin privileges.', 'bbpress' ); ?></p>
+	</div>
+
+<?php endif;
+}
+
+/**
+ * Drop down for selecting the user's display name
+ *
+ * @since bbPress (r2688)
+ */
+function bbp_edit_user_display_name() {
+	$bbp            = bbpress();
+	$public_display = array();
+	$public_display['display_username'] = $bbp->displayed_user->user_login;
+
+	if ( !empty( $bbp->displayed_user->nickname ) )
+		$public_display['display_nickname']  = $bbp->displayed_user->nickname;
+
+	if ( !empty( $bbp->displayed_user->first_name ) )
+		$public_display['display_firstname'] = $bbp->displayed_user->first_name;
+
+	if ( !empty( $bbp->displayed_user->last_name ) )
+		$public_display['display_lastname']  = $bbp->displayed_user->last_name;
+
+	if ( !empty( $bbp->displayed_user->first_name ) && !empty( $bbp->displayed_user->last_name ) ) {
+		$public_display['display_firstlast'] = $bbp->displayed_user->first_name . ' ' . $bbp->displayed_user->last_name;
+		$public_display['display_lastfirst'] = $bbp->displayed_user->last_name  . ' ' . $bbp->displayed_user->first_name;
+	}
+
+	if ( !in_array( $bbp->displayed_user->display_name, $public_display ) ) // Only add this if it isn't duplicated elsewhere
+		$public_display = array( 'display_displayname' => $bbp->displayed_user->display_name ) + $public_display;
+
+	$public_display = array_map( 'trim', $public_display );
+	$public_display = array_unique( $public_display ); ?>
+
+	<select name="display_name" id="display_name">
+
+	<?php foreach ( $public_display as $id => $item ) : ?>
+
+		<option id="<?php echo $id; ?>" value="<?php echo esc_attr( $item ); ?>"<?php selected( $bbp->displayed_user->display_name, $item ); ?>><?php echo $item; ?></option>
+
+	<?php endforeach; ?>
+
+	</select>
+
+<?php
+}
+
+/**
+ * Output blog role selector (for user edit)
+ *
+ * @since bbPress (r2688)
+ */
+function bbp_edit_user_blog_role() {
+
+	// Return if no user is being edited
+	if ( ! bbp_is_single_user_edit() )
+		return;
+
+	// Get users current blog role
+	$user      = get_userdata( bbp_get_displayed_user_id() );
+	$user_role = isset( $user->roles ) ? array_shift( $user->roles ) : ''; ?>
+
+	<select name="role" id="role">
+		<option value=""><?php _e( '&mdash; No role for this site &mdash;', 'bbpress' ); ?></option>
+
+		<?php foreach ( get_editable_roles() as $role => $details ) : ?>
+
+			<option <?php selected( $user_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo translate_user_role( $details['name'] ); ?></option>
+
+		<?php endforeach; ?>
+
+	</select>
+
+	<?php
+}
+
+/**
+ * Output forum role selector (for user edit)
+ *
+ * @since bbPress (r4284)
+ */
+function bbp_edit_user_forums_role() {
+
+	// Return if no user is being edited
+	if ( ! bbp_is_single_user_edit() )
+		return;
+
+	// Get the user's role
+	$user_role     = bbp_get_user_role( bbp_get_displayed_user_id() );
+
+	// Get the roles
+	$dynamic_roles = bbp_get_dynamic_roles();
+
+	// Only keymasters can set other keymasters
+	if ( ! current_user_can( 'keep_gate' ) )
+		unset( $dynamic_roles[ bbp_get_keymaster_role() ] ); ?>
+
+	<select name="bbp-forums-role" id="bbp-forums-role">
+		<option value=""><?php _e( '&mdash; No role for this forum &mdash;', 'bbpress' ); ?></option>
+
+		<?php foreach ( $dynamic_roles as $role => $details ) : ?>
+
+			<option <?php selected( $user_role, $role ); ?> value="<?php echo esc_attr( $role ); ?>"><?php echo translate_user_role( $details['name'] ); ?></option>
+
+		<?php endforeach; ?>
+
+	</select>
+
+	<?php
+}
+
+/**
+ * Return user contact methods Selectbox
+ *
+ * @since bbPress (r2688)
+ *
+ * @uses _wp_get_user_contactmethods() To get the contact methods
+ * @uses apply_filters() Calls 'bbp_edit_user_contact_methods' with the methods
+ * @return string User contact methods
+ */
+function bbp_edit_user_contact_methods() {
+
+	// Get the core WordPress contact methods
+	$contact_methods = _wp_get_user_contactmethods( bbpress()->displayed_user );
+
+	return apply_filters( 'bbp_edit_user_contact_methods', $contact_methods );
+}
+
+/** Topics Created ************************************************************/
+
+/**
+ * Output the link to the user's topics
+ *
+ * @since bbPress (r4225)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_favorites_permalink() To get the favorites permalink
+ */
+function bbp_user_topics_created_url( $user_id = 0 ) {
+	echo bbp_get_user_topics_created_url( $user_id );
+}
+	/**
+	 * Return the link to the user's topics
+	 *
+	 * @since bbPress (r4225)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_profile_url() To get the user profile url
+	 * @uses apply_filters() Calls 'bbp_get_favorites_permalink' with the
+	 *                        user profile url and user id
+	 * @return string Permanent link to user profile page
+	 */
+	function bbp_get_user_topics_created_url( $user_id = 0 ) {
+		global $wp_rewrite;
+
+		// Use displayed user ID if there is one, and one isn't requested
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Allow early overriding of the profile URL to cut down on processing
+		$early_url = apply_filters( 'bbp_pre_get_user_topics_created_url', (int) $user_id );
+		if ( is_string( $early_url ) )
+			return $early_url;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url  = $wp_rewrite->root . bbp_get_user_slug() . '/%' . bbp_get_user_rewrite_id() . '%/topics';
+			$user = get_userdata( $user_id );
+			if ( ! empty( $user->user_nicename ) ) {
+				$user_nicename = $user->user_nicename;
+			} else {
+				$user_nicename = $user->user_login;
+			}
+			$url = str_replace( '%' . bbp_get_user_rewrite_id() . '%', $user_nicename, $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array(
+				bbp_get_user_rewrite_id()        => $user_id,
+				bbp_get_user_topics_rewrite_id() => '1',
+			), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_user_topics_created_url', $url, $user_id );
+	}
+
+/** Topics Created ************************************************************/
+
+/**
+ * Output the link to the user's replies
+ *
+ * @since bbPress (r4225)
+ *
+ * @param int $user_id Optional. User id
+ * @uses bbp_get_favorites_permalink() To get the favorites permalink
+ */
+function bbp_user_replies_created_url( $user_id = 0 ) {
+	echo bbp_get_user_replies_created_url( $user_id );
+}
+	/**
+	 * Return the link to the user's replies
+	 *
+	 * @since bbPress (r4225)
+	 *
+	 * @param int $user_id Optional. User id
+	 * @uses bbp_get_user_profile_url() To get the user profile url
+	 * @uses apply_filters() Calls 'bbp_get_favorites_permalink' with the
+	 *                        user profile url and user id
+	 * @return string Permanent link to user profile page
+	 */
+	function bbp_get_user_replies_created_url( $user_id = 0 ) {
+		global $wp_rewrite;
+
+		// Use displayed user ID if there is one, and one isn't requested
+		$user_id = bbp_get_user_id( $user_id );
+		if ( empty( $user_id ) )
+			return false;
+
+		// Allow early overriding of the profile URL to cut down on processing
+		$early_url = apply_filters( 'bbp_pre_get_user_replies_created_url', (int) $user_id );
+		if ( is_string( $early_url ) )
+			return $early_url;
+
+		// Pretty permalinks
+		if ( $wp_rewrite->using_permalinks() ) {
+			$url  = $wp_rewrite->root . bbp_get_user_slug() . '/%' . bbp_get_user_rewrite_id() . '%/replies';
+			$user = get_userdata( $user_id );
+			if ( ! empty( $user->user_nicename ) ) {
+				$user_nicename = $user->user_nicename;
+			} else {
+				$user_nicename = $user->user_login;
+			}
+			$url = str_replace( '%' . bbp_get_user_rewrite_id() . '%', $user_nicename, $url );
+			$url = home_url( user_trailingslashit( $url ) );
+
+		// Unpretty permalinks
+		} else {
+			$url = add_query_arg( array(
+				bbp_get_user_rewrite_id()         => $user_id,
+				bbp_get_user_replies_rewrite_id() => '1',
+			), home_url( '/' ) );
+		}
+
+		return apply_filters( 'bbp_get_user_replies_created_url', $url, $user_id );
+	}
+
+/** Login *********************************************************************/
+
+/**
+ * Handle the login and registration template notices
+ *
+ * @since bbPress (r2970)
+ *
+ * @uses WP_Error bbPress::errors::add() To add an error or message
+ */
+function bbp_login_notices() {
+
+	// loggedout was passed
+	if ( !empty( $_GET['loggedout'] ) && ( true == $_GET['loggedout'] ) ) {
+		bbp_add_error( 'loggedout', __( 'You are now logged out.', 'bbpress' ), 'message' );
+
+	// registration is disabled
+	} elseif ( !empty( $_GET['registration'] ) && ( 'disabled' == $_GET['registration'] ) ) {
+		bbp_add_error( 'registerdisabled', __( 'New user registration is currently not allowed.', 'bbpress' ) );
+
+	// Prompt user to check their email
+	} elseif ( !empty( $_GET['checkemail'] ) && in_array( $_GET['checkemail'], array( 'confirm', 'newpass', 'registered' ) ) ) {
+
+		switch ( $_GET['checkemail'] ) {
+
+			// Email needs confirmation
+			case 'confirm' :
+				bbp_add_error( 'confirm',    __( 'Check your e-mail for the confirmation link.',     'bbpress' ), 'message' );
+				break;
+
+			// User requested a new password
+			case 'newpass' :
+				bbp_add_error( 'newpass',    __( 'Check your e-mail for your new password.',         'bbpress' ), 'message' );
+				break;
+
+			// User is newly registered
+			case 'registered' :
+				bbp_add_error( 'registered', __( 'Registration complete. Please check your e-mail.', 'bbpress' ), 'message' );
+				break;
+		}
+	}
+}
+
+/**
+ * Redirect a user back to their profile if they are already logged in.
+ *
+ * This should be used before {@link get_header()} is called in template files
+ * where the user should never have access to the contents of that file.
+ *
+ * @since bbPress (r2815)
+ *
+ * @param string $url The URL to redirect to
+ * @uses is_user_logged_in() Check if user is logged in
+ * @uses wp_safe_redirect() To safely redirect
+ * @uses bbp_get_user_profile_url() To get the profile url of the user
+ * @uses bbp_get_current_user_id() To get the current user id
+ */
+function bbp_logged_in_redirect( $url = '' ) {
+
+	// Bail if user is not logged in
+	if ( !is_user_logged_in() )
+		return;
+
+	// Setup the profile page to redirect to
+	$redirect_to = !empty( $url ) ? $url : bbp_get_user_profile_url( bbp_get_current_user_id() );
+
+	// Do a safe redirect and exit
+	wp_safe_redirect( $redirect_to );
+	exit;
+}
+
+/**
+ * Output the required hidden fields when logging in
+ *
+ * @since bbPress (r2815)
+ *
+ * @uses apply_filters() To allow custom redirection
+ * @uses bbp_redirect_to_field() To output the hidden request url field
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ */
+function bbp_user_login_fields() {
+?>
+
+		<input type="hidden" name="user-cookie" value="1" />
+
+		<?php
+
+		// Allow custom login redirection
+		$redirect_to = apply_filters( 'bbp_user_login_redirect_to', '' );
+		bbp_redirect_to_field( $redirect_to );
+
+		// Prevent intention hi-jacking of log-in form
+		wp_nonce_field( 'bbp-user-login' );
+}
+
+/** Register ******************************************************************/
+
+/**
+ * Output the required hidden fields when registering
+ *
+ * @since bbPress (r2815)
+ *
+ * @uses add_query_arg() To add query args
+ * @uses bbp_login_url() To get the login url
+ * @uses apply_filters() To allow custom redirection
+ * @uses bbp_redirect_to_field() To output the redirect to field
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ */
+function bbp_user_register_fields() {
+?>
+
+		<input type="hidden" name="action"      value="register" />
+		<input type="hidden" name="user-cookie" value="1" />
+
+		<?php
+
+		// Allow custom registration redirection
+		$redirect_to = apply_filters( 'bbp_user_register_redirect_to', '' );
+		bbp_redirect_to_field( add_query_arg( array( 'checkemail' => 'registered' ), $redirect_to ) );
+
+		// Prevent intention hi-jacking of sign-up form
+		wp_nonce_field( 'bbp-user-register' );
+}
+
+/** Lost Password *************************************************************/
+
+/**
+ * Output the required hidden fields when user lost password
+ *
+ * @since bbPress (r2815)
+ *
+ * @uses apply_filters() To allow custom redirection
+ * @uses wp_referer_field() Set referer
+ * @uses wp_nonce_field() To generate hidden nonce fields
+ */
+function bbp_user_lost_pass_fields() {
+?>
+
+		<input type="hidden" name="user-cookie" value="1" />
+
+		<?php
+
+		// Allow custom lost pass redirection
+		$redirect_to = apply_filters( 'bbp_user_lost_pass_redirect_to', get_permalink() );
+		bbp_redirect_to_field( add_query_arg( array( 'checkemail' => 'confirm' ), $redirect_to ) );
+
+		// Prevent intention hi-jacking of lost pass form
+		wp_nonce_field( 'bbp-user-lost-pass' );
+}
+
+/** Author Avatar *************************************************************/
+
+/**
+ * Output the author link of a post
+ *
+ * @since bbPress (r2875)
+ *
+ * @param mixed $args Optional. If it is an integer, it is used as post id.
+ * @uses bbp_get_author_link() To get the post author link
+ */
+function bbp_author_link( $args = '' ) {
+	echo bbp_get_author_link( $args );
+}
+	/**
+	 * Return the author link of the post
+	 *
+	 * @since bbPress (r2875)
+	 *
+	 * @param mixed $args Optional. If an integer, it is used as reply id.
+	 * @uses bbp_is_topic() To check if it's a topic page
+	 * @uses bbp_get_topic_author_link() To get the topic author link
+	 * @uses bbp_is_reply() To check if it's a reply page
+	 * @uses bbp_get_reply_author_link() To get the reply author link
+	 * @uses get_post_field() To get the post author
+	 * @uses bbp_is_reply_anonymous() To check if the reply is by an
+	 *                                 anonymous user
+	 * @uses get_the_author_meta() To get the author name
+	 * @uses bbp_get_user_profile_url() To get the author profile url
+	 * @uses get_avatar() To get the author avatar
+	 * @uses apply_filters() Calls 'bbp_get_reply_author_link' with the
+	 *                        author link and args
+	 * @return string Author link of reply
+	 */
+	function bbp_get_author_link( $args = '' ) {
+
+		// Default arguments
+		$defaults = array(
+			'post_id'    => 0,
+			'link_title' => '',
+			'type'       => 'both',
+			'size'       => 80
+		);
+		$r = bbp_parse_args( $args, $defaults, 'get_author_link' );
+		extract( $r );
+
+		// Used as reply_id
+		if ( is_numeric( $args ) )
+			$post_id = $args;
+
+		// Confirmed topic
+		if ( bbp_is_topic( $post_id ) ) {
+			return bbp_get_topic_author_link( $args );
+
+		// Confirmed reply
+		} elseif ( bbp_is_reply( $post_id ) ) {
+			return bbp_get_reply_author_link( $args );
+
+		// Get the post author and proceed
+		} else {
+			$user_id = get_post_field( 'post_author', $post_id );
+		}
+
+		// Neither a reply nor a topic, so could be a revision
+		if ( !empty( $post_id ) ) {
+
+			// Generate title with the display name of the author
+			if ( empty( $link_title ) ) {
+				$link_title = sprintf( !bbp_is_reply_anonymous( $post_id ) ? __( 'View %s\'s profile', 'bbpress' ) : __( 'Visit %s\'s website', 'bbpress' ), get_the_author_meta( 'display_name', $user_id ) );
+			}
+
+			// Assemble some link bits
+			$link_title = !empty( $link_title ) ? ' title="' . $link_title . '"' : '';
+			$author_url = bbp_get_user_profile_url( $user_id );
+			$anonymous  = bbp_is_reply_anonymous( $post_id );
+
+			// Get avatar
+			if ( 'avatar' == $type || 'both' == $type ) {
+				$author_links[] = get_avatar( $user_id, $size );
+			}
+
+			// Get display name
+			if ( 'name' == $type   || 'both' == $type ) {
+				$author_links[] = get_the_author_meta( 'display_name', $user_id );
+			}
+
+			// Add links if not anonymous
+			if ( empty( $anonymous ) && bbp_user_has_profile( $user_id ) ) {
+				foreach ( $author_links as $link_text ) {
+					$author_link[] = sprintf( '<a href="%1$s"%2$s>%3$s</a>', $author_url, $link_title, $link_text );
+				}
+				$author_link = join( '&nbsp;', $author_link );
+
+			// No links if anonymous
+			} else {
+				$author_link = join( '&nbsp;', $author_links );
+			}
+
+		// No post so link is empty
+		} else {
+			$author_link = '';
+		}
+
+		return apply_filters( 'bbp_get_author_link', $author_link, $args );
+	}
+
+/** Capabilities **************************************************************/
+
+/**
+ * Check if the user can access a specific forum
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses bbp_get_current_user_id()
+ * @uses bbp_get_forum_id()
+ * @uses bbp_allow_anonymous()
+ * @uses bbp_parse_args()
+ * @uses bbp_get_user_id()
+ * @uses current_user_can()
+ * @uses is_super_admin()
+ * @uses bbp_is_forum_public()
+ * @uses bbp_is_forum_private()
+ * @uses bbp_is_forum_hidden()
+ * @uses current_user_can()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_user_can_view_forum( $args = '' ) {
+
+	// Default arguments
+	$defaults = array(
+		'user_id'         => bbp_get_current_user_id(),
+		'forum_id'        => bbp_get_forum_id(),
+		'check_ancestors' => false
+	);
+	$r = bbp_parse_args( $args, $defaults, 'user_can_view_forum' );
+	extract( $r );
+
+	// Validate parsed values
+	$user_id  = bbp_get_user_id ( $user_id, false, false );
+	$forum_id = bbp_get_forum_id( $forum_id );
+	$retval   = false;
+
+	// User is a super admin
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Forum is public, and user can read forums or is not logged in
+	} elseif ( bbp_is_forum_public ( $forum_id, $check_ancestors ) ) {
+		$retval = true;
+
+	// Forum is private, and user can see it
+	} elseif ( bbp_is_forum_private( $forum_id, $check_ancestors ) && current_user_can( 'read_private_forums' ) ) {
+		$retval = true;
+
+	// Forum is hidden, and user can see it
+	} elseif ( bbp_is_forum_hidden ( $forum_id, $check_ancestors ) && current_user_can( 'read_hidden_forums'  ) ) {
+		$retval = true;
+	}
+
+	return apply_filters( 'bbp_user_can_view_forum', $retval, $forum_id, $user_id );
+}
+
+/**
+ * Check if the current user can publish topics
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses is_super_admin()
+ * @uses is_user_logged_in()
+ * @uses bbp_allow_anonymous()
+ * @uses bbp_is_user_active()
+ * @uses current_user_can()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_publish_topics() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Do not allow anonymous if not enabled
+	} elseif ( !is_user_logged_in() && bbp_allow_anonymous() ) {
+		$retval = true;
+
+	// User is logged in
+	} elseif ( current_user_can( 'publish_topics' ) ) {
+		$retval = true;
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_publish_forums', $retval );
+}
+
+/**
+ * Check if the current user can publish forums
+ *
+ * @since bbPress (r3549)
+ *
+ * @uses is_super_admin()
+ * @uses bbp_is_user_active()
+ * @uses current_user_can()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_publish_forums() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// User is logged in
+	} elseif ( current_user_can( 'publish_forums' ) ) {
+		$retval = true;
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_publish_forums', $retval );
+}
+
+/**
+ * Check if the current user can publish replies
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses is_super_admin()
+ * @uses is_user_logged_in()
+ * @uses bbp_allow_anonymous()
+ * @uses bbp_is_user_active()
+ * @uses current_user_can()
+ * @uses apply_filters()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_publish_replies() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Do not allow anonymous if not enabled
+	} elseif ( !is_user_logged_in() && bbp_allow_anonymous() ) {
+		$retval = true;
+
+	// User is logged in
+	} elseif ( current_user_can( 'publish_replies' ) ) {
+		$retval = true;
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_publish_replies', $retval );
+}
+
+/** Forms *********************************************************************/
+
+/**
+ * Get the forums the current user has the ability to see and post to
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses bbp_get_forum_post_type()
+ * @uses get_posts()
+ *
+ * @param type $args
+ * @return type
+ */
+function bbp_get_forums_for_current_user( $args = array() ) {
+
+	// Setup arrays
+	$private = $hidden = $post__not_in = array();
+
+	// Private forums
+	if ( !current_user_can( 'read_private_forums' ) )
+		$private = bbp_get_private_forum_ids();
+
+	// Hidden forums
+	if ( !current_user_can( 'read_hidden_forums' ) )
+		$hidden  = bbp_get_hidden_forum_ids();
+
+	// Merge private and hidden forums together and remove any empties
+	$forum_ids = (array) array_filter( array_merge( $private, $hidden ) );
+
+	// There are forums that need to be ex
+	if ( !empty( $forum_ids ) )
+		$post__not_in = implode( ',', $forum_ids );
+
+	$defaults = array(
+		'post_type'   => bbp_get_forum_post_type(),
+		'post_status' => bbp_get_public_status_id(),
+		'numberposts' => -1,
+		'exclude'     => $post__not_in
+	);
+	$r = bbp_parse_args( $args, $defaults, 'get_forums_for_current_user' );
+
+	// Get the forums
+	$forums = get_posts( $r );
+
+	// No availabe forums
+	if ( empty( $forums ) )
+		$forums = false;
+
+	return apply_filters( 'bbp_get_forums_for_current_user', $forums );
+}
+
+/**
+ * Performs a series of checks to ensure the current user can create forums.
+ *
+ * @since bbPress (r3549)
+ *
+ * @uses bbp_is_forum_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_forum_id()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_access_create_forum_form() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Looking at a single forum & forum is open
+	} elseif ( ( is_page() || is_single() ) && bbp_is_forum_open() ) {
+		$retval = bbp_current_user_can_publish_forums();
+
+	// User can edit this topic
+	} elseif ( bbp_is_forum_edit() ) {
+		$retval = current_user_can( 'edit_forum', bbp_get_forum_id() );
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_access_create_forum_form', (bool) $retval );
+}
+
+/**
+ * Performs a series of checks to ensure the current user can create topics.
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses bbp_is_topic_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_id()
+ * @uses bbp_allow_anonymous()
+ * @uses is_user_logged_in()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_access_create_topic_form() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Looking at a single forum & forum is open
+	} elseif ( ( bbp_is_single_forum() || is_page() || is_single() ) && bbp_is_forum_open() ) {
+		$retval = bbp_current_user_can_publish_topics();
+
+	// User can edit this topic
+	} elseif ( bbp_is_topic_edit() ) {
+		$retval = current_user_can( 'edit_topic', bbp_get_topic_id() );
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_access_create_topic_form', (bool) $retval );
+}
+
+/**
+ * Performs a series of checks to ensure the current user can create replies.
+ *
+ * @since bbPress (r3127)
+ *
+ * @uses bbp_is_topic_edit()
+ * @uses current_user_can()
+ * @uses bbp_get_topic_id()
+ * @uses bbp_allow_anonymous()
+ * @uses is_user_logged_in()
+ *
+ * @return bool
+ */
+function bbp_current_user_can_access_create_reply_form() {
+
+	// Users need to earn access
+	$retval = false;
+
+	// Always allow super admins
+	if ( is_super_admin() ) {
+		$retval = true;
+
+	// Looking at a single topic, topic is open, and forum is open
+	} elseif ( ( bbp_is_single_topic() || is_page() || is_single() ) && bbp_is_topic_open() && bbp_is_forum_open() ) {
+		$retval = bbp_current_user_can_publish_replies();
+
+	// User can edit this topic
+	} elseif ( bbp_is_reply_edit() ) {
+		$retval = current_user_can( 'edit_reply', bbp_get_reply_id() );
+	}
+
+	// Allow access to be filtered
+	return (bool) apply_filters( 'bbp_current_user_can_access_create_reply_form', (bool) $retval );
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,5 @@
+<?php
+
+/**
+ * Do not modify the files in this folder.
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/languages/bbpress.pot	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,4551 @@
+# Copyright (C) 2012 bbPress
+# This file is distributed under the same license as the bbPress package.
+msgid ""
+msgstr ""
+"Project-Id-Version: bbPress 2.2\n"
+"Report-Msgid-Bugs-To: http://bbpress.org\n"
+"POT-Creation-Date: 2012-11-19 06:18:52+00:00\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"PO-Revision-Date: 2012-MO-DA HO:MI+ZONE\n"
+"Last-Translator: JOHN JAMES JACOBY <jjj@bbpress.org>\n"
+"Language-Team: ENGLISH <jjj@bbpress.org>\n"
+
+#: bbpress.php:130 bbpress.php:137
+msgid "Cheatin&#8217; huh?"
+msgstr ""
+
+#: bbpress.php:388 templates/default/bbpress-functions.php:68
+msgid "bbPress Default"
+msgstr ""
+
+#: bbpress.php:471 bbpress.php:472 includes/admin/admin.php:208
+#: includes/admin/admin.php:209 includes/admin/admin.php:219
+#: includes/admin/admin.php:220 includes/admin/users.php:82
+#: includes/extend/buddypress/group.php:503
+#: includes/extend/buddypress/loader.php:42
+#: includes/extend/buddypress/loader.php:170
+#: includes/extend/buddypress/loader.php:259
+#: includes/extend/buddypress/loader.php:310
+#: templates/default/extras/page-forum-statistics.php:39
+msgid "Forums"
+msgstr ""
+
+#: bbpress.php:473 includes/admin/forums.php:420
+#: includes/admin/metaboxes.php:50 includes/admin/metaboxes.php:358
+#: includes/admin/metaboxes.php:411 includes/admin/replies.php:621
+#: includes/admin/topics.php:686 includes/extend/buddypress/group.php:36
+#: includes/extend/buddypress/group.php:37
+#: includes/forums/template-tags.php:2135
+#: templates/default/bbpress/loop-forums.php:19
+msgid "Forum"
+msgstr ""
+
+#: bbpress.php:474 includes/admin/tools.php:1004
+msgid "All Forums"
+msgstr ""
+
+#: bbpress.php:475 bbpress.php:479
+msgid "New Forum"
+msgstr ""
+
+#: bbpress.php:476 templates/default/bbpress/form-forum.php:37
+msgid "Create New Forum"
+msgstr ""
+
+#: bbpress.php:477 bbpress.php:534 bbpress.php:591
+#: includes/common/template-tags.php:1959
+#: includes/replies/template-tags.php:1525
+#: includes/topics/template-tags.php:2261
+#: templates/default/bbpress/user-details.php:65
+msgid "Edit"
+msgstr ""
+
+#: bbpress.php:478
+msgid "Edit Forum"
+msgstr ""
+
+#: bbpress.php:480 bbpress.php:481
+msgid "View Forum"
+msgstr ""
+
+#: bbpress.php:482
+msgid "Search Forums"
+msgstr ""
+
+#: bbpress.php:483
+msgid "No forums found"
+msgstr ""
+
+#: bbpress.php:484
+msgid "No forums found in Trash"
+msgstr ""
+
+#: bbpress.php:485 templates/default/bbpress/form-forum.php:129
+msgid "Parent Forum:"
+msgstr ""
+
+#: bbpress.php:508
+msgid "bbPress Forums"
+msgstr ""
+
+#: bbpress.php:528 bbpress.php:529 includes/admin/forums.php:421
+#: includes/admin/settings.php:187 includes/admin/settings.php:208
+#: includes/admin/topics.php:685 includes/extend/buddypress/activity.php:399
+#: includes/extend/buddypress/group.php:507
+#: includes/forums/template-tags.php:2283
+#: templates/default/bbpress/loop-forums.php:20
+#: templates/default/extras/page-forum-statistics.php:44
+msgid "Topics"
+msgstr ""
+
+#: bbpress.php:530 includes/admin/metaboxes.php:67
+#: includes/admin/metaboxes.php:437 includes/admin/replies.php:622
+#: templates/default/bbpress/content-single-topic-lead.php:22
+#: templates/default/bbpress/content-single-topic-lead.php:94
+#: templates/default/bbpress/loop-topics.php:19
+msgid "Topic"
+msgstr ""
+
+#: bbpress.php:531 includes/admin/tools.php:1005
+#: includes/topics/functions.php:3224
+msgid "All Topics"
+msgstr ""
+
+#: bbpress.php:532 bbpress.php:536
+msgid "New Topic"
+msgstr ""
+
+#: bbpress.php:533 templates/default/bbpress/form-topic.php:43
+msgid "Create New Topic"
+msgstr ""
+
+#: bbpress.php:535
+msgid "Edit Topic"
+msgstr ""
+
+#: bbpress.php:537 bbpress.php:538
+msgid "View Topic"
+msgstr ""
+
+#: bbpress.php:539
+msgid "Search Topics"
+msgstr ""
+
+#: bbpress.php:540
+msgid "No topics found"
+msgstr ""
+
+#: bbpress.php:541
+msgid "No topics found in Trash"
+msgstr ""
+
+#: bbpress.php:542 includes/admin/metaboxes.php:357
+#: includes/admin/metaboxes.php:410 includes/extend/buddypress/group.php:808
+#: templates/default/bbpress/form-topic.php:125
+msgid "Forum:"
+msgstr ""
+
+#: bbpress.php:565
+msgid "bbPress Topics"
+msgstr ""
+
+#: bbpress.php:585 bbpress.php:586 includes/admin/forums.php:422
+#: includes/admin/settings.php:195 includes/admin/settings.php:216
+#: includes/admin/topics.php:687 includes/core/theme-compat.php:552
+#: includes/extend/buddypress/activity.php:400
+#: includes/forums/template-tags.php:2347
+#: templates/default/bbpress/loop-forums.php:21
+#: templates/default/bbpress/loop-replies.php:32
+#: templates/default/bbpress/loop-replies.php:62
+#: templates/default/bbpress/loop-topics.php:21
+#: templates/default/extras/page-forum-statistics.php:49
+msgid "Replies"
+msgstr ""
+
+#: bbpress.php:587 includes/admin/metaboxes.php:84
+msgid "Reply"
+msgstr ""
+
+#: bbpress.php:588 includes/admin/tools.php:1006
+#: includes/replies/functions.php:1514
+msgid "All Replies"
+msgstr ""
+
+#: bbpress.php:589 bbpress.php:593
+msgid "New Reply"
+msgstr ""
+
+#: bbpress.php:590
+msgid "Create New Reply"
+msgstr ""
+
+#: bbpress.php:592
+msgid "Edit Reply"
+msgstr ""
+
+#: bbpress.php:594 bbpress.php:595
+msgid "View Reply"
+msgstr ""
+
+#: bbpress.php:596
+msgid "Search Replies"
+msgstr ""
+
+#: bbpress.php:597
+msgid "No replies found"
+msgstr ""
+
+#: bbpress.php:598
+msgid "No replies found in Trash"
+msgstr ""
+
+#: bbpress.php:599 includes/admin/metaboxes.php:436
+msgid "Topic:"
+msgstr ""
+
+#: bbpress.php:622
+msgid "bbPress Replies"
+msgstr ""
+
+#: bbpress.php:657
+msgctxt "post"
+msgid "Closed"
+msgstr ""
+
+#: bbpress.php:658
+msgctxt "bbpress"
+msgid "Closed <span class=\"count\">(%s)</span>"
+msgid_plural "Closed <span class=\"count\">(%s)</span>"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bbpress.php:668
+msgctxt "post"
+msgid "Spam"
+msgstr ""
+
+#: bbpress.php:669
+msgctxt "bbpress"
+msgid "Spam <span class=\"count\">(%s)</span>"
+msgid_plural "Spam <span class=\"count\">(%s)</span>"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bbpress.php:681
+msgctxt "post"
+msgid "Orphan"
+msgstr ""
+
+#: bbpress.php:682
+msgctxt "bbpress"
+msgid "Orphan <span class=\"count\">(%s)</span>"
+msgid_plural "Orphans <span class=\"count\">(%s)</span>"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bbpress.php:694
+msgctxt "post"
+msgid "Hidden"
+msgstr ""
+
+#: bbpress.php:695
+msgctxt "bbpress"
+msgid "Hidden <span class=\"count\">(%s)</span>"
+msgid_plural "Hidden <span class=\"count\">(%s)</span>"
+msgstr[0] ""
+msgstr[1] ""
+
+#: bbpress.php:740 templates/default/extras/page-forum-statistics.php:54
+msgid "Topic Tags"
+msgstr ""
+
+#: bbpress.php:741 includes/admin/metaboxes.php:103
+msgid "Topic Tag"
+msgstr ""
+
+#: bbpress.php:742
+msgid "Search Tags"
+msgstr ""
+
+#: bbpress.php:743
+msgid "Popular Tags"
+msgstr ""
+
+#: bbpress.php:744
+msgid "All Tags"
+msgstr ""
+
+#: bbpress.php:745
+msgid "Edit Tag"
+msgstr ""
+
+#: bbpress.php:746
+msgid "Update Tag"
+msgstr ""
+
+#: bbpress.php:747
+msgid "Add New Tag"
+msgstr ""
+
+#: bbpress.php:748
+msgid "New Tag Name"
+msgstr ""
+
+#: bbpress.php:749
+msgid "View Topic Tag"
+msgstr ""
+
+#: bbpress.php:787
+msgid "Topics with no replies"
+msgstr ""
+
+#: includes/admin/admin.php:173 includes/admin/functions.php:224
+#: includes/admin/tools.php:34
+msgid "Repair Forums"
+msgstr ""
+
+#: includes/admin/admin.php:174
+msgid "Forum Repair"
+msgstr ""
+
+#: includes/admin/admin.php:183 includes/admin/functions.php:228
+#: includes/admin/settings.php:1244
+msgid "Import Forums"
+msgstr ""
+
+#: includes/admin/admin.php:184
+msgid "Forum Import"
+msgstr ""
+
+#: includes/admin/admin.php:193 includes/admin/functions.php:232
+#: includes/admin/tools.php:995
+msgid "Reset Forums"
+msgstr ""
+
+#: includes/admin/admin.php:194
+msgid "Forum Reset"
+msgstr ""
+
+#: includes/admin/admin.php:232 includes/admin/admin.php:233
+#: includes/admin/admin.php:241 includes/admin/admin.php:242
+msgid "Welcome to bbPress"
+msgstr ""
+
+#: includes/admin/admin.php:255 includes/admin/admin.php:256
+#: includes/admin/admin.php:277 includes/admin/admin.php:278
+#: includes/admin/admin.php:1583 includes/admin/admin.php:1672
+msgid "Update Forums"
+msgstr ""
+
+#: includes/admin/admin.php:468
+msgid "Settings"
+msgstr ""
+
+#: includes/admin/admin.php:469
+msgid "About"
+msgstr ""
+
+#: includes/admin/admin.php:481
+msgid "Right Now in Forums"
+msgstr ""
+
+#: includes/admin/admin.php:1237
+msgctxt "admin color scheme"
+msgid "Green"
+msgstr ""
+
+#: includes/admin/admin.php:1278
+msgid "%s - %s"
+msgstr ""
+
+#: includes/admin/admin.php:1296 includes/admin/admin.php:1402
+msgid "Welcome to bbPress %s"
+msgstr ""
+
+#: includes/admin/admin.php:1297 includes/admin/admin.php:1403
+msgid ""
+"Thank you for updating to the latest version! bbPress %s is ready to make "
+"your community a safer, faster, and better looking place to hang out!"
+msgstr ""
+
+#: includes/admin/admin.php:1298 includes/admin/admin.php:1404
+msgid "Version %s"
+msgstr ""
+
+#: includes/admin/admin.php:1302 includes/admin/admin.php:1408
+msgid "What&#8217;s New"
+msgstr ""
+
+#: includes/admin/admin.php:1304 includes/admin/admin.php:1410
+msgid "Credits"
+msgstr ""
+
+#: includes/admin/admin.php:1309
+msgid "In-depth User Profiles"
+msgstr ""
+
+#: includes/admin/admin.php:1312
+msgid "User Details"
+msgstr ""
+
+#: includes/admin/admin.php:1313
+msgid ""
+"Forum profiles include the details of your forum activity, including your "
+"topics and replies, subscriptions, and favorites."
+msgstr ""
+
+#: includes/admin/admin.php:1315
+msgid "Easy Updating"
+msgstr ""
+
+#: includes/admin/admin.php:1316
+msgid "You can easily update your profile without leaving bbPress."
+msgstr ""
+
+#: includes/admin/admin.php:1321
+msgid "Theme Compatability"
+msgstr ""
+
+#: includes/admin/admin.php:1324
+msgid "Twenty Twelve"
+msgstr ""
+
+#: includes/admin/admin.php:1325
+msgid ""
+"Updated default templates are now Twenty Twelve compatible, and we refreshed "
+"our CSS to better integrate with other popular themes, too."
+msgstr ""
+
+#: includes/admin/admin.php:1330
+msgid "Improved User Management"
+msgstr ""
+
+#: includes/admin/admin.php:1333
+msgid "Dynamic User Roles and Capabilities"
+msgstr ""
+
+#: includes/admin/admin.php:1334
+msgid ""
+"bbPress now includes some fancy user-roles with smart default capabilities "
+"to help you manage your forums. New roles include Key Master (for complete "
+"administrative access), Moderator, and Participant for regular forum users."
+msgstr ""
+
+#: includes/admin/admin.php:1336
+msgid "Manage Forum Users from WordPress"
+msgstr ""
+
+#: includes/admin/admin.php:1337
+msgid ""
+"You can assign Forums roles to users individually, or bulk update them from "
+"the WordPress Users page. Users automatically start out as forum "
+"participants."
+msgstr ""
+
+#: includes/admin/admin.php:1342
+msgid "Better BuddyPress Integration"
+msgstr ""
+
+#: includes/admin/admin.php:1345
+msgid "Use bbPress for Your BuddyPress Group Forums"
+msgstr ""
+
+#: includes/admin/admin.php:1346
+msgid ""
+"You can now use bbPress to manage your BuddyPress Group Forums, allowing for "
+"seamless integration and improved plugin performance. Plugins developed for "
+"bbPress can now be extended to improve the BuddyPress Group Forums "
+"experience."
+msgstr ""
+
+#: includes/admin/admin.php:1348
+msgid "Activity Stream Syncing"
+msgstr ""
+
+#: includes/admin/admin.php:1349
+msgid ""
+"bbPress now keeps track of changes to topics and replies and keeps their "
+"corresponding BuddyPress Activity Stream updates synced."
+msgstr ""
+
+#: includes/admin/admin.php:1354
+msgid "Under the Hood"
+msgstr ""
+
+#: includes/admin/admin.php:1358
+msgid "Template Logic"
+msgstr ""
+
+#: includes/admin/admin.php:1359
+msgid ""
+"New functions and template stacks are in place to help plugin developers "
+"extend bbPress further."
+msgstr ""
+
+#: includes/admin/admin.php:1361
+msgid "Plugin Directory Structure"
+msgstr ""
+
+#: includes/admin/admin.php:1362
+msgid ""
+"We simplified the bbPress plugin directory structure, making it easier for "
+"plugin developers to find the relevant code."
+msgstr ""
+
+#: includes/admin/admin.php:1366
+msgid "Autocomplete"
+msgstr ""
+
+#: includes/admin/admin.php:1367
+msgid ""
+"In WordPress Admin, you now select a parent forum or topic via autocomplete "
+"rather than a dropdown."
+msgstr ""
+
+#: includes/admin/admin.php:1369
+msgid "Fancy Editor Support"
+msgstr ""
+
+#: includes/admin/admin.php:1370
+msgid ""
+"We improved our support of the Fancy Editor, giving forum users a better "
+"experience."
+msgstr ""
+
+#: includes/admin/admin.php:1374
+msgid "WordPress 3.5-ready"
+msgstr ""
+
+#: includes/admin/admin.php:1375
+msgid ""
+"bbPress 2.2 has been thoroughly tested against the ongoing development of "
+"WordPress 3.5."
+msgstr ""
+
+#: includes/admin/admin.php:1381 includes/admin/admin.php:1509
+msgid "Go to Forum Settings"
+msgstr ""
+
+#: includes/admin/admin.php:1414
+msgid "bbPress is created by a worldwide swarm of busy, busy bees."
+msgstr ""
+
+#: includes/admin/admin.php:1416
+msgid "Project Leaders"
+msgstr ""
+
+#: includes/admin/admin.php:1421
+msgid "Founding Developer"
+msgstr ""
+
+#: includes/admin/admin.php:1426
+msgid "Lead Developer"
+msgstr ""
+
+#: includes/admin/admin.php:1430
+msgid "Contributing Developers"
+msgstr ""
+
+#: includes/admin/admin.php:1449
+msgid "Codex Rockstars"
+msgstr ""
+
+#: includes/admin/admin.php:1468
+msgid "Core Contributors to bbPress 2.2"
+msgstr ""
+
+#: includes/admin/admin.php:1535 includes/admin/admin.php:1557
+msgid "Update Forum"
+msgstr ""
+
+#: includes/admin/admin.php:1546 includes/admin/admin.php:1600
+msgid "All done!"
+msgstr ""
+
+#: includes/admin/admin.php:1547 includes/admin/admin.php:1601
+msgid "Go Back"
+msgstr ""
+
+#: includes/admin/admin.php:1556
+msgid ""
+"You can update your forum through this page. Hit the link below to update."
+msgstr ""
+
+#: includes/admin/admin.php:1628
+msgid ""
+"Warning! Problem updating %1$s. Your server may not be able to connect to "
+"sites running on it. Error message: <em>%2$s</em>"
+msgstr ""
+
+#: includes/admin/admin.php:1652
+msgid ""
+"If your browser doesn&#8217;t start loading the next page automatically, "
+"click this link:"
+msgstr ""
+
+#: includes/admin/admin.php:1653
+msgid "Next Forums"
+msgstr ""
+
+#: includes/admin/admin.php:1671
+msgid ""
+"You can update all the forums on your network through this page. It works by "
+"calling the update script of each site automatically. Hit the link below to "
+"update."
+msgstr ""
+
+#: includes/admin/converter.php:80
+msgid "Database Settings"
+msgstr ""
+
+#: includes/admin/converter.php:83
+msgid "Select Platform"
+msgstr ""
+
+#: includes/admin/converter.php:87
+msgid "Database Server"
+msgstr ""
+
+#: includes/admin/converter.php:91
+msgid "Database Port"
+msgstr ""
+
+#: includes/admin/converter.php:95
+msgid "Database Name"
+msgstr ""
+
+#: includes/admin/converter.php:99
+msgid "Database User"
+msgstr ""
+
+#: includes/admin/converter.php:103
+msgid "Database Password"
+msgstr ""
+
+#: includes/admin/converter.php:107
+msgid "Table Prefix"
+msgstr ""
+
+#: includes/admin/converter.php:111
+msgid "Options"
+msgstr ""
+
+#: includes/admin/converter.php:114
+msgid "Rows Limit"
+msgstr ""
+
+#: includes/admin/converter.php:118
+msgid "Delay Time"
+msgstr ""
+
+#: includes/admin/converter.php:122
+msgid "Convert Users"
+msgstr ""
+
+#: includes/admin/converter.php:126
+msgid "Start Over"
+msgstr ""
+
+#: includes/admin/converter.php:130
+msgid "Purge Previous Import"
+msgstr ""
+
+#: includes/admin/converter.php:219
+msgid "Starting Conversion"
+msgstr ""
+
+#: includes/admin/converter.php:244 includes/admin/converter.php:471
+msgid "Conversion Complete"
+msgstr ""
+
+#: includes/admin/converter.php:338
+msgid "No data to clean"
+msgstr ""
+
+#: includes/admin/converter.php:342
+msgid "Deleting previously converted data (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:358
+msgid "No users to convert"
+msgstr ""
+
+#: includes/admin/converter.php:362
+msgid "Converting users (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:378
+msgid "No passwords to clear"
+msgstr ""
+
+#: includes/admin/converter.php:382
+msgid "Delete users wordpress default passwords (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:397
+msgid "No forums to convert"
+msgstr ""
+
+#: includes/admin/converter.php:401
+msgid "Converting forums (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:412
+msgid "No forum parents to convert"
+msgstr ""
+
+#: includes/admin/converter.php:416
+msgid "Calculating forum hierarchy (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:427
+msgid "No topics to convert"
+msgstr ""
+
+#: includes/admin/converter.php:431
+msgid "Converting topics (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:442
+msgid "No tags to convert"
+msgstr ""
+
+#: includes/admin/converter.php:446
+msgid "Converting topic tags (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converter.php:457
+msgid "No replies to convert"
+msgstr ""
+
+#: includes/admin/converter.php:461
+msgid "Converting replies (%1$s - %2$s)"
+msgstr ""
+
+#: includes/admin/converters/bbPress1.php:540
+msgid "Re: "
+msgstr ""
+
+#: includes/admin/forums.php:120 includes/admin/replies.php:132
+#: includes/admin/settings.php:1284 includes/admin/topics.php:132
+msgid "Overview"
+msgstr ""
+
+#: includes/admin/forums.php:122
+msgid ""
+"This screen displays the individual forums on your site. You can customize "
+"the display of this screen to suit your workflow."
+msgstr ""
+
+#: includes/admin/forums.php:128 includes/admin/replies.php:140
+#: includes/admin/topics.php:140
+msgid "Screen Content"
+msgstr ""
+
+#: includes/admin/forums.php:130 includes/admin/replies.php:142
+#: includes/admin/topics.php:142
+msgid ""
+"You can customize the display of this screen&#8217;s contents in a number of "
+"ways:"
+msgstr ""
+
+#: includes/admin/forums.php:132
+msgid ""
+"You can hide/display columns based on your needs and decide how many forums "
+"to list per screen using the Screen Options tab."
+msgstr ""
+
+#: includes/admin/forums.php:133
+msgid ""
+"You can filter the list of forums by forum status using the text links in "
+"the upper left to show All, Published, or Trashed forums. The default view "
+"is to show all forums."
+msgstr ""
+
+#: includes/admin/forums.php:134
+msgid ""
+"You can refine the list to show only forums from a specific month by using "
+"the dropdown menus above the forums list. Click the Filter button after "
+"making your selection. You also can refine the list by clicking on the forum "
+"creator in the forums list."
+msgstr ""
+
+#: includes/admin/forums.php:141 includes/admin/replies.php:154
+#: includes/admin/topics.php:153
+msgid "Available Actions"
+msgstr ""
+
+#: includes/admin/forums.php:143
+msgid ""
+"Hovering over a row in the forums list will display action links that allow "
+"you to manage your forum. You can perform the following actions:"
+msgstr ""
+
+#: includes/admin/forums.php:145
+msgid ""
+"<strong>Edit</strong> takes you to the editing screen for that forum. You "
+"can also reach that screen by clicking on the forum title."
+msgstr ""
+
+#: includes/admin/forums.php:146
+msgid ""
+"<strong>Trash</strong> removes your forum from this list and places it in "
+"the trash, from which you can permanently delete it."
+msgstr ""
+
+#: includes/admin/forums.php:147
+msgid ""
+"<strong>View</strong> will show you what your draft forum will look like if "
+"you publish it. View will take you to your live site to view the forum. "
+"Which link is available depends on your forum&#8217;s status."
+msgstr ""
+
+#: includes/admin/forums.php:154 includes/admin/replies.php:169
+#: includes/admin/topics.php:170
+msgid "Bulk Actions"
+msgstr ""
+
+#: includes/admin/forums.php:156
+msgid ""
+"You can also edit or move multiple forums to the trash at once. Select the "
+"forums you want to act on using the checkboxes, then select the action you "
+"want to take from the Bulk Actions menu and click Apply."
+msgstr ""
+
+#: includes/admin/forums.php:157
+msgid ""
+"When using Bulk Edit, you can change the metadata (categories, author, etc.) "
+"for all selected forums at once. To remove a forum from the grouping, just "
+"click the x next to its name in the Bulk Edit area that appears."
+msgstr ""
+
+#: includes/admin/forums.php:162 includes/admin/forums.php:233
+#: includes/admin/replies.php:177 includes/admin/replies.php:245
+#: includes/admin/settings.php:1330 includes/admin/topics.php:178
+#: includes/admin/topics.php:246
+msgid "For more information:"
+msgstr ""
+
+#: includes/admin/forums.php:163 includes/admin/forums.php:234
+#: includes/admin/replies.php:178 includes/admin/replies.php:246
+#: includes/admin/settings.php:1331 includes/admin/topics.php:179
+#: includes/admin/topics.php:247
+msgid ""
+"<a href=\"http://codex.bbpress.org\" target=\"_blank\">bbPress "
+"Documentation</a>"
+msgstr ""
+
+#: includes/admin/forums.php:164 includes/admin/forums.php:235
+#: includes/admin/replies.php:179 includes/admin/replies.php:247
+#: includes/admin/settings.php:1332 includes/admin/topics.php:180
+#: includes/admin/topics.php:248
+msgid ""
+"<a href=\"http://bbpress.org/forums/\" target=\"_blank\">bbPress Support "
+"Forums</a>"
+msgstr ""
+
+#: includes/admin/forums.php:178
+msgid ""
+"The title field and the big forum editing Area are fixed in place, but you "
+"can reposition all the other boxes using drag and drop, and can minimize or "
+"expand them by clicking the title bar of each box. Use the Screen Options "
+"tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, "
+"Discussion, Slug, Author) or to choose a 1- or 2-column layout for this "
+"screen."
+msgstr ""
+
+#: includes/admin/forums.php:182 includes/admin/replies.php:197
+#: includes/admin/topics.php:198
+msgid "Customizing This Display"
+msgstr ""
+
+#: includes/admin/forums.php:188
+msgid "Title and Forum Editor"
+msgstr ""
+
+#: includes/admin/forums.php:190
+msgid ""
+"<strong>Title</strong> - Enter a title for your forum. After you enter a "
+"title, you&#8217;ll see the permalink below, which you can edit."
+msgstr ""
+
+#: includes/admin/forums.php:191
+msgid ""
+"<strong>Forum Editor</strong> - Enter the text for your forum. There are two "
+"modes of editing: Visual and HTML. Choose the mode by clicking on the "
+"appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon "
+"in the row to get a second row of controls. The HTML mode allows you to "
+"enter raw HTML along with your forum text. You can insert media files by "
+"clicking the icons above the forum editor and following the directions. You "
+"can go to the distraction-free writing screen via the Fullscreen icon in "
+"Visual mode (second to last in the top row) or the Fullscreen button in HTML "
+"mode (last in the row). Once there, you can make buttons visible by hovering "
+"over the top area. Exit Fullscreen back to the regular forum editor."
+msgstr ""
+
+#: includes/admin/forums.php:194
+msgid ""
+"<strong>Publish</strong> - You can set the terms of publishing your forum in "
+"the Publish box. For Status, Visibility, and Publish (immediately), click on "
+"the Edit link to reveal more options. Visibility includes options for "
+"password-protecting a forum or making it stay at the top of your blog "
+"indefinitely (sticky). Publish (immediately) allows you to set a future or "
+"past date and time, so you can schedule a forum to be published in the "
+"future or backdate a forum."
+msgstr ""
+
+#: includes/admin/forums.php:197
+msgid ""
+"<strong>forum Format</strong> - This designates how your theme will display "
+"a specific forum. For example, you could have a <em>standard</em> blog forum "
+"with a title and paragraphs, or a short <em>aside</em> that omits the title "
+"and contains a short text blurb. Please refer to the Codex for <a href="
+"\"http://codex.wordpress.org/Post_Formats#Supported_Formats\">descriptions "
+"of each forum format</a>. Your theme could enable all or some of 10 possible "
+"formats."
+msgstr ""
+
+#: includes/admin/forums.php:201
+msgid ""
+"<strong>Featured Image</strong> - This allows you to associate an image with "
+"your forum without inserting it. This is usually useful only if your theme "
+"makes use of the featured image as a forum thumbnail on the home page, a "
+"custom header, etc."
+msgstr ""
+
+#: includes/admin/forums.php:206 includes/admin/forums.php:254
+msgid "Forum Attributes"
+msgstr ""
+
+#: includes/admin/forums.php:208
+msgid "Select the attributes that your forum should have:"
+msgstr ""
+
+#: includes/admin/forums.php:210
+msgid ""
+"<strong>Type</strong> indicates if the forum is a category or forum. "
+"Categories generally contain other forums."
+msgstr ""
+
+#: includes/admin/forums.php:211
+msgid ""
+"<strong>Status</strong> allows you to close a forum to new topics and forums."
+msgstr ""
+
+#: includes/admin/forums.php:212
+msgid ""
+"<strong>Visibility</strong> lets you pick the scope of each forum and what "
+"users are allowed to access it."
+msgstr ""
+
+#: includes/admin/forums.php:213
+msgid ""
+"<strong>Parent</strong> dropdown determines the parent forum. Select the "
+"forum or category from the dropdown, or leave the default (No Parent) to "
+"create the forum at the root of your forums."
+msgstr ""
+
+#: includes/admin/forums.php:214
+msgid "<strong>Order</strong> allows you to order your forums numerically."
+msgstr ""
+
+#: includes/admin/forums.php:220 includes/admin/replies.php:232
+#: includes/admin/topics.php:233
+msgid "Publish Box"
+msgstr ""
+
+#: includes/admin/forums.php:226 includes/admin/replies.php:238
+#: includes/admin/topics.php:239
+msgid "Discussion Settings"
+msgstr ""
+
+#: includes/admin/forums.php:228 includes/admin/replies.php:240
+#: includes/admin/topics.php:241
+msgid ""
+"<strong>Send Trackbacks</strong> - Trackbacks are a way to notify legacy "
+"blog systems that you&#8217;ve linked to them. Enter the URL(s) you want to "
+"send trackbacks. If you link to other WordPress sites they&#8217;ll be "
+"notified automatically using pingbacks, and this field is unnecessary."
+msgstr ""
+
+#: includes/admin/forums.php:229
+msgid ""
+"<strong>Discussion</strong> - You can turn comments and pings on or off, and "
+"if there are comments on the forum, you can see them here and moderate them."
+msgstr ""
+
+#: includes/admin/forums.php:423
+#: templates/default/bbpress/content-single-topic-lead.php:18
+#: templates/default/bbpress/content-single-topic-lead.php:90
+msgid "Creator"
+msgstr ""
+
+#: includes/admin/forums.php:424 includes/admin/replies.php:624
+#: includes/admin/topics.php:690
+msgid "Created"
+msgstr ""
+
+#: includes/admin/forums.php:425 includes/admin/topics.php:691
+#: templates/default/bbpress/loop-forums.php:22
+#: templates/default/bbpress/loop-topics.php:22
+msgid "Freshness"
+msgstr ""
+
+#: includes/admin/forums.php:462 includes/admin/replies.php:732
+#: includes/admin/topics.php:770
+msgid "%1$s <br /> %2$s"
+msgstr ""
+
+#: includes/admin/forums.php:474 includes/forums/template-tags.php:533
+msgid "No Topics"
+msgstr ""
+
+#: includes/admin/forums.php:540
+msgid "Forum updated. <a href=\"%s\">View forum</a>"
+msgstr ""
+
+#: includes/admin/forums.php:543 includes/admin/replies.php:904
+#: includes/admin/topics.php:976
+msgid "Custom field updated."
+msgstr ""
+
+#: includes/admin/forums.php:546 includes/admin/replies.php:907
+#: includes/admin/topics.php:979
+msgid "Custom field deleted."
+msgstr ""
+
+#: includes/admin/forums.php:549
+msgid "Forum updated."
+msgstr ""
+
+#. translators: %s: date and time of the revision
+#: includes/admin/forums.php:554
+msgid "Forum restored to revision from %s"
+msgstr ""
+
+#: includes/admin/forums.php:558
+msgid "Forum created. <a href=\"%s\">View forum</a>"
+msgstr ""
+
+#: includes/admin/forums.php:561
+msgid "Forum saved."
+msgstr ""
+
+#: includes/admin/forums.php:564
+msgid "Forum submitted. <a target=\"_blank\" href=\"%s\">Preview forum</a>"
+msgstr ""
+
+#: includes/admin/forums.php:567
+msgid ""
+"Forum scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href=\"%2$s"
+"\">Preview forum</a>"
+msgstr ""
+
+#. translators: Publish box date format, see http:php.net/date
+#: includes/admin/forums.php:569 includes/admin/replies.php:930
+#: includes/admin/topics.php:1002
+msgid "M j, Y @ G:i"
+msgstr ""
+
+#: includes/admin/forums.php:574
+msgid "Forum draft updated. <a target=\"_blank\" href=\"%s\">Preview forum</a>"
+msgstr ""
+
+#: includes/admin/metaboxes.php:42
+msgid "Discussion"
+msgstr ""
+
+#: includes/admin/metaboxes.php:127
+msgid "Users &amp; Moderation"
+msgstr ""
+
+#: includes/admin/metaboxes.php:135
+msgid "User"
+msgid_plural "Users"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/metaboxes.php:154
+msgid "Hidden Topic"
+msgid_plural "Hidden Topics"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/metaboxes.php:176
+msgid "Hidden Reply"
+msgid_plural "Hidden Replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/metaboxes.php:198
+msgid "Empty Topic Tag"
+msgid_plural "Empty Topic Tags"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/admin/metaboxes.php:222
+msgid "You are using <span class=\"b\">bbPress %s</span>."
+msgstr ""
+
+#: includes/admin/metaboxes.php:261 includes/admin/metaboxes.php:262
+#: includes/admin/metaboxes.php:351
+msgid "Type:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:273 includes/admin/metaboxes.php:274
+#: templates/default/bbpress/form-forum.php:111
+msgid "Status:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:285 includes/admin/metaboxes.php:286
+#: templates/default/bbpress/form-forum.php:120
+msgid "Visibility:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:299
+msgid "Parent:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:300
+msgid "Forum Parent"
+msgstr ""
+
+#: includes/admin/metaboxes.php:315 includes/admin/metaboxes.php:373
+#: includes/admin/metaboxes.php:426
+msgid "&mdash; No parent &mdash;"
+msgstr ""
+
+#: includes/admin/metaboxes.php:323
+msgid "Order:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:324
+msgid "Forum Order"
+msgstr ""
+
+#: includes/admin/metaboxes.php:352
+msgid "Topic Type"
+msgstr ""
+
+#: includes/admin/metaboxes.php:467
+#: templates/default/bbpress/form-topic-tag.php:35
+msgid "Name:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:468
+#: templates/default/bbpress/form-user-edit.php:14
+#: templates/default/bbpress/form-user-edit.php:19
+msgid "Name"
+msgstr ""
+
+#: includes/admin/metaboxes.php:473
+msgid "Email:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:474
+#: templates/default/bbpress/form-user-edit.php:105
+#: templates/default/bbpress/form-user-register.php:28
+msgid "Email"
+msgstr ""
+
+#: includes/admin/metaboxes.php:479
+#: templates/default/bbpress/form-anonymous.php:32
+msgid "Website:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:480
+#: templates/default/bbpress/form-user-edit.php:57
+msgid "Website"
+msgstr ""
+
+#: includes/admin/metaboxes.php:487
+msgid "IP:"
+msgstr ""
+
+#: includes/admin/metaboxes.php:488
+msgid "IP Address"
+msgstr ""
+
+#: includes/admin/replies.php:134
+msgid ""
+"This screen provides access to all of your replies. You can customize the "
+"display of this screen to suit your workflow."
+msgstr ""
+
+#: includes/admin/replies.php:144
+msgid ""
+"You can hide/display columns based on your needs and decide how many replies "
+"to list per screen using the Screen Options tab."
+msgstr ""
+
+#: includes/admin/replies.php:145
+msgid ""
+"You can filter the list of replies by reply status using the text links in "
+"the upper left to show All, Published, Draft, or Trashed replies. The "
+"default view is to show all replies."
+msgstr ""
+
+#: includes/admin/replies.php:146
+msgid ""
+"You can view replies in a simple title list or with an excerpt. Choose the "
+"view you prefer by clicking on the icons at the top of the list on the right."
+msgstr ""
+
+#: includes/admin/replies.php:147
+msgid ""
+"You can refine the list to show only replies in a specific category or from "
+"a specific month by using the dropdown menus above the replies list. Click "
+"the Filter button after making your selection. You also can refine the list "
+"by clicking on the reply author, category or tag in the replies list."
+msgstr ""
+
+#: includes/admin/replies.php:156
+msgid ""
+"Hovering over a row in the replies list will display action links that allow "
+"you to manage your reply. You can perform the following actions:"
+msgstr ""
+
+#: includes/admin/replies.php:158
+msgid ""
+"<strong>Edit</strong> takes you to the editing screen for that reply. You "
+"can also reach that screen by clicking on the reply title."
+msgstr ""
+
+#: includes/admin/replies.php:160
+msgid ""
+"<strong>Trash</strong> removes your reply from this list and places it in "
+"the trash, from which you can permanently delete it."
+msgstr ""
+
+#: includes/admin/replies.php:161
+msgid ""
+"<strong>Spam</strong> removes your reply from this list and places it in the "
+"spam queue, from which you can permanently delete it."
+msgstr ""
+
+#: includes/admin/replies.php:162
+msgid ""
+"<strong>Preview</strong> will show you what your draft reply will look like "
+"if you publish it. View will take you to your live site to view the reply. "
+"Which link is available depends on your reply&#8217;s status."
+msgstr ""
+
+#: includes/admin/replies.php:171
+msgid ""
+"You can also edit or move multiple replies to the trash at once. Select the "
+"replies you want to act on using the checkboxes, then select the action you "
+"want to take from the Bulk Actions menu and click Apply."
+msgstr ""
+
+#: includes/admin/replies.php:172
+msgid ""
+"When using Bulk Edit, you can change the metadata (categories, author, etc.) "
+"for all selected replies at once. To remove a reply from the grouping, just "
+"click the x next to its name in the Bulk Edit area that appears."
+msgstr ""
+
+#: includes/admin/replies.php:193
+msgid ""
+"The title field and the big reply editing Area are fixed in place, but you "
+"can reposition all the other boxes using drag and drop, and can minimize or "
+"expand them by clicking the title bar of each box. Use the Screen Options "
+"tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, "
+"Discussion, Slug, Author) or to choose a 1- or 2-column layout for this "
+"screen."
+msgstr ""
+
+#: includes/admin/replies.php:203
+msgid "Title and Reply Editor"
+msgstr ""
+
+#: includes/admin/replies.php:205
+msgid ""
+"<strong>Title</strong> - Enter a title for your reply. After you enter a "
+"title, you&#8217;ll see the permalink below, which you can edit."
+msgstr ""
+
+#: includes/admin/replies.php:206
+msgid ""
+"<strong>Reply Editor</strong> - Enter the text for your reply. There are two "
+"modes of editing: Visual and HTML. Choose the mode by clicking on the "
+"appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon "
+"in the row to get a second row of controls. The HTML mode allows you to "
+"enter raw HTML along with your reply text. You can insert media files by "
+"clicking the icons above the reply editor and following the directions. You "
+"can go to the distraction-free writing screen via the Fullscreen icon in "
+"Visual mode (second to last in the top row) or the Fullscreen button in HTML "
+"mode (last in the row). Once there, you can make buttons visible by hovering "
+"over the top area. Exit Fullscreen back to the regular reply editor."
+msgstr ""
+
+#: includes/admin/replies.php:209
+msgid ""
+"<strong>Publish</strong> - You can set the terms of publishing your reply in "
+"the Publish box. For Status, Visibility, and Publish (immediately), click on "
+"the Edit link to reveal more options. Visibility includes options for "
+"password-protecting a reply or making it stay at the top of your blog "
+"indefinitely (sticky). Publish (immediately) allows you to set a future or "
+"past date and time, so you can schedule a reply to be published in the "
+"future or backdate a reply."
+msgstr ""
+
+#: includes/admin/replies.php:212
+msgid ""
+"<strong>reply Format</strong> - This designates how your theme will display "
+"a specific reply. For example, you could have a <em>standard</em> blog reply "
+"with a title and paragraphs, or a short <em>aside</em> that omits the title "
+"and contains a short text blurb. Please refer to the Codex for <a href="
+"\"http://codex.wordpress.org/Post_Formats#Supported_Formats\">descriptions "
+"of each reply format</a>. Your theme could enable all or some of 10 possible "
+"formats."
+msgstr ""
+
+#: includes/admin/replies.php:216
+msgid ""
+"<strong>Featured Image</strong> - This allows you to associate an image with "
+"your reply without inserting it. This is usually useful only if your theme "
+"makes use of the featured image as a reply thumbnail on the home page, a "
+"custom header, etc."
+msgstr ""
+
+#: includes/admin/replies.php:221 includes/admin/replies.php:266
+msgid "Reply Attributes"
+msgstr ""
+
+#: includes/admin/replies.php:223
+msgid "Select the attributes that your reply should have:"
+msgstr ""
+
+#: includes/admin/replies.php:225
+msgid ""
+"<strong>Forum</strong> dropdown determines the parent forum that the reply "
+"belongs to. Select the forum, or leave the default (Use Forum of Topic) to "
+"post the reply in forum of the topic."
+msgstr ""
+
+#: includes/admin/replies.php:226
+msgid ""
+"<strong>Topic</strong> determines the parent topic that the reply belongs to."
+msgstr ""
+
+#: includes/admin/replies.php:241
+msgid ""
+"<strong>Discussion</strong> - You can turn comments and pings on or off, and "
+"if there are comments on the reply, you can see them here and moderate them."
+msgstr ""
+
+#: includes/admin/replies.php:351 includes/admin/topics.php:369
+#: templates/default/bbpress/form-anonymous.php:17
+msgid "Author Information"
+msgstr ""
+
+#: includes/admin/replies.php:512
+msgid "The reply was not found!"
+msgstr ""
+
+#: includes/admin/replies.php:515 includes/admin/topics.php:541
+msgid "You do not have the permission to do that!"
+msgstr ""
+
+#: includes/admin/replies.php:583
+msgid "There was a problem marking the reply \"%1$s\" as spam."
+msgstr ""
+
+#: includes/admin/replies.php:583
+msgid "Reply \"%1$s\" successfully marked as spam."
+msgstr ""
+
+#: includes/admin/replies.php:587
+msgid "There was a problem unmarking the reply \"%1$s\" as spam."
+msgstr ""
+
+#: includes/admin/replies.php:587
+msgid "Reply \"%1$s\" successfully unmarked as spam."
+msgstr ""
+
+#: includes/admin/replies.php:620
+msgid "Title"
+msgstr ""
+
+#: includes/admin/replies.php:623 includes/admin/topics.php:689
+#: templates/default/bbpress/loop-replies.php:18
+#: templates/default/bbpress/loop-replies.php:52
+msgid "Author"
+msgstr ""
+
+#: includes/admin/replies.php:677 includes/admin/replies.php:685
+msgid "No Topic"
+msgstr ""
+
+#: includes/admin/replies.php:703 includes/admin/replies.php:718
+#: includes/admin/topics.php:741
+msgid "No Forum"
+msgstr ""
+
+#: includes/admin/replies.php:709
+msgid "(Mismatch)"
+msgstr ""
+
+#: includes/admin/replies.php:777 includes/admin/topics.php:830
+msgid "View &#8220;%s&#8221;"
+msgstr ""
+
+#: includes/admin/replies.php:777 includes/admin/topics.php:830
+msgid "View"
+msgstr ""
+
+#: includes/admin/replies.php:788
+msgid "Mark the reply as not spam"
+msgstr ""
+
+#: includes/admin/replies.php:788 includes/admin/topics.php:861
+msgid "Not spam"
+msgstr ""
+
+#: includes/admin/replies.php:790
+msgid "Mark this reply as spam"
+msgstr ""
+
+#: includes/admin/replies.php:790 includes/admin/topics.php:863
+#: includes/replies/template-tags.php:1719
+#: includes/topics/template-tags.php:2643
+msgid "Spam"
+msgstr ""
+
+#: includes/admin/replies.php:799 includes/admin/topics.php:871
+#: includes/replies/template-tags.php:1663
+#: includes/topics/template-tags.php:2401
+msgid "Restore this item from the Trash"
+msgstr ""
+
+#: includes/admin/replies.php:799 includes/admin/topics.php:871
+#: includes/replies/template-tags.php:1649
+#: includes/topics/template-tags.php:2387
+msgid "Restore"
+msgstr ""
+
+#: includes/admin/replies.php:801 includes/admin/topics.php:873
+#: includes/replies/template-tags.php:1665
+#: includes/topics/template-tags.php:2403
+msgid "Move this item to the Trash"
+msgstr ""
+
+#: includes/admin/replies.php:801 includes/admin/topics.php:873
+#: includes/replies/template-tags.php:1648
+#: includes/topics/template-tags.php:2386
+msgid "Trash"
+msgstr ""
+
+#: includes/admin/replies.php:805 includes/admin/topics.php:877
+#: includes/replies/template-tags.php:1669
+#: includes/topics/template-tags.php:2407
+msgid "Delete this item permanently"
+msgstr ""
+
+#: includes/admin/replies.php:805 includes/admin/topics.php:877
+msgid "Delete Permanently"
+msgstr ""
+
+#: includes/admin/replies.php:831 includes/admin/topics.php:903
+msgid "Empty Spam"
+msgstr ""
+
+#: includes/admin/replies.php:841 includes/admin/topics.php:913
+msgid "In all forums"
+msgstr ""
+
+#: includes/admin/replies.php:901
+msgid "Reply updated. <a href=\"%s\">View topic</a>"
+msgstr ""
+
+#: includes/admin/replies.php:910
+msgid "Reply updated."
+msgstr ""
+
+#. translators: %s: date and time of the revision
+#: includes/admin/replies.php:915
+msgid "Reply restored to revision from %s"
+msgstr ""
+
+#: includes/admin/replies.php:919
+msgid "Reply created. <a href=\"%s\">View topic</a>"
+msgstr ""
+
+#: includes/admin/replies.php:922
+msgid "Reply saved."
+msgstr ""
+
+#: includes/admin/replies.php:925
+msgid "Reply submitted. <a target=\"_blank\" href=\"%s\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/replies.php:928
+msgid ""
+"Reply scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href=\"%2$s"
+"\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/replies.php:935
+msgid "Reply draft updated. <a target=\"_blank\" href=\"%s\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/settings.php:24 includes/admin/settings.php:1292
+msgid "Main Settings"
+msgstr ""
+
+#: includes/admin/settings.php:29
+msgid "Theme Packages"
+msgstr ""
+
+#: includes/admin/settings.php:34 includes/admin/settings.php:1312
+msgid "Per Page"
+msgstr ""
+
+#: includes/admin/settings.php:39
+msgid "Per RSS Page"
+msgstr ""
+
+#: includes/admin/settings.php:44
+msgid "Archive Slugs"
+msgstr ""
+
+#: includes/admin/settings.php:49
+msgid "Single Slugs"
+msgstr ""
+
+#: includes/admin/settings.php:54
+msgid "BuddyPress"
+msgstr ""
+
+#: includes/admin/settings.php:59
+msgid "Akismet"
+msgstr ""
+
+#: includes/admin/settings.php:81
+msgid "Disallow editing after"
+msgstr ""
+
+#: includes/admin/settings.php:89
+msgid "Throttle posting every"
+msgstr ""
+
+#: includes/admin/settings.php:97 includes/admin/settings.php:1425
+msgid "Revisions"
+msgstr ""
+
+#: includes/admin/settings.php:105 includes/extend/buddypress/loader.php:213
+#: templates/default/bbpress/user-details.php:48
+msgid "Favorites"
+msgstr ""
+
+#: includes/admin/settings.php:113 includes/extend/buddypress/loader.php:225
+#: templates/default/bbpress/user-details.php:58
+msgid "Subscriptions"
+msgstr ""
+
+#: includes/admin/settings.php:121
+msgid "Topic tags"
+msgstr ""
+
+#: includes/admin/settings.php:129
+msgid "Anonymous posting"
+msgstr ""
+
+#: includes/admin/settings.php:137
+msgid "Default user role"
+msgstr ""
+
+#: includes/admin/settings.php:145
+msgid "Auto role"
+msgstr ""
+
+#: includes/admin/settings.php:153
+msgid "Fancy editor"
+msgstr ""
+
+#: includes/admin/settings.php:161
+msgid "Auto-embed links"
+msgstr ""
+
+#: includes/admin/settings.php:174
+msgid "Current Package"
+msgstr ""
+
+#: includes/admin/settings.php:229 includes/admin/settings.php:1438
+msgid "Forums base"
+msgstr ""
+
+#: includes/admin/settings.php:237 includes/admin/settings.php:1441
+msgid "Topics base"
+msgstr ""
+
+#: includes/admin/settings.php:250
+msgid "Forum Prefix"
+msgstr ""
+
+#: includes/admin/settings.php:258 includes/admin/settings.php:1444
+msgid "Forum slug"
+msgstr ""
+
+#: includes/admin/settings.php:266 includes/admin/settings.php:1447
+msgid "Topic slug"
+msgstr ""
+
+#: includes/admin/settings.php:274 includes/admin/settings.php:1459
+msgid "Topic tag slug"
+msgstr ""
+
+#: includes/admin/settings.php:282 includes/admin/settings.php:1450
+msgid "Reply slug"
+msgstr ""
+
+#: includes/admin/settings.php:290
+msgid "User slug"
+msgstr ""
+
+#: includes/admin/settings.php:298
+msgid "Topic view slug"
+msgstr ""
+
+#: includes/admin/settings.php:311
+msgid "Enable Group Forums"
+msgstr ""
+
+#: includes/admin/settings.php:319
+msgid "Group Forums Parent"
+msgstr ""
+
+#: includes/admin/settings.php:332
+msgid "Use Akismet"
+msgstr ""
+
+#: includes/admin/settings.php:370
+msgid "Main forum settings for enabling features and setting time limits"
+msgstr ""
+
+#: includes/admin/settings.php:386 includes/common/functions.php:121
+msgid "minutes"
+msgstr ""
+
+#: includes/admin/settings.php:402 includes/common/functions.php:122
+msgid "seconds"
+msgstr ""
+
+#: includes/admin/settings.php:418
+msgid "Allow users to mark topics as favorites"
+msgstr ""
+
+#: includes/admin/settings.php:434
+msgid "Allow users to subscribe to topics"
+msgstr ""
+
+#: includes/admin/settings.php:450
+msgid "Allow topics to have tags"
+msgstr ""
+
+#: includes/admin/settings.php:466
+msgid "Allow topic and reply revision logging"
+msgstr ""
+
+#: includes/admin/settings.php:482
+msgid "Allow guest users without accounts to create topics and replies"
+msgstr ""
+
+#: includes/admin/settings.php:498
+msgid ""
+"Automatically assign default role to new, registered users upon visiting the "
+"site."
+msgstr ""
+
+#: includes/admin/settings.php:536
+msgid "Use the fancy WordPress editor to create and edit topics and replies"
+msgstr ""
+
+#: includes/admin/settings.php:549
+msgid "How your forum content is displayed within your existing theme."
+msgstr ""
+
+#: includes/admin/settings.php:573
+msgid "%1$s - %2$s"
+msgstr ""
+
+#: includes/admin/settings.php:579
+msgid "will serve all bbPress templates"
+msgstr ""
+
+#: includes/admin/settings.php:583
+msgid "No template packages available."
+msgstr ""
+
+#: includes/admin/settings.php:599
+msgid ""
+"Embed media (YouTube, Twitter, Flickr, etc...) directly into topics and "
+"replies"
+msgstr ""
+
+#: includes/admin/settings.php:614
+msgid "How many topics and replies to show per page"
+msgstr ""
+
+#: includes/admin/settings.php:630 includes/admin/settings.php:646
+#: includes/admin/settings.php:677 includes/admin/settings.php:693
+msgid "per page"
+msgstr ""
+
+#: includes/admin/settings.php:661
+msgid "How many topics and replies to show per RSS page"
+msgstr ""
+
+#: includes/admin/settings.php:711
+msgid ""
+"Custom root slugs to prefix your forums and topics with. These can be "
+"partnered with WordPress pages to allow more flexibility."
+msgstr ""
+
+#: includes/admin/settings.php:760
+msgid ""
+"Custom slugs for single forums, topics, replies, tags, users, and views "
+"here. If you change these, existing permalinks will also change."
+msgstr ""
+
+#: includes/admin/settings.php:776
+msgid "Prefix your forum area with the Forum Base slug (Recommended)"
+msgstr ""
+
+#: includes/admin/settings.php:896
+msgid "Forum settings for BuddyPress"
+msgstr ""
+
+#: includes/admin/settings.php:912
+msgid "Allow BuddyPress Groups to have their own forums"
+msgstr ""
+
+#: includes/admin/settings.php:929
+msgid "&mdash; Forum root &mdash;"
+msgstr ""
+
+#: includes/admin/settings.php:937
+msgid "is the parent for all group forums"
+msgstr ""
+
+#: includes/admin/settings.php:938
+msgid ""
+"Using the Forum Root is not recommended. Changing this does not move "
+"existing forums."
+msgstr ""
+
+#: includes/admin/settings.php:953
+msgid "Forum settings for Akismet"
+msgstr ""
+
+#: includes/admin/settings.php:970
+msgid "Allow Akismet to actively prevent forum spam."
+msgstr ""
+
+#: includes/admin/settings.php:993
+msgid "Forums Settings"
+msgstr ""
+
+#: includes/admin/settings.php:1002
+#: templates/default/bbpress/form-user-edit.php:175
+msgid "Save Changes"
+msgstr ""
+
+#: includes/admin/settings.php:1021
+msgid ""
+"Information about your previous forums database so that they can be "
+"converted. <strong>Backup your database before proceeding.</strong>"
+msgstr ""
+
+#: includes/admin/settings.php:1051
+msgid "is the previous forum software"
+msgstr ""
+
+#: includes/admin/settings.php:1065
+msgid "IP or hostname"
+msgstr ""
+
+#: includes/admin/settings.php:1079
+msgid "Use default 3306 if unsure"
+msgstr ""
+
+#: includes/admin/settings.php:1093
+msgid "User for your database connection"
+msgstr ""
+
+#: includes/admin/settings.php:1107
+msgid "Password to access the database"
+msgstr ""
+
+#: includes/admin/settings.php:1121
+msgid "Name of the database with your old forum data"
+msgstr ""
+
+#: includes/admin/settings.php:1134
+msgid "Some optional parameters to help tune the conversion process."
+msgstr ""
+
+#: includes/admin/settings.php:1148
+msgid ""
+"(If converting from BuddyPress Forums, use \"wp_bb_\" or your custom prefix)"
+msgstr ""
+
+#: includes/admin/settings.php:1162
+msgid "rows to process at a time"
+msgstr ""
+
+#: includes/admin/settings.php:1163
+msgid "Keep this low if you experience out-of-memory issues."
+msgstr ""
+
+#: includes/admin/settings.php:1177
+msgid "second(s) delay between each group of rows"
+msgstr ""
+
+#: includes/admin/settings.php:1178
+msgid "Keep this high to prevent too-many-connection issues."
+msgstr ""
+
+#: includes/admin/settings.php:1192
+msgid "Start a fresh conversion from the beginning"
+msgstr ""
+
+#: includes/admin/settings.php:1193
+msgid "You should clean old conversion information before starting over."
+msgstr ""
+
+#: includes/admin/settings.php:1207
+msgid "Purge all information from a previously attempted import"
+msgstr ""
+
+#: includes/admin/settings.php:1208
+msgid ""
+"Use this if an import failed and you want to remove that incomplete data."
+msgstr ""
+
+#: includes/admin/settings.php:1222
+msgid "Attempt to import user accounts from previous forums"
+msgstr ""
+
+#: includes/admin/settings.php:1223
+msgid ""
+"Non-bbPress passwords cannot be automatically converted. They will be "
+"converted as each user logs in."
+msgstr ""
+
+#: includes/admin/settings.php:1253
+msgid "Start"
+msgstr ""
+
+#: includes/admin/settings.php:1254
+msgid "Stop"
+msgstr ""
+
+#: includes/admin/settings.php:1285
+msgid "This screen provides access to all of the Forums settings."
+msgstr ""
+
+#: includes/admin/settings.php:1286
+msgid ""
+"Please see the additional help tabs for more information on each indiviual "
+"section."
+msgstr ""
+
+#: includes/admin/settings.php:1293
+msgid "In the Main Settings you have a number of options:"
+msgstr ""
+
+#: includes/admin/settings.php:1296
+msgid ""
+"You can choose to lock a post after a certain number of minutes. \"Locking "
+"post editing\" will prevent the author from editing some amount of time "
+"after saving a post."
+msgstr ""
+
+#: includes/admin/settings.php:1297
+msgid ""
+"\"Throttle time\" is the amount of time required between posts from a single "
+"author. The higher the throttle time, the longer a user will need to wait "
+"between posting to the forum."
+msgstr ""
+
+#: includes/admin/settings.php:1298
+msgid ""
+"Favorites are a way for users to save and later return to topics they favor. "
+"This is enabled by default."
+msgstr ""
+
+#: includes/admin/settings.php:1299
+msgid ""
+"Subscriptions allow users to subscribe for notifications to topics that "
+"interest them. This is enabled by default."
+msgstr ""
+
+#: includes/admin/settings.php:1300
+msgid ""
+"Topic-Tags allow users to filter topics between forums. This is enabled by "
+"default."
+msgstr ""
+
+#: includes/admin/settings.php:1301
+msgid ""
+"\"Anonymous Posting\" allows guest users who do not have accounts on your "
+"site to both create topics as well as replies."
+msgstr ""
+
+#: includes/admin/settings.php:1302
+msgid ""
+"The Fancy Editor brings the luxury of the Visual editor and HTML editor from "
+"the traditional WordPress dashboard into your theme."
+msgstr ""
+
+#: includes/admin/settings.php:1303
+msgid ""
+"Auto-embed will embed the media content from a URL directly into the "
+"replies. For example: links to Flickr and YouTube."
+msgstr ""
+
+#: includes/admin/settings.php:1306
+msgid ""
+"You must click the Save Changes button at the bottom of the screen for new "
+"settings to take effect."
+msgstr ""
+
+#: includes/admin/settings.php:1313
+msgid ""
+"Per Page settings allow you to control the number of topics and replies "
+"appear on each page."
+msgstr ""
+
+#: includes/admin/settings.php:1314
+msgid ""
+"This is comparable to the WordPress \"Reading Settings\" page, where you can "
+"set the number of posts that should show on blog pages and in feeds."
+msgstr ""
+
+#: includes/admin/settings.php:1315
+msgid ""
+"These are broken up into two separate groups: one for what appears in your "
+"theme, another for RSS feeds."
+msgstr ""
+
+#: includes/admin/settings.php:1321
+msgid "Slugs"
+msgstr ""
+
+#: includes/admin/settings.php:1322
+msgid ""
+"The Slugs section allows you to control the permalink structure for your "
+"forums."
+msgstr ""
+
+#: includes/admin/settings.php:1323
+msgid ""
+"\"Archive Slugs\" are used as the \"root\" for your forums and topics. If "
+"you combine these values with existing page slugs, bbPress will attempt to "
+"output the most correct title and content."
+msgstr ""
+
+#: includes/admin/settings.php:1324
+msgid ""
+"\"Single Slugs\" are used as a prefix when viewing an individual forum, "
+"topic, reply, user, or view."
+msgstr ""
+
+#: includes/admin/settings.php:1325
+msgid ""
+"In the event of a slug collision with WordPress or BuddyPress, a warning "
+"will appear next to the problem slug(s)."
+msgstr ""
+
+#: includes/admin/settings.php:1423
+#: templates/default/bbpress/loop-forums.php:21
+#: templates/default/bbpress/loop-replies.php:24
+#: templates/default/bbpress/loop-replies.php:58
+#: templates/default/bbpress/loop-topics.php:21
+msgid "Posts"
+msgstr ""
+
+#: includes/admin/settings.php:1424
+msgid "Pages"
+msgstr ""
+
+#: includes/admin/settings.php:1426
+msgid "Attachments"
+msgstr ""
+
+#: includes/admin/settings.php:1427
+msgid "Menus"
+msgstr ""
+
+#: includes/admin/settings.php:1430
+msgid "Tag base"
+msgstr ""
+
+#: includes/admin/settings.php:1433
+msgid "Category base"
+msgstr ""
+
+#: includes/admin/settings.php:1453
+msgid "User base"
+msgstr ""
+
+#: includes/admin/settings.php:1456
+msgid "View base"
+msgstr ""
+
+#: includes/admin/settings.php:1471
+msgid "%s page"
+msgstr ""
+
+#: includes/admin/settings.php:1490
+msgid "Possible %1$s conflict: <strong>%2$s</strong>"
+msgstr ""
+
+#: includes/admin/tools.php:36
+msgid ""
+"bbPress keeps track of relationships between forums, topics, replies, and "
+"topic tags, and users. Occasionally these relationships become out of sync, "
+"most often after an import or migration. Use the tools below to manually "
+"recalculate these relationships."
+msgstr ""
+
+#: includes/admin/tools.php:37
+msgid ""
+"Some of these tools create substantial database overhead. Avoid running more "
+"than 1 repair job at a time."
+msgstr ""
+
+#: includes/admin/tools.php:43
+msgid "Relationships to Repair:"
+msgstr ""
+
+#: includes/admin/tools.php:46
+msgid "Repair"
+msgstr ""
+
+#: includes/admin/tools.php:61
+msgid "Repair Items"
+msgstr ""
+
+#: includes/admin/tools.php:160
+msgid "Recalculate the parent topic for each post"
+msgstr ""
+
+#: includes/admin/tools.php:161
+msgid "Recalculate the parent forum for each post"
+msgstr ""
+
+#: includes/admin/tools.php:162
+msgid "Recalculate private and hidden forums"
+msgstr ""
+
+#: includes/admin/tools.php:163
+msgid "Recalculate last activity in each topic and forum"
+msgstr ""
+
+#: includes/admin/tools.php:164
+msgid "Repair BuddyPress Group Forum relationships"
+msgstr ""
+
+#: includes/admin/tools.php:165
+msgid "Count topics in each forum"
+msgstr ""
+
+#: includes/admin/tools.php:166
+msgid "Count replies in each forum"
+msgstr ""
+
+#: includes/admin/tools.php:167
+msgid "Count replies in each topic"
+msgstr ""
+
+#: includes/admin/tools.php:168
+msgid "Count voices in each topic"
+msgstr ""
+
+#: includes/admin/tools.php:169
+msgid "Count spammed & trashed replies in each topic"
+msgstr ""
+
+#: includes/admin/tools.php:170
+msgid "Count topics for each user"
+msgstr ""
+
+#: includes/admin/tools.php:171
+msgid "Count replies for each user"
+msgstr ""
+
+#: includes/admin/tools.php:172
+msgid "Remove trashed topics from user favorites"
+msgstr ""
+
+#: includes/admin/tools.php:173
+msgid "Remove trashed topics from user subscriptions"
+msgstr ""
+
+#: includes/admin/tools.php:174
+msgid "Remap existing users to default forum roles"
+msgstr ""
+
+#: includes/admin/tools.php:194
+msgid "Counting the number of replies in each topic&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:195 includes/admin/tools.php:238
+#: includes/admin/tools.php:280 includes/admin/tools.php:323
+#: includes/admin/tools.php:404 includes/admin/tools.php:438
+#: includes/admin/tools.php:470 includes/admin/tools.php:515
+#: includes/admin/tools.php:560 includes/admin/tools.php:622
+#: includes/admin/tools.php:689 includes/admin/tools.php:734
+#: includes/admin/tools.php:841 includes/admin/tools.php:890
+#: includes/admin/tools.php:944
+msgid "Failed!"
+msgstr ""
+
+#: includes/admin/tools.php:221 includes/admin/tools.php:264
+#: includes/admin/tools.php:290 includes/admin/tools.php:419
+#: includes/admin/tools.php:453 includes/admin/tools.php:498
+#: includes/admin/tools.php:543 includes/admin/tools.php:605
+#: includes/admin/tools.php:666 includes/admin/tools.php:824
+#: includes/admin/tools.php:874 includes/admin/tools.php:928
+#: includes/admin/tools.php:973
+msgid "Complete!"
+msgstr ""
+
+#: includes/admin/tools.php:237
+msgid "Counting the number of voices in each topic&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:279
+msgid ""
+"Counting the number of spammed and trashed replies in each topic&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:304
+msgid "Repairing BuddyPress group-forum relationships&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:375
+msgid "Group Forums"
+msgstr ""
+
+#: includes/admin/tools.php:384
+msgid "Complete! %s groups updated; %s forums updated."
+msgstr ""
+
+#: includes/admin/tools.php:403
+msgid "Counting the number of topics in each forum&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:437
+msgid "Counting the number of replies in each forum&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:469
+msgid "Counting the number of topics each user has created&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:514
+msgid "Counting the number of topics to which each user has replied&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:559
+msgid "Removing trashed topics from user favorites&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:589 includes/admin/tools.php:650
+msgid "Nothing to remove!"
+msgstr ""
+
+#: includes/admin/tools.php:621
+msgid "Removing trashed topics from user subscriptions&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:683
+msgid "Remapping forum role for each user on this site&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:717
+msgid "Complete! %s users updated."
+msgstr ""
+
+#: includes/admin/tools.php:733
+msgid "Recomputing latest post in every topic and forum&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:840
+msgid "Recalculating forum visibility &hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:889
+msgid "Recalculating the forum for each post &hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:943
+msgid "Recalculating the topic for each post &hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:996
+msgid ""
+"This will revert your forums back to a brand new installation. This process "
+"cannot be undone. <strong>Backup your database before proceeding</strong>."
+msgstr ""
+
+#: includes/admin/tools.php:1002
+msgid "The following data will be removed:"
+msgstr ""
+
+#: includes/admin/tools.php:1007
+msgid "All Topic Tags"
+msgstr ""
+
+#: includes/admin/tools.php:1008
+msgid "Related Meta Data"
+msgstr ""
+
+#: includes/admin/tools.php:1009
+msgid "Forum Settings"
+msgstr ""
+
+#: includes/admin/tools.php:1010
+msgid "Forum Activity"
+msgstr ""
+
+#: includes/admin/tools.php:1011
+msgid "Forum User Roles"
+msgstr ""
+
+#: includes/admin/tools.php:1012
+msgid "Importer Helper Data"
+msgstr ""
+
+#: includes/admin/tools.php:1016
+msgid "Are you sure you want to do this?"
+msgstr ""
+
+#: includes/admin/tools.php:1019
+msgid "Say it ain't so!"
+msgstr ""
+
+#: includes/admin/tools.php:1020
+msgid "This process cannot be undone."
+msgstr ""
+
+#: includes/admin/tools.php:1028
+msgid "Reset bbPress"
+msgstr ""
+
+#: includes/admin/tools.php:1053
+msgid "Failed"
+msgstr ""
+
+#: includes/admin/tools.php:1054
+msgid "Success!"
+msgstr ""
+
+#: includes/admin/tools.php:1061
+msgid "Deleting Posts&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:1074
+msgid "Deleting Post Meta&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:1087
+msgid "Deleting User Meta&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:1094
+msgid "Deleting Conversion Table&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:1106
+msgid "Deleting Settings&hellip; %s"
+msgstr ""
+
+#: includes/admin/tools.php:1112
+msgid "Deleting Roles and Capabilities&hellip; %s"
+msgstr ""
+
+#: includes/admin/topics.php:134
+msgid ""
+"This screen displays the individual topics on your site. You can customize "
+"the display of this screen to suit your workflow."
+msgstr ""
+
+#: includes/admin/topics.php:144
+msgid ""
+"You can hide/display columns based on your needs and decide how many topics "
+"to list per screen using the Screen Options tab."
+msgstr ""
+
+#: includes/admin/topics.php:145
+msgid ""
+"You can filter the list of topics by topic status using the text links in "
+"the upper left to show All, Published, or Trashed topics. The default view "
+"is to show all topics."
+msgstr ""
+
+#: includes/admin/topics.php:146
+msgid ""
+"You can refine the list to show only topics from a specific month by using "
+"the dropdown menus above the topics list. Click the Filter button after "
+"making your selection. You also can refine the list by clicking on the topic "
+"creator in the topics list."
+msgstr ""
+
+#: includes/admin/topics.php:155
+msgid ""
+"Hovering over a row in the topics list will display action links that allow "
+"you to manage your topic. You can perform the following actions:"
+msgstr ""
+
+#: includes/admin/topics.php:157
+msgid ""
+"<strong>Edit</strong> takes you to the editing screen for that topic. You "
+"can also reach that screen by clicking on the topic title."
+msgstr ""
+
+#: includes/admin/topics.php:158
+msgid ""
+"<strong>Trash</strong> removes your topic from this list and places it in "
+"the trash, from which you can permanently delete it."
+msgstr ""
+
+#: includes/admin/topics.php:159
+msgid ""
+"<strong>Spam</strong> removes your topic from this list and places it in the "
+"spam queue, from which you can permanently delete it."
+msgstr ""
+
+#: includes/admin/topics.php:160
+msgid ""
+"<strong>Preview</strong> will show you what your draft topic will look like "
+"if you publish it. View will take you to your live site to view the topic. "
+"Which link is available depends on your topic&#8217;s status."
+msgstr ""
+
+#: includes/admin/topics.php:161
+msgid ""
+"<strong>Close</strong> will mark the selected topic as &#8217;closed&#8217; "
+"and disable the option to post new replies to the topic."
+msgstr ""
+
+#: includes/admin/topics.php:162
+msgid ""
+"<strong>Stick</strong> will keep the selected topic &#8217;pinned&#8217; to "
+"the top the parent forum topic list."
+msgstr ""
+
+#: includes/admin/topics.php:163
+msgid ""
+"<strong>Stick <em>(to front)</em></strong> will keep the selected topic "
+"&#8217;pinned&#8217; to the top of ALL forums and be visable in any forums "
+"topics list."
+msgstr ""
+
+#: includes/admin/topics.php:172
+msgid ""
+"You can also edit or move multiple topics to the trash at once. Select the "
+"topics you want to act on using the checkboxes, then select the action you "
+"want to take from the Bulk Actions menu and click Apply."
+msgstr ""
+
+#: includes/admin/topics.php:173
+msgid ""
+"When using Bulk Edit, you can change the metadata (categories, author, etc.) "
+"for all selected topics at once. To remove a topic from the grouping, just "
+"click the x next to its name in the Bulk Edit area that appears."
+msgstr ""
+
+#: includes/admin/topics.php:194
+msgid ""
+"The title field and the big topic editing Area are fixed in place, but you "
+"can reposition all the other boxes using drag and drop, and can minimize or "
+"expand them by clicking the title bar of each box. Use the Screen Options "
+"tab to unhide more boxes (Excerpt, Send Trackbacks, Custom Fields, "
+"Discussion, Slug, Author) or to choose a 1- or 2-column layout for this "
+"screen."
+msgstr ""
+
+#: includes/admin/topics.php:204
+msgid "Title and Topic Editor"
+msgstr ""
+
+#: includes/admin/topics.php:206
+msgid ""
+"<strong>Title</strong> - Enter a title for your topic. After you enter a "
+"title, you&#8217;ll see the permalink below, which you can edit."
+msgstr ""
+
+#: includes/admin/topics.php:207
+msgid ""
+"<strong>Topic Editor</strong> - Enter the text for your topic. There are two "
+"modes of editing: Visual and HTML. Choose the mode by clicking on the "
+"appropriate tab. Visual mode gives you a WYSIWYG editor. Click the last icon "
+"in the row to get a second row of controls. The HTML mode allows you to "
+"enter raw HTML along with your topic text. You can insert media files by "
+"clicking the icons above the topic editor and following the directions. You "
+"can go to the distraction-free writing screen via the Fullscreen icon in "
+"Visual mode (second to last in the top row) or the Fullscreen button in HTML "
+"mode (last in the row). Once there, you can make buttons visible by hovering "
+"over the top area. Exit Fullscreen back to the regular topic editor."
+msgstr ""
+
+#: includes/admin/topics.php:210
+msgid ""
+"<strong>Publish</strong> - You can set the terms of publishing your topic in "
+"the Publish box. For Status, Visibility, and Publish (immediately), click on "
+"the Edit link to reveal more options. Visibility includes options for "
+"password-protecting a topic or making it stay at the top of your blog "
+"indefinitely (sticky). Publish (immediately) allows you to set a future or "
+"past date and time, so you can schedule a topic to be published in the "
+"future or backdate a topic."
+msgstr ""
+
+#: includes/admin/topics.php:213
+msgid ""
+"<strong>topic Format</strong> - This designates how your theme will display "
+"a specific topic. For example, you could have a <em>standard</em> blog topic "
+"with a title and paragraphs, or a short <em>aside</em> that omits the title "
+"and contains a short text blurb. Please refer to the Codex for <a href="
+"\"http://codex.wordpress.org/Post_Formats#Supported_Formats\">descriptions "
+"of each topic format</a>. Your theme could enable all or some of 10 possible "
+"formats."
+msgstr ""
+
+#: includes/admin/topics.php:217
+msgid ""
+"<strong>Featured Image</strong> - This allows you to associate an image with "
+"your topic without inserting it. This is usually useful only if your theme "
+"makes use of the featured image as a topic thumbnail on the home page, a "
+"custom header, etc."
+msgstr ""
+
+#: includes/admin/topics.php:222 includes/admin/topics.php:267
+msgid "Topic Attributes"
+msgstr ""
+
+#: includes/admin/topics.php:224
+msgid "Select the attributes that your topic should have:"
+msgstr ""
+
+#: includes/admin/topics.php:226
+msgid ""
+"<strong>Forum</strong> dropdown determines the parent forum that the topic "
+"belongs to. Select the forum or category from the dropdown, or leave the "
+"default (No Forum) to post the topic without an assigned forum."
+msgstr ""
+
+#: includes/admin/topics.php:227
+msgid ""
+"<strong>Topic Type</strong> dropdown indicates the sticky status of the "
+"topic. Selecting the super sticky option would stick the topic to the front "
+"of your forums, i.e. the topic index, sticky option would stick the topic to "
+"its respective forum. Selecting normal would not stick the topic anywhere."
+msgstr ""
+
+#: includes/admin/topics.php:242
+msgid ""
+"<strong>Discussion</strong> - You can turn comments and pings on or off, and "
+"if there are comments on the topic, you can see them here and moderate them."
+msgstr ""
+
+#: includes/admin/topics.php:538
+msgid "The topic was not found!"
+msgstr ""
+
+#: includes/admin/topics.php:628
+msgid "There was a problem opening the topic \"%1$s\"."
+msgstr ""
+
+#: includes/admin/topics.php:628
+msgid "Topic \"%1$s\" successfully opened."
+msgstr ""
+
+#: includes/admin/topics.php:632
+msgid "There was a problem closing the topic \"%1$s\"."
+msgstr ""
+
+#: includes/admin/topics.php:632
+msgid "Topic \"%1$s\" successfully closed."
+msgstr ""
+
+#: includes/admin/topics.php:636
+msgid "There was a problem sticking the topic \"%1$s\" to front."
+msgstr ""
+
+#: includes/admin/topics.php:636
+msgid "Topic \"%1$s\" successfully sticked to front."
+msgstr ""
+
+#: includes/admin/topics.php:640
+msgid "There was a problem sticking the topic \"%1$s\"."
+msgstr ""
+
+#: includes/admin/topics.php:640
+msgid "Topic \"%1$s\" successfully sticked."
+msgstr ""
+
+#: includes/admin/topics.php:644
+msgid "There was a problem unsticking the topic \"%1$s\"."
+msgstr ""
+
+#: includes/admin/topics.php:644
+msgid "Topic \"%1$s\" successfully unsticked."
+msgstr ""
+
+#: includes/admin/topics.php:648
+msgid "There was a problem marking the topic \"%1$s\" as spam."
+msgstr ""
+
+#: includes/admin/topics.php:648
+msgid "Topic \"%1$s\" successfully marked as spam."
+msgstr ""
+
+#: includes/admin/topics.php:652
+msgid "There was a problem unmarking the topic \"%1$s\" as spam."
+msgstr ""
+
+#: includes/admin/topics.php:652
+msgid "Topic \"%1$s\" successfully unmarked as spam."
+msgstr ""
+
+#: includes/admin/topics.php:688 templates/default/bbpress/loop-topics.php:20
+msgid "Voices"
+msgstr ""
+
+#: includes/admin/topics.php:748
+msgid "(No Forum)"
+msgstr ""
+
+#: includes/admin/topics.php:783 includes/topics/template-tags.php:1828
+msgid "No Replies"
+msgstr ""
+
+#: includes/admin/topics.php:840
+msgid "Close this topic"
+msgstr ""
+
+#: includes/admin/topics.php:840
+msgctxt "Close a Topic"
+msgid "Close"
+msgstr ""
+
+#: includes/admin/topics.php:842
+msgid "Open this topic"
+msgstr ""
+
+#: includes/admin/topics.php:842
+msgctxt "Open a Topic"
+msgid "Open"
+msgstr ""
+
+#: includes/admin/topics.php:851
+msgid "Unstick this topic"
+msgstr ""
+
+#: includes/admin/topics.php:851 includes/topics/template-tags.php:2517
+msgid "Unstick"
+msgstr ""
+
+#: includes/admin/topics.php:854
+msgid "Stick this topic to its forum"
+msgstr ""
+
+#: includes/admin/topics.php:854 includes/topics/template-tags.php:2516
+msgid "Stick"
+msgstr ""
+
+#: includes/admin/topics.php:854
+msgid "Stick this topic to front"
+msgstr ""
+
+#: includes/admin/topics.php:854 includes/topics/template-tags.php:2518
+msgid "to front"
+msgstr ""
+
+#: includes/admin/topics.php:861
+msgid "Mark the topic as not spam"
+msgstr ""
+
+#: includes/admin/topics.php:863
+msgid "Mark this topic as spam"
+msgstr ""
+
+#: includes/admin/topics.php:973
+msgid "Topic updated. <a href=\"%s\">View topic</a>"
+msgstr ""
+
+#: includes/admin/topics.php:982
+msgid "Topic updated."
+msgstr ""
+
+#. translators: %s: date and time of the revision
+#: includes/admin/topics.php:987
+msgid "Topic restored to revision from %s"
+msgstr ""
+
+#: includes/admin/topics.php:991
+msgid "Topic created. <a href=\"%s\">View topic</a>"
+msgstr ""
+
+#: includes/admin/topics.php:994
+msgid "Topic saved."
+msgstr ""
+
+#: includes/admin/topics.php:997
+msgid "Topic submitted. <a target=\"_blank\" href=\"%s\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/topics.php:1000
+msgid ""
+"Topic scheduled for: <strong>%1$s</strong>. <a target=\"_blank\" href=\"%2$s"
+"\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/topics.php:1007
+msgid "Topic draft updated. <a target=\"_blank\" href=\"%s\">Preview topic</a>"
+msgstr ""
+
+#: includes/admin/users.php:87 includes/admin/users.php:217
+#: templates/default/bbpress/form-user-roles.php:9
+msgid "Forum Role"
+msgstr ""
+
+#: includes/admin/users.php:96 includes/admin/users.php:100
+#: includes/users/template-tags.php:1017
+msgid "&mdash; No role for this forum &mdash;"
+msgstr ""
+
+#: includes/admin/users.php:138 includes/admin/users.php:140
+msgid "Change forum role to&hellip;"
+msgstr ""
+
+#: includes/admin/users.php:148
+msgid "Change"
+msgstr ""
+
+#: includes/admin/users.php:216
+msgid "Site Role"
+msgstr ""
+
+#: includes/common/functions.php:110
+msgid "sometime"
+msgstr ""
+
+#: includes/common/functions.php:111
+msgid "right now"
+msgstr ""
+
+#: includes/common/functions.php:112
+msgid "%s ago"
+msgstr ""
+
+#: includes/common/functions.php:116
+msgid "year"
+msgstr ""
+
+#: includes/common/functions.php:116
+msgid "years"
+msgstr ""
+
+#: includes/common/functions.php:117
+msgid "month"
+msgstr ""
+
+#: includes/common/functions.php:117
+msgid "months"
+msgstr ""
+
+#: includes/common/functions.php:118
+msgid "week"
+msgstr ""
+
+#: includes/common/functions.php:118
+msgid "weeks"
+msgstr ""
+
+#: includes/common/functions.php:119
+msgid "day"
+msgstr ""
+
+#: includes/common/functions.php:119
+msgid "days"
+msgstr ""
+
+#: includes/common/functions.php:120
+msgid "hour"
+msgstr ""
+
+#: includes/common/functions.php:120
+msgid "hours"
+msgstr ""
+
+#: includes/common/functions.php:121
+msgid "minute"
+msgstr ""
+
+#: includes/common/functions.php:122
+msgid "second"
+msgstr ""
+
+#: includes/common/functions.php:177
+msgctxt "Separator in time since"
+msgid ","
+msgstr ""
+
+#: includes/common/functions.php:488 includes/common/functions.php:520
+msgid "Private: %s"
+msgstr ""
+
+#: includes/common/functions.php:489 includes/common/functions.php:521
+msgid "Spammed: %s"
+msgstr ""
+
+#: includes/common/functions.php:490 includes/common/functions.php:522
+msgid "Trashed: %s"
+msgstr ""
+
+#: includes/common/functions.php:597
+msgid "<strong>ERROR</strong>: Invalid author name submitted!"
+msgstr ""
+
+#: includes/common/functions.php:601
+msgid "<strong>ERROR</strong>: Invalid email address submitted!"
+msgstr ""
+
+#: includes/common/functions.php:1024
+msgid ""
+"%1$s wrote:\n"
+"\n"
+"%2$s\n"
+"\t\t\t\n"
+"Post Link: %3$s\n"
+"\n"
+"-----------\n"
+"\n"
+"You are receiving this email because you subscribed to a forum topic.\n"
+"\n"
+"Login and visit the topic to unsubscribe from these emails."
+msgstr ""
+
+#: includes/common/functions.php:1664
+msgid ""
+"Conditional query tags do not work before the query is run. Before then, "
+"they always return false."
+msgstr ""
+
+#: includes/common/template-tags.php:1339
+msgid "No topics available"
+msgstr ""
+
+#: includes/common/template-tags.php:1344
+msgid "No forums available"
+msgstr ""
+
+#: includes/common/template-tags.php:1349
+msgid "None available"
+msgstr ""
+
+#: includes/common/template-tags.php:1466
+#: includes/common/template-tags.php:1477 includes/topics/functions.php:1239
+#: includes/topics/functions.php:1597
+#: templates/default/bbpress/form-reply.php:29
+msgid "Reply To: %s"
+msgstr ""
+
+#: includes/common/template-tags.php:1888
+msgid "Home"
+msgstr ""
+
+#: includes/common/template-tags.php:1951
+msgid "(Edit)"
+msgstr ""
+
+#: includes/common/template-tags.php:1955
+#: includes/common/template-tags.php:2065
+#: includes/common/template-tags.php:2282 includes/core/theme-compat.php:607
+#: templates/default/extras/taxonomy-topic-tag-edit.php:17
+#: templates/default/extras/taxonomy-topic-tag.php:17
+msgid "Topic Tag: %s"
+msgstr ""
+
+#: includes/common/template-tags.php:1976
+msgid "&rsaquo;"
+msgstr ""
+
+#: includes/common/template-tags.php:2216
+msgid "Log Out"
+msgstr ""
+
+#: includes/common/template-tags.php:2269
+msgid "Forum: %s"
+msgstr ""
+
+#: includes/common/template-tags.php:2273
+msgid "Topic: %s"
+msgstr ""
+
+#: includes/common/template-tags.php:2291
+msgid "Your Profile"
+msgstr ""
+
+#: includes/common/template-tags.php:2296
+#: templates/default/bbpress/user-details.php:29
+msgid "%s's Profile"
+msgstr ""
+
+#: includes/common/template-tags.php:2304
+msgid "Edit Your Profile"
+msgstr ""
+
+#: includes/common/template-tags.php:2309
+msgid "Edit %s's Profile"
+msgstr ""
+
+#: includes/common/template-tags.php:2316
+msgid "View: %s"
+msgstr ""
+
+#: includes/common/widgets.php:39
+msgid ""
+"A simple login form with optional links to sign-up and lost password pages."
+msgstr ""
+
+#: includes/common/widgets.php:42
+msgid "(bbPress) Login Widget"
+msgstr ""
+
+#: includes/common/widgets.php:82 includes/common/widgets.php:103
+#: templates/default/bbpress/form-user-login.php:14
+#: templates/default/bbpress/form-user-login.php:35
+msgid "Log In"
+msgstr ""
+
+#: includes/common/widgets.php:85
+#: templates/default/bbpress/form-user-edit.php:99
+#: templates/default/bbpress/form-user-login.php:17
+#: templates/default/bbpress/form-user-register.php:23
+msgid "Username"
+msgstr ""
+
+#: includes/common/widgets.php:90
+#: templates/default/bbpress/form-user-login.php:22
+msgid "Password"
+msgstr ""
+
+#: includes/common/widgets.php:96
+msgid "Remember Me"
+msgstr ""
+
+#: includes/common/widgets.php:115
+#: templates/default/bbpress/form-user-register.php:36
+msgid "Register"
+msgstr ""
+
+#: includes/common/widgets.php:121
+#: templates/default/bbpress/form-user-lost-pass.php:14
+msgid "Lost Password"
+msgstr ""
+
+#: includes/common/widgets.php:182 includes/common/widgets.php:308
+#: includes/common/widgets.php:450 includes/common/widgets.php:668
+#: includes/common/widgets.php:856
+msgid "Title:"
+msgstr ""
+
+#: includes/common/widgets.php:187
+msgid "Register URI:"
+msgstr ""
+
+#: includes/common/widgets.php:192
+msgid "Lost Password URI:"
+msgstr ""
+
+#: includes/common/widgets.php:224
+msgid "A list of registered optional topic views."
+msgstr ""
+
+#: includes/common/widgets.php:227
+msgid "(bbPress) Topic Views List"
+msgstr ""
+
+#: includes/common/widgets.php:341
+msgid "A list of forums with an option to set the parent."
+msgstr ""
+
+#: includes/common/widgets.php:344
+msgid "(bbPress) Forums List"
+msgstr ""
+
+#: includes/common/widgets.php:456
+msgid "Parent Forum ID:"
+msgstr ""
+
+#: includes/common/widgets.php:462
+msgid "\"0\" to show only root - \"any\" to show all"
+msgstr ""
+
+#: includes/common/widgets.php:493
+msgid "A list of recent topics, sorted by popularity or freshness."
+msgstr ""
+
+#: includes/common/widgets.php:496
+msgid "(bbPress) Recent Topics"
+msgstr ""
+
+#: includes/common/widgets.php:609
+msgctxt "widgets"
+msgid "by %1$s"
+msgstr ""
+
+#: includes/common/widgets.php:669
+msgid "Maximum topics to show:"
+msgstr ""
+
+#: includes/common/widgets.php:670 includes/common/widgets.php:858
+msgid "Show post date:"
+msgstr ""
+
+#: includes/common/widgets.php:671
+msgid "Show topic author:"
+msgstr ""
+
+#: includes/common/widgets.php:674
+msgid "Order By:"
+msgstr ""
+
+#: includes/common/widgets.php:676
+msgid "Newest Topics"
+msgstr ""
+
+#: includes/common/widgets.php:677
+#: templates/default/extras/page-forum-statistics.php:100
+msgid "Popular Topics"
+msgstr ""
+
+#: includes/common/widgets.php:678
+msgid "Topics With Recent Replies"
+msgstr ""
+
+#: includes/common/widgets.php:710
+msgid "A list of the most recent replies."
+msgstr ""
+
+#: includes/common/widgets.php:713
+msgid "(bbPress) Recent Replies"
+msgstr ""
+
+#. translators: 1: reply author, 2: reply link, 3: reply timestamp
+#: includes/common/widgets.php:785
+msgctxt "widgets"
+msgid "%1$s on %2$s %3$s"
+msgstr ""
+
+#. translators: 1: reply link, 2: reply timestamp
+#: includes/common/widgets.php:791
+msgctxt "widgets"
+msgid "%1$s %2$s"
+msgstr ""
+
+#. translators: 1: reply author, 2: reply link
+#: includes/common/widgets.php:797
+msgctxt "widgets"
+msgid "%1$s on %2$s"
+msgstr ""
+
+#. translators: 1: reply link
+#: includes/common/widgets.php:803
+msgctxt "widgets"
+msgid "%1$s"
+msgstr ""
+
+#: includes/common/widgets.php:857
+msgid "Maximum replies to show:"
+msgstr ""
+
+#: includes/common/widgets.php:859
+msgid "Show reply author:"
+msgstr ""
+
+#: includes/core/capabilities.php:407
+msgid "Keymaster"
+msgstr ""
+
+#: includes/core/capabilities.php:413 includes/users/template-tags.php:450
+msgid "Moderator"
+msgstr ""
+
+#: includes/core/capabilities.php:419 includes/users/template-tags.php:454
+msgid "Participant"
+msgstr ""
+
+#: includes/core/capabilities.php:425
+msgid "Spectator"
+msgstr ""
+
+#: includes/core/capabilities.php:431
+msgid "Visitor"
+msgstr ""
+
+#: includes/core/capabilities.php:437
+msgid "Blocked"
+msgstr ""
+
+#: includes/core/capabilities.php:553 includes/core/capabilities.php:563
+msgid "Editable forum roles no longer exist."
+msgstr ""
+
+#: includes/core/update.php:164
+msgid "General"
+msgstr ""
+
+#: includes/core/update.php:165
+msgid "General chit-chat"
+msgstr ""
+
+#: includes/core/update.php:166
+msgid "Hello World!"
+msgstr ""
+
+#: includes/core/update.php:167
+msgid "I am the first topic in your new forums."
+msgstr ""
+
+#: includes/core/update.php:168
+msgid "Re: Hello World!"
+msgstr ""
+
+#: includes/core/update.php:169
+msgid "Oh, and this is what a reply looks like."
+msgstr ""
+
+#: includes/extend/akismet.php:304
+msgid "%1$s reported this %2$s as spam"
+msgstr ""
+
+#: includes/extend/akismet.php:311
+msgid "%1$s reported this %2$s as not spam"
+msgstr ""
+
+#: includes/extend/akismet.php:400
+msgid "No response"
+msgstr ""
+
+#: includes/extend/akismet.php:458
+msgid "Akismet caught this post as spam"
+msgstr ""
+
+#: includes/extend/akismet.php:462 includes/extend/akismet.php:477
+msgid "Post status was changed to %s"
+msgstr ""
+
+#: includes/extend/akismet.php:470
+msgid "Akismet cleared this post"
+msgstr ""
+
+#: includes/extend/akismet.php:484
+msgid ""
+"Akismet was unable to check this post (response: %s), will automatically "
+"retry again later."
+msgstr ""
+
+#: includes/extend/buddypress/activity.php:238
+msgid "New topic created"
+msgstr ""
+
+#: includes/extend/buddypress/activity.php:239
+msgid "New reply created"
+msgstr ""
+
+#: includes/extend/buddypress/activity.php:469
+msgid "%1$s started the topic %2$s in the forum %3$s"
+msgstr ""
+
+#: includes/extend/buddypress/activity.php:622
+msgid "%1$s replied to the topic %2$s in the forum %3$s"
+msgstr ""
+
+#: includes/extend/buddypress/group.php:201
+msgid "Enable Group Forum"
+msgstr ""
+
+#: includes/extend/buddypress/group.php:203
+#: includes/extend/buddypress/group.php:267
+msgid ""
+"Create a discussion forum to allow members of this group to communicate in a "
+"structured, bulletin-board style fashion."
+msgstr ""
+
+#: includes/extend/buddypress/group.php:206
+#: includes/extend/buddypress/group.php:270
+msgid "Yes. I want this group to have a forum."
+msgstr ""
+
+#: includes/extend/buddypress/group.php:209
+msgid "Saying no will not delete existing forum content."
+msgstr ""
+
+#: includes/extend/buddypress/group.php:211
+msgid "Save Settings"
+msgstr ""
+
+#: includes/extend/buddypress/group.php:265
+msgid "Group Forum"
+msgstr ""
+
+#: includes/extend/buddypress/group.php:531
+#: includes/extend/buddypress/group.php:540
+msgid "This group does not currently have any forums."
+msgstr ""
+
+#: includes/extend/buddypress/loader.php:100
+msgid "Search Forums..."
+msgstr ""
+
+#: includes/extend/buddypress/loader.php:191
+#: includes/extend/buddypress/loader.php:267
+#: templates/default/bbpress/user-details.php:35
+msgid "Topics Started"
+msgstr ""
+
+#: includes/extend/buddypress/loader.php:202
+#: includes/extend/buddypress/loader.php:275
+#: templates/default/bbpress/user-details.php:41
+msgid "Replies Created"
+msgstr ""
+
+#: includes/extend/buddypress/loader.php:283
+msgid "Favorite Topics"
+msgstr ""
+
+#: includes/extend/buddypress/loader.php:291
+msgid "Subscribed Topics"
+msgstr ""
+
+#: includes/forums/functions.php:121 includes/forums/functions.php:400
+#: includes/replies/functions.php:117 includes/replies/functions.php:408
+#: includes/topics/functions.php:129 includes/topics/functions.php:482
+#: includes/topics/functions.php:1098 includes/topics/functions.php:1400
+#: includes/topics/functions.php:1751 includes/topics/functions.php:1790
+#: includes/topics/functions.php:1847 includes/users/functions.php:467
+#: includes/users/functions.php:787 includes/users/functions.php:914
+#: includes/users/functions.php:920
+msgid "<strong>ERROR</strong>: Are you sure you wanted to do that?"
+msgstr ""
+
+#: includes/forums/functions.php:134
+msgid ""
+"<strong>ERROR</strong>: You do not have permission to create new forums."
+msgstr ""
+
+#: includes/forums/functions.php:157 includes/forums/functions.php:459
+msgid "<strong>ERROR</strong>: Your forum needs a title."
+msgstr ""
+
+#: includes/forums/functions.php:169 includes/forums/functions.php:471
+msgid "<strong>ERROR</strong>: Your forum description cannot be empty."
+msgstr ""
+
+#: includes/forums/functions.php:182
+msgid "<strong>ERROR</strong>: Your forum must have a parent."
+msgstr ""
+
+#: includes/forums/functions.php:189
+msgid ""
+"<strong>ERROR</strong>: This forum is a category. No forums can be created "
+"in this forum."
+msgstr ""
+
+#: includes/forums/functions.php:194 includes/forums/functions.php:435
+msgid "<strong>ERROR</strong>: This forum has been closed to new forums."
+msgstr ""
+
+#: includes/forums/functions.php:199 includes/forums/functions.php:440
+msgid ""
+"<strong>ERROR</strong>: This forum is private and you do not have the "
+"capability to read or create new forums in it."
+msgstr ""
+
+#: includes/forums/functions.php:204 includes/forums/functions.php:445
+msgid ""
+"<strong>ERROR</strong>: This forum is hidden and you do not have the "
+"capability to read or create new forums in it."
+msgstr ""
+
+#: includes/forums/functions.php:211 includes/replies/functions.php:206
+#: includes/topics/functions.php:228
+msgid "<strong>ERROR</strong>: Slow down; you move too fast."
+msgstr ""
+
+#: includes/forums/functions.php:216
+msgid "<strong>ERROR</strong>: This forum already exists."
+msgstr ""
+
+#: includes/forums/functions.php:221
+msgid "<strong>ERROR</strong>: Your forum cannot be created at this time."
+msgstr ""
+
+#: includes/forums/functions.php:389
+msgid "<strong>ERROR</strong>: Forum ID not found."
+msgstr ""
+
+#: includes/forums/functions.php:405
+msgid "<strong>ERROR</strong>: The forum you want to edit was not found."
+msgstr ""
+
+#: includes/forums/functions.php:410
+msgid "<strong>ERROR</strong>: You do not have permission to edit that forum."
+msgstr ""
+
+#: includes/forums/functions.php:476
+msgid "<strong>ERROR</strong>: Your forum cannot be edited at this time."
+msgstr ""
+
+#: includes/forums/template-tags.php:1121
+#: includes/forums/template-tags.php:1860
+msgid "%s topic"
+msgid_plural "%s topics"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/forums/template-tags.php:1137
+#: includes/topics/template-tags.php:1884
+msgid " (+ %d hidden)"
+msgstr ""
+
+#: includes/forums/template-tags.php:1849
+#: includes/topics/template-tags.php:1868
+msgid "%s reply"
+msgid_plural "%s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/forums/template-tags.php:1869
+msgid ""
+"This category contains %1$s and %2$s, and was last updated by %3$s %4$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1871
+msgid "This forum contains %1$s and %2$s, and was last updated by %3$s %4$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1877
+msgid "This category contains %1$s, and was last updated by %2$s %3$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1879
+msgid "This forum contains %1$s, and was last updated by %2$s %3$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1889
+msgid "This category contains %1$s and %2$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1891
+msgid "This forum contains %1$s and %2$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1899
+msgid "This category contains %1$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1901
+msgid "This forum contains %1$s."
+msgstr ""
+
+#: includes/forums/template-tags.php:1905
+msgid "This forum is empty."
+msgstr ""
+
+#: includes/forums/template-tags.php:2136
+msgid "Category"
+msgstr ""
+
+#: includes/forums/template-tags.php:2173
+msgctxt "Forum Status"
+msgid "Open"
+msgstr ""
+
+#: includes/forums/template-tags.php:2174
+msgctxt "Forum Status"
+msgid "Closed"
+msgstr ""
+
+#: includes/forums/template-tags.php:2211
+msgid "Public"
+msgstr ""
+
+#: includes/forums/template-tags.php:2212
+#: templates/default/bbpress/feedback-no-access.php:13
+msgid "Private"
+msgstr ""
+
+#: includes/forums/template-tags.php:2213
+msgid "Hidden"
+msgstr ""
+
+#: includes/replies/functions.php:143
+msgid "<strong>ERROR</strong>: You do not have permission to reply."
+msgstr ""
+
+#: includes/replies/functions.php:157
+msgid "<strong>ERROR</strong>: Topic ID is missing."
+msgstr ""
+
+#: includes/replies/functions.php:168 includes/topics/functions.php:199
+#: includes/topics/functions.php:496
+msgid "<strong>ERROR</strong>: Forum ID is missing."
+msgstr ""
+
+#: includes/replies/functions.php:189
+msgid "<strong>ERROR</strong>: Your reply needs a title."
+msgstr ""
+
+#: includes/replies/functions.php:201 includes/replies/functions.php:492
+msgid "<strong>ERROR</strong>: Your reply cannot be empty."
+msgstr ""
+
+#: includes/replies/functions.php:211
+msgid ""
+"<strong>ERROR</strong>: Duplicate reply detected; it looks as though "
+"you&#8217;ve already said that!"
+msgstr ""
+
+#: includes/replies/functions.php:216
+msgid "<strong>ERROR</strong>: Your reply cannot be created at this time."
+msgstr ""
+
+#: includes/replies/functions.php:285 includes/replies/functions.php:576
+msgid ""
+"<strong>ERROR</strong>: There was a problem adding the tags to the topic."
+msgstr ""
+
+#: includes/replies/functions.php:397
+msgid "<strong>ERROR</strong>: Reply ID not found."
+msgstr ""
+
+#: includes/replies/functions.php:414
+msgid "<strong>ERROR</strong>: The reply you want to edit was not found."
+msgstr ""
+
+#: includes/replies/functions.php:425
+msgid "<strong>ERROR</strong>: You do not have permission to edit that reply."
+msgstr ""
+
+#: includes/replies/functions.php:459
+msgid ""
+"<strong>ERROR</strong>: This forum is a category. No topics or replies can "
+"be created in it."
+msgstr ""
+
+#: includes/replies/functions.php:463
+msgid ""
+"<strong>ERROR</strong>: This forum has been closed to new topics and replies."
+msgstr ""
+
+#: includes/replies/functions.php:467
+msgid ""
+"<strong>ERROR</strong>: This forum is private and you do not have the "
+"capability to read or create new replies in it."
+msgstr ""
+
+#: includes/replies/functions.php:471
+msgid ""
+"<strong>ERROR</strong>: This forum is hidden and you do not have the "
+"capability to read or create new replies in it."
+msgstr ""
+
+#: includes/replies/functions.php:497
+msgid "<strong>ERROR</strong>: Your reply cannot be edited at this time."
+msgstr ""
+
+#: includes/replies/functions.php:1075
+msgid "<strong>ERROR:</strong> You do not have the permission to do that!"
+msgstr ""
+
+#: includes/replies/functions.php:1088
+msgid ""
+"<strong>ERROR</strong>: There was a problem unmarking the reply as spam!"
+msgstr ""
+
+#: includes/replies/functions.php:1088
+msgid "<strong>ERROR</strong>: There was a problem marking the reply as spam!"
+msgstr ""
+
+#: includes/replies/functions.php:1107
+msgid "<strong>ERROR</strong>: There was a problem trashing the reply!"
+msgstr ""
+
+#: includes/replies/functions.php:1115
+msgid "<strong>ERROR</strong>: There was a problem untrashing the reply!"
+msgstr ""
+
+#: includes/replies/functions.php:1123
+msgid "<strong>ERROR</strong>: There was a problem deleting the reply!"
+msgstr ""
+
+#: includes/replies/functions.php:1512
+msgid "All Posts"
+msgstr ""
+
+#: includes/replies/functions.php:1554 includes/topics/functions.php:3249
+msgid "Replies: %s"
+msgstr ""
+
+#: includes/replies/template-tags.php:545
+#: includes/topics/template-tags.php:688
+msgctxt "date at time"
+msgid "%1$s at %2$s"
+msgstr ""
+
+#: includes/replies/template-tags.php:643
+msgid "This reply was modified %1$s by %2$s. Reason: %3$s"
+msgstr ""
+
+#: includes/replies/template-tags.php:645
+msgid "This reply was modified %1$s by %2$s."
+msgstr ""
+
+#: includes/replies/template-tags.php:930
+#: includes/topics/template-tags.php:1235 includes/users/template-tags.php:165
+msgid "Anonymous"
+msgstr ""
+
+#: includes/replies/template-tags.php:1031
+#: includes/topics/template-tags.php:1340
+#: includes/users/template-tags.php:1383
+msgid "View %s's profile"
+msgstr ""
+
+#: includes/replies/template-tags.php:1031
+#: includes/topics/template-tags.php:1340
+#: includes/users/template-tags.php:1383
+msgid "Visit %s's website"
+msgstr ""
+
+#: includes/replies/template-tags.php:1650
+#: includes/topics/template-tags.php:2388
+#: templates/default/bbpress/form-topic-tag.php:88
+#: templates/default/bbpress/form-topic-tag.php:101
+msgid "Delete"
+msgstr ""
+
+#: includes/replies/template-tags.php:1669
+#: includes/topics/template-tags.php:2407
+msgid "Are you sure you want to delete that permanently?"
+msgstr ""
+
+#: includes/replies/template-tags.php:1720
+#: includes/topics/template-tags.php:2644
+msgid "Unspam"
+msgstr ""
+
+#: includes/replies/template-tags.php:1783
+msgid "Split"
+msgstr ""
+
+#: includes/replies/template-tags.php:1784
+msgid "Split the topic from this reply"
+msgstr ""
+
+#: includes/replies/template-tags.php:1891
+msgid "Viewing %1$s reply"
+msgid_plural "Viewing %1$s replies"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/replies/template-tags.php:1895
+msgid "Viewing %2$s replies (of %4$s total)"
+msgid_plural "Viewing %1$s replies - %2$s through %3$s (of %4$s total)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/replies/template-tags.php:1903
+msgid "Viewing %1$s post"
+msgid_plural "Viewing %1$s posts"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/replies/template-tags.php:1907
+msgid "Viewing %2$s post (of %4$s total)"
+msgid_plural "Viewing %1$s posts - %2$s through %3$s (of %4$s total)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/topics/functions.php:157
+msgid ""
+"<strong>ERROR</strong>: You do not have permission to create new topics."
+msgstr ""
+
+#: includes/topics/functions.php:181 includes/topics/functions.php:536
+msgid "<strong>ERROR</strong>: Your topic needs a title."
+msgstr ""
+
+#: includes/topics/functions.php:193 includes/topics/functions.php:548
+msgid "<strong>ERROR</strong>: Your topic cannot be empty."
+msgstr ""
+
+#: includes/topics/functions.php:210
+msgid ""
+"<strong>ERROR</strong>: This forum is a category. No topics can be created "
+"in this forum."
+msgstr ""
+
+#: includes/topics/functions.php:214 includes/topics/functions.php:515
+msgid "<strong>ERROR</strong>: This forum has been closed to new topics."
+msgstr ""
+
+#: includes/topics/functions.php:218 includes/topics/functions.php:519
+msgid ""
+"<strong>ERROR</strong>: This forum is private and you do not have the "
+"capability to read or create new topics in it."
+msgstr ""
+
+#: includes/topics/functions.php:222 includes/topics/functions.php:523
+msgid ""
+"<strong>ERROR</strong>: This forum is hidden and you do not have the "
+"capability to read or create new topics in it."
+msgstr ""
+
+#: includes/topics/functions.php:233
+msgid ""
+"<strong>ERROR</strong>: Duplicate topic detected; it looks as though "
+"you&#8217;ve already said that!"
+msgstr ""
+
+#: includes/topics/functions.php:238
+msgid "<strong>ERROR</strong>: Your topic cannot be created at this time."
+msgstr ""
+
+#: includes/topics/functions.php:444 includes/topics/functions.php:1092
+msgid "<strong>ERROR</strong>: Topic ID not found."
+msgstr ""
+
+#: includes/topics/functions.php:455
+msgid "<strong>ERROR</strong>: The topic you want to edit was not found."
+msgstr ""
+
+#: includes/topics/functions.php:466
+msgid "<strong>ERROR</strong>: You do not have permission to edit that topic."
+msgstr ""
+
+#: includes/topics/functions.php:511
+msgid ""
+"<strong>ERROR</strong>: This forum is a category. No topics can be created "
+"in it."
+msgstr ""
+
+#: includes/topics/functions.php:553
+msgid "<strong>ERROR</strong>: Your topic cannot be edited at this time."
+msgstr ""
+
+#: includes/topics/functions.php:1103
+msgid "<strong>ERROR</strong>: The topic you want to merge was not found."
+msgstr ""
+
+#: includes/topics/functions.php:1109 includes/topics/functions.php:1406
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to edit the source "
+"topic."
+msgstr ""
+
+#: includes/topics/functions.php:1117
+msgid "<strong>ERROR</strong>: Destination topic ID not found."
+msgstr ""
+
+#: includes/topics/functions.php:1123
+msgid "<strong>ERROR</strong>: The topic you want to merge to was not found."
+msgstr ""
+
+#: includes/topics/functions.php:1127
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to edit the "
+"destination topic."
+msgstr ""
+
+#: includes/topics/functions.php:1379
+msgid "<strong>ERROR</strong>: Reply ID to split the topic from not found!"
+msgstr ""
+
+#: includes/topics/functions.php:1387
+msgid "<strong>ERROR</strong>: The reply you want to split from was not found."
+msgstr ""
+
+#: includes/topics/functions.php:1396
+msgid "<strong>ERROR</strong>: The topic you want to split was not found."
+msgstr ""
+
+#: includes/topics/functions.php:1414
+msgid "<strong>ERROR</strong>: You need to choose a valid split option."
+msgstr ""
+
+#: includes/topics/functions.php:1427
+msgid "<strong>ERROR</strong>: Destination topic ID not found!"
+msgstr ""
+
+#: includes/topics/functions.php:1436
+msgid "<strong>ERROR</strong>: The topic you want to split to was not found!"
+msgstr ""
+
+#: includes/topics/functions.php:1440
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to edit the "
+"destination topic!"
+msgstr ""
+
+#: includes/topics/functions.php:1479
+msgid ""
+"<strong>ERROR</strong>: There was a problem converting the reply into the "
+"topic. Please try again."
+msgstr ""
+
+#: includes/topics/functions.php:1484
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to create new "
+"topics. The reply could not be converted into a topic."
+msgstr ""
+
+#: includes/topics/functions.php:1739
+msgid ""
+"<strong>ERROR</strong>: The following problem(s) have been found while "
+"getting the tag: %s"
+msgstr ""
+
+#: includes/topics/functions.php:1757 includes/topics/functions.php:1796
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to edit the topic "
+"tags."
+msgstr ""
+
+#: includes/topics/functions.php:1763 includes/topics/functions.php:1802
+msgid "<strong>ERROR</strong>: You need to enter a tag name."
+msgstr ""
+
+#: includes/topics/functions.php:1773
+msgid ""
+"<strong>ERROR</strong>: The following problem(s) have been found while "
+"updating the tag: %s"
+msgstr ""
+
+#: includes/topics/functions.php:1812 includes/topics/functions.php:1830
+msgid ""
+"<strong>ERROR</strong>: The following problem(s) have been found while "
+"merging the tags: %s"
+msgstr ""
+
+#: includes/topics/functions.php:1821
+msgid ""
+"<strong>ERROR</strong>: The tags which are being merged can not be the same."
+msgstr ""
+
+#: includes/topics/functions.php:1853
+msgid ""
+"<strong>ERROR</strong>: You do not have the permissions to delete the topic "
+"tags."
+msgstr ""
+
+#: includes/topics/functions.php:1862
+msgid ""
+"<strong>ERROR</strong>: The following problem(s) have been found while "
+"deleting the tag: %s"
+msgstr ""
+
+#: includes/topics/functions.php:1991
+msgid "<strong>ERROR:</strong> You do not have the permission to do that."
+msgstr ""
+
+#: includes/topics/functions.php:2004
+msgid "<strong>ERROR</strong>: There was a problem closing the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2004
+msgid "<strong>ERROR</strong>: There was a problem opening the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2015
+msgid "<strong>ERROR</strong>: There was a problem unsticking the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2015
+msgid "<strong>ERROR</strong>: There was a problem sticking the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2025
+msgid ""
+"<strong>ERROR</strong>: There was a problem unmarking the topic as spam."
+msgstr ""
+
+#: includes/topics/functions.php:2025
+msgid "<strong>ERROR</strong>: There was a problem marking the topic as spam."
+msgstr ""
+
+#: includes/topics/functions.php:2044
+msgid "<strong>ERROR</strong>: There was a problem trashing the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2052
+msgid "<strong>ERROR</strong>: There was a problem untrashing the topic."
+msgstr ""
+
+#: includes/topics/functions.php:2060
+msgid "<strong>ERROR</strong>: There was a problem deleting the topic."
+msgstr ""
+
+#: includes/topics/template-tags.php:865
+msgid "This topic was modified %1$s by %2$s. Reason: %3$s"
+msgstr ""
+
+#: includes/topics/template-tags.php:867
+msgid "This topic was modified %1$s by %2$s."
+msgstr ""
+
+#: includes/topics/template-tags.php:2060
+msgid "Tagged:"
+msgstr ""
+
+#: includes/topics/template-tags.php:2456
+msgctxt "Topic Status"
+msgid "Close"
+msgstr ""
+
+#: includes/topics/template-tags.php:2457
+msgctxt "Topic Status"
+msgid "Open"
+msgstr ""
+
+#: includes/topics/template-tags.php:2587
+#: templates/default/bbpress/form-topic-tag.php:59
+#: templates/default/bbpress/form-topic-tag.php:73
+msgid "Merge"
+msgstr ""
+
+#: includes/topics/template-tags.php:2699
+msgid "Viewing %1$s topic"
+msgid_plural "Viewing %1$s topics"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/topics/template-tags.php:2703
+msgid "Viewing topic %2$s (of %4$s total)"
+msgid_plural "Viewing %1$s topics - %2$s through %3$s (of %4$s total)"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/topics/template-tags.php:2763
+msgid "This topic is marked as spam."
+msgstr ""
+
+#: includes/topics/template-tags.php:2768
+msgid "This topic is in the trash."
+msgstr ""
+
+#: includes/topics/template-tags.php:2806
+msgid "Normal"
+msgstr ""
+
+#: includes/topics/template-tags.php:2807
+msgid "Sticky"
+msgstr ""
+
+#: includes/topics/template-tags.php:2808
+msgid "Super Sticky"
+msgstr ""
+
+#: includes/topics/template-tags.php:2929
+msgid "%s voice"
+msgid_plural "%s voices"
+msgstr[0] ""
+msgstr[1] ""
+
+#: includes/topics/template-tags.php:2935
+msgid "This topic contains %1$s, has %2$s, and was last updated by %3$s %4$s."
+msgstr ""
+
+#: includes/topics/template-tags.php:2939
+msgid "This topic contains %1$s and has %2$s."
+msgstr ""
+
+#: includes/topics/template-tags.php:2943
+msgid "This topic has no replies."
+msgstr ""
+
+#: includes/users/functions.php:463
+msgid ""
+"<strong>ERROR</strong>: No topic was found! Which topic are you marking/"
+"unmarking as favorite?"
+msgstr ""
+
+#: includes/users/functions.php:471 includes/users/functions.php:791
+msgid ""
+"<strong>ERROR</strong>: You don't have the permission to edit favorites of "
+"that user!"
+msgstr ""
+
+#: includes/users/functions.php:512
+msgid ""
+"<strong>ERROR</strong>: There was a problem removing that topic from "
+"favorites!"
+msgstr ""
+
+#: includes/users/functions.php:514
+msgid "<strong>ERROR</strong>: There was a problem favoriting that topic!"
+msgstr ""
+
+#: includes/users/functions.php:783
+msgid ""
+"<strong>ERROR</strong>: No topic was found! Which topic are you subscribing/"
+"unsubscribing to?"
+msgstr ""
+
+#: includes/users/functions.php:832
+msgid ""
+"<strong>ERROR</strong>: There was a problem unsubscribing from that topic!"
+msgstr ""
+
+#: includes/users/functions.php:834
+msgid "<strong>ERROR</strong>: There was a problem subscribing to that topic!"
+msgstr ""
+
+#: includes/users/template-tags.php:438
+msgid "Key Master"
+msgstr ""
+
+#: includes/users/template-tags.php:442
+msgid "Inactive"
+msgstr ""
+
+#: includes/users/template-tags.php:446
+msgid "Guest"
+msgstr ""
+
+#: includes/users/template-tags.php:458
+msgid "Member"
+msgstr ""
+
+#: includes/users/template-tags.php:497
+msgid "Admin"
+msgstr ""
+
+#: includes/users/template-tags.php:674
+#: templates/default/bbpress-functions.php:256
+msgid "Add this topic to your favorites"
+msgstr ""
+
+#: includes/users/template-tags.php:675
+msgid " (%?%)"
+msgstr ""
+
+#: includes/users/template-tags.php:681
+msgid "This topic is one of your %favorites% ["
+msgstr ""
+
+#: includes/users/template-tags.php:682
+#: templates/default/bbpress-functions.php:255
+msgid "&times;"
+msgstr ""
+
+#: includes/users/template-tags.php:683
+msgid "]"
+msgstr ""
+
+#: includes/users/template-tags.php:825
+#: templates/default/bbpress-functions.php:265
+msgid "Subscribe"
+msgstr ""
+
+#: includes/users/template-tags.php:826
+#: templates/default/bbpress-functions.php:266
+msgid "Unsubscribe"
+msgstr ""
+
+#: includes/users/template-tags.php:892
+msgid "User updated."
+msgstr ""
+
+#: includes/users/template-tags.php:917
+msgid "You have super admin privileges."
+msgstr ""
+
+#: includes/users/template-tags.php:917
+msgid "This user has super admin privileges."
+msgstr ""
+
+#: includes/users/template-tags.php:982
+msgid "&mdash; No role for this site &mdash;"
+msgstr ""
+
+#: includes/users/template-tags.php:1180
+msgid "You are now logged out."
+msgstr ""
+
+#: includes/users/template-tags.php:1184
+msgid "New user registration is currently not allowed."
+msgstr ""
+
+#: includes/users/template-tags.php:1193
+msgid "Check your e-mail for the confirmation link."
+msgstr ""
+
+#: includes/users/template-tags.php:1198
+msgid "Check your e-mail for your new password."
+msgstr ""
+
+#: includes/users/template-tags.php:1203
+msgid "Registration complete. Please check your e-mail."
+msgstr ""
+
+#: templates/default/bbpress/feedback-logged-in.php:13
+msgid "You are already logged in."
+msgstr ""
+
+#: templates/default/bbpress/feedback-no-access.php:16
+msgid "You do not have permission to view this forum."
+msgstr ""
+
+#: templates/default/bbpress/feedback-no-forums.php:13
+msgid "Oh bother! No forums were found here!"
+msgstr ""
+
+#: templates/default/bbpress/feedback-no-replies.php:13
+msgid "Oh bother! No replies were found here!"
+msgstr ""
+
+#: templates/default/bbpress/feedback-no-topics.php:13
+msgid "Oh bother! No topics were found here!"
+msgstr ""
+
+#: templates/default/bbpress/form-anonymous.php:17
+msgid "Your information:"
+msgstr ""
+
+#: templates/default/bbpress/form-anonymous.php:22
+msgid "Name (required):"
+msgstr ""
+
+#: templates/default/bbpress/form-anonymous.php:27
+msgid "Mail (will not be published) (required):"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:35
+#: templates/default/bbpress/form-topic.php:41
+msgid "Now Editing &ldquo;%s&rdquo;"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:37
+msgid "Create New Forum in &ldquo;%s&rdquo;"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:47
+msgid ""
+"This forum is closed to new content, however your account still allows you "
+"to do so."
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:55
+#: templates/default/bbpress/form-reply.php:44
+#: templates/default/bbpress/form-topic.php:61
+msgid "Your account has the ability to post unrestricted HTML content."
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:67
+msgid "Forum Name (Maximum Length: %d):"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:78
+msgid "Forum Description:"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:93
+#: templates/default/bbpress/form-reply.php:75
+#: templates/default/bbpress/form-topic.php:101
+msgid ""
+"You may use these <abbr title=\"HyperText Markup Language\">HTML</abbr> tags "
+"and attributes:"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:102
+msgid "Forum Type:"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:134
+msgid "(No Parent)"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:149
+#: templates/default/bbpress/form-reply.php:149
+#: templates/default/bbpress/form-topic-merge.php:94
+#: templates/default/bbpress/form-topic-split.php:98
+#: templates/default/bbpress/form-topic.php:198
+msgid "Submit"
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:172
+msgid "The forum &#8216;%s&#8217; is closed to new content."
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:180
+msgid "You cannot create new forums."
+msgstr ""
+
+#: templates/default/bbpress/form-forum.php:180
+msgid "You must be logged in to create new forums."
+msgstr ""
+
+#: templates/default/bbpress/form-protected.php:14
+msgid "Protected"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:36
+msgid ""
+"This topic is marked as closed to new replies, however your posting "
+"capabilities still allow you to do so."
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:60
+#: templates/default/bbpress/form-topic.php:86
+msgid "Reply:"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:86
+msgid "Tags:"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:104
+#: templates/default/bbpress/form-topic.php:158
+msgid "Notify the author of follow-up replies via email"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:108
+#: templates/default/bbpress/form-topic.php:162
+msgid "Notify me of follow-up replies via email"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:123
+#: templates/default/bbpress/form-topic.php:176
+msgid "Revision"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:126
+#: templates/default/bbpress/form-topic.php:179
+msgid "Keep a log of this edit:"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:130
+#: templates/default/bbpress/form-topic.php:183
+msgid "Optional reason for editing:"
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:172
+msgid "The topic &#8216;%s&#8217; is closed to new replies."
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:180
+#: templates/default/bbpress/form-topic.php:221
+msgid "The forum &#8216;%s&#8217; is closed to new topics and replies."
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:188
+msgid "You cannot reply to this topic."
+msgstr ""
+
+#: templates/default/bbpress/form-reply.php:188
+msgid "You must be logged in to reply to this topic."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:24
+msgid "Merge topic \"%s\""
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:29
+msgid ""
+"Select the topic to merge this one into. The destination topic will remain "
+"the lead topic, and this one will change into a reply."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:30
+msgid ""
+"To keep this topic as the lead, go to the other topic and use the merge tool "
+"from there instead."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:34
+msgid ""
+"All replies within both topics will be merged chronologically. The order of "
+"the merged replies is based on the time and date they were posted. If the "
+"destination topic was created after this one, it's post date will be updated "
+"to second earlier than this one."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:38
+msgid "Destination"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:42
+msgid "Merge with this topic:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:51
+msgid "No topics were found to which the topic could be merged to!"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:57
+msgid "There are no other topics in this forum to merge with."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:65
+#: templates/default/bbpress/form-topic-split.php:69
+msgid "Topic Extras"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:72
+msgid "Merge topic subscribers"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:77
+msgid "Merge topic favoriters"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:82
+msgid "Merge topic tags"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:90
+#: templates/default/bbpress/form-topic-split.php:94
+msgid "<strong>WARNING:</strong> This process cannot be undone."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:107
+#: templates/default/bbpress/form-topic-split.php:111
+msgid "You do not have the permissions to edit this topic!"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-merge.php:107
+#: templates/default/bbpress/form-topic-split.php:111
+msgid "You cannot edit this topic."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:24
+msgid "Split topic \"%s\""
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:29
+msgid ""
+"When you split a topic, you are slicing it in half starting with the reply "
+"you just selected. Choose to use that reply as a new topic with a new title, "
+"or merge those replies into an existing topic."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:33
+msgid ""
+"If you use the existing topic option, replies within both topics will be "
+"merged chronologically. The order of the merged replies is based on the time "
+"and date they were posted."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:37
+msgid "Split Method"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:41
+msgid "New topic in <strong>%s</strong> titled:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:42
+msgid "Split: %s"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:49
+msgid "Use an existing topic in this forum:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:58
+msgid "No other topics found!"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:76
+msgid "Copy subscribers to the new topic"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:81
+msgid "Copy favoriters to the new topic"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-split.php:86
+msgid "Copy topic tags to the new topic"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:18
+msgid "Manage Tag: \"%s\""
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:22
+msgid "Rename"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:25
+msgid "Leave the slug empty to have one automatically generated."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:29
+msgid ""
+"Changing the slug affects its permalink. Any links to the old slug will stop "
+"working."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:40
+msgid "Slug:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:45
+msgid "Update"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:62
+msgid "Merging tags together cannot be undone."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:68
+msgid "Existing tag:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:73
+msgid ""
+"Are you sure you want to merge the \"%s\" tag into the tag you specified?"
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:91
+msgid "This does not delete your topics. Only the tag itself is deleted."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:94
+msgid "Deleting a tag cannot be undone."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:95
+msgid "Any links to this tag will no longer function."
+msgstr ""
+
+#: templates/default/bbpress/form-topic-tag.php:101
+msgid ""
+"Are you sure you want to delete the \"%s\" tag? This is permanent and cannot "
+"be undone."
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:43
+msgid "Create New Topic in &ldquo;%s&rdquo;"
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:53
+msgid ""
+"This forum is marked as closed to new topics, however your posting "
+"capabilities still allow you to do so."
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:75
+msgid "Topic Title (Maximum Length: %d):"
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:112
+msgid "Topic Tags:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:139
+msgid "Topic Type:"
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:229
+msgid "You cannot create new topics."
+msgstr ""
+
+#: templates/default/bbpress/form-topic.php:229
+msgid "You must be logged in to create new topics."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:24
+msgid "First Name"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:29
+msgid "Last Name"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:34
+msgid "Nickname"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:39
+msgid "Display Name"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:49
+#: templates/default/bbpress/form-user-edit.php:52
+msgid "Contact Info"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:74
+#: templates/default/bbpress/form-user-edit.php:77
+msgid "About Yourself"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:74
+#: templates/default/bbpress/form-user-edit.php:77
+msgid "About the user"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:82
+msgid "Biographical Info"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:84
+msgid ""
+"Share a little biographical information to fill out your profile. This may "
+"be shown publicly."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:91
+#: templates/default/bbpress/form-user-edit.php:94
+msgid "Account"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:101
+msgid "Usernames cannot be changed."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:117
+msgid ""
+"There is a pending email address change to <code>%1$s</code>. <a href=\"%2$s"
+"\">Cancel</a>"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:126
+msgid "New Password"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:129
+msgid ""
+"If you would like to change the password type a new one. Otherwise leave "
+"this blank."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:132
+msgid "Type your new password again."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:135
+msgid ""
+"Your password should be at least ten characters long. Use upper and lower "
+"case letters, numbers, and symbols to make it even stronger."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:145
+#: templates/default/bbpress/form-user-edit.php:148
+msgid "User Role"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:155
+msgid "Network Role"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:158
+msgid "Grant this user super admin privileges for the Network."
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:180
+msgid "Update Profile"
+msgstr ""
+
+#: templates/default/bbpress/form-user-edit.php:180
+msgid "Update User"
+msgstr ""
+
+#: templates/default/bbpress/form-user-login.php:28
+msgid "Keep me signed in"
+msgstr ""
+
+#: templates/default/bbpress/form-user-lost-pass.php:18
+msgid "Username or Email"
+msgstr ""
+
+#: templates/default/bbpress/form-user-lost-pass.php:27
+msgid "Reset My Password"
+msgstr ""
+
+#: templates/default/bbpress/form-user-register.php:14
+msgid "Create an Account"
+msgstr ""
+
+#: templates/default/bbpress/form-user-register.php:17
+msgid "Your username must be unique, and cannot be changed later."
+msgstr ""
+
+#: templates/default/bbpress/form-user-register.php:18
+msgid ""
+"We use your email address to email you a secure password and verify your "
+"account."
+msgstr ""
+
+#: templates/default/bbpress/form-user-roles.php:2
+msgid "Blog Role"
+msgstr ""
+
+#: templates/default/bbpress/loop-single-reply.php:21
+msgid "in reply to: "
+msgstr ""
+
+#: templates/default/bbpress/loop-single-topic.php:30
+msgid "Started by: %1$s"
+msgstr ""
+
+#: templates/default/bbpress/loop-single-topic.php:38
+msgid "in: <a href=\"%1$s\">%2$s</a>"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:29
+#: templates/default/bbpress/user-profile.php:15
+msgid "Profile"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:35
+msgid "%s's Topics Started"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:41
+msgid "%s's Replies Created"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:48
+msgid "%s's Favorites"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:58
+msgid "%s's Subscriptions"
+msgstr ""
+
+#: templates/default/bbpress/user-details.php:65
+msgid "Edit Profile of User %s"
+msgstr ""
+
+#: templates/default/bbpress/user-favorites.php:15
+msgid "Favorite Forum Topics"
+msgstr ""
+
+#: templates/default/bbpress/user-favorites.php:28
+msgid "You currently have no favorite topics."
+msgstr ""
+
+#: templates/default/bbpress/user-favorites.php:28
+msgid "This user has no favorite topics."
+msgstr ""
+
+#: templates/default/bbpress/user-profile.php:24
+msgid "Forum Role: %s"
+msgstr ""
+
+#: templates/default/bbpress/user-profile.php:25
+msgid "Topics Started: %s"
+msgstr ""
+
+#: templates/default/bbpress/user-profile.php:26
+msgid "Replies Created: %s"
+msgstr ""
+
+#: templates/default/bbpress/user-replies-created.php:15
+msgid "Forum Replies Created"
+msgstr ""
+
+#: templates/default/bbpress/user-replies-created.php:28
+msgid "You have not replied to any topics."
+msgstr ""
+
+#: templates/default/bbpress/user-replies-created.php:28
+msgid "This user has not replied to any topics."
+msgstr ""
+
+#: templates/default/bbpress/user-subscriptions.php:19
+msgid "Subscribed Forum Topics"
+msgstr ""
+
+#: templates/default/bbpress/user-subscriptions.php:32
+msgid "You are not currently subscribed to any topics."
+msgstr ""
+
+#: templates/default/bbpress/user-subscriptions.php:32
+msgid "This user is not currently subscribed to any topics."
+msgstr ""
+
+#: templates/default/bbpress/user-topics-created.php:15
+msgid "Forum Topics Started"
+msgstr ""
+
+#: templates/default/bbpress/user-topics-created.php:28
+msgid "You have not created any topics."
+msgstr ""
+
+#: templates/default/bbpress/user-topics-created.php:28
+msgid "This user has not created any topics."
+msgstr ""
+
+#: templates/default/bbpress-functions.php:251
+msgid "favorites"
+msgstr ""
+
+#: templates/default/bbpress-functions.php:252
+msgid "?"
+msgstr ""
+
+#: templates/default/bbpress-functions.php:253
+msgid "This topic is one of your %favLinkYes% [%favDel%]"
+msgstr ""
+
+#: templates/default/bbpress-functions.php:254
+msgid "%favAdd% (%favLinkNo%)"
+msgstr ""
+
+#: templates/default/extras/page-forum-statistics.php:26
+msgid "<p>Here are the statistics and popular topics of our forums.</p>"
+msgstr ""
+
+#: templates/default/extras/page-forum-statistics.php:34
+msgid "Registered Users"
+msgstr ""
+
+#: templates/default/extras/page-forum-statistics.php:61
+msgid "Empty Topic Tags"
+msgstr ""
+
+#: templates/default/extras/page-forum-statistics.php:70
+msgid "Hidden Topics"
+msgstr ""
+
+#: templates/default/extras/page-forum-statistics.php:81
+msgid "Hidden Replies"
+msgstr ""
+
+#: templates/default/extras/page-topic-tags.php:22
+msgid ""
+"<p>This is a collection of tags that are currently popular on our forums.</p>"
+msgstr ""
+
+#. Plugin Name of the plugin/theme
+msgid "bbPress"
+msgstr ""
+
+#. #-#-#-#-#  plugin.pot (bbPress 2.2)  #-#-#-#-#
+#. Plugin URI of the plugin/theme
+#. #-#-#-#-#  plugin.pot (bbPress 2.2)  #-#-#-#-#
+#. Author URI of the plugin/theme
+msgid "http://bbpress.org"
+msgstr ""
+
+#. Description of the plugin/theme
+msgid "bbPress is forum software with a twist from the creators of WordPress."
+msgstr ""
+
+#. Author of the plugin/theme
+msgid "The bbPress Community"
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/languages/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * Do not put custom translations here. They will be deleted on bbPress updates.
+ *
+ * Keep custom bbPress translations in /wp-content/languages/bbpress/
+ */
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/license.txt	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,281 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+              51 Franklin St, Fifth Floor, Boston, MA 02110, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
+
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/readme.txt	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,163 @@
+=== bbPress ===
+Contributors: matt, johnjamesjacoby
+Tags: forums, discussion, support, theme, akismet, multisite
+Requires at least: 3.4
+Tested up to: 3.5
+Stable tag: 2.2.2
+License: GPLv2 or later
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+
+bbPress is forum software, made the WordPress way
+
+== Description ==
+
+Have you ever been frustrated with forum or bulletin board software that was slow, bloated and always got your server hacked? bbPress is focused on ease of integration, ease of use, web standards, and speed.
+
+We're keeping things as small and light as possible while still allowing for great add-on features through WordPress's extensive plugin system. What does all that mean? bbPress is lean, mean, and ready to take on any job you throw at it.
+
+== Installation ==
+
+1. Place the 'bbpress' folder in your '/wp-content/plugins/' directory.
+2. Activate bbPress.
+3. Visit 'Settings > Forums' and adjust your configuration.
+4. Create some forums.
+5. View your site.
+6. Adjust the CSS of your theme as needed, to make everything pretty.
+
+== Changelog ==
+
+= 2.2.2 =
+* RTL and i18n fixes
+* Improved user profile theme compatibility
+* Fixed incorrect link in credits page
+* Fixed admin area JS issues related to topic suggest
+* Fixed template part reference in extras user edit template
+
+= 2.2.1 =
+* Fix role mapping for non-WordPress roles
+* Fix issue with private forums being blocked
+* Allow moderators to see hidden forums
+
+= 2.2 =
+* Improved user roles and capabilities
+* Improved theme compatibility
+* Improved BuddyPress Group Forums integration
+* Improved forums convertion tool
+* Improved forums tools and settings
+* Improved multisite support
+* Added What's New and Credits pages
+* WordPress 3.5 and BuddyPress 1.7 ready
+
+= 2.1.2 =
+* Fixed admin-side help verbiage
+* Fixed reply height CSS
+* Fixed password converter
+* Fixed child post trash and delete functions
+
+= 2.1.1 =
+* Fixed Invision, phpBB, and vBulletin importers
+* Fixed private/hidden forum bugs
+* Fixed topic split meta values
+* Fixed theme compatibility logic error
+* Fixed role mask issues for shared user installs
+* Fixed missing function cruft
+* Fixed missing filter on displayed user fields
+
+= 2.1 =
+* WordPress 3.4 compatibility
+* Deprecate $bbp global, use bbpress() singleton
+* Private forums now visible to registered users
+* Updated forum converter
+* Topic and reply edits now ran through Akismet
+* Fixed Akismet edit bug
+* Fixed Widgets nooping globals
+* Fixed translation load order
+* Fixed user-edit bugs
+* Fixed settings screen regressions
+* Improved post cache invalidation
+* Improved admin-side nonce checks
+* Improved admin settings API
+* Improved bbPress 1.1 converter
+* Improved BuddyPress integration
+* Improved Theme-Compatibility
+* Improved template coverage
+* Improved query performance
+* Improved breadcrumb behavior
+* Improved multisite integration
+* Improved code clarity
+* Improved RTL styling
+* Added 2x menu icons for HiDPI displays
+* Added fancy editor support
+* Added fallback theme picker
+* Added tools for importing, resetting, and removing
+
+= 2.0 =
+* Released on September 21, 2011
+
+= 2.0-rc-5 =
+* Fixed Genesis incompatibilities
+* Fixed BuddyPress activity stream issues
+* Fixed Subscription email sending issues
+* Fixed Theme Compat display issues for some themes
+* Improved Theme Compat class
+* More future proofing internal API's
+
+= 2.0-rc-4 =
+* BuddyPress @mention integration
+* Improved Akismet user agent handling
+* Added blacklist_keys support
+* Fixed spam/deleted user handling
+* Updated green admin color scheme for WordPress 3.2
+* Added actions to topic/reply forms
+* Improved support for future ajaxification
+
+= 2.0-rc-3 =
+* Fixed activation/deactivation
+* Added Forum Participant role for multisite use
+
+= 2.0-rc-2 =
+* BuddyPress activity action integration
+* Multisite integration
+* Fixed a bushel of bugs
+* Fixed tag pagination again
+* Fixed ajax priority loading
+
+= 2.0-rc-1 =
+* Fixed tag pagination
+* Broke tag pagination
+* Squashed a bunch of bugs
+
+= 2.0-beta-3b =
+* Fix regression in forum index theme compatibility template
+* Audit usage of get strings for moderator level and above users
+
+= 2.0-beta-3 =
+* Akismet integration
+* Fixes replies within wp-admin
+* Fixes reply notification links
+* Fixes inconsistent breadcrumb behavior
+* Fixes theme compatibility issues
+* Fixes archive and page conflicts
+* Improvements to unpretty permalink support
+* Improvements to importer
+* Improvements to multisite support
+* Normalize theme, shortcodes, and template parts
+* Add humans.txt
+* Add empty index.php files to prevent snooping
+* Add max length to topic titles (default 80 chars)
+
+= 2.0-beta-2 =
+* GlotPress integration
+* Fixes Forum archive bug
+* Fixes and improvements to importer
+* Adds home link support to breadcrumb
+* Improvements to Theme Compatibility
+* Numerous template and CSS improvements
+* RTL support
+* Improved multisite support
+* Add filters for future anti-spam support
+* Add missing breadcrumbs to various template files
+* Topic/reply trash fixes
+
+= 2.0-beta-1 =
+* In development
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress-functions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,362 @@
+<?php
+
+/**
+ * Functions of bbPress's Default theme
+ *
+ * @package bbPress
+ * @subpackage BBP_Theme_Compat
+ * @since bbPress (r3732)
+ */
+
+// Exit if accessed directly
+if ( !defined( 'ABSPATH' ) ) exit;
+
+/** Theme Setup ***************************************************************/
+
+if ( !class_exists( 'BBP_Default' ) ) :
+
+/**
+ * Loads bbPress Default Theme functionality
+ *
+ * This is not a real theme by WordPress standards, and is instead used as the
+ * fallback for any WordPress theme that does not have bbPress templates in it.
+ *
+ * To make your custom theme bbPress compatible and customize the templates, you
+ * can copy these files into your theme without needing to merge anything
+ * together; bbPress should safely handle the rest.
+ *
+ * See @link BBP_Theme_Compat() for more.
+ *
+ * @since bbPress (r3732)
+ *
+ * @package bbPress
+ * @subpackage BBP_Theme_Compat
+ */
+class BBP_Default extends BBP_Theme_Compat {
+
+	/** Functions *************************************************************/
+
+	/**
+	 * The main bbPress (Default) Loader
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses BBP_Default::setup_globals()
+	 * @uses BBP_Default::setup_actions()
+	 */
+	public function __construct() {
+		$this->setup_globals();
+		$this->setup_actions();
+	}
+
+	/**
+	 * Component global variables
+	 *
+	 * Note that this function is currently commented out in the constructor.
+	 * It will only be used if you copy this file into your current theme and
+	 * uncomment the line above.
+	 *
+	 * You'll want to customize the values in here, so they match whatever your
+	 * needs are.
+	 *
+	 * @since bbPress (r3732)
+	 * @access private
+	 */
+	private function setup_globals() {
+		$bbp           = bbpress();
+		$this->id      = 'default';
+		$this->name    = __( 'bbPress Default', 'bbpress' );
+		$this->version = bbp_get_version();
+		$this->dir     = trailingslashit( $bbp->themes_dir . 'default' );
+		$this->url     = trailingslashit( $bbp->themes_url . 'default' );
+	}
+
+	/**
+	 * Setup the theme hooks
+	 *
+	 * @since bbPress (r3732)
+	 * @access private
+	 *
+	 * @uses add_filter() To add various filters
+	 * @uses add_action() To add various actions
+	 */
+	private function setup_actions() {
+
+		/** Scripts ***********************************************************/
+
+		add_action( 'bbp_enqueue_scripts',      array( $this, 'enqueue_styles'        ) ); // Enqueue theme CSS
+		add_action( 'bbp_enqueue_scripts',      array( $this, 'enqueue_scripts'       ) ); // Enqueue theme JS
+		add_filter( 'bbp_enqueue_scripts',      array( $this, 'localize_topic_script' ) ); // Enqueue theme script localization
+		add_action( 'bbp_head',                 array( $this, 'head_scripts'          ) ); // Output some extra JS in the <head>
+		add_action( 'wp_ajax_dim-favorite',     array( $this, 'ajax_favorite'         ) ); // Handles the ajax favorite/unfavorite
+		add_action( 'wp_ajax_dim-subscription', array( $this, 'ajax_subscription'     ) ); // Handles the ajax subscribe/unsubscribe
+
+		/** Template Wrappers *************************************************/
+
+		add_action( 'bbp_before_main_content',  array( $this, 'before_main_content'   ) ); // Top wrapper HTML
+		add_action( 'bbp_after_main_content',   array( $this, 'after_main_content'    ) ); // Bottom wrapper HTML
+
+		/** Override **********************************************************/
+
+		do_action_ref_array( 'bbp_theme_compat_actions', array( &$this ) );
+	}
+
+	/**
+	 * Inserts HTML at the top of the main content area to be compatible with
+	 * the Twenty Twelve theme.
+	 *
+	 * @since bbPress (r3732)
+	 */
+	public function before_main_content() {
+	?>
+
+		<div id="bbp-container">
+			<div id="bbp-content" role="main">
+
+	<?php
+	}
+
+	/**
+	 * Inserts HTML at the bottom of the main content area to be compatible with
+	 * the Twenty Twelve theme.
+	 *
+	 * @since bbPress (r3732)
+	 */
+	public function after_main_content() {
+	?>
+
+			</div><!-- #bbp-content -->
+		</div><!-- #bbp-container -->
+
+	<?php
+	}
+
+	/**
+	 * Load the theme CSS
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses wp_enqueue_style() To enqueue the styles
+	 */
+	public function enqueue_styles() {
+
+		// LTR or RTL
+		$file = is_rtl() ? 'css/bbpress-rtl.css' : 'css/bbpress.css';
+
+		// Check child theme
+		if ( file_exists( trailingslashit( get_stylesheet_directory() ) . $file ) ) {
+			$location = trailingslashit( get_stylesheet_directory_uri() );
+			$handle   = 'bbp-child-bbpress';
+
+		// Check parent theme
+		} elseif ( file_exists( trailingslashit( get_template_directory() ) . $file ) ) {
+			$location = trailingslashit( get_template_directory_uri() );
+			$handle   = 'bbp-parent-bbpress';
+
+		// bbPress Theme Compatibility
+		} else {
+			$location = trailingslashit( $this->url );
+			$handle   = 'bbp-default-bbpress';
+		}
+
+		// Enqueue the bbPress styling
+		wp_enqueue_style( $handle, $location . $file, array(), $this->version, 'screen' );
+	}
+
+	/**
+	 * Enqueue the required Javascript files
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses bbp_is_single_topic() To check if it's the topic page
+	 * @uses bbp_is_single_user_edit() To check if it's the profile edit page
+	 * @uses wp_enqueue_script() To enqueue the scripts
+	 */
+	public function enqueue_scripts() {
+
+		if ( bbp_is_single_topic() )
+			wp_enqueue_script( 'bbpress-topic', $this->url . 'js/topic.js', array( 'wp-lists' ), $this->version, true );
+
+		elseif ( bbp_is_single_user_edit() )
+			wp_enqueue_script( 'user-profile' );
+	}
+
+	/**
+	 * Put some scripts in the header, like AJAX url for wp-lists
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses bbp_is_single_topic() To check if it's the topic page
+	 * @uses admin_url() To get the admin url
+	 * @uses bbp_is_single_user_edit() To check if it's the profile edit page
+	 */
+	public function head_scripts() {
+	?>
+
+		<script type="text/javascript">
+			/* <![CDATA[ */
+			var ajaxurl = '<?php echo admin_url( 'admin-ajax.php' ); ?>';
+
+			<?php if ( bbp_is_single_user_edit() ) : ?>
+			if ( window.location.hash == '#password' ) {
+				document.getElementById('pass1').focus();
+			}
+			<?php endif; ?>
+			/* ]]> */
+		</script>
+
+	<?php
+	}
+
+	/**
+	 * Load localizations for topic script
+	 *
+	 * These localizations require information that may not be loaded even by init.
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses bbp_is_single_topic() To check if it's the topic page
+	 * @uses is_user_logged_in() To check if user is logged in
+	 * @uses bbp_get_current_user_id() To get the current user id
+	 * @uses bbp_get_topic_id() To get the topic id
+	 * @uses bbp_get_favorites_permalink() To get the favorites permalink
+	 * @uses bbp_is_user_favorite() To check if the topic is in user's favorites
+	 * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
+	 * @uses bbp_is_user_subscribed() To check if the user is subscribed to topic
+	 * @uses bbp_get_topic_permalink() To get the topic permalink
+	 * @uses wp_localize_script() To localize the script
+	 */
+	public function localize_topic_script() {
+
+		// Bail if not viewing a single topic
+		if ( !bbp_is_single_topic() )
+			return;
+
+		// Bail if user is not logged in
+		if ( !is_user_logged_in() )
+			return;
+
+		$user_id = bbp_get_current_user_id();
+
+		$localizations = array(
+			'currentUserId' => $user_id,
+			'topicId'       => bbp_get_topic_id(),
+		);
+
+		// Favorites
+		if ( bbp_is_favorites_active() ) {
+			$localizations['favoritesActive'] = 1;
+			$localizations['favoritesLink']   = bbp_get_favorites_permalink( $user_id );
+			$localizations['isFav']           = (int) bbp_is_user_favorite( $user_id );
+			$localizations['favLinkYes']      = __( 'favorites',                                         'bbpress' );
+			$localizations['favLinkNo']       = __( '?',                                                 'bbpress' );
+			$localizations['favYes']          = __( 'This topic is one of your %favLinkYes% [%favDel%]', 'bbpress' );
+			$localizations['favNo']           = __( '%favAdd% (%favLinkNo%)',                            'bbpress' );
+			$localizations['favDel']          = __( '&times;',                                           'bbpress' );
+			$localizations['favAdd']          = __( 'Add this topic to your favorites',                  'bbpress' );
+		} else {
+			$localizations['favoritesActive'] = 0;
+		}
+
+		// Subscriptions
+		if ( bbp_is_subscriptions_active() ) {
+			$localizations['subsActive']   = 1;
+			$localizations['isSubscribed'] = (int) bbp_is_user_subscribed( $user_id );
+			$localizations['subsSub']      = __( 'Subscribe',   'bbpress' );
+			$localizations['subsUns']      = __( 'Unsubscribe', 'bbpress' );
+			$localizations['subsLink']     = bbp_get_topic_permalink();
+		} else {
+			$localizations['subsActive'] = 0;
+		}
+
+		wp_localize_script( 'bbpress-topic', 'bbpTopicJS', $localizations );
+	}
+
+	/**
+	 * Add or remove a topic from a user's favorites
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses bbp_get_current_user_id() To get the current user id
+	 * @uses current_user_can() To check if the current user can edit the user
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses check_ajax_referer() To verify the nonce & check the referer
+	 * @uses bbp_is_user_favorite() To check if the topic is user's favorite
+	 * @uses bbp_remove_user_favorite() To remove the topic from user's favorites
+	 * @uses bbp_add_user_favorite() To add the topic from user's favorites
+	 */
+	public function ajax_favorite() {
+		$user_id = bbp_get_current_user_id();
+		$id      = intval( $_POST['id'] );
+
+		if ( !current_user_can( 'edit_user', $user_id ) )
+			die( '-1' );
+
+		$topic = bbp_get_topic( $id );
+
+		if ( empty( $topic ) )
+			die( '0' );
+
+		check_ajax_referer( 'toggle-favorite_' . $topic->ID );
+
+		if ( bbp_is_user_favorite( $user_id, $topic->ID ) ) {
+			if ( bbp_remove_user_favorite( $user_id, $topic->ID ) ) {
+				die( '1' );
+			}
+		} else {
+			if ( bbp_add_user_favorite( $user_id, $topic->ID ) ) {
+				die( '1' );
+			}
+		}
+
+		die( '0' );
+	}
+
+	/**
+	 * Subscribe/Unsubscribe a user from a topic
+	 *
+	 * @since bbPress (r3732)
+	 *
+	 * @uses bbp_is_subscriptions_active() To check if the subscriptions are active
+	 * @uses bbp_get_current_user_id() To get the current user id
+	 * @uses current_user_can() To check if the current user can edit the user
+	 * @uses bbp_get_topic() To get the topic
+	 * @uses check_ajax_referer() To verify the nonce & check the referer
+	 * @uses bbp_is_user_subscribed() To check if the topic is in user's
+	 *                                 subscriptions
+	 * @uses bbp_remove_user_subscriptions() To remove the topic from user's
+	 *                                        subscriptions
+	 * @uses bbp_add_user_subscriptions() To add the topic from user's subscriptions
+	 */
+	public function ajax_subscription() {
+		if ( !bbp_is_subscriptions_active() )
+			return;
+
+		$user_id = bbp_get_current_user_id();
+		$id      = intval( $_POST['id'] );
+
+		if ( !current_user_can( 'edit_user', $user_id ) )
+			die( '-1' );
+
+		$topic = bbp_get_topic( $id );
+
+		if ( empty( $topic ) )
+			die( '0' );
+
+		check_ajax_referer( 'toggle-subscription_' . $topic->ID );
+
+		if ( bbp_is_user_subscribed( $user_id, $topic->ID ) ) {
+			if ( bbp_remove_user_subscription( $user_id, $topic->ID ) ) {
+				die( '1' );
+			}
+		} else {
+			if ( bbp_add_user_subscription( $user_id, $topic->ID ) ) {
+				die( '1' );
+			}
+		}
+
+		die( '0' );
+	}
+}
+new BBP_Default();
+endif;
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-archive-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Archive Forum Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php do_action( 'bbp_template_before_forums_index' ); ?>
+
+	<?php if ( bbp_has_forums() ) : ?>
+
+		<?php bbp_get_template_part( 'loop',     'forums'    ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_get_template_part( 'feedback', 'no-forums' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_forums_index' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-archive-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,36 @@
+<?php
+
+/**
+ * Archive Topic Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php if ( bbp_is_topic_tag() ) bbp_topic_tag_description(); ?>
+
+	<?php do_action( 'bbp_template_before_topics_index' ); ?>
+
+	<?php if ( bbp_has_topics() ) : ?>
+
+		<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+		<?php bbp_get_template_part( 'loop',       'topics'    ); ?>
+
+		<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_topics_index' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,54 @@
+<?php
+
+/**
+ * Single Topic Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php do_action( 'bbp_template_before_single_forum' ); ?>
+
+	<?php if ( post_password_required() ) : ?>
+
+		<?php bbp_get_template_part( 'form', 'protected' ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_single_forum_description(); ?>
+
+		<?php if ( bbp_get_forum_subforum_count() && bbp_has_forums() ) : ?>
+
+			<?php bbp_get_template_part( 'loop', 'forums' ); ?>
+
+		<?php endif; ?>
+
+		<?php if ( !bbp_is_forum_category() && bbp_has_topics() ) : ?>
+
+			<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+			<?php bbp_get_template_part( 'loop',       'topics'    ); ?>
+
+			<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+			<?php bbp_get_template_part( 'form',       'topic'     ); ?>
+
+		<?php elseif ( !bbp_is_forum_category() ) : ?>
+
+			<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+			<?php bbp_get_template_part( 'form',       'topic'     ); ?>
+
+		<?php endif; ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_single_forum' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-reply.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Single Reply Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php do_action( 'bbp_template_before_single_reply' ); ?>
+
+	<?php if ( post_password_required() ) : ?>
+
+		<?php bbp_get_template_part( 'form', 'protected' ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_get_template_part( 'loop', 'single-reply' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_single_reply' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-topic-lead.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,102 @@
+<?php
+
+/**
+ * Single Topic Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_lead_topic' ); ?>
+
+<ul id="bbp-topic-<?php bbp_topic_id(); ?>-lead" class="bbp-lead-topic">
+
+	<li class="bbp-header">
+
+		<div class="bbp-topic-author"><?php  _e( 'Creator',  'bbpress' ); ?></div><!-- .bbp-topic-author -->
+
+		<div class="bbp-topic-content">
+
+			<?php _e( 'Topic', 'bbpress' ); ?>
+
+			<?php bbp_user_subscribe_link(); ?>
+
+			<?php bbp_user_favorites_link(); ?>
+
+		</div><!-- .bbp-topic-content -->
+
+	</li><!-- .bbp-header -->
+
+	<li class="bbp-body">
+
+		<div class="bbp-topic-header">
+
+			<div class="bbp-meta">
+
+				<span class="bbp-topic-post-date"><?php bbp_topic_post_date(); ?></span>
+
+				<a href="<?php bbp_topic_permalink(); ?>" title="<?php bbp_topic_title(); ?>" class="bbp-topic-permalink">#<?php bbp_topic_id(); ?></a>
+
+				<?php do_action( 'bbp_theme_before_topic_admin_links' ); ?>
+
+				<?php bbp_topic_admin_links(); ?>
+
+				<?php do_action( 'bbp_theme_after_topic_admin_links' ); ?>
+
+			</div><!-- .bbp-meta -->
+
+		</div><!-- .bbp-topic-header -->
+
+		<div id="post-<?php bbp_topic_id(); ?>" <?php bbp_topic_class(); ?>>
+
+			<div class="bbp-topic-author">
+
+				<?php do_action( 'bbp_theme_before_topic_author_details' ); ?>
+
+				<?php bbp_topic_author_link( array( 'sep' => '<br />', 'show_role' => true ) ); ?>
+
+				<?php if ( is_super_admin() ) : ?>
+
+					<?php do_action( 'bbp_theme_before_topic_author_admin_details' ); ?>
+
+					<div class="bbp-topic-ip"><?php bbp_author_ip( bbp_get_topic_id() ); ?></div>
+
+					<?php do_action( 'bbp_theme_after_topic_author_admin_details' ); ?>
+
+				<?php endif; ?>
+
+				<?php do_action( 'bbp_theme_after_topic_author_details' ); ?>
+
+			</div><!-- .bbp-topic-author -->
+
+			<div class="bbp-topic-content">
+
+				<?php do_action( 'bbp_theme_before_topic_content' ); ?>
+
+				<?php bbp_topic_content(); ?>
+
+				<?php do_action( 'bbp_theme_after_topic_content' ); ?>
+
+			</div><!-- .bbp-topic-content -->
+
+		</div><!-- #post-<?php bbp_topic_id(); ?> -->
+
+	</li><!-- .bbp-body -->
+
+	<li class="bbp-footer">
+
+		<div class="bbp-topic-author"><?php  _e( 'Creator',  'bbpress' ); ?></div>
+
+		<div class="bbp-topic-content">
+
+			<?php _e( 'Topic', 'bbpress' ); ?>
+			
+		</div><!-- .bbp-topic-content -->
+
+	</li>
+
+</ul><!-- #topic-<?php bbp_topic_id(); ?>-replies -->
+
+<?php do_action( 'bbp_template_after_lead_topic' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,50 @@
+<?php
+
+/**
+ * Single Topic Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php do_action( 'bbp_template_before_single_topic' ); ?>
+
+	<?php if ( post_password_required() ) : ?>
+
+		<?php bbp_get_template_part( 'form', 'protected' ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_topic_tag_list(); ?>
+
+		<?php bbp_single_topic_description(); ?>
+
+		<?php if ( bbp_show_lead_topic() ) : ?>
+
+			<?php bbp_get_template_part( 'content', 'single-topic-lead' ); ?>
+
+		<?php endif; ?>
+
+		<?php if ( bbp_has_replies() ) : ?>
+
+			<?php bbp_get_template_part( 'pagination', 'replies' ); ?>
+
+			<?php bbp_get_template_part( 'loop',       'replies' ); ?>
+
+			<?php bbp_get_template_part( 'pagination', 'replies' ); ?>
+
+		<?php endif; ?>
+
+		<?php bbp_get_template_part( 'form', 'reply' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_single_topic' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-user.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Single User Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="bbp-user-wrapper">
+		<?php bbp_get_template_part( 'user', 'details' ); ?>
+
+		<div id="bbp-user-body">
+			<?php if ( bbp_is_favorites()                 ) bbp_get_template_part( 'user', 'favorites'       ); ?>
+			<?php if ( bbp_is_subscriptions()             ) bbp_get_template_part( 'user', 'subscriptions'   ); ?>
+			<?php if ( bbp_is_single_user_topics()        ) bbp_get_template_part( 'user', 'topics-created'  ); ?>
+			<?php if ( bbp_is_single_user_replies()       ) bbp_get_template_part( 'user', 'replies-created' ); ?>
+			<?php if ( bbp_is_single_user_edit()          ) bbp_get_template_part( 'form', 'user-edit'       ); ?>
+			<?php if ( bbp_is_single_user_profile()       ) bbp_get_template_part( 'user', 'profile'         ); ?>
+		</div>
+	</div>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-single-view.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Single View Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php bbp_set_query_name( 'bbp_view' ); ?>
+
+	<?php if ( bbp_view_query() ) : ?>
+
+		<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+		<?php bbp_get_template_part( 'loop',       'topics'    ); ?>
+
+		<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+	<?php else : ?>
+
+		<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+	<?php endif; ?>
+
+	<?php bbp_reset_query_name(); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/content-topic-tag-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,24 @@
+<?php
+
+/**
+ * Topic Tag Edit Content Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php bbp_topic_tag_description(); ?>
+
+	<?php do_action( 'bbp_template_before_topic_tag_edit' ); ?>
+
+	<?php bbp_get_template_part( 'form', 'topic-tag' ); ?>
+
+	<?php do_action( 'bbp_template_after_topic_tag_edit' ); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-logged-in.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Already Logged In
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div class="bbp-template-notice info">
+	<p><?php _e( 'You are already logged in.', 'bbpress' ); ?></p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-access.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * No access
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="forum-private" class="bbp-forum-content">
+	<h1 class="entry-title"><?php _e( 'Private', 'bbpress' ); ?></h1>
+	<div class="entry-content">
+		<div class="bbp-template-notice info">
+			<p><?php _e( 'You do not have permission to view this forum.', 'bbpress' ); ?></p>
+		</div>
+	</div>
+</div><!-- #forum-private -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-forums.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Oh bother!
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div class="bbp-template-notice">
+	<p><?php _e( 'Oh bother! No forums were found here!', 'bbpress' ); ?></p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-replies.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Oh bother!
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div class="bbp-template-notice">
+	<p><?php _e( 'Oh bother! No replies were found here!', 'bbpress' ); ?></p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/feedback-no-topics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,14 @@
+<?php
+
+/**
+ * Oh bother!
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div class="bbp-template-notice">
+	<p><?php _e( 'Oh bother! No topics were found here!', 'bbpress' ); ?></p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-anonymous.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Anonymous User
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php if ( bbp_is_anonymous() || ( bbp_is_topic_edit() && bbp_is_topic_anonymous() ) || ( bbp_is_reply_edit() && bbp_is_reply_anonymous() ) ) : ?>
+
+	<?php do_action( 'bbp_theme_before_anonymous_form' ); ?>
+
+	<fieldset class="bbp-form">
+		<legend><?php ( bbp_is_topic_edit() || bbp_is_reply_edit() ) ? _e( 'Author Information', 'bbpress' ) : _e( 'Your information:', 'bbpress' ); ?></legend>
+
+		<?php do_action( 'bbp_theme_anonymous_form_extras_top' ); ?>
+
+		<p>
+			<label for="bbp_anonymous_author"><?php _e( 'Name (required):', 'bbpress' ); ?></label><br />
+			<input type="text" id="bbp_anonymous_author"  value="<?php bbp_is_topic_edit() ? bbp_topic_author()       : bbp_is_reply_edit() ? bbp_reply_author()       : bbp_current_anonymous_user_data( 'name' );    ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_anonymous_name" />
+		</p>
+
+		<p>
+			<label for="bbp_anonymous_email"><?php _e( 'Mail (will not be published) (required):', 'bbpress' ); ?></label><br />
+			<input type="text" id="bbp_anonymous_email"   value="<?php bbp_is_topic_edit() ? bbp_topic_author_email() : bbp_is_reply_edit() ? bbp_reply_author_email() : bbp_current_anonymous_user_data( 'email' );   ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_anonymous_email" />
+		</p>
+
+		<p>
+			<label for="bbp_anonymous_website"><?php _e( 'Website:', 'bbpress' ); ?></label><br />
+			<input type="text" id="bbp_anonymous_website" value="<?php bbp_is_topic_edit() ? bbp_topic_author_url()   : bbp_is_reply_edit() ? bbp_reply_author_url()   : bbp_current_anonymous_user_data( 'website' ); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_anonymous_website" />
+		</p>
+
+		<?php do_action( 'bbp_theme_anonymous_form_extras_bottom' ); ?>
+
+	</fieldset>
+
+	<?php do_action( 'bbp_theme_after_anonymous_form' ); ?>
+
+<?php endif; ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,190 @@
+<?php
+
+/**
+ * New/Edit Forum
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php if ( bbp_is_forum_edit() ) : ?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php bbp_single_forum_description( array( 'forum_id' => bbp_get_forum_id() ) ); ?>
+
+<?php endif; ?>
+
+<?php if ( bbp_current_user_can_access_create_forum_form() ) : ?>
+
+	<div id="new-forum-<?php bbp_forum_id(); ?>" class="bbp-forum-form">
+
+		<form id="new-post" name="new-post" method="post" action="<?php the_permalink(); ?>">
+
+			<?php do_action( 'bbp_theme_before_forum_form' ); ?>
+
+			<fieldset class="bbp-form">
+				<legend>
+
+					<?php
+						if ( bbp_is_forum_edit() )
+							printf( __( 'Now Editing &ldquo;%s&rdquo;', 'bbpress' ), bbp_get_forum_title() );
+						else
+							bbp_is_single_forum() ? printf( __( 'Create New Forum in &ldquo;%s&rdquo;', 'bbpress' ), bbp_get_forum_title() ) : _e( 'Create New Forum', 'bbpress' );
+					?>
+
+				</legend>
+
+				<?php do_action( 'bbp_theme_before_forum_form_notices' ); ?>
+
+				<?php if ( !bbp_is_forum_edit() && bbp_is_forum_closed() ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'This forum is closed to new content, however your account still allows you to do so.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php if ( current_user_can( 'unfiltered_html' ) ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'Your account has the ability to post unrestricted HTML content.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php do_action( 'bbp_template_notices' ); ?>
+
+				<div>
+
+					<?php do_action( 'bbp_theme_before_forum_form_title' ); ?>
+
+					<p>
+						<label for="bbp_forum_title"><?php printf( __( 'Forum Name (Maximum Length: %d):', 'bbpress' ), bbp_get_title_max_length() ); ?></label><br />
+						<input type="text" id="bbp_forum_title" value="<?php bbp_form_forum_title(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_forum_title" maxlength="<?php bbp_title_max_length(); ?>" />
+					</p>
+
+					<?php do_action( 'bbp_theme_after_forum_form_title' ); ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_content' ); ?>
+
+					<?php if ( !function_exists( 'wp_editor' ) ) : ?>
+
+						<p>
+							<label for="bbp_forum_content"><?php _e( 'Forum Description:', 'bbpress' ); ?></label><br />
+							<textarea id="bbp_forum_content" tabindex="<?php bbp_tab_index(); ?>" name="bbp_forum_content" cols="60" rows="10"><?php bbp_form_forum_content(); ?></textarea>
+						</p>
+
+					<?php else : ?>
+
+						<?php bbp_the_content( array( 'context' => 'forum' ) ); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_after_forum_form_content' ); ?>
+
+					<?php if ( !current_user_can( 'unfiltered_html' ) ) : ?>
+
+						<p class="form-allowed-tags">
+							<label><?php _e( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes:','bbpress' ); ?></label><br />
+							<code><?php bbp_allowed_tags(); ?></code>
+						</p>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_type' ); ?>
+
+					<p>
+						<label for="bbp_forum_type"><?php _e( 'Forum Type:', 'bbpress' ); ?></label><br />
+						<?php bbp_form_forum_type_dropdown(); ?>
+					</p>
+
+					<?php do_action( 'bbp_theme_after_forum_form_type' ); ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_status' ); ?>
+
+					<p>
+						<label for="bbp_forum_status"><?php _e( 'Status:', 'bbpress' ); ?></label><br />
+						<?php bbp_form_forum_status_dropdown(); ?>
+					</p>
+
+					<?php do_action( 'bbp_theme_after_forum_form_status' ); ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_status' ); ?>
+
+					<p>
+						<label for="bbp_forum_visibility"><?php _e( 'Visibility:', 'bbpress' ); ?></label><br />
+						<?php bbp_form_forum_visibility_dropdown(); ?>
+					</p>
+
+					<?php do_action( 'bbp_theme_after_forum_visibility_status' ); ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_parent' ); ?>
+
+					<p>
+						<label for="bbp_forum_parent_id"><?php _e( 'Parent Forum:', 'bbpress' ); ?></label><br />
+
+						<?php
+							bbp_dropdown( array(
+								'select_id' => 'bbp_forum_parent_id',
+								'show_none' => __( '(No Parent)', 'bbpress' ),
+								'selected'  => bbp_get_form_forum_parent(),
+								'exclude'   => bbp_get_forum_id()
+							) );
+						?>
+					</p>
+
+					<?php do_action( 'bbp_theme_after_forum_form_parent' ); ?>
+
+					<?php do_action( 'bbp_theme_before_forum_form_submit_wrapper' ); ?>
+
+					<div class="bbp-submit-wrapper">
+
+						<?php do_action( 'bbp_theme_before_forum_form_submit_button' ); ?>
+
+						<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_forum_submit" name="bbp_forum_submit" class="button submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
+
+						<?php do_action( 'bbp_theme_after_forum_form_submit_button' ); ?>
+
+					</div>
+
+					<?php do_action( 'bbp_theme_after_forum_form_submit_wrapper' ); ?>
+
+				</div>
+
+				<?php bbp_forum_form_fields(); ?>
+
+			</fieldset>
+
+			<?php do_action( 'bbp_theme_after_forum_form' ); ?>
+
+		</form>
+	</div>
+
+<?php elseif ( bbp_is_forum_closed() ) : ?>
+
+	<div id="no-forum-<?php bbp_forum_id(); ?>" class="bbp-no-forum">
+		<div class="bbp-template-notice">
+			<p><?php printf( __( 'The forum &#8216;%s&#8217; is closed to new content.', 'bbpress' ), bbp_get_forum_title() ); ?></p>
+		</div>
+	</div>
+
+<?php else : ?>
+
+	<div id="no-forum-<?php bbp_forum_id(); ?>" class="bbp-no-forum">
+		<div class="bbp-template-notice">
+			<p><?php is_user_logged_in() ? _e( 'You cannot create new forums.', 'bbpress' ) : _e( 'You must be logged in to create new forums.', 'bbpress' ); ?></p>
+		</div>
+	</div>
+
+<?php endif; ?>
+
+<?php if ( bbp_is_forum_edit() ) : ?>
+
+</div>
+
+<?php endif; ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-protected.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,19 @@
+<?php
+
+/**
+ * Password Protected
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+	<fieldset class="bbp-form" id="bbp-protected">
+		<Legend><?php _e( 'Protected', 'bbpress' ); ?></legend>
+
+		<?php echo get_the_password_form(); ?>
+
+	</fieldset>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-reply.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,198 @@
+<?php
+
+/**
+ * New/Edit Reply
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php if ( bbp_is_reply_edit() ) : ?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+<?php endif; ?>
+
+<?php if ( bbp_current_user_can_access_create_reply_form() ) : ?>
+
+	<div id="new-reply-<?php bbp_topic_id(); ?>" class="bbp-reply-form">
+
+		<form id="new-post" name="new-post" method="post" action="<?php the_permalink(); ?>">
+
+			<?php do_action( 'bbp_theme_before_reply_form' ); ?>
+
+			<fieldset class="bbp-form">
+				<legend><?php printf( __( 'Reply To: %s', 'bbpress' ), bbp_get_topic_title() ); ?></legend>
+
+				<?php do_action( 'bbp_theme_before_reply_form_notices' ); ?>
+
+				<?php if ( !bbp_is_topic_open() && !bbp_is_reply_edit() ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'This topic is marked as closed to new replies, however your posting capabilities still allow you to do so.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php if ( current_user_can( 'unfiltered_html' ) ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'Your account has the ability to post unrestricted HTML content.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php do_action( 'bbp_template_notices' ); ?>
+
+				<div>
+
+					<?php bbp_get_template_part( 'form', 'anonymous' ); ?>
+
+					<?php do_action( 'bbp_theme_before_reply_form_content' ); ?>
+
+					<?php if ( !function_exists( 'wp_editor' ) ) : ?>
+
+						<p>
+							<label for="bbp_reply_content"><?php _e( 'Reply:', 'bbpress' ); ?></label><br />
+							<textarea id="bbp_reply_content" tabindex="<?php bbp_tab_index(); ?>" name="bbp_reply_content" rows="6"><?php bbp_form_reply_content(); ?></textarea>
+						</p>
+
+					<?php else : ?>
+
+						<?php bbp_the_content( array( 'context' => 'reply' ) ); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_after_reply_form_content' ); ?>
+
+					<?php if ( !current_user_can( 'unfiltered_html' ) ) : ?>
+
+						<p class="form-allowed-tags">
+							<label><?php _e( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes:','bbpress' ); ?></label><br />
+							<code><?php bbp_allowed_tags(); ?></code>
+						</p>
+
+					<?php endif; ?>
+					
+					<?php if ( bbp_allow_topic_tags() && current_user_can( 'assign_topic_tags' ) ) : ?>
+
+						<?php do_action( 'bbp_theme_before_reply_form_tags' ); ?>
+
+						<p>
+							<label for="bbp_topic_tags"><?php _e( 'Tags:', 'bbpress' ); ?></label><br />
+							<input type="text" value="<?php bbp_form_topic_tags(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_topic_tags" id="bbp_topic_tags" <?php disabled( bbp_is_topic_spam() ); ?> />
+						</p>
+
+						<?php do_action( 'bbp_theme_after_reply_form_tags' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( bbp_is_subscriptions_active() && !bbp_is_anonymous() && ( !bbp_is_reply_edit() || ( bbp_is_reply_edit() && !bbp_is_reply_anonymous() ) ) ) : ?>
+
+						<?php do_action( 'bbp_theme_before_reply_form_subscription' ); ?>
+
+						<p>
+
+							<input name="bbp_topic_subscription" id="bbp_topic_subscription" type="checkbox" value="bbp_subscribe"<?php bbp_form_topic_subscribed(); ?> tabindex="<?php bbp_tab_index(); ?>" />
+
+							<?php if ( bbp_is_reply_edit() && ( get_the_author_meta( 'ID' ) != bbp_get_current_user_id() ) ) : ?>
+
+								<label for="bbp_topic_subscription"><?php _e( 'Notify the author of follow-up replies via email', 'bbpress' ); ?></label>
+
+							<?php else : ?>
+
+								<label for="bbp_topic_subscription"><?php _e( 'Notify me of follow-up replies via email', 'bbpress' ); ?></label>
+
+							<?php endif; ?>
+
+						</p>
+
+						<?php do_action( 'bbp_theme_after_reply_form_subscription' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( bbp_allow_revisions() && bbp_is_reply_edit() ) : ?>
+
+						<?php do_action( 'bbp_theme_before_reply_form_revisions' ); ?>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Revision', 'bbpress' ); ?></legend>
+							<div>
+								<input name="bbp_log_reply_edit" id="bbp_log_reply_edit" type="checkbox" value="1" <?php bbp_form_reply_log_edit(); ?> tabindex="<?php bbp_tab_index(); ?>" />
+								<label for="bbp_log_reply_edit"><?php _e( 'Keep a log of this edit:', 'bbpress' ); ?></label><br />
+							</div>
+
+							<div>
+								<label for="bbp_reply_edit_reason"><?php printf( __( 'Optional reason for editing:', 'bbpress' ), bbp_get_current_user_name() ); ?></label><br />
+								<input type="text" value="<?php bbp_form_reply_edit_reason(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_reply_edit_reason" id="bbp_reply_edit_reason" />
+							</div>
+						</fieldset>
+
+						<?php do_action( 'bbp_theme_after_reply_form_revisions' ); ?>
+
+					<?php else : ?>
+
+						<?php bbp_topic_admin_links(); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_before_reply_form_submit_wrapper' ); ?>
+
+					<div class="bbp-submit-wrapper">
+
+						<?php do_action( 'bbp_theme_before_reply_form_submit_button' ); ?>
+
+						<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_reply_submit" name="bbp_reply_submit" class="button submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
+
+						<?php do_action( 'bbp_theme_after_reply_form_submit_button' ); ?>
+
+					</div>
+
+					<?php do_action( 'bbp_theme_after_reply_form_submit_wrapper' ); ?>
+
+				</div>
+
+				<?php bbp_reply_form_fields(); ?>
+
+			</fieldset>
+
+			<?php do_action( 'bbp_theme_after_reply_form' ); ?>
+
+		</form>
+	</div>
+
+<?php elseif ( bbp_is_topic_closed() ) : ?>
+
+	<div id="no-reply-<?php bbp_topic_id(); ?>" class="bbp-no-reply">
+		<div class="bbp-template-notice">
+			<p><?php printf( __( 'The topic &#8216;%s&#8217; is closed to new replies.', 'bbpress' ), bbp_get_topic_title() ); ?></p>
+		</div>
+	</div>
+
+<?php elseif ( bbp_is_forum_closed( bbp_get_topic_forum_id() ) ) : ?>
+
+	<div id="no-reply-<?php bbp_topic_id(); ?>" class="bbp-no-reply">
+		<div class="bbp-template-notice">
+			<p><?php printf( __( 'The forum &#8216;%s&#8217; is closed to new topics and replies.', 'bbpress' ), bbp_get_forum_title( bbp_get_topic_forum_id() ) ); ?></p>
+		</div>
+	</div>
+
+<?php else : ?>
+
+	<div id="no-reply-<?php bbp_topic_id(); ?>" class="bbp-no-reply">
+		<div class="bbp-template-notice">
+			<p><?php is_user_logged_in() ? _e( 'You cannot reply to this topic.', 'bbpress' ) : _e( 'You must be logged in to reply to this topic.', 'bbpress' ); ?></p>
+		</div>
+	</div>
+
+<?php endif; ?>
+
+<?php if ( bbp_is_reply_edit() ) : ?>
+
+</div>
+
+<?php endif; ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-merge.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,112 @@
+<?php
+
+/**
+ * Merge Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php if ( is_user_logged_in() && current_user_can( 'edit_topic', bbp_get_topic_id() ) ) : ?>
+
+		<div id="merge-topic-<?php bbp_topic_id(); ?>" class="bbp-topic-merge">
+
+			<form id="merge_topic" name="merge_topic" method="post" action="<?php the_permalink(); ?>">
+
+				<fieldset class="bbp-form">
+
+					<legend><?php printf( __( 'Merge topic "%s"', 'bbpress' ), bbp_get_topic_title() ); ?></legend>
+
+					<div>
+
+						<div class="bbp-template-notice info">
+							<p><?php _e( 'Select the topic to merge this one into. The destination topic will remain the lead topic, and this one will change into a reply.', 'bbpress' ); ?></p>
+							<p><?php _e( 'To keep this topic as the lead, go to the other topic and use the merge tool from there instead.', 'bbpress' ); ?></p>
+						</div>
+
+						<div class="bbp-template-notice">
+							<p><?php _e( 'All replies within both topics will be merged chronologically. The order of the merged replies is based on the time and date they were posted. If the destination topic was created after this one, it\'s post date will be updated to second earlier than this one.', 'bbpress' ); ?></p>
+						</div>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Destination', 'bbpress' ); ?></legend>
+							<div>
+								<?php if ( bbp_has_topics( array( 'show_stickies' => false, 'post_parent' => bbp_get_topic_forum_id( bbp_get_topic_id() ), 'post__not_in' => array( bbp_get_topic_id() ) ) ) ) : ?>
+
+									<label for="bbp_destination_topic"><?php _e( 'Merge with this topic:', 'bbpress' ); ?></label>
+
+									<?php
+										bbp_dropdown( array(
+											'post_type'   => bbp_get_topic_post_type(),
+											'post_parent' => bbp_get_topic_forum_id( bbp_get_topic_id() ),
+											'selected'    => -1,
+											'exclude'     => bbp_get_topic_id(),
+											'select_id'   => 'bbp_destination_topic',
+											'none_found'  => __( 'No topics were found to which the topic could be merged to!', 'bbpress' )
+										) );
+									?>
+
+								<?php else : ?>
+
+									<label><?php _e( 'There are no other topics in this forum to merge with.', 'bbpress' ); ?></label>
+
+								<?php endif; ?>
+
+							</div>
+						</fieldset>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Topic Extras', 'bbpress' ); ?></legend>
+
+							<div>
+
+								<?php if ( bbp_is_subscriptions_active() ) : ?>
+
+									<input name="bbp_topic_subscribers" id="bbp_topic_subscribers" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+									<label for="bbp_topic_subscribers"><?php _e( 'Merge topic subscribers', 'bbpress' ); ?></label><br />
+
+								<?php endif; ?>
+
+								<input name="bbp_topic_favoriters" id="bbp_topic_favoriters" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+								<label for="bbp_topic_favoriters"><?php _e( 'Merge topic favoriters', 'bbpress' ); ?></label><br />
+
+								<?php if ( bbp_allow_topic_tags() ) : ?>
+
+									<input name="bbp_topic_tags" id="bbp_topic_tags" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+									<label for="bbp_topic_tags"><?php _e( 'Merge topic tags', 'bbpress' ); ?></label><br />
+
+								<?php endif; ?>
+
+							</div>
+						</fieldset>
+
+						<div class="bbp-template-notice error">
+							<p><?php _e( '<strong>WARNING:</strong> This process cannot be undone.', 'bbpress' ); ?></p>
+						</div>
+
+						<div class="bbp-submit-wrapper">
+							<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_merge_topic_submit" name="bbp_merge_topic_submit" class="button submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
+						</div>
+					</div>
+
+					<?php bbp_merge_topic_form_fields(); ?>
+
+				</fieldset>
+			</form>
+		</div>
+
+	<?php else : ?>
+
+		<div id="no-topic-<?php bbp_topic_id(); ?>" class="bbp-no-topic">
+			<div class="entry-content"><?php is_user_logged_in() ? _e( 'You do not have the permissions to edit this topic!', 'bbpress' ) : _e( 'You cannot edit this topic.', 'bbpress' ); ?></div>
+		</div>
+
+	<?php endif; ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-split.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,116 @@
+<?php
+
+/**
+ * Split Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+	<?php if ( is_user_logged_in() && current_user_can( 'edit_topic', bbp_get_topic_id() ) ) : ?>
+
+		<div id="split-topic-<?php bbp_topic_id(); ?>" class="bbp-topic-split">
+
+			<form id="split_topic" name="split_topic" method="post" action="<?php the_permalink(); ?>">
+
+				<fieldset class="bbp-form">
+
+					<legend><?php printf( __( 'Split topic "%s"', 'bbpress' ), bbp_get_topic_title() ); ?></legend>
+
+					<div>
+
+						<div class="bbp-template-notice info">
+							<p><?php _e( 'When you split a topic, you are slicing it in half starting with the reply you just selected. Choose to use that reply as a new topic with a new title, or merge those replies into an existing topic.', 'bbpress' ); ?></p>
+						</div>
+
+						<div class="bbp-template-notice">
+							<p><?php _e( 'If you use the existing topic option, replies within both topics will be merged chronologically. The order of the merged replies is based on the time and date they were posted.', 'bbpress' ); ?></p>
+						</div>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Split Method', 'bbpress' ); ?></legend>
+
+							<div>
+								<input name="bbp_topic_split_option" id="bbp_topic_split_option_reply" type="radio" checked="checked" value="reply" tabindex="<?php bbp_tab_index(); ?>" />
+								<label for="bbp_topic_split_option_reply"><?php printf( __( 'New topic in <strong>%s</strong> titled:', 'bbpress' ), bbp_get_forum_title( bbp_get_topic_forum_id( bbp_get_topic_id() ) ) ); ?></label>
+								<input type="text" id="bbp_topic_split_destination_title" value="<?php printf( __( 'Split: %s', 'bbpress' ), bbp_get_topic_title() ); ?>" tabindex="<?php bbp_tab_index(); ?>" size="35" name="bbp_topic_split_destination_title" />
+							</div>
+
+							<?php if ( bbp_has_topics( array( 'show_stickies' => false, 'post_parent' => bbp_get_topic_forum_id( bbp_get_topic_id() ), 'post__not_in' => array( bbp_get_topic_id() ) ) ) ) : ?>
+
+								<div>
+									<input name="bbp_topic_split_option" id="bbp_topic_split_option_existing" type="radio" value="existing" tabindex="<?php bbp_tab_index(); ?>" />
+									<label for="bbp_topic_split_option_existing"><?php _e( 'Use an existing topic in this forum:', 'bbpress' ); ?></label>
+
+									<?php
+										bbp_dropdown( array(
+											'post_type'   => bbp_get_topic_post_type(),
+											'post_parent' => bbp_get_topic_forum_id( bbp_get_topic_id() ),
+											'selected'    => -1,
+											'exclude'     => bbp_get_topic_id(),
+											'select_id'   => 'bbp_destination_topic',
+											'none_found'  => __( 'No other topics found!', 'bbpress' )
+										) );
+									?>
+
+								</div>
+
+							<?php endif; ?>
+
+						</fieldset>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Topic Extras', 'bbpress' ); ?></legend>
+
+							<div>
+
+								<?php if ( bbp_is_subscriptions_active() ) : ?>
+
+									<input name="bbp_topic_subscribers" id="bbp_topic_subscribers" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+									<label for="bbp_topic_subscribers"><?php _e( 'Copy subscribers to the new topic', 'bbpress' ); ?></label><br />
+
+								<?php endif; ?>
+
+								<input name="bbp_topic_favoriters" id="bbp_topic_favoriters" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+								<label for="bbp_topic_favoriters"><?php _e( 'Copy favoriters to the new topic', 'bbpress' ); ?></label><br />
+
+								<?php if ( bbp_allow_topic_tags() ) : ?>
+
+									<input name="bbp_topic_tags" id="bbp_topic_tags" type="checkbox" value="1" checked="checked" tabindex="<?php bbp_tab_index(); ?>" />
+									<label for="bbp_topic_tags"><?php _e( 'Copy topic tags to the new topic', 'bbpress' ); ?></label><br />
+
+								<?php endif; ?>
+
+							</div>
+						</fieldset>
+
+						<div class="bbp-template-notice error">
+							<p><?php _e( '<strong>WARNING:</strong> This process cannot be undone.', 'bbpress' ); ?></p>
+						</div>
+
+						<div class="bbp-submit-wrapper">
+							<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_merge_topic_submit" name="bbp_merge_topic_submit" class="button submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
+						</div>
+					</div>
+
+					<?php bbp_split_topic_form_fields(); ?>
+
+				</fieldset>
+			</form>
+		</div>
+
+	<?php else : ?>
+
+		<div id="no-topic-<?php bbp_topic_id(); ?>" class="bbp-no-topic">
+			<div class="entry-content"><?php is_user_logged_in() ? _e( 'You do not have the permissions to edit this topic!', 'bbpress' ) : _e( 'You cannot edit this topic.', 'bbpress' ); ?></div>
+		</div>
+
+	<?php endif; ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic-tag.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,117 @@
+<?php
+
+/**
+ * Edit Topic Tag
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php if ( current_user_can( 'edit_topic_tags' ) ) : ?>
+
+	<div id="edit-topic-tag-<?php bbp_topic_tag_id(); ?>" class="bbp-topic-tag-form">
+
+		<fieldset class="bbp-form" id="bbp-edit-topic-tag">
+
+			<legend><?php printf( __( 'Manage Tag: "%s"', 'bbpress' ), bbp_get_topic_tag_name() ); ?></legend>
+
+			<fieldset class="bbp-form" id="tag-rename">
+
+				<legend><?php _e( 'Rename', 'bbpress' ); ?></legend>
+
+				<div class="bbp-template-notice info">
+					<p><?php _e( 'Leave the slug empty to have one automatically generated.', 'bbpress' ); ?></p>
+				</div>
+
+				<div class="bbp-template-notice">
+					<p><?php _e( 'Changing the slug affects its permalink. Any links to the old slug will stop working.', 'bbpress' ); ?></p>
+				</div>
+
+				<form id="rename_tag" name="rename_tag" method="post" action="<?php the_permalink(); ?>">
+
+					<div>
+						<label for="tag-name"><?php _e( 'Name:', 'bbpress' ); ?></label>
+						<input type="text" id="tag-name" name="tag-name" size="20" maxlength="40" tabindex="<?php bbp_tab_index(); ?>" value="<?php echo esc_attr( bbp_get_topic_tag_name() ); ?>" />
+					</div>
+
+					<div>
+						<label for="tag-slug"><?php _e( 'Slug:', 'bbpress' ); ?></label>
+						<input type="text" id="tag-slug" name="tag-slug" size="20" maxlength="40" tabindex="<?php bbp_tab_index(); ?>" value="<?php echo esc_attr( apply_filters( 'editable_slug', bbp_get_topic_tag_slug() ) ); ?>" />
+					</div>
+
+					<div class="bbp-submit-wrapper">
+						<button type="submit" tabindex="<?php bbp_tab_index(); ?>" class="button submit"><?php esc_attr_e( 'Update', 'bbpress' ); ?></button>
+
+						<input type="hidden" name="tag-id" value="<?php bbp_topic_tag_id(); ?>" />
+						<input type="hidden" name="action" value="bbp-update-topic-tag" />
+
+						<?php wp_nonce_field( 'update-tag_' . bbp_get_topic_tag_id() ); ?>
+
+					</div>
+				</form>
+
+			</fieldset>
+
+			<fieldset class="bbp-form" id="tag-merge">
+
+				<legend><?php _e( 'Merge', 'bbpress' ); ?></legend>
+
+				<div class="bbp-template-notice">
+					<p><?php _e( 'Merging tags together cannot be undone.', 'bbpress' ); ?></p>
+				</div>
+
+				<form id="merge_tag" name="merge_tag" method="post" action="<?php the_permalink(); ?>">
+
+					<div>
+						<label for="tag-existing-name"><?php _e( 'Existing tag:', 'bbpress' ); ?></label>
+						<input type="text" id="tag-existing-name" name="tag-existing-name" size="22" tabindex="<?php bbp_tab_index(); ?>" maxlength="40" />
+					</div>
+
+					<div class="bbp-submit-wrapper">
+						<button type="submit" tabindex="<?php bbp_tab_index(); ?>" class="button submit" onclick="return confirm('<?php echo esc_js( sprintf( __( 'Are you sure you want to merge the "%s" tag into the tag you specified?', 'bbpress' ), bbp_get_topic_tag_name() ) ); ?>');"><?php esc_attr_e( 'Merge', 'bbpress' ); ?></button>
+
+						<input type="hidden" name="tag-id" value="<?php bbp_topic_tag_id(); ?>" />
+						<input type="hidden" name="action" value="bbp-merge-topic-tag" />
+
+						<?php wp_nonce_field( 'merge-tag_' . bbp_get_topic_tag_id() ); ?>
+					</div>
+				</form>
+
+			</fieldset>
+
+			<?php if ( current_user_can( 'delete_topic_tags' ) ) : ?>
+
+				<fieldset class="bbp-form" id="delete-tag">
+
+					<legend><?php _e( 'Delete', 'bbpress' ); ?></legend>
+
+					<div class="bbp-template-notice info">
+						<p><?php _e( 'This does not delete your topics. Only the tag itself is deleted.', 'bbpress' ); ?></p>
+					</div>
+					<div class="bbp-template-notice">
+						<p><?php _e( 'Deleting a tag cannot be undone.', 'bbpress' ); ?></p>
+						<p><?php _e( 'Any links to this tag will no longer function.', 'bbpress' ); ?></p>
+					</div>
+
+					<form id="delete_tag" name="delete_tag" method="post" action="<?php the_permalink(); ?>">
+
+						<div class="bbp-submit-wrapper">
+							<button type="submit" tabindex="<?php bbp_tab_index(); ?>" class="button submit" onclick="return confirm('<?php echo esc_js( sprintf( __( 'Are you sure you want to delete the "%s" tag? This is permanent and cannot be undone.', 'bbpress' ), bbp_get_topic_tag_name() ) ); ?>');"><?php esc_attr_e( 'Delete', 'bbpress' ); ?></button>
+
+							<input type="hidden" name="tag-id" value="<?php bbp_topic_tag_id(); ?>" />
+							<input type="hidden" name="action" value="bbp-delete-topic-tag" />
+
+							<?php wp_nonce_field( 'delete-tag_' . bbp_get_topic_tag_id() ); ?>
+						</div>
+					</form>
+
+				</fieldset>
+
+			<?php endif; ?>
+
+		</fieldset>
+	</div>
+
+<?php endif; ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,239 @@
+<?php
+
+/**
+ * New/Edit Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php if ( !bbp_is_single_forum() ) : ?>
+
+<div id="bbpress-forums">
+
+	<?php bbp_breadcrumb(); ?>
+
+<?php endif; ?>
+
+<?php if ( bbp_is_topic_edit() ) : ?>
+
+	<?php bbp_topic_tag_list( bbp_get_topic_id() ); ?>
+
+	<?php bbp_single_topic_description( array( 'topic_id' => bbp_get_topic_id() ) ); ?>
+
+<?php endif; ?>
+
+<?php if ( bbp_current_user_can_access_create_topic_form() ) : ?>
+
+	<div id="new-topic-<?php bbp_topic_id(); ?>" class="bbp-topic-form">
+
+		<form id="new-post" name="new-post" method="post" action="<?php the_permalink(); ?>">
+
+			<?php do_action( 'bbp_theme_before_topic_form' ); ?>
+
+			<fieldset class="bbp-form">
+				<legend>
+
+					<?php
+						if ( bbp_is_topic_edit() )
+							printf( __( 'Now Editing &ldquo;%s&rdquo;', 'bbpress' ), bbp_get_topic_title() );
+						else
+							bbp_is_single_forum() ? printf( __( 'Create New Topic in &ldquo;%s&rdquo;', 'bbpress' ), bbp_get_forum_title() ) : _e( 'Create New Topic', 'bbpress' );
+					?>
+
+				</legend>
+
+				<?php do_action( 'bbp_theme_before_topic_form_notices' ); ?>
+
+				<?php if ( !bbp_is_topic_edit() && bbp_is_forum_closed() ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'This forum is marked as closed to new topics, however your posting capabilities still allow you to do so.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php if ( current_user_can( 'unfiltered_html' ) ) : ?>
+
+					<div class="bbp-template-notice">
+						<p><?php _e( 'Your account has the ability to post unrestricted HTML content.', 'bbpress' ); ?></p>
+					</div>
+
+				<?php endif; ?>
+
+				<?php do_action( 'bbp_template_notices' ); ?>
+
+				<div>
+
+					<?php bbp_get_template_part( 'form', 'anonymous' ); ?>
+
+					<?php do_action( 'bbp_theme_before_topic_form_title' ); ?>
+
+					<p>
+						<label for="bbp_topic_title"><?php printf( __( 'Topic Title (Maximum Length: %d):', 'bbpress' ), bbp_get_title_max_length() ); ?></label><br />
+						<input type="text" id="bbp_topic_title" value="<?php bbp_form_topic_title(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_topic_title" maxlength="<?php bbp_title_max_length(); ?>" />
+					</p>
+
+					<?php do_action( 'bbp_theme_after_topic_form_title' ); ?>
+
+					<?php do_action( 'bbp_theme_before_topic_form_content' ); ?>
+
+					<?php if ( !function_exists( 'wp_editor' ) ) : ?>
+
+						<p>
+							<label for="bbp_reply_content"><?php _e( 'Reply:', 'bbpress' ); ?></label><br />
+							<textarea id="bbp_topic_content" tabindex="<?php bbp_tab_index(); ?>" name="bbp_topic_content" cols="60" rows="6"><?php bbp_form_topic_content(); ?></textarea>
+						</p>
+
+					<?php else : ?>
+
+						<?php bbp_the_content( array( 'context' => 'topic' ) ); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_after_topic_form_content' ); ?>
+
+					<?php if ( !current_user_can( 'unfiltered_html' ) ) : ?>
+
+						<p class="form-allowed-tags">
+							<label><?php _e( 'You may use these <abbr title="HyperText Markup Language">HTML</abbr> tags and attributes:','bbpress' ); ?></label><br />
+							<code><?php bbp_allowed_tags(); ?></code>
+						</p>
+
+					<?php endif; ?>
+
+					<?php if ( bbp_allow_topic_tags() && current_user_can( 'assign_topic_tags' ) ) : ?>
+
+						<?php do_action( 'bbp_theme_before_topic_form_tags' ); ?>
+
+						<p>
+							<label for="bbp_topic_tags"><?php _e( 'Topic Tags:', 'bbpress' ); ?></label><br />
+							<input type="text" value="<?php bbp_form_topic_tags(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_topic_tags" id="bbp_topic_tags" <?php disabled( bbp_is_topic_spam() ); ?> />
+						</p>
+
+						<?php do_action( 'bbp_theme_after_topic_form_tags' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( !bbp_is_single_forum() ) : ?>
+
+						<?php do_action( 'bbp_theme_before_topic_form_forum' ); ?>
+
+						<p>
+							<label for="bbp_forum_id"><?php _e( 'Forum:', 'bbpress' ); ?></label><br />
+							<?php bbp_dropdown( array( 'selected' => bbp_get_form_topic_forum() ) ); ?>
+						</p>
+
+						<?php do_action( 'bbp_theme_after_topic_form_forum' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( current_user_can( 'moderate' ) ) : ?>
+
+						<?php do_action( 'bbp_theme_before_topic_form_type' ); ?>
+
+						<p>
+
+							<label for="bbp_stick_topic"><?php _e( 'Topic Type:', 'bbpress' ); ?></label><br />
+
+							<?php bbp_topic_type_select(); ?>
+
+						</p>
+
+						<?php do_action( 'bbp_theme_after_topic_form_type' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( bbp_is_subscriptions_active() && !bbp_is_anonymous() && ( !bbp_is_topic_edit() || ( bbp_is_topic_edit() && !bbp_is_topic_anonymous() ) ) ) : ?>
+
+						<?php do_action( 'bbp_theme_before_topic_form_subscriptions' ); ?>
+
+						<p>
+							<input name="bbp_topic_subscription" id="bbp_topic_subscription" type="checkbox" value="bbp_subscribe" <?php bbp_form_topic_subscribed(); ?> tabindex="<?php bbp_tab_index(); ?>" />
+
+							<?php if ( bbp_is_topic_edit() && ( get_the_author_meta( 'ID' ) != bbp_get_current_user_id() ) ) : ?>
+
+								<label for="bbp_topic_subscription"><?php _e( 'Notify the author of follow-up replies via email', 'bbpress' ); ?></label>
+
+							<?php else : ?>
+
+								<label for="bbp_topic_subscription"><?php _e( 'Notify me of follow-up replies via email', 'bbpress' ); ?></label>
+
+							<?php endif; ?>
+						</p>
+
+						<?php do_action( 'bbp_theme_after_topic_form_subscriptions' ); ?>
+
+					<?php endif; ?>
+
+					<?php if ( bbp_allow_revisions() && bbp_is_topic_edit() ) : ?>
+
+						<?php do_action( 'bbp_theme_before_topic_form_revisions' ); ?>
+
+						<fieldset class="bbp-form">
+							<legend><?php _e( 'Revision', 'bbpress' ); ?></legend>
+							<div>
+								<input name="bbp_log_topic_edit" id="bbp_log_topic_edit" type="checkbox" value="1" <?php bbp_form_topic_log_edit(); ?> tabindex="<?php bbp_tab_index(); ?>" />
+								<label for="bbp_log_topic_edit"><?php _e( 'Keep a log of this edit:', 'bbpress' ); ?></label><br />
+							</div>
+
+							<div>
+								<label for="bbp_topic_edit_reason"><?php printf( __( 'Optional reason for editing:', 'bbpress' ), bbp_get_current_user_name() ); ?></label><br />
+								<input type="text" value="<?php bbp_form_topic_edit_reason(); ?>" tabindex="<?php bbp_tab_index(); ?>" size="40" name="bbp_topic_edit_reason" id="bbp_topic_edit_reason" />
+							</div>
+						</fieldset>
+
+						<?php do_action( 'bbp_theme_after_topic_form_revisions' ); ?>
+
+					<?php endif; ?>
+
+					<?php do_action( 'bbp_theme_before_topic_form_submit_wrapper' ); ?>
+
+					<div class="bbp-submit-wrapper">
+
+						<?php do_action( 'bbp_theme_before_topic_form_submit_button' ); ?>
+
+						<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_topic_submit" name="bbp_topic_submit" class="button submit"><?php _e( 'Submit', 'bbpress' ); ?></button>
+
+						<?php do_action( 'bbp_theme_after_topic_form_submit_button' ); ?>
+
+					</div>
+
+					<?php do_action( 'bbp_theme_after_topic_form_submit_wrapper' ); ?>
+
+				</div>
+
+				<?php bbp_topic_form_fields(); ?>
+
+			</fieldset>
+
+			<?php do_action( 'bbp_theme_after_topic_form' ); ?>
+
+		</form>
+	</div>
+
+<?php elseif ( bbp_is_forum_closed() ) : ?>
+
+	<div id="no-topic-<?php bbp_topic_id(); ?>" class="bbp-no-topic">
+		<div class="bbp-template-notice">
+			<p><?php printf( __( 'The forum &#8216;%s&#8217; is closed to new topics and replies.', 'bbpress' ), bbp_get_forum_title() ); ?></p>
+		</div>
+	</div>
+
+<?php else : ?>
+
+	<div id="no-topic-<?php bbp_topic_id(); ?>" class="bbp-no-topic">
+		<div class="bbp-template-notice">
+			<p><?php is_user_logged_in() ? _e( 'You cannot create new topics.', 'bbpress' ) : _e( 'You must be logged in to create new topics.', 'bbpress' ); ?></p>
+		</div>
+	</div>
+
+<?php endif; ?>
+
+<?php if ( !bbp_is_single_forum() ) : ?>
+
+</div>
+
+<?php endif; ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,182 @@
+<?php
+
+/**
+ * bbPress User Profile Edit Part
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<form id="bbp-your-profile" action="<?php bbp_user_profile_edit_url( bbp_get_displayed_user_id() ); ?>" method="post" enctype="multipart/form-data">
+
+	<h2 class="entry-title"><?php _e( 'Name', 'bbpress' ) ?></h2>
+
+	<?php do_action( 'bbp_user_edit_before' ); ?>
+
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Name', 'bbpress' ) ?></legend>
+
+		<?php do_action( 'bbp_user_edit_before_name' ); ?>
+
+		<div>
+			<label for="first_name"><?php _e( 'First Name', 'bbpress' ) ?></label>
+			<input type="text" name="first_name" id="first_name" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'first_name' ) ); ?>" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div>
+			<label for="last_name"><?php _e( 'Last Name', 'bbpress' ) ?></label>
+			<input type="text" name="last_name" id="last_name" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'last_name' ) ); ?>" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div>
+			<label for="nickname"><?php _e( 'Nickname', 'bbpress' ); ?></label>
+			<input type="text" name="nickname" id="nickname" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'nickname' ) ); ?>" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div>
+			<label for="display_name"><?php _e( 'Display Name', 'bbpress' ) ?></label>
+
+			<?php bbp_edit_user_display_name(); ?>
+
+		</div>
+
+		<?php do_action( 'bbp_user_edit_after_name' ); ?>
+
+	</fieldset>
+
+	<h2 class="entry-title"><?php _e( 'Contact Info', 'bbpress' ) ?></h2>
+
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Contact Info', 'bbpress' ) ?></legend>
+
+		<?php do_action( 'bbp_user_edit_before_contact' ); ?>
+
+		<div>
+			<label for="url"><?php _e( 'Website', 'bbpress' ) ?></label>
+			<input type="text" name="url" id="url" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'user_url' ) ); ?>" class="regular-text code" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<?php foreach ( bbp_edit_user_contact_methods() as $name => $desc ) : ?>
+
+			<div>
+				<label for="<?php echo $name; ?>"><?php echo apply_filters( 'user_'.$name.'_label', $desc ); ?></label>
+				<input type="text" name="<?php echo $name; ?>" id="<?php echo $name; ?>" value="<?php echo esc_attr( bbp_get_displayed_user_field( $name ) ); ?>" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+			</div>
+
+		<?php endforeach; ?>
+
+		<?php do_action( 'bbp_user_edit_after_contact' ); ?>
+
+	</fieldset>
+
+	<h2 class="entry-title"><?php bbp_is_user_home_edit() ? _e( 'About Yourself', 'bbpress' ) : _e( 'About the user', 'bbpress' ); ?></h2>
+
+	<fieldset class="bbp-form">
+		<legend><?php bbp_is_user_home_edit() ? _e( 'About Yourself', 'bbpress' ) : _e( 'About the user', 'bbpress' ); ?></legend>
+
+		<?php do_action( 'bbp_user_edit_before_about' ); ?>
+
+		<div>
+			<label for="description"><?php _e( 'Biographical Info', 'bbpress' ); ?></label>
+			<textarea name="description" id="description" rows="5" cols="30" tabindex="<?php bbp_tab_index(); ?>"><?php echo esc_attr( bbp_get_displayed_user_field( 'description' ) ); ?></textarea>
+		</div>
+
+		<?php do_action( 'bbp_user_edit_after_about' ); ?>
+
+	</fieldset>
+
+	<h2 class="entry-title"><?php _e( 'Account', 'bbpress' ) ?></h2>
+
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Account', 'bbpress' ) ?></legend>
+
+		<?php do_action( 'bbp_user_edit_before_account' ); ?>
+
+		<div>
+			<label for="user_login"><?php _e( 'Username', 'bbpress' ); ?></label>
+			<input type="text" name="user_login" id="user_login" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'user_login' ) ); ?>" disabled="disabled" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div>
+			<label for="email"><?php _e( 'Email', 'bbpress' ); ?></label>
+
+			<input type="text" name="email" id="email" value="<?php echo esc_attr( bbp_get_displayed_user_field( 'user_email' ) ); ?>" class="regular-text" tabindex="<?php bbp_tab_index(); ?>" />
+
+			<?php
+
+			// Handle address change requests
+			$new_email = get_option( bbp_get_displayed_user_id() . '_new_email' );
+			if ( $new_email && $new_email != bbp_get_displayed_user_field( 'user_email' ) ) : ?>
+
+				<span class="updated inline">
+
+					<?php printf( __( 'There is a pending email address change to <code>%1$s</code>. <a href="%2$s">Cancel</a>', 'bbpress' ), $new_email['newemail'], esc_url( self_admin_url( 'user.php?dismiss=' . bbp_get_current_user_id()  . '_new_email' ) ) ); ?>
+
+				</span>
+
+			<?php endif; ?>
+
+		</div>
+
+		<div id="password">
+			<label for="pass1"><?php _e( 'New Password', 'bbpress' ); ?></label>
+			<fieldset class="bbp-form password">
+				<input type="password" name="pass1" id="pass1" size="16" value="" autocomplete="off" tabindex="<?php bbp_tab_index(); ?>" />
+				<span class="description"><?php _e( 'If you would like to change the password type a new one. Otherwise leave this blank.', 'bbpress' ); ?></span>
+
+				<input type="password" name="pass2" id="pass2" size="16" value="" autocomplete="off" tabindex="<?php bbp_tab_index(); ?>" />
+				<span class="description"><?php _e( 'Type your new password again.', 'bbpress' ); ?></span><br />
+
+				<div id="pass-strength-result"></div>
+				<span class="description indicator-hint"><?php _e( 'Your password should be at least ten characters long. Use upper and lower case letters, numbers, and symbols to make it even stronger.', 'bbpress' ); ?></span>
+			</fieldset>
+		</div>
+
+		<?php do_action( 'bbp_user_edit_after_account' ); ?>
+
+	</fieldset>
+
+	<?php if ( current_user_can( 'edit_users' ) && ! bbp_is_user_home_edit() ) : ?>
+
+		<h2 class="entry-title"><?php _e( 'User Role', 'bbpress' ) ?></h2>
+
+		<fieldset class="bbp-form">
+			<legend><?php _e( 'User Role', 'bbpress' ); ?></legend>
+
+			<?php do_action( 'bbp_user_edit_before_role' ); ?>
+
+			<?php if ( is_multisite() && is_super_admin() && current_user_can( 'manage_network_options' ) ) : ?>
+
+				<div>
+					<label for="super_admin"><?php _e( 'Network Role', 'bbpress' ); ?></label>
+					<label>
+						<input class="checkbox" type="checkbox" id="super_admin" name="super_admin"<?php checked( is_super_admin( bbp_get_displayed_user_id() ) ); ?> tabindex="<?php bbp_tab_index(); ?>" />
+						<?php _e( 'Grant this user super admin privileges for the Network.', 'bbpress' ); ?>
+					</label>
+				</div>
+
+			<?php endif; ?>
+
+			<?php bbp_get_template_part( 'form', 'user-roles' ); ?>
+
+			<?php do_action( 'bbp_user_edit_after_role' ); ?>
+
+		</fieldset>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_user_edit_after' ); ?>
+
+	<fieldset class="submit">
+		<legend><?php _e( 'Save Changes', 'bbpress' ); ?></legend>
+		<div>
+
+			<?php bbp_edit_user_form_fields(); ?>
+
+			<button type="submit" tabindex="<?php bbp_tab_index(); ?>" id="bbp_user_edit_submit" name="bbp_user_edit_submit" class="button submit user-submit"><?php bbp_is_user_home_edit() ? _e( 'Update Profile', 'bbpress' ) : _e( 'Update User', 'bbpress' ); ?></button>
+		</div>
+	</fieldset>
+
+</form>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-login.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,41 @@
+<?php
+
+/**
+ * User Login Form
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<form method="post" action="<?php bbp_wp_login_action( array( 'context' => 'login_post' ) ); ?>" class="bbp-login-form">
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Log In', 'bbpress' ); ?></legend>
+
+		<div class="bbp-username">
+			<label for="user_login"><?php _e( 'Username', 'bbpress' ); ?>: </label>
+			<input type="text" name="log" value="<?php bbp_sanitize_val( 'user_login', 'text' ); ?>" size="20" id="user_login" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div class="bbp-password">
+			<label for="user_pass"><?php _e( 'Password', 'bbpress' ); ?>: </label>
+			<input type="password" name="pwd" value="<?php bbp_sanitize_val( 'user_pass', 'password' ); ?>" size="20" id="user_pass" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div class="bbp-remember-me">
+			<input type="checkbox" name="rememberme" value="forever" <?php checked( bbp_get_sanitize_val( 'rememberme', 'checkbox' ) ); ?> id="rememberme" tabindex="<?php bbp_tab_index(); ?>" />
+			<label for="rememberme"><?php _e( 'Keep me signed in', 'bbpress' ); ?></label>
+		</div>
+
+		<div class="bbp-submit-wrapper">
+
+			<?php do_action( 'login_form' ); ?>
+
+			<button type="submit" tabindex="<?php bbp_tab_index(); ?>" name="user-submit" class="button submit user-submit"><?php _e( 'Log In', 'bbpress' ); ?></button>
+
+			<?php bbp_user_login_fields(); ?>
+
+		</div>
+	</fieldset>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-lost-pass.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,33 @@
+<?php
+
+/**
+ * User Lost Password Form
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<form method="post" action="<?php bbp_wp_login_action( array( 'action' => 'lostpassword', 'context' => 'login_post' ) ); ?>" class="bbp-login-form">
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Lost Password', 'bbpress' ); ?></legend>
+
+		<div class="bbp-username">
+			<p>
+				<label for="user_login" class="hide"><?php _e( 'Username or Email', 'bbpress' ); ?>: </label>
+				<input type="text" name="user_login" value="" size="20" id="user_login" tabindex="<?php bbp_tab_index(); ?>" />
+			</p>
+		</div>
+
+		<div class="bbp-submit-wrapper">
+
+			<?php do_action( 'login_form', 'resetpass' ); ?>
+
+			<button type="submit" tabindex="<?php bbp_tab_index(); ?>" name="user-submit" class="button submit user-submit"><?php _e( 'Reset My Password', 'bbpress' ); ?></button>
+
+			<?php bbp_user_lost_pass_fields(); ?>
+
+		</div>
+	</fieldset>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-register.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * User Registration Form
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<form method="post" action="<?php bbp_wp_login_action( array( 'context' => 'login_post' ) ); ?>" class="bbp-login-form">
+	<fieldset class="bbp-form">
+		<legend><?php _e( 'Create an Account', 'bbpress' ); ?></legend>
+
+		<div class="bbp-template-notice">
+			<p><?php _e( 'Your username must be unique, and cannot be changed later.', 'bbpress' ) ?></p>
+			<p><?php _e( 'We use your email address to email you a secure password and verify your account.', 'bbpress' ) ?></p>
+
+		</div>
+
+		<div class="bbp-username">
+			<label for="user_login"><?php _e( 'Username', 'bbpress' ); ?>: </label>
+			<input type="text" name="user_login" value="<?php bbp_sanitize_val( 'user_login' ); ?>" size="20" id="user_login" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<div class="bbp-email">
+			<label for="user_email"><?php _e( 'Email', 'bbpress' ); ?>: </label>
+			<input type="text" name="user_email" value="<?php bbp_sanitize_val( 'user_email' ); ?>" size="20" id="user_email" tabindex="<?php bbp_tab_index(); ?>" />
+		</div>
+
+		<?php do_action( 'register_form' ); ?>
+
+		<div class="bbp-submit-wrapper">
+
+			<button type="submit" tabindex="<?php bbp_tab_index(); ?>" name="user-submit" class="button submit user-submit"><?php _e( 'Register', 'bbpress' ); ?></button>
+
+			<?php bbp_user_register_fields(); ?>
+
+		</div>
+	</fieldset>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/form-user-roles.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,13 @@
+<div>
+	<label for="role"><?php _e( 'Blog Role', 'bbpress' ) ?></label>
+
+	<?php bbp_edit_user_blog_role(); ?>
+
+</div>
+
+<div>
+	<label for="forum-role"><?php _e( 'Forum Role', 'bbpress' ) ?></label>
+
+	<?php bbp_edit_user_forums_role(); ?>
+
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-forums.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,47 @@
+<?php
+
+/**
+ * Forums Loop
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_forums_loop' ); ?>
+
+<ul id="forums-list-<?php bbp_forum_id(); ?>" class="bbp-forums">
+
+	<li class="bbp-header">
+
+		<ul class="forum-titles">
+			<li class="bbp-forum-info"><?php _e( 'Forum', 'bbpress' ); ?></li>
+			<li class="bbp-forum-topic-count"><?php _e( 'Topics', 'bbpress' ); ?></li>
+			<li class="bbp-forum-reply-count"><?php bbp_show_lead_topic() ? _e( 'Replies', 'bbpress' ) : _e( 'Posts', 'bbpress' ); ?></li>
+			<li class="bbp-forum-freshness"><?php _e( 'Freshness', 'bbpress' ); ?></li>
+		</ul>
+
+	</li><!-- .bbp-header -->
+
+	<li class="bbp-body">
+
+		<?php while ( bbp_forums() ) : bbp_the_forum(); ?>
+
+			<?php bbp_get_template_part( 'loop', 'single-forum' ); ?>
+
+		<?php endwhile; ?>
+
+	</li><!-- .bbp-body -->
+
+	<li class="bbp-footer">
+
+		<div class="tr">
+			<p class="td colspan4">&nbsp;</p>
+		</div><!-- .tr -->
+
+	</li><!-- .bbp-footer -->
+
+</ul><!-- .forums-directory -->
+
+<?php do_action( 'bbp_template_after_forums_loop' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-replies.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,72 @@
+<?php
+
+/**
+ * Replies Loop
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_replies_loop' ); ?>
+
+<ul id="topic-<?php bbp_topic_id(); ?>-replies" class="forums bbp-replies">
+
+	<li class="bbp-header">
+
+		<div class="bbp-reply-author"><?php  _e( 'Author',  'bbpress' ); ?></div><!-- .bbp-reply-author -->
+
+		<div class="bbp-reply-content">
+
+			<?php if ( !bbp_show_lead_topic() ) : ?>
+
+				<?php _e( 'Posts', 'bbpress' ); ?>
+
+				<?php bbp_user_subscribe_link(); ?>
+
+				<?php bbp_user_favorites_link(); ?>
+
+			<?php else : ?>
+
+				<?php _e( 'Replies', 'bbpress' ); ?>
+
+			<?php endif; ?>
+
+		</div><!-- .bbp-reply-content -->
+
+	</li><!-- .bbp-header -->
+
+	<li class="bbp-body">
+
+		<?php while ( bbp_replies() ) : bbp_the_reply(); ?>
+
+			<?php bbp_get_template_part( 'loop', 'single-reply' ); ?>
+
+		<?php endwhile; ?>
+
+	</li><!-- .bbp-body -->
+
+	<li class="bbp-footer">
+
+		<div class="bbp-reply-author"><?php  _e( 'Author',  'bbpress' ); ?></div>
+
+		<div class="bbp-reply-content">
+
+			<?php if ( !bbp_show_lead_topic() ) : ?>
+
+				<?php _e( 'Posts', 'bbpress' ); ?>
+
+			<?php else : ?>
+
+				<?php _e( 'Replies', 'bbpress' ); ?>
+
+			<?php endif; ?>
+
+		</div><!-- .bbp-reply-content -->
+
+	</li><!-- .bbp-footer -->
+
+</ul><!-- #topic-<?php bbp_topic_id(); ?>-replies -->
+
+<?php do_action( 'bbp_template_after_replies_loop' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,61 @@
+<?php
+
+/**
+ * Forums Loop - Single Forum
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<ul id="bbp-forum-<?php bbp_forum_id(); ?>" <?php bbp_forum_class(); ?>>
+
+	<li class="bbp-forum-info">
+
+		<?php do_action( 'bbp_theme_before_forum_title' ); ?>
+
+		<a class="bbp-forum-title" href="<?php bbp_forum_permalink(); ?>" title="<?php bbp_forum_title(); ?>"><?php bbp_forum_title(); ?></a>
+
+		<?php do_action( 'bbp_theme_after_forum_title' ); ?>
+
+		<?php do_action( 'bbp_theme_before_forum_sub_forums' ); ?>
+
+		<?php bbp_list_forums(); ?>
+
+		<?php do_action( 'bbp_theme_after_forum_sub_forums' ); ?>
+
+		<?php do_action( 'bbp_theme_before_forum_description' ); ?>
+
+		<div class="bbp-forum-content"><?php the_content(); ?></div>
+
+		<?php do_action( 'bbp_theme_after_forum_description' ); ?>
+
+		<?php bbp_forum_row_actions(); ?>
+
+	</li>
+
+	<li class="bbp-forum-topic-count"><?php bbp_forum_topic_count(); ?></li>
+
+	<li class="bbp-forum-reply-count"><?php bbp_show_lead_topic() ? bbp_forum_reply_count() : bbp_forum_post_count(); ?></li>
+
+	<li class="bbp-forum-freshness">
+
+		<?php do_action( 'bbp_theme_before_forum_freshness_link' ); ?>
+
+		<?php bbp_forum_freshness_link(); ?>
+
+		<?php do_action( 'bbp_theme_after_forum_freshness_link' ); ?>
+
+		<p class="bbp-topic-meta">
+
+			<?php do_action( 'bbp_theme_before_topic_author' ); ?>
+
+			<span class="bbp-topic-freshness-author"><?php bbp_author_link( array( 'post_id' => bbp_get_forum_last_active_id(), 'size' => 14 ) ); ?></span>
+
+			<?php do_action( 'bbp_theme_after_topic_author' ); ?>
+
+		</p>
+	</li>
+
+</ul><!-- #bbp-forum-<?php bbp_forum_id(); ?> -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-reply.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,71 @@
+<?php
+
+/**
+ * Replies Loop - Single Reply
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<div class="bbp-reply-header">
+
+	<div class="bbp-meta">
+
+		<span class="bbp-reply-post-date"><?php bbp_reply_post_date(); ?></span>
+
+		<?php if ( bbp_is_single_user_replies() ) : ?>
+
+			<span class="bbp-header">
+				<?php _e( 'in reply to: ', 'bbpress' ); ?>
+				<a class="bbp-topic-permalink" href="<?php bbp_topic_permalink( bbp_get_reply_topic_id() ); ?>" title="<?php bbp_topic_title( bbp_get_reply_topic_id() ); ?>"><?php bbp_topic_title( bbp_get_reply_topic_id() ); ?></a>
+			</span>
+
+		<?php endif; ?>
+
+		<a href="<?php bbp_reply_url(); ?>" title="<?php bbp_reply_title(); ?>" class="bbp-reply-permalink">#<?php bbp_reply_id(); ?></a>
+
+		<?php do_action( 'bbp_theme_before_reply_admin_links' ); ?>
+
+		<?php bbp_reply_admin_links(); ?>
+
+		<?php do_action( 'bbp_theme_after_reply_admin_links' ); ?>
+
+	</div><!-- .bbp-meta -->
+
+</div><!-- .bbp-reply-header -->
+
+<div id="post-<?php bbp_reply_id(); ?>" <?php bbp_reply_class(); ?>>
+
+	<div class="bbp-reply-author">
+
+		<?php do_action( 'bbp_theme_before_reply_author_details' ); ?>
+
+		<?php bbp_reply_author_link( array( 'sep' => '<br />', 'show_role' => true ) ); ?>
+
+		<?php if ( is_super_admin() ) : ?>
+
+			<?php do_action( 'bbp_theme_before_reply_author_admin_details' ); ?>
+
+			<div class="bbp-reply-ip"><?php bbp_author_ip( bbp_get_reply_id() ); ?></div>
+
+			<?php do_action( 'bbp_theme_after_reply_author_admin_details' ); ?>
+
+		<?php endif; ?>
+
+		<?php do_action( 'bbp_theme_after_reply_author_details' ); ?>
+
+	</div><!-- .bbp-reply-author -->
+
+	<div class="bbp-reply-content">
+
+		<?php do_action( 'bbp_theme_before_reply_content' ); ?>
+
+		<?php bbp_reply_content(); ?>
+
+		<?php do_action( 'bbp_theme_after_reply_content' ); ?>
+
+	</div><!-- .bbp-reply-content -->
+
+</div><!-- #post-<?php bbp_reply_id(); ?> -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-single-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,105 @@
+<?php
+
+/**
+ * Topics Loop - Single
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<ul id="topic-<?php bbp_topic_id(); ?>" <?php bbp_topic_class(); ?>>
+
+	<li class="bbp-topic-title">
+
+		<?php if ( bbp_is_user_home() ) : ?>
+
+			<?php if ( bbp_is_favorites() ) : ?>
+
+				<span class="bbp-topic-action">
+
+					<?php do_action( 'bbp_theme_before_topic_favorites_action' ); ?>
+
+					<?php bbp_user_favorites_link( array( 'mid' => '+', 'post' => '' ), array( 'pre' => '', 'mid' => '&times;', 'post' => '' ) ); ?>
+
+					<?php do_action( 'bbp_theme_after_topic_favorites_action' ); ?>
+
+				</span>
+
+			<?php elseif ( bbp_is_subscriptions() ) : ?>
+
+				<span class="bbp-topic-action">
+
+					<?php do_action( 'bbp_theme_before_topic_subscription_action' ); ?>
+
+					<?php bbp_user_subscribe_link( array( 'before' => '', 'subscribe' => '+', 'unsubscribe' => '&times;' ) ); ?>
+
+					<?php do_action( 'bbp_theme_after_topic_subscription_action' ); ?>
+
+				</span>
+
+			<?php endif; ?>
+
+		<?php endif; ?>
+
+		<?php do_action( 'bbp_theme_before_topic_title' ); ?>
+
+		<a class="bbp-topic-permalink" href="<?php bbp_topic_permalink(); ?>" title="<?php bbp_topic_title(); ?>"><?php bbp_topic_title(); ?></a>
+
+		<?php do_action( 'bbp_theme_after_topic_title' ); ?>
+
+		<?php bbp_topic_pagination(); ?>
+
+		<?php do_action( 'bbp_theme_before_topic_meta' ); ?>
+
+		<p class="bbp-topic-meta">
+
+			<?php do_action( 'bbp_theme_before_topic_started_by' ); ?>
+
+			<span class="bbp-topic-started-by"><?php printf( __( 'Started by: %1$s', 'bbpress' ), bbp_get_topic_author_link( array( 'size' => '14' ) ) ); ?></span>
+
+			<?php do_action( 'bbp_theme_after_topic_started_by' ); ?>
+
+			<?php if ( !bbp_is_single_forum() || ( bbp_get_topic_forum_id() != bbp_get_forum_id() ) ) : ?>
+
+				<?php do_action( 'bbp_theme_before_topic_started_in' ); ?>
+
+				<span class="bbp-topic-started-in"><?php printf( __( 'in: <a href="%1$s">%2$s</a>', 'bbpress' ), bbp_get_forum_permalink( bbp_get_topic_forum_id() ), bbp_get_forum_title( bbp_get_topic_forum_id() ) ); ?></span>
+
+				<?php do_action( 'bbp_theme_after_topic_started_in' ); ?>
+
+			<?php endif; ?>
+
+		</p>
+
+		<?php do_action( 'bbp_theme_after_topic_meta' ); ?>
+
+		<?php bbp_topic_row_actions(); ?>
+
+	</li>
+
+	<li class="bbp-topic-voice-count"><?php bbp_topic_voice_count(); ?></li>
+
+	<li class="bbp-topic-reply-count"><?php bbp_show_lead_topic() ? bbp_topic_reply_count() : bbp_topic_post_count(); ?></li>
+
+	<li class="bbp-topic-freshness">
+
+		<?php do_action( 'bbp_theme_before_topic_freshness_link' ); ?>
+
+		<?php bbp_topic_freshness_link(); ?>
+
+		<?php do_action( 'bbp_theme_after_topic_freshness_link' ); ?>
+
+		<p class="bbp-topic-meta">
+
+			<?php do_action( 'bbp_theme_before_topic_freshness_author' ); ?>
+
+			<span class="bbp-topic-freshness-author"><?php bbp_author_link( array( 'post_id' => bbp_get_topic_last_active_id(), 'size' => 14 ) ); ?></span>
+
+			<?php do_action( 'bbp_theme_after_topic_freshness_author' ); ?>
+
+		</p>
+	</li>
+
+</ul><!-- #topic-<?php bbp_topic_id(); ?> -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/loop-topics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,49 @@
+<?php
+
+/**
+ * Topics Loop
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_topics_loop' ); ?>
+
+<ul id="bbp-forum-<?php bbp_forum_id(); ?>" class="bbp-topics">
+
+	<li class="bbp-header">
+
+		<ul class="forum-titles">
+			<li class="bbp-topic-title"><?php _e( 'Topic', 'bbpress' ); ?></li>
+			<li class="bbp-topic-voice-count"><?php _e( 'Voices', 'bbpress' ); ?></li>
+			<li class="bbp-topic-reply-count"><?php bbp_show_lead_topic() ? _e( 'Replies', 'bbpress' ) : _e( 'Posts', 'bbpress' ); ?></li>
+			<li class="bbp-topic-freshness"><?php _e( 'Freshness', 'bbpress' ); ?></li>
+		</ul>
+
+	</li>
+
+	<li class="bbp-body">
+
+		<?php while ( bbp_topics() ) : bbp_the_topic(); ?>
+
+			<?php bbp_get_template_part( 'loop', 'single-topic' ); ?>
+
+		<?php endwhile; ?>
+
+	</li>
+
+	<li class="bbp-footer">
+
+		<div class="tr">
+			<p>
+				<span class="td colspan<?php echo ( bbp_is_user_home() && ( bbp_is_favorites() || bbp_is_subscriptions() ) ) ? '5' : '4'; ?>">&nbsp;</span>
+			</p>
+		</div><!-- .tr -->
+
+	</li>
+
+</ul><!-- #bbp-forum-<?php bbp_forum_id(); ?> -->
+
+<?php do_action( 'bbp_template_after_topics_loop' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/pagination-replies.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Pagination for pages of replies (when viewing a topic)
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_pagination_loop' ); ?>
+
+<div class="bbp-pagination">
+	<div class="bbp-pagination-count">
+
+		<?php bbp_topic_pagination_count(); ?>
+
+	</div>
+
+	<div class="bbp-pagination-links">
+
+		<?php bbp_topic_pagination_links(); ?>
+
+	</div>
+</div>
+
+<?php do_action( 'bbp_template_after_pagination_loop' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/pagination-topics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Pagination for pages of topics (when viewing a forum)
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+<?php do_action( 'bbp_template_before_pagination_loop' ); ?>
+
+<div class="bbp-pagination">
+	<div class="bbp-pagination-count">
+
+		<?php bbp_forum_pagination_count(); ?>
+
+	</div>
+
+	<div class="bbp-pagination-links">
+
+		<?php bbp_forum_pagination_links(); ?>
+
+	</div>
+</div>
+
+<?php do_action( 'bbp_template_after_pagination_loop' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-details.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,75 @@
+<?php
+
+/**
+ * User Details
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_details' ); ?>
+
+	<div id="bbp-single-user-details">
+		<div id="bbp-user-avatar">
+
+			<span class='vcard'>
+				<a class="url fn n" href="<?php bbp_user_profile_url(); ?>" title="<?php bbp_displayed_user_field( 'display_name' ); ?>" rel="me">
+					<?php echo get_avatar( bbp_get_displayed_user_field( 'user_email' ), apply_filters( 'twentyten_author_bio_avatar_size', 150 ) ); ?>
+				</a>
+			</span>
+
+		</div><!-- #author-avatar -->
+
+		<div id="bbp-user-navigation">
+			<ul>
+				<li class="<?php if ( bbp_is_single_user_profile() ) :?>current<?php endif; ?>">
+					<span class="vcard bbp-user-profile-link">
+						<a class="url fn n" href="<?php bbp_user_profile_url(); ?>" title="<?php printf( __( "%s's Profile", 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>" rel="me"><?php _e( 'Profile', 'bbpress' ); ?></a>
+					</span>
+				</li>
+
+				<li class="<?php if ( bbp_is_single_user_topics() ) :?>current<?php endif; ?>">
+					<span class='bbp-user-topics-created-link'>
+						<a href="<?php bbp_user_topics_created_url(); ?>" title="<?php printf( __( "%s's Topics Started", 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>"><?php _e( 'Topics Started', 'bbpress' ); ?></a>
+					</span>
+				</li>
+
+				<li class="<?php if ( bbp_is_single_user_replies() ) :?>current<?php endif; ?>">
+					<span class='bbp-user-replies-created-link'>
+						<a href="<?php bbp_user_replies_created_url(); ?>" title="<?php printf( __( "%s's Replies Created", 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>"><?php _e( 'Replies Created', 'bbpress' ); ?></a>
+					</span>
+				</li>
+
+				<?php if ( bbp_is_favorites_active() ) : ?>
+					<li class="<?php if ( bbp_is_favorites() ) :?>current<?php endif; ?>">
+						<span class="bbp-user-favorites-link">
+							<a href="<?php bbp_favorites_permalink(); ?>" title="<?php printf( __( "%s's Favorites", 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>"><?php _e( 'Favorites', 'bbpress' ); ?></a>							
+						</span>
+					</li>
+				<?php endif; ?>
+
+				<?php if ( bbp_is_user_home() || current_user_can( 'edit_users' ) ) : ?>
+
+					<?php if ( bbp_is_subscriptions_active() ) : ?>
+						<li class="<?php if ( bbp_is_subscriptions() ) :?>current<?php endif; ?>">
+							<span class="bbp-user-subscriptions-link">
+								<a href="<?php bbp_subscriptions_permalink(); ?>" title="<?php printf( __( "%s's Subscriptions", 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>"><?php _e( 'Subscriptions', 'bbpress' ); ?></a>							
+							</span>
+						</li>
+					<?php endif; ?>
+
+					<li class="<?php if ( bbp_is_single_user_edit() ) :?>current<?php endif; ?>">
+						<span class="bbp-user-edit-link">
+							<a href="<?php bbp_user_profile_edit_url(); ?>" title="<?php printf( __( 'Edit Profile of User %s', 'bbpress' ), esc_attr( bbp_get_displayed_user_field( 'display_name' ) ) ); ?>"><?php _e( 'Edit', 'bbpress' ); ?></a>
+						</span>
+					</li>
+
+				<?php endif; ?>
+
+			</ul>
+		</div><!-- #bbp-user-navigation -->
+	</div><!-- #bbp-single-user-details -->
+
+	<?php do_action( 'bbp_template_after_user_details' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-favorites.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * User Favorites
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_favorites' ); ?>
+
+	<div id="bbp-user-favorites" class="bbp-user-favorites">
+		<h2 class="entry-title"><?php _e( 'Favorite Forum Topics', 'bbpress' ); ?></h2>
+		<div class="bbp-user-section">
+
+			<?php if ( bbp_get_user_favorites() ) : ?>
+
+				<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+				<?php bbp_get_template_part( 'loop',       'topics' ); ?>
+
+				<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+			<?php else : ?>
+
+				<p><?php bbp_is_user_home() ? _e( 'You currently have no favorite topics.', 'bbpress' ) : _e( 'This user has no favorite topics.', 'bbpress' ); ?></p>
+
+			<?php endif; ?>
+
+		</div>
+	</div><!-- #bbp-user-favorites -->
+
+	<?php do_action( 'bbp_template_after_user_favorites' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-profile.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * User Profile
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_profile' ); ?>
+
+	<div id="bbp-user-profile" class="bbp-user-profile">
+		<h2 class="entry-title"><?php _e( 'Profile', 'bbpress' ); ?></h2>
+		<div class="bbp-user-section">
+
+			<?php if ( bbp_get_displayed_user_field( 'description' ) ) : ?>
+
+				<p class="bbp-user-description"><?php bbp_displayed_user_field( 'description' ); ?></p>
+
+			<?php endif; ?>
+
+			<p class="bbp-user-forum-role"><?php  printf( __( 'Forum Role: %s',      'bbpress' ), bbp_get_user_display_role()    ); ?></p>
+			<p class="bbp-user-topic-count"><?php printf( __( 'Topics Started: %s',  'bbpress' ), bbp_get_user_topic_count_raw() ); ?></p>
+			<p class="bbp-user-reply-count"><?php printf( __( 'Replies Created: %s', 'bbpress' ), bbp_get_user_reply_count_raw() ); ?></p>
+		</div>
+	</div><!-- #bbp-author-topics-started -->
+
+	<?php do_action( 'bbp_template_after_user_profile' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-replies-created.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * User Replies Created
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_replies' ); ?>
+
+	<div id="bbp-user-replies-created" class="bbp-user-replies-created">
+		<h2 class="entry-title"><?php _e( 'Forum Replies Created', 'bbpress' ); ?></h2>
+		<div class="bbp-user-section">
+
+			<?php if ( bbp_get_user_replies_created() ) : ?>
+
+				<?php bbp_get_template_part( 'pagination', 'replies' ); ?>
+
+				<?php bbp_get_template_part( 'loop',       'replies' ); ?>
+
+				<?php bbp_get_template_part( 'pagination', 'replies' ); ?>
+
+			<?php else : ?>
+
+				<p><?php bbp_is_user_home() ? _e( 'You have not replied to any topics.', 'bbpress' ) : _e( 'This user has not replied to any topics.', 'bbpress' ); ?></p>
+
+			<?php endif; ?>
+
+		</div>
+	</div><!-- #bbp-user-replies-created -->
+
+	<?php do_action( 'bbp_template_after_user_replies' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-subscriptions.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * User Subscriptions
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_subscriptions' ); ?>
+
+	<?php if ( bbp_is_subscriptions_active() ) : ?>
+
+		<?php if ( bbp_is_user_home() || current_user_can( 'edit_users' ) ) : ?>
+
+			<div id="bbp-user-subscriptions" class="bbp-user-subscriptions">
+				<h2 class="entry-title"><?php _e( 'Subscribed Forum Topics', 'bbpress' ); ?></h2>
+				<div class="bbp-user-section">
+
+					<?php if ( bbp_get_user_subscriptions() ) : ?>
+
+						<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+						<?php bbp_get_template_part( 'loop',       'topics' ); ?>
+
+						<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+					<?php else : ?>
+
+						<p><?php bbp_is_user_home() ? _e( 'You are not currently subscribed to any topics.', 'bbpress' ) : _e( 'This user is not currently subscribed to any topics.', 'bbpress' ); ?></p>
+
+					<?php endif; ?>
+
+				</div>
+			</div><!-- #bbp-user-subscriptions -->
+
+		<?php endif; ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_template_after_user_subscriptions' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/bbpress/user-topics-created.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,35 @@
+<?php
+
+/**
+ * User Topics Created
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+?>
+
+	<?php do_action( 'bbp_template_before_user_topics_created' ); ?>
+
+	<div id="bbp-user-topics-started" class="bbp-user-topics-started">
+		<h2 class="entry-title"><?php _e( 'Forum Topics Started', 'bbpress' ); ?></h2>
+		<div class="bbp-user-section">
+
+			<?php if ( bbp_get_user_topics_started() ) : ?>
+
+				<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+				<?php bbp_get_template_part( 'loop',       'topics' ); ?>
+
+				<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+			<?php else : ?>
+
+				<p><?php bbp_is_user_home() ? _e( 'You have not created any topics.', 'bbpress' ) : _e( 'This user has not created any topics.', 'bbpress' ); ?></p>
+
+			<?php endif; ?>
+
+		</div>
+	</div><!-- #bbp-user-topics-started -->
+
+	<?php do_action( 'bbp_template_after_user_topics_created' ); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/css/bbpress-rtl.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,901 @@
+/**
+ * bbPress specific CSS
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+/* =bbPress Style
+-------------------------------------------------------------- */
+
+#bbpress-forums hr {
+	margin: 0 0 24px 0;
+}
+
+#bbpress-forums {
+	background: transparent;
+	clear: both;
+	margin-bottom: 20px;
+	overflow: hidden;
+	font-size: 12px;
+}
+
+#bbpress-forums div.even,
+#bbpress-forums ul.even {
+	background-color: #fff;
+}
+
+#bbpress-forums div.odd,
+#bbpress-forums ul.odd {
+	background-color: #fbfbfb;
+}
+
+#bbpress-forums div.reply {
+	height: auto;
+}
+
+#bbpress-forums div.bbp-topic-header,
+#bbpress-forums div.bbp-reply-header {
+	background-color: #f4f4f4;
+}
+
+#bbpress-forums .status-trash.even,
+#bbpress-forums .status-spam.even {
+	background-color: #fee;
+}
+#bbpress-forums .status-trash.odd,
+#bbpress-forums .status-spam.odd {
+	background-color: #fdd;
+}
+
+#bbpress-forums .status-closed,
+#bbpress-forums .status-closed a {
+	color: #ccc;
+}
+
+#bbpress-forums ul {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+}
+
+#bbpress-forums li {
+	margin: 0;
+	list-style: none;
+}
+
+#bbpress-forums ul.bbp-lead-topic,
+#bbpress-forums ul.bbp-topics,
+#bbpress-forums ul.bbp-forums,
+#bbpress-forums ul.bbp-replies {
+	font-size: 12px;
+	overflow: hidden;
+	border: 1px solid #eee;
+	margin-bottom: 20px;
+	clear: both;
+}
+
+#bbpress-forums li.bbp-header,
+#bbpress-forums li.bbp-body,
+#bbpress-forums li.bbp-footer {
+	clear: both;
+}
+
+#bbpress-forums li.bbp-header,
+#bbpress-forums li.bbp-footer {
+	background: #f3f3f3;
+	border-top: 1px solid #eee;
+	font-weight: bold;
+	padding: 8px;
+	text-align: center;
+}
+
+#bbpress-forums li.bbp-header {
+	background: #eaeaea;
+}
+
+#bbpress-forums li.bbp-header ul {
+	overflow: hidden;
+}
+
+#bbpress-forums .bbp-forums-list {
+	margin: 0 5px 0 0;
+	padding-right: 15px;
+	border-right: 1px solid #ddd;
+}
+
+#bbpress-forums .bbp-forums-list li {
+	display: inline;
+	font-size: 11px;
+}
+
+#bbpress-forums li.bbp-footer p {
+	margin: 0;
+	line-height: 1em;
+}
+
+#bbpress-forums .bbp-topic-content img,
+#bbpress-forums .bbp-reply-content img {
+	max-width: 100%;
+}
+
+#bbpress-forums .bbp-topic-content ul,
+#bbpress-forums .bbp-reply-content ul {
+	list-style: square;
+	padding-right: 15px;
+}
+
+#bbpress-forums .bbp-forum-content p {
+	margin: 5px 0 0;
+	font-style: italic;
+}
+
+li.bbp-forum-info,
+li.bbp-topic-title {
+	float: right;
+	text-align: right;
+	width: 55%;
+}
+li.bbp-forum-topic-count,
+li.bbp-topic-voice-count,
+li.bbp-forum-reply-count,
+li.bbp-topic-reply-count {
+	float: right;
+	text-align: center;
+	width: 10%;
+}
+
+li.bbp-forum-freshness,
+li.bbp-topic-freshness {
+	text-align: center;
+	float: right;
+	width: 22%;
+}
+
+#bbpress-forums li.bbp-body ul.forum,
+#bbpress-forums li.bbp-body ul.topic {
+	border-top: 1px solid #eee;
+	overflow: hidden;
+	padding: 8px;
+}
+
+li.bbp-header div.bbp-topic-content span#subscription-toggle,
+li.bbp-header div.bbp-topic-content span#favorite-toggle,
+li.bbp-header div.bbp-reply-content span#subscription-toggle,
+li.bbp-header div.bbp-reply-content span#favorite-toggle {
+	float: left;
+}
+
+#bbpress-forums div.bbp-topic-author,
+#bbpress-forums div.bbp-reply-author {
+	float: right;
+	text-align: center;
+	width: 115px;
+}
+
+#bbpress-forums div.bbp-topic-author img.avatar,
+#bbpress-forums div.bbp-reply-author img.avatar {
+	border: none;
+	max-width: 80px;
+	padding: 0;
+	margin: 12px auto 0 auto;
+	float: none;
+}
+
+#bbpress-forums div.bbp-topic-author a.bbp-author-name,
+#bbpress-forums div.bbp-reply-author a.bbp-author-name {
+	word-break: break-word;
+}
+
+#bbpress-forums div.bbp-topic-author .bbp-author-role,
+#bbpress-forums div.bbp-reply-author .bbp-author-role {
+	font-size: 11px;
+	font-style: italic;
+}
+
+#bbpress-forums div.bbp-topic-content,
+#bbpress-forums div.bbp-reply-content {
+	margin-right: 140px;
+	padding: 12px 12px 12px 0;
+	text-align: right;
+}
+
+#bbpress-forums li.bbp-header .bbp-topic-author,
+#bbpress-forums li.bbp-footer .bbp-topic-author,
+#bbpress-forums li.bbp-header .bbp-reply-author,
+#bbpress-forums li.bbp-footer .bbp-reply-author {
+	float: right;
+	margin: 0;
+	padding: 0;
+	width: 120px;
+}
+
+#bbpress-forums li.bbp-header .bbp-topic-content,
+#bbpress-forums li.bbp-footer .bbp-topic-content,
+#bbpress-forums li.bbp-header .bbp-reply-content,
+#bbpress-forums li.bbp-footer .bbp-reply-content {
+	margin-right: 140px;
+	padding: 0;
+	text-align: right;
+}
+
+div.bbp-topic-header,
+div.bbp-reply-header,
+li.bbp-body div.hentry {
+	margin-bottom: 0;
+	overflow: hidden;
+	padding: 8px;
+}
+
+div.bbp-topic-header,
+div.bbp-reply-header {
+	border-top: 1px solid #ddd;
+	clear: both;
+}
+
+span.bbp-author-ip {
+	font-family: 'Helvetica Neue', Arial, Helvetica, 'Nimbus Sans L', sans-serif;
+	font-size: 11px;
+	font-weight: bold;
+	color: #aaa;
+}
+
+/* =Breadcrumb and Tags
+-------------------------------------------------------------- */
+
+div.bbp-breadcrumb {
+	float: right;
+}
+
+div.bbp-breadcrumb,
+div.bbp-topic-tags {
+	font-size: 12px;
+}
+
+#bbpress-forums div.bbp-breadcrumb p,
+#bbpress-forums div.bbp-topic-tags p {
+	margin-bottom: 10px
+}
+
+div.bbp-topic-tags {
+	float: left;
+}
+
+/* =Admin Links
+-------------------------------------------------------------- */
+
+span.bbp-admin-links {
+	float: left;
+	color: #ddd;
+}
+span.bbp-admin-links a {
+	color: #bbb;
+	font-weight: normal;
+	font-size: 10px;
+	text-transform: uppercase;
+	text-decoration: none;
+}
+fieldset span.bbp-admin-links {
+	float: right;
+}
+tr td span.bbp-admin-links a:hover {
+	color: #ff4b33;
+}
+td.bbp-topic-admin-links,
+td.bbp-topic-counts {
+	width: 50%;
+}
+
+.bbp-topic-header a.bbp-topic-permalink,
+.bbp-reply-header a.bbp-reply-permalink {
+	float: left;
+	margin-right: 10px;
+	color: #ccc;
+}
+
+/* =Toggles
+-------------------------------------------------------------- */
+
+.bbp-topic-action #favorite-toggle a {
+	text-decoration: none;
+	padding: 0 3px 1px;
+	color: #7c7;
+	border: 1px solid #aca;
+	background-color: #dfd;
+	font-weight: bold;
+	font-size: 13px;
+	}
+	.bbp-topic-action #favorite-toggle a:hover {
+		color: #5a5;
+		border-color: #7c7;
+		background-color: #beb;
+	}
+	.bbp-topic-action #favorite-toggle span.is-favorite a {
+		color: #faa;
+		border: 1px solid #faa;
+		background-color: #fee;
+		}
+		.bbp-topic-action #favorite-toggle span.is-favorite a:hover {
+			color: #c88;
+			border-color: #c88;
+			background-color: #fdd;
+		}
+
+.bbp-topic-action #subscription-toggle a {
+	text-decoration: none;
+	padding: 0 3px 1px;
+	color: #7c7;
+	border: 1px solid #aca;
+	background-color: #dfd;
+	font-weight: bold;
+	font-size: 13px;
+	}
+	.bbp-topic-action #subscription-toggle a:hover {
+		color: #5a5;
+		border-color: #7c7;
+		background-color: #beb;
+	}
+	.bbp-topic-action #subscription-toggle span.is-subscribed a {
+		color: #faa;
+		border: 1px solid #faa;
+		background-color: #fee;
+		}
+		.bbp-topic-action #subscription-toggle span.is-subscribed a:hover {
+			color: #c88;
+			border-color: #c88;
+			background-color: #fdd;
+		}
+
+#bbpress-forums p.bbp-topic-meta {
+	margin: 5px 0 5px;
+	font-size: 11px;
+}
+
+#bbpress-forums p.bbp-topic-meta span {
+	white-space: nowrap;
+}
+
+/* =Pagination
+-------------------------------------------------------------- */
+
+.bbp-pagination-count {
+	float: right;
+}
+.bbp-pagination-links {
+	float: left;
+}
+.bbp-pagination {
+	float: right;
+	width: 100%;
+	margin-bottom: 15px;
+}
+
+.bbp-topic-pagination {
+	display: inline-block;
+	margin-right: 5px;
+	margin-bottom: 2px;
+	}
+	.bbp-topic-pagination a {
+		font-size: 10px;
+		line-height: 10px;
+		padding: 1px 3px;
+		border: 1px solid #ddd;
+		text-decoration: none;
+	}
+
+/* =Forms
+-------------------------------------------------------------- */
+
+#bbpress-forums fieldset.bbp-form {
+	clear: right;
+}
+
+#bbpress-forums fieldset.bbp-form {
+	border: 1px solid #eee;
+	padding: 10px 20px;
+	margin-bottom: 10px;
+}
+
+#bbpress-forums fieldset.bbp-form legend {
+	padding: 5px;
+}
+
+#bbpress-forums fieldset.bbp-form label {
+	margin: 0;
+	display: inline-block;
+}
+
+#bbp-edit-topic-tag.bbp-form fieldset.bbp-form label,
+#bbp-login fieldset label,
+#bbp-register fieldset label,
+#bbp-lost-pass fieldset label {
+	width: 100px;
+}
+
+#bbpress-forums fieldset.bbp-form p,
+#bbpress-forums fieldset.bbp-form textarea,
+#bbpress-forums fieldset.bbp-form select,
+#bbpress-forums fieldset.bbp-form input {
+	margin: 0 0 8px;
+}
+
+textarea#bbp_reply_content,
+textarea#bbp_topic_content,
+textarea#bbp_forum_content {
+	width: 97%;
+	box-sizing: border-box;
+}
+
+textarea#bbp_forum_content {
+	height: 210px;
+}
+
+#bbpress-forums fieldset.bbp-forum-form-attributes {
+	width: 200px;
+	float: left;
+	clear: none;
+	margin-right: 25px;
+}
+
+/**
+ * Fix for too-long forum names, usually from conversion
+ */
+#bbpress-forums fieldset select#bbp_forum_id {
+	max-width: 200px;
+}
+
+.bbp-topic-form,
+.bbp-reply-form,
+.bbp-topic-tag-form {
+	clear: right;
+}
+body.topic-edit .bbp-topic-form div.avatar img,
+body.reply-edit .bbp-reply-form div.avatar img,
+body.single-forum .bbp-topic-form div.avatar img,
+body.single-reply .bbp-reply-form div.avatar img {
+	margin-left: 0;
+	padding: 10px;
+	border: 1px solid #ddd;
+	line-height: 0;
+	background-color: #efefef;
+}
+
+body.page .bbp-reply-form code,
+body.page .bbp-topic-form code,
+body.single-topic .bbp-reply-form code,
+body.single-forum .bbp-topic-form code,
+body.topic-edit .bbp-topic-form code,
+body.reply-edit .bbp-reply-form code {
+	font-size: 10px;
+	background-color: #f0fff8;
+	border: 1px solid #CEEFE1;
+	display: block;
+	padding: 8px;
+	margin-top: 5px;
+	width: 369px;
+}
+
+#merge_tag,
+#delete_tag {
+	display: inline;
+}
+
+div.bbp-submit-wrapper {
+	margin-top: 15px;
+	float: left;
+	clear: both;
+}
+
+p.form-allowed-tags {
+	width: 462px;
+}
+
+/* =TinyMCE in themes
+-------------------------------------------------------------- */
+#bbpress-forums div.bbp-the-content-wrapper {
+	margin-bottom: 10px;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper textarea.bbp-the-content {
+	width: 100%;
+	margin: 0;
+	font-size: 12px;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper table,
+#bbpress-forums div.bbp-the-content-wrapper tbody,
+#bbpress-forums div.bbp-the-content-wrapper tr,
+#bbpress-forums div.bbp-the-content-wrapper td {
+	border: none;
+	padding: 0;
+	margin: 0;
+	width: auto;
+	line-height: 1em;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper input {
+	font-size: 12px;
+	padding: 5px;
+	margin: 3px 0 0;
+	line-height: 1em;
+	margin: 0;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper div.quicktags-toolbar {
+	padding: 5px;
+	min-height: 26px;
+}
+#bbpress-forums div.bbp-the-content-wrapper td.mceToolbar {
+	padding: 4px 4px 8px;
+}
+
+#bbpress-forums div.wp-editor-container {
+	margin: 0;
+	padding: 0;
+	line-height: 0;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper td.mceStatusbar {
+	line-height: 16px;
+}
+
+/* =Edit User
+-------------------------------------------------------------- */
+
+#bbpress-forums #bbp-your-profile fieldset {
+	padding: 20px 20px 0 20px;
+}
+	#bbpress-forums #bbp-your-profile fieldset div {
+		margin-bottom: 20px;
+		float: right;
+		width: 100%;
+		clear: right;
+	}
+	#bbpress-forums #bbp-your-profile fieldset select {
+		margin-bottom: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset input,
+	#bbpress-forums #bbp-your-profile fieldset textarea {
+		margin-bottom: 0;
+		width: 60%;
+		background: #f9f9f9;
+		border: 1px solid #ddd;
+		box-shadow: none;
+		padding: 5px 8px;
+		border-radius: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset input:focus,
+	#bbpress-forums #bbp-your-profile fieldset textarea:focus {
+		border: 1px solid #ccc;
+		box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1);
+		outline-color: rgba(240,255,240,0.1);
+	}
+	#bbpress-forums #bbp-your-profile fieldset.bbp-form input.checkbox {
+		width: auto;
+	}
+	#bbpress-forums #bbp-your-profile fieldset legend {
+		display: none;
+	}
+	#bbpress-forums #bbp-your-profile fieldset label[for] {
+		float: right;
+		width: 20%;
+		padding: 5px 5px 5px 20px;
+		text-align: left;
+		cursor: pointer;
+	}
+	#bbpress-forums #bbp-your-profile fieldset dl label[for] {
+		text-align: right;
+		width: 60%;
+	}
+	#bbpress-forums #bbp-your-profile fieldset span.description {
+		margin: 5px 0 0 20%;
+		font-size: 12px;
+		font-style: italic;
+		float: right;
+		clear: right;
+		width: 60%;
+		padding: 5px 8px;
+		border: #cee1ef 1px solid;
+		background-color: #f0f8ff;
+	}
+
+	#bbpress-forums #bbp-your-profile fieldset fieldset {
+		margin: 0;
+		border: none;
+		padding: 0;
+		clear: none;
+		float: none;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password {
+		width: 60%;
+		display: inline;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password input,
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password span {
+		width: 100%;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.capabilities dl {
+		margin: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password span.description {
+		margin-right: 0;
+		margin-bottom: 20px;
+	}
+
+	#bbpress-forums #bbp-your-profile fieldset.submit button {
+		float: left;
+	}
+
+/* =Notices
+-------------------------------------------------------------- */
+
+div.bbp-template-notice,
+div.indicator-hint {
+	border-width: 1px;
+	border-style: solid;
+	padding: 0 0.6em;
+	margin: 5px 0 15px;
+	border-radius: 3px;
+	background-color: #ffffe0;
+	border-color: #e6db55;
+	color: #000;
+	clear: both;
+}
+div.bbp-template-notice a {
+	color: #555;
+	text-decoration: none;
+}
+	div.bbp-template-notice a:hover {
+		color: #000;
+	}
+	div.bbp-template-notice.info {
+		border: #cee1ef 1px solid;
+		background-color: #f0f8ff;
+	}
+	div.bbp-template-notice.important {
+		border: #e6db55 1px solid;
+		background-color: #fffbcc;
+	}
+	div.bbp-template-notice.error,
+	div.bbp-template-notice.warning {
+		background-color: #ffebe8;
+		border-color: #c00;
+	}
+	div.bbp-template-notice.error a,
+	div.bbp-template-notice.warning a {
+		color: #c00;
+	}
+	div.bbp-template-notice p {
+		margin: 0.5em 0 6px 0 !important;
+		padding: 2px;
+		font-size: 12px;
+		line-height: 140%;
+	}
+
+/* =Stickies
+-------------------------------------------------------------- */
+
+.bbp-topics-front ul.super-sticky,
+.bbp-topics ul.super-sticky,
+.bbp-topics ul.sticky,
+.bbp-forum-content ul.sticky {
+	background-color: #ffffe0 !important;
+	font-size: 1.1em;
+}
+
+/* =Revisions
+-------------------------------------------------------------- */
+#bbpress-forums .bbp-topic-revision-log,
+#bbpress-forums .bbp-reply-revision-log {
+	border-top: 1px dotted #ddd;
+	list-style: none;
+	width: 100%;
+	margin: 0;
+	padding: 8px 0 0 0;
+	font-size: 11px;
+	color: #aaa;
+}
+
+/* =Widgets
+-------------------------------------------------------------- */
+
+.bbp-login-form fieldset legend {
+	display: none;
+}
+
+.bbp-login-form .bbp-username input,
+.bbp-login-form .bbp-email input,
+.bbp-login-form .bbp-password input {
+	padding: 5px;
+}
+
+.bbp-login-form label {
+	width: 140px;
+	display: inline-block;
+}
+
+#sidebar .bbp-login-form label {
+	width: 70px;
+}
+
+.bbp-login-form .bbp-username,
+.bbp-login-form .bbp-email,
+.bbp-login-form .bbp-password,
+.bbp-login-form .bbp-remember-me,
+.bbp-login-form .bbp-submit-wrapper {
+	margin-top: 10px;
+}
+
+.bbp-login-form .bbp-remember-me {
+
+}
+
+.bbp-login-form .bbp-submit-wrapper {
+	text-align: left;
+}
+
+.bbp-login-form .bbp-login-links {
+}
+
+.bbp-login-form .bbp-login-links a {
+	float: right;
+	clear: right;
+}
+
+.bbp-logged-in img.avatar {
+	float: right;
+	margin: 0 0 0 15px;
+}
+
+.bbp-logged-in h4 {
+	font-weight: bold;
+	font-size: 1.3em;
+	clear: none;
+	margin-bottom: 10px;
+}
+
+/* =Avatars
+-------------------------------------------------------------- */
+
+#bbpress-forums p.bbp-topic-meta img.avatar,
+#bbpress-forums ul.bbp-reply-revision-log img.avatar,
+#bbpress-forums ul.bbp-topic-revision-log img.avatar,
+#bbpress-forums div.bbp-template-notice img.avatar,
+#bbpress-forums .widget_display_topics img.avatar,
+#bbpress-forums .widget_display_replies img.avatar,
+#bbpress-forums p.bbp-topic-meta img.avatar {
+	float: none;
+	margin-bottom: -7px;
+	border: 3px double #ddd;
+}
+
+fieldset div.avatar {
+	float: left;
+}
+
+/* =BuddyPress Activity Streams
+-------------------------------------------------------------- */
+
+.activity-list li.bbp_topic_create .activity-content .activity-inner,
+.activity-list li.bbp_reply_create .activity-content .activity-inner {
+	border-right: 2px solid #eaeaea;
+	margin-right: 5px;
+	padding-right: 10px;
+}
+
+/* =User Pages
+-------------------------------------------------------------- */
+
+#bbpress-forums h1 {
+	clear: none;
+	font-size: 1.8em;
+	line-height: 1em;
+	padding-bottom: 10px;
+}
+
+#bbpress-forums #bbp-user-wrapper {
+	float: right;
+	width: 100%;
+}
+
+#bbpress-forums #bbp-user-wrapper h2.entry-title {
+	font-size: 1.4em;
+	margin: 0;
+	padding-bottom: 10px;
+	padding-top: 0;
+	clear: none;
+}
+
+#bbpress-forums #bbp-user-wrapper ul.bbp-lead-topic,
+#bbpress-forums #bbp-user-wrapper ul.bbp-topics,
+#bbpress-forums #bbp-user-wrapper ul.bbp-forums,
+#bbpress-forums #bbp-user-wrapper ul.bbp-replies,
+#bbpress-forums #bbp-user-wrapper fieldset.bbp-form {
+	clear: none;
+}
+
+#bbpress-forums #bbp-single-user-details {
+	margin: 0;
+	width: 150px;
+	float: right;
+	overflow: hidden;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-avatar {
+	margin: 0;
+	width: 150px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-avatar img.avatar {
+	border: none;
+	height: 150px;
+	padding: 0;
+	margin: 0 0 20px 0;
+	width: 150px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-description {
+	float: none;
+	margin-right: 180px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation {
+	float: none;
+	margin: 0;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation li {
+	margin: 0;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation a {
+	padding: 5px 8px;
+	display: block;
+	border: 1px solid transparent;
+	text-decoration: none;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation li.current a {
+	background: #eee;
+	opacity: 0.8;
+}
+
+#bbpress-forums #bbp-user-body {
+	margin-right: 180px;
+}
+
+body.my-account #bbpress-forums {
+	border-top: none;
+	padding-top: 0;
+	margin-bottom: 0;
+}
+
+/* =User Capabilities
+-------------------------------------------------------------- */
+
+#bbpress-forums dl.bbp-user-capabilities {
+	display: inline-block;
+	vertical-align: top;
+}
+
+#bbpress-forums dl.bbp-user-capabilities dt {
+	margin: 0 0 10px;
+	text-transform: capitalize;
+}
+
+#bbpress-forums dl.bbp-user-capabilities dd {
+	margin: 0;
+	padding: 0;
+}
+
+/* =BuddyPress Group Forums
+-------------------------------------------------------------- */
+
+#bbpress-forums div.row-actions {
+	font-size: 11px;
+	visibility: hidden;
+}
+
+#bbpress-forums li:hover > div.row-actions {
+	visibility: visible;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/css/bbpress-rtl.min.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1 @@
+#bbpress-forums hr{margin:0 0 24px 0}#bbpress-forums{background:transparent;clear:both;margin-bottom:20px;overflow:hidden;font-size:12px}#bbpress-forums div.even,#bbpress-forums ul.even{background-color:#fff}#bbpress-forums div.odd,#bbpress-forums ul.odd{background-color:#fbfbfb}#bbpress-forums div.reply{height:auto}#bbpress-forums div.bbp-topic-header,#bbpress-forums div.bbp-reply-header{background-color:#f4f4f4}#bbpress-forums .status-trash.even,#bbpress-forums .status-spam.even{background-color:#fee}#bbpress-forums .status-trash.odd,#bbpress-forums .status-spam.odd{background-color:#fdd}#bbpress-forums .status-closed,#bbpress-forums .status-closed a{color:#ccc}#bbpress-forums ul{list-style:none;margin:0;padding:0}#bbpress-forums li{margin:0;list-style:none}#bbpress-forums ul.bbp-lead-topic,#bbpress-forums ul.bbp-topics,#bbpress-forums ul.bbp-forums,#bbpress-forums ul.bbp-replies{font-size:12px;overflow:hidden;border:1px solid #eee;margin-bottom:20px;clear:both}#bbpress-forums li.bbp-header,#bbpress-forums li.bbp-body,#bbpress-forums li.bbp-footer{clear:both}#bbpress-forums li.bbp-header,#bbpress-forums li.bbp-footer{background:#f3f3f3;border-top:1px solid #eee;font-weight:bold;padding:8px;text-align:center}#bbpress-forums li.bbp-header{background:#eaeaea}#bbpress-forums li.bbp-header ul{overflow:hidden}#bbpress-forums .bbp-forums-list{margin:0 5px 0 0;padding-right:15px;border-right:1px solid #ddd}#bbpress-forums .bbp-forums-list li{display:inline;font-size:11px}#bbpress-forums li.bbp-footer p{margin:0;line-height:1em}#bbpress-forums .bbp-topic-content img,#bbpress-forums .bbp-reply-content img{max-width:100%}#bbpress-forums .bbp-topic-content ul,#bbpress-forums .bbp-reply-content ul{list-style:square;padding-right:15px}#bbpress-forums .bbp-forum-content p{margin:5px 0 0;font-style:italic}li.bbp-forum-info,li.bbp-topic-title{float:right;text-align:right;width:55%}li.bbp-forum-topic-count,li.bbp-topic-voice-count,li.bbp-forum-reply-count,li.bbp-topic-reply-count{float:right;text-align:center;width:10%}li.bbp-forum-freshness,li.bbp-topic-freshness{text-align:center;float:right;width:22%}#bbpress-forums li.bbp-body ul.forum,#bbpress-forums li.bbp-body ul.topic{border-top:1px solid #eee;overflow:hidden;padding:8px}li.bbp-header div.bbp-topic-content span#subscription-toggle,li.bbp-header div.bbp-topic-content span#favorite-toggle,li.bbp-header div.bbp-reply-content span#subscription-toggle,li.bbp-header div.bbp-reply-content span#favorite-toggle{float:left}#bbpress-forums div.bbp-topic-author,#bbpress-forums div.bbp-reply-author{float:right;text-align:center;width:115px}#bbpress-forums div.bbp-topic-author img.avatar,#bbpress-forums div.bbp-reply-author img.avatar{border:0;max-width:80px;padding:0;margin:12px auto 0 auto;float:none}#bbpress-forums div.bbp-topic-author a.bbp-author-name,#bbpress-forums div.bbp-reply-author a.bbp-author-name{word-wrap:break-word}#bbpress-forums div.bbp-topic-content,#bbpress-forums div.bbp-reply-content{margin-right:140px;padding:12px 12px 12px 0;text-align:right}#bbpress-forums li.bbp-header .bbp-topic-author,#bbpress-forums li.bbp-footer .bbp-topic-author,#bbpress-forums li.bbp-header .bbp-reply-author,#bbpress-forums li.bbp-footer .bbp-reply-author{float:right;padding:0;width:120px}#bbpress-forums li.bbp-header .bbp-topic-content,#bbpress-forums li.bbp-footer .bbp-topic-content,#bbpress-forums li.bbp-header .bbp-reply-content,#bbpress-forums li.bbp-footer .bbp-reply-content{margin-right:140px;padding:0;text-align:right}div.bbp-topic-header,div.bbp-reply-header,li.bbp-body div.hentry{margin-bottom:0;overflow:hidden;padding:8px}div.bbp-topic-header,div.bbp-reply-header{border-top:1px solid #ddd;clear:both}span.bbp-author-ip{font-family:'Helvetica Neue',Arial,Helvetica,'Nimbus Sans L',sans-serif;font-size:11px;font-weight:bold;color:#aaa}div.bbp-breadcrumb{float:right}div.bbp-breadcrumb,div.bbp-topic-tags{font-size:12px}#content div.bbp-breadcrumb p,#content div.bbp-topic-tags p{margin-bottom:10px}div.bbp-topic-tags{float:left}span.bbp-admin-links{float:left;color:#ddd}span.bbp-admin-links a{color:#bbb;font-weight:normal;font-size:10px;text-transform:uppercase;text-decoration:none}fieldset span.bbp-admin-links{float:right}tr td span.bbp-admin-links a:hover{color:#ff4b33}td.bbp-topic-admin-links,td.bbp-topic-counts{width:50%}.bbp-topic-header a.bbp-topic-permalink,.bbp-reply-header a.bbp-reply-permalink{float:left;margin-right:10px;color:#ccc}.bbp-topic-action #favorite-toggle a{text-decoration:none;padding:0 3px 1px;color:#7c7;border:1px solid #aca;background-color:#dfd;font-weight:bold;font-size:13px}.bbp-topic-action #favorite-toggle a:hover{color:#5a5;border-color:#7c7;background-color:#beb}.bbp-topic-action #favorite-toggle span.is-favorite a{color:#faa;border:1px solid #faa;background-color:#fee}.bbp-topic-action #favorite-toggle span.is-favorite a:hover{color:#c88;border-color:#c88;background-color:#fdd}.bbp-topic-action #subscription-toggle a{text-decoration:none;padding:0 3px 1px;color:#7c7;border:1px solid #aca;background-color:#dfd;font-weight:bold;font-size:13px}.bbp-topic-action #subscription-toggle a:hover{color:#5a5;border-color:#7c7;background-color:#beb}.bbp-topic-action #subscription-toggle span.is-subscribed a{color:#faa;border:1px solid #faa;background-color:#fee}.bbp-topic-action #subscription-toggle span.is-subscribed a:hover{color:#c88;border-color:#c88;background-color:#fdd}#content p.bbp-topic-meta{margin-bottom:0;font-size:11px}#content p.bbp-topic-meta span{white-space:nowrap}.bbp-pagination-count{float:right}.bbp-pagination-links{float:left}.bbp-pagination{float:right;width:100%;margin-bottom:20px}.bbp-topic-pagination{display:inline-block;margin-right:5px;margin-bottom:2px}.bbp-topic-pagination a{font-size:10px;line-height:10px;padding:1px 3px;border:1px solid #ddd;text-decoration:none}#content fieldset.bbp-form,#container fieldset.bbp-form,#wrapper fieldset.bbp-form{clear:right}#content fieldset.bbp-form,#container fieldset.bbp-form,#wrapper fieldset.bbp-form{border:1px solid #eee;padding:10px 20px;margin-bottom:10px}#content fieldset.bbp-form legend,#container fieldset.bbp-form legend,#wrapper fieldset.bbp-form legend{padding:5px}#content fieldset.bbp-form label,#container fieldset.bbp-form label,#wrapper fieldset.bbp-form label{margin:0;display:inline-block}#bbp-edit-topic-tag.bbp-form fieldset.bbp-form label,#bbp-login fieldset label,#bbp-register fieldset label,#bbp-lost-pass fieldset label{width:100px}#content fieldset.bbp-form p,#container fieldset.bbp-form p,#wrapper fieldset.bbp-form p,#content fieldset.bbp-form textarea,#container fieldset.bbp-form textarea,#wrapper fieldset.bbp-form textarea,#content fieldset.bbp-form select,#container fieldset.bbp-form select,#wrapper fieldset.bbp-form select,#content fieldset.bbp-form input,#container fieldset.bbp-form input,#wrapper fieldset.bbp-form input{margin:0 0 10px}textarea#bbp_reply_content,textarea#bbp_topic_content,textarea#bbp_forum_content{width:97%;box-sizing:border-box}textarea#bbp_forum_content{height:210px}#content fieldset.bbp-forum-form-attributes,#container fieldset.bbp-forum-form-attributes,#wrapper fieldset.bbp-forum-form-attributes{width:200px;float:left;clear:none;margin-right:25px}#bbpress-forums fieldset select#bbp_forum_id{max-width:200px}.bbp-topic-form,.bbp-reply-form,.bbp-topic-tag-form{clear:right}body.topic-edit .bbp-topic-form div.avatar img,body.reply-edit .bbp-reply-form div.avatar img,body.single-forum .bbp-topic-form div.avatar img,body.single-reply .bbp-reply-form div.avatar img{margin-left:0;padding:10px;border:1px solid #ddd;line-height:0;background-color:#efefef}body.page .bbp-reply-form code,body.page .bbp-topic-form code,body.single-topic .bbp-reply-form code,body.single-forum .bbp-topic-form code,body.topic-edit .bbp-topic-form code,body.reply-edit .bbp-reply-form code{font-size:10px;background-color:#f0fff8;border:1px solid #ceefe1;display:block;padding:8px;margin-top:5px;width:369px}#merge_tag,#delete_tag{display:inline}div.bbp-submit-wrapper{margin-top:15px;float:left;clear:both}p.form-allowed-tags{width:462px}input[type="password"]{background:#f9f9f9;border:1px solid #ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,0.1);padding:2px}#content div.bbp-the-content-wrapper{margin-bottom:10px}#content div.bbp-the-content-wrapper textarea.bbp-the-content{width:100%;margin:0;font-size:12px}#content div.bbp-the-content-wrapper table,#content div.bbp-the-content-wrapper tbody,#content div.bbp-the-content-wrapper tr,#content div.bbp-the-content-wrapper td{border:0;padding:0;margin:0;width:auto;line-height:1em}#content div.bbp-the-content-wrapper input{font-size:12px;padding:5px;margin:3px 0 0;line-height:1em;margin:0}#content div.bbp-the-content-wrapper div.quicktags-toolbar{padding:5px;min-height:26px}#content div.bbp-the-content-wrapper td.mceToolbar{padding:4px 4px 8px}#content div.wp-editor-container{margin:0;padding:0;line-height:0}#content div.bbp-the-content-wrapper td.mceStatusbar{line-height:16px}#bbp-your-profile fieldset{margin-top:20px;padding:20px 20px 0 20px}#bbp-your-profile fieldset div{margin-bottom:20px;float:right;width:100%;clear:right}#bbp-your-profile fieldset select{margin-bottom:0}#bbp-your-profile fieldset input,#bbp-your-profile fieldset textarea{margin-bottom:0;width:400px;background:#f9f9f9;border:1px solid #ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,0.1);padding:2px}#bbp-your-profile fieldset legend{display:none}#content #bbp-your-profile fieldset label,#container #bbp-your-profile fieldset label{float:right;width:150px;padding-left:20px;text-align:left}#bbp-your-profile fieldset span.description{margin:5px 0 0 170px;font-size:12px;font-style:italic;float:right;clear:right;width:383px;padding:5px 10px;border:#cee1ef 1px solid;background-color:#f0f8ff}#content #bbp-your-profile fieldset fieldset,#container #bbp-your-profile fieldset fieldset{margin:0;width:260px;border:0;padding:0;clear:none;float:none}#bbp-your-profile fieldset fieldset span.description{margin-right:0;margin-bottom:20px}#bbp-your-profile fieldset.submit button{float:left}div.bbp-template-notice{border-width:1px;border-style:solid;padding:0 .6em;margin:5px 0 15px;border-radius:3px;background-color:#ffffe0;border-color:#e6db55;color:#000;clear:both}div.bbp-template-notice a{color:#555;text-decoration:none}div.bbp-template-notice a:hover{color:#000}div.bbp-template-notice.info{border:#cee1ef 1px solid;background-color:#f0f8ff}div.bbp-template-notice.important{border:#e6db55 1px solid;background-color:#fffbcc}div.bbp-template-notice.error,div.bbp-template-notice.warning{background-color:#ffebe8;border-color:#c00}div.bbp-template-notice.error a,div.bbp-template-notice.warning a{color:#c00}div.bbp-template-notice p{margin:.5em 0 6px 0!important;padding:2px;font-size:12px;line-height:140%}.bbp-topics-front ul.super-sticky,.bbp-topics ul.super-sticky,.bbp-topics ul.sticky,.bbp-forum-content ul.sticky{background-color:#ffffe0!important;font-size:1.1em}#content .bbp-topic-revision-log,#content .bbp-reply-revision-log,#main .bbp-topic-revision-log,#main .bbp-reply-revision-log,#container .bbp-topic-revision-log,#container .bbp-reply-revision-log{border-top:1px dotted #ddd;list-style:none;width:100%;margin:0;padding:8px 0 0 0;font-size:11px;color:#aaa}.bbp-login-form fieldset legend{display:none}.bbp-login-form .bbp-username input,.bbp-login-form .bbp-email input,.bbp-login-form .bbp-password input{padding:5px}.bbp-login-form .bbp-username label,.bbp-login-form .bbp-password label{width:70px;display:inline-block}.bbp-login-form .bbp-username,.bbp-login-form .bbp-password,.bbp-login-form .bbp-remember-me,.bbp-login-form .bbp-submit-wrapper{margin-top:10px}.bbp-login-form .bbp-submit-wrapper{text-align:left}.bbp-login-form .bbp-login-links a{float:right;clear:right}.bbp-logged-in img.avatar{float:right;margin-left:15px}.bbp-logged-in h4{font-weight:bold;font-size:1.3em;clear:none;margin-bottom:10px}#bbpress-forums p.bbp-topic-meta img.avatar,#bbpress-forums ul.bbp-reply-revision-log img.avatar,#bbpress-forums ul.bbp-topic-revision-log img.avatar,#bbpress-forums div.bbp-template-notice img.avatar,#bbpress-forums .widget_display_topics img.avatar,#bbpress-forums .widget_display_replies img.avatar,#bbpress-forums p.bbp-topic-meta img.avatar{float:none;margin-bottom:-7px;border:3px double #ddd}fieldset div.avatar{float:left}.activity-list li.bbp_topic_create .activity-content .activity-inner,.activity-list li.bbp_reply_create .activity-content .activity-inner{border-right:2px solid #eaeaea;margin-right:5px;padding-right:10px}#bbpress-forums h1{clear:none;font-size:1.8em;line-height:1em;padding-bottom:10px}#bbpress-forums h2.entry-title{font-size:1.4em;margin-bottom:0;padding-bottom:10px;padding-top:0}#bbpress-forums #bbp-single-user-details{display:inline-block;margin:0;width:150px;vertical-align:top;overflow:hidden}#bbpress-forums #bbp-single-user-details #bbp-user-avatar{margin:0;width:150px}#bbpress-forums #bbp-single-user-details #bbp-user-avatar img.avatar{border:0;height:150px;padding:0;margin:0 0 20px 0;width:150px}#bbpress-forums #bbp-single-user-details #bbp-user-description{float:none;margin:0 180px 0 0}#bbpress-forums #bbp-single-user-details #bbp-user-navigation{float:none;margin:0}#bbpress-forums #bbp-single-user-details #bbp-user-navigation li{margin:0}#bbpress-forums #bbp-single-user-details #bbp-user-navigation a{padding:5px 8px;display:block;border:1px solid transparent;text-decoration:none;text-align:right}#bbpress-forums #bbp-single-user-details #bbp-user-navigation li.current a{background:#eee;opacity:.8}#bbpress-forums #bbp-user-body{display:inline-block;vertical-align:top;margin:0 30px 0 0;width:80%;float:left;text-align:right}body.my-account #bbpress-forums{border-top:0;padding-top:0;margin-bottom:0}body.my-account #bbpress-forums,body.my-account #bbp-author-subscriptions,body.my-account #bbp-author-favorites,body.my-account #bbp-author-topics-started{border-top:0;padding-top:0;margin-bottom:0}#bbpress-forums dl.bbp-user-capabilities{display:inline-block;vertical-align:top}#bbpress-forums dl.bbp-user-capabilities dt{margin:0 0 10px;text-transform:capitalize}#bbpress-forums dl.bbp-user-capabilities dd{margin:0;padding:0}#bbpress-forums div.row-actions{font-size:11px;visibility:hidden}#bbpress-forums li:hover>div.row-actions{visibility:visible}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/css/bbpress.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,902 @@
+/**
+ * bbPress specific CSS
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+/* =bbPress Style
+-------------------------------------------------------------- */
+
+#bbpress-forums hr {
+	margin: 0 0 24px 0;
+}
+
+#bbpress-forums {
+	background: transparent;
+	clear: both;
+	margin-bottom: 20px;
+	overflow: hidden;
+	font-size: 12px;
+}
+
+#bbpress-forums div.even,
+#bbpress-forums ul.even {
+	background-color: #fff;
+}
+
+#bbpress-forums div.odd,
+#bbpress-forums ul.odd {
+	background-color: #fbfbfb;
+}
+
+#bbpress-forums div.reply {
+	height: auto;
+}
+
+#bbpress-forums div.bbp-topic-header,
+#bbpress-forums div.bbp-reply-header {
+	background-color: #f4f4f4;
+}
+
+#bbpress-forums .status-trash.even,
+#bbpress-forums .status-spam.even {
+	background-color: #fee;
+}
+#bbpress-forums .status-trash.odd,
+#bbpress-forums .status-spam.odd {
+	background-color: #fdd;
+}
+
+#bbpress-forums .status-closed,
+#bbpress-forums .status-closed a {
+	color: #ccc;
+}
+
+#bbpress-forums ul {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+}
+
+#bbpress-forums li {
+	margin: 0;
+	list-style: none;
+}
+
+#bbpress-forums ul.bbp-lead-topic,
+#bbpress-forums ul.bbp-topics,
+#bbpress-forums ul.bbp-forums,
+#bbpress-forums ul.bbp-replies {
+	font-size: 12px;
+	overflow: hidden;
+	border: 1px solid #eee;
+	margin-bottom: 20px;
+	clear: both;
+}
+
+#bbpress-forums li.bbp-header,
+#bbpress-forums li.bbp-body,
+#bbpress-forums li.bbp-footer {
+	clear: both;
+}
+
+#bbpress-forums li.bbp-header,
+#bbpress-forums li.bbp-footer {
+	background: #f3f3f3;
+	border-top: 1px solid #eee;
+	font-weight: bold;
+	padding: 8px;
+	text-align: center;
+}
+
+#bbpress-forums li.bbp-header {
+	background: #eaeaea;
+}
+
+#bbpress-forums li.bbp-header ul {
+	overflow: hidden;
+}
+
+#bbpress-forums .bbp-forums-list {
+	margin: 0 0 0 5px;
+	padding-left: 15px;
+	border-left: 1px solid #ddd;
+}
+
+#bbpress-forums .bbp-forums-list li {
+	display: inline;
+	font-size: 11px;
+}
+
+#bbpress-forums li.bbp-footer p {
+	margin: 0;
+	line-height: 1em;
+}
+
+#bbpress-forums .bbp-topic-content img,
+#bbpress-forums .bbp-reply-content img {
+	max-width: 100%;
+}
+
+#bbpress-forums .bbp-topic-content ul,
+#bbpress-forums .bbp-reply-content ul {
+	list-style: square;
+	padding-left: 15px;
+}
+
+#bbpress-forums .bbp-forum-content p {
+	margin: 5px 0 0;
+	font-style: italic;
+}
+
+li.bbp-forum-info,
+li.bbp-topic-title {
+	float: left;
+	text-align: left;
+	width: 55%;
+}
+li.bbp-forum-topic-count,
+li.bbp-topic-voice-count,
+li.bbp-forum-reply-count,
+li.bbp-topic-reply-count {
+	float: left;
+	text-align: center;
+	width: 10%;
+}
+
+li.bbp-forum-freshness,
+li.bbp-topic-freshness {
+	text-align: center;
+	float: left;
+	width: 22%;
+}
+
+#bbpress-forums li.bbp-body ul.forum,
+#bbpress-forums li.bbp-body ul.topic {
+	border-top: 1px solid #eee;
+	overflow: hidden;
+	padding: 8px;
+}
+
+li.bbp-header div.bbp-topic-content span#subscription-toggle,
+li.bbp-header div.bbp-topic-content span#favorite-toggle,
+li.bbp-header div.bbp-reply-content span#subscription-toggle,
+li.bbp-header div.bbp-reply-content span#favorite-toggle {
+	float: right;
+}
+
+#bbpress-forums div.bbp-topic-author,
+#bbpress-forums div.bbp-reply-author {
+	float: left;
+	text-align: center;
+	width: 115px;
+}
+
+#bbpress-forums div.bbp-topic-author img.avatar,
+#bbpress-forums div.bbp-reply-author img.avatar {
+	border: none;
+	max-width: 80px;
+	padding: 0;
+	margin: 12px auto 0 auto;
+	float: none;
+}
+
+#bbpress-forums div.bbp-topic-author a.bbp-author-name,
+#bbpress-forums div.bbp-reply-author a.bbp-author-name {
+	margin: 0 12px;
+	word-break: break-word;
+}
+
+#bbpress-forums div.bbp-topic-author .bbp-author-role,
+#bbpress-forums div.bbp-reply-author .bbp-author-role {
+	font-size: 11px;
+	font-style: italic;
+}
+
+#bbpress-forums div.bbp-topic-content,
+#bbpress-forums div.bbp-reply-content {
+	margin-left: 140px;
+	padding: 12px 12px 12px 0;
+	text-align: left;
+}
+
+#bbpress-forums li.bbp-header .bbp-topic-author,
+#bbpress-forums li.bbp-footer .bbp-topic-author,
+#bbpress-forums li.bbp-header .bbp-reply-author,
+#bbpress-forums li.bbp-footer .bbp-reply-author {
+	float: left;
+	margin: 0;
+	padding: 0;
+	width: 120px;
+}
+
+#bbpress-forums li.bbp-header .bbp-topic-content,
+#bbpress-forums li.bbp-footer .bbp-topic-content,
+#bbpress-forums li.bbp-header .bbp-reply-content,
+#bbpress-forums li.bbp-footer .bbp-reply-content {
+	margin-left: 140px;
+	padding: 0;
+	text-align: left;
+}
+
+div.bbp-topic-header,
+div.bbp-reply-header,
+li.bbp-body div.hentry {
+	margin-bottom: 0;
+	overflow: hidden;
+	padding: 8px;
+}
+
+div.bbp-topic-header,
+div.bbp-reply-header {
+	border-top: 1px solid #ddd;
+	clear: both;
+}
+
+span.bbp-author-ip {
+	font-family: 'Helvetica Neue', Arial, Helvetica, 'Nimbus Sans L', sans-serif;
+	font-size: 11px;
+	font-weight: bold;
+	color: #aaa;
+}
+
+/* =Breadcrumb and Tags
+-------------------------------------------------------------- */
+
+div.bbp-breadcrumb {
+	float: left;
+}
+
+div.bbp-breadcrumb,
+div.bbp-topic-tags {
+	font-size: 12px;
+}
+
+#bbpress-forums div.bbp-breadcrumb p,
+#bbpress-forums div.bbp-topic-tags p {
+	margin-bottom: 10px
+}
+
+div.bbp-topic-tags {
+	float: right;
+}
+
+/* =Admin Links
+-------------------------------------------------------------- */
+
+span.bbp-admin-links {
+	float: right;
+	color: #ddd;
+}
+span.bbp-admin-links a {
+	color: #bbb;
+	font-weight: normal;
+	font-size: 10px;
+	text-transform: uppercase;
+	text-decoration: none;
+}
+fieldset span.bbp-admin-links {
+	float: left;
+}
+tr td span.bbp-admin-links a:hover {
+	color: #ff4b33;
+}
+td.bbp-topic-admin-links,
+td.bbp-topic-counts {
+	width: 50%;
+}
+
+.bbp-topic-header a.bbp-topic-permalink,
+.bbp-reply-header a.bbp-reply-permalink {
+	float: right;
+	margin-left: 10px;
+	color: #ccc;
+}
+
+/* =Toggles
+-------------------------------------------------------------- */
+
+.bbp-topic-action #favorite-toggle a {
+	text-decoration: none;
+	padding: 0 3px 1px;
+	color: #7c7;
+	border: 1px solid #aca;
+	background-color: #dfd;
+	font-weight: bold;
+	font-size: 13px;
+	}
+	.bbp-topic-action #favorite-toggle a:hover {
+		color: #5a5;
+		border-color: #7c7;
+		background-color: #beb;
+	}
+	.bbp-topic-action #favorite-toggle span.is-favorite a {
+		color: #faa;
+		border: 1px solid #faa;
+		background-color: #fee;
+		}
+		.bbp-topic-action #favorite-toggle span.is-favorite a:hover {
+			color: #c88;
+			border-color: #c88;
+			background-color: #fdd;
+		}
+
+.bbp-topic-action #subscription-toggle a {
+	text-decoration: none;
+	padding: 0 3px 1px;
+	color: #7c7;
+	border: 1px solid #aca;
+	background-color: #dfd;
+	font-weight: bold;
+	font-size: 13px;
+	}
+	.bbp-topic-action #subscription-toggle a:hover {
+		color: #5a5;
+		border-color: #7c7;
+		background-color: #beb;
+	}
+	.bbp-topic-action #subscription-toggle span.is-subscribed a {
+		color: #faa;
+		border: 1px solid #faa;
+		background-color: #fee;
+		}
+		.bbp-topic-action #subscription-toggle span.is-subscribed a:hover {
+			color: #c88;
+			border-color: #c88;
+			background-color: #fdd;
+		}
+
+#bbpress-forums p.bbp-topic-meta {
+	margin: 5px 0 5px;
+	font-size: 11px;
+}
+
+#bbpress-forums p.bbp-topic-meta span {
+	white-space: nowrap;
+}
+
+/* =Pagination
+-------------------------------------------------------------- */
+
+.bbp-pagination-count {
+	float: left;
+}
+.bbp-pagination-links {
+	float: right;
+}
+.bbp-pagination {
+	float: left;
+	width: 100%;
+	margin-bottom: 15px;
+}
+
+.bbp-topic-pagination {
+	display: inline-block;
+	margin-left: 5px;
+	margin-bottom: 2px;
+	}
+	.bbp-topic-pagination a {
+		font-size: 10px;
+		line-height: 10px;
+		padding: 1px 3px;
+		border: 1px solid #ddd;
+		text-decoration: none;
+	}
+
+/* =Forms
+-------------------------------------------------------------- */
+
+#bbpress-forums fieldset.bbp-form {
+	clear: left;
+}
+
+#bbpress-forums fieldset.bbp-form {
+	border: 1px solid #eee;
+	padding: 10px 20px;
+	margin-bottom: 10px;
+}
+
+#bbpress-forums fieldset.bbp-form legend {
+	padding: 5px;
+}
+
+#bbpress-forums fieldset.bbp-form label {
+	margin: 0;
+	display: inline-block;
+}
+
+#bbp-edit-topic-tag.bbp-form fieldset.bbp-form label,
+#bbp-login fieldset label,
+#bbp-register fieldset label,
+#bbp-lost-pass fieldset label {
+	width: 100px;
+}
+
+#bbpress-forums fieldset.bbp-form p,
+#bbpress-forums fieldset.bbp-form textarea,
+#bbpress-forums fieldset.bbp-form select,
+#bbpress-forums fieldset.bbp-form input {
+	margin: 0 0 8px;
+}
+
+textarea#bbp_reply_content,
+textarea#bbp_topic_content,
+textarea#bbp_forum_content {
+	width: 97%;
+	box-sizing: border-box;
+}
+
+textarea#bbp_forum_content {
+	height: 210px;
+}
+
+#bbpress-forums fieldset.bbp-forum-form-attributes {
+	width: 200px;
+	float: right;
+	clear: none;
+	margin-left: 25px;
+}
+
+/**
+ * Fix for too-long forum names, usually from conversion
+ */
+#bbpress-forums fieldset select#bbp_forum_id {
+	max-width: 200px;
+}
+
+.bbp-topic-form,
+.bbp-reply-form,
+.bbp-topic-tag-form {
+	clear: left;
+}
+body.topic-edit .bbp-topic-form div.avatar img,
+body.reply-edit .bbp-reply-form div.avatar img,
+body.single-forum .bbp-topic-form div.avatar img,
+body.single-reply .bbp-reply-form div.avatar img {
+	margin-right: 0;
+	padding: 10px;
+	border: 1px solid #ddd;
+	line-height: 0;
+	background-color: #efefef;
+}
+
+body.page .bbp-reply-form code,
+body.page .bbp-topic-form code,
+body.single-topic .bbp-reply-form code,
+body.single-forum .bbp-topic-form code,
+body.topic-edit .bbp-topic-form code,
+body.reply-edit .bbp-reply-form code {
+	font-size: 10px;
+	background-color: #f0fff8;
+	border: 1px solid #CEEFE1;
+	display: block;
+	padding: 8px;
+	margin-top: 5px;
+	width: 369px;
+}
+
+#merge_tag,
+#delete_tag {
+	display: inline;
+}
+
+div.bbp-submit-wrapper {
+	margin-top: 15px;
+	float: right;
+	clear: both;
+}
+
+p.form-allowed-tags {
+	width: 462px;
+}
+
+/* =TinyMCE in themes
+-------------------------------------------------------------- */
+#bbpress-forums div.bbp-the-content-wrapper {
+	margin-bottom: 10px;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper textarea.bbp-the-content {
+	width: 100%;
+	margin: 0;
+	font-size: 12px;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper table,
+#bbpress-forums div.bbp-the-content-wrapper tbody,
+#bbpress-forums div.bbp-the-content-wrapper tr,
+#bbpress-forums div.bbp-the-content-wrapper td {
+	border: none;
+	padding: 0;
+	margin: 0;
+	width: auto;
+	line-height: 1em;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper input {
+	font-size: 12px;
+	padding: 5px;
+	margin: 3px 0 0;
+	line-height: 1em;
+	margin: 0;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper div.quicktags-toolbar {
+	padding: 5px;
+	min-height: 26px;
+}
+#bbpress-forums div.bbp-the-content-wrapper td.mceToolbar {
+	padding: 4px 4px 8px;
+}
+
+#bbpress-forums div.wp-editor-container {
+	margin: 0;
+	padding: 0;
+	line-height: 0;
+}
+
+#bbpress-forums div.bbp-the-content-wrapper td.mceStatusbar {
+	line-height: 16px;
+}
+
+/* =Edit User
+-------------------------------------------------------------- */
+
+#bbpress-forums #bbp-your-profile fieldset {
+	padding: 20px 20px 0 20px;
+}
+	#bbpress-forums #bbp-your-profile fieldset div {
+		margin-bottom: 20px;
+		float: left;
+		width: 100%;
+		clear: left;
+	}
+	#bbpress-forums #bbp-your-profile fieldset select {
+		margin-bottom: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset input,
+	#bbpress-forums #bbp-your-profile fieldset textarea {
+		margin-bottom: 0;
+		width: 60%;
+		background: #f9f9f9;
+		border: 1px solid #ddd;
+		box-shadow: none;
+		padding: 5px 8px;
+		border-radius: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset input:focus,
+	#bbpress-forums #bbp-your-profile fieldset textarea:focus {
+		border: 1px solid #ccc;
+		box-shadow: inset 1px 1px 1px rgba(0,0,0,0.1);
+		outline-color: rgba(240,255,240,0.1);
+	}
+	#bbpress-forums #bbp-your-profile fieldset.bbp-form input.checkbox {
+		width: auto;
+	}
+	#bbpress-forums #bbp-your-profile fieldset legend {
+		display: none;
+	}
+	#bbpress-forums #bbp-your-profile fieldset label[for] {
+		float: left;
+		width: 20%;
+		padding: 5px 20px 5px 0;
+		text-align: right;
+		cursor: pointer;
+	}
+	#bbpress-forums #bbp-your-profile fieldset dl label[for] {
+		text-align: left;
+		width: 60%;
+	}
+	#bbpress-forums #bbp-your-profile fieldset span.description {
+		margin: 5px 0 0 20%;
+		font-size: 12px;
+		font-style: italic;
+		float: left;
+		clear: left;
+		width: 60%;
+		padding: 5px 8px;
+		border: #cee1ef 1px solid;
+		background-color: #f0f8ff;
+	}
+
+	#bbpress-forums #bbp-your-profile fieldset fieldset {
+		margin: 0;
+		border: none;
+		padding: 0;
+		clear: none;
+		float: none;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password {
+		width: 60%;
+		display: inline;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password input,
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password span {
+		width: 100%;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.capabilities dl {
+		margin: 0;
+	}
+	#bbpress-forums #bbp-your-profile fieldset fieldset.password span.description {
+		margin-left: 0;
+		margin-bottom: 20px;
+	}
+
+	#bbpress-forums #bbp-your-profile fieldset.submit button {
+		float: right;
+	}
+
+/* =Notices
+-------------------------------------------------------------- */
+
+div.bbp-template-notice,
+div.indicator-hint {
+	border-width: 1px;
+	border-style: solid;
+	padding: 0 0.6em;
+	margin: 5px 0 15px;
+	border-radius: 3px;
+	background-color: #ffffe0;
+	border-color: #e6db55;
+	color: #000;
+	clear: both;
+}
+div.bbp-template-notice a {
+	color: #555;
+	text-decoration: none;
+}
+	div.bbp-template-notice a:hover {
+		color: #000;
+	}
+	div.bbp-template-notice.info {
+		border: #cee1ef 1px solid;
+		background-color: #f0f8ff;
+	}
+	div.bbp-template-notice.important {
+		border: #e6db55 1px solid;
+		background-color: #fffbcc;
+	}
+	div.bbp-template-notice.error,
+	div.bbp-template-notice.warning {
+		background-color: #ffebe8;
+		border-color: #c00;
+	}
+	div.bbp-template-notice.error a,
+	div.bbp-template-notice.warning a {
+		color: #c00;
+	}
+	div.bbp-template-notice p {
+		margin: 0.5em 0 6px 0 !important;
+		padding: 2px;
+		font-size: 12px;
+		line-height: 140%;
+	}
+
+/* =Stickies
+-------------------------------------------------------------- */
+
+.bbp-topics-front ul.super-sticky,
+.bbp-topics ul.super-sticky,
+.bbp-topics ul.sticky,
+.bbp-forum-content ul.sticky {
+	background-color: #ffffe0 !important;
+	font-size: 1.1em;
+}
+
+/* =Revisions
+-------------------------------------------------------------- */
+#bbpress-forums .bbp-topic-revision-log,
+#bbpress-forums .bbp-reply-revision-log {
+	border-top: 1px dotted #ddd;
+	list-style: none;
+	width: 100%;
+	margin: 0;
+	padding: 8px 0 0 0;
+	font-size: 11px;
+	color: #aaa;
+}
+
+/* =Widgets
+-------------------------------------------------------------- */
+
+.bbp-login-form fieldset legend {
+	display: none;
+}
+
+.bbp-login-form .bbp-username input,
+.bbp-login-form .bbp-email input,
+.bbp-login-form .bbp-password input {
+	padding: 5px;
+}
+
+.bbp-login-form label {
+	width: 140px;
+	display: inline-block;
+}
+
+#sidebar .bbp-login-form label {
+	width: 70px;
+}
+
+.bbp-login-form .bbp-username,
+.bbp-login-form .bbp-email,
+.bbp-login-form .bbp-password,
+.bbp-login-form .bbp-remember-me,
+.bbp-login-form .bbp-submit-wrapper {
+	margin-top: 10px;
+}
+
+.bbp-login-form .bbp-remember-me {
+
+}
+
+.bbp-login-form .bbp-submit-wrapper {
+	text-align: right;
+}
+
+.bbp-login-form .bbp-login-links {
+}
+
+.bbp-login-form .bbp-login-links a {
+	float: left;
+	clear: left;
+}
+
+.bbp-logged-in img.avatar {
+	float: left;
+	margin: 0 15px 0 0;
+}
+
+.bbp-logged-in h4 {
+	font-weight: bold;
+	font-size: 1.3em;
+	clear: none;
+	margin-bottom: 10px;
+}
+
+/* =Avatars
+-------------------------------------------------------------- */
+
+#bbpress-forums p.bbp-topic-meta img.avatar,
+#bbpress-forums ul.bbp-reply-revision-log img.avatar,
+#bbpress-forums ul.bbp-topic-revision-log img.avatar,
+#bbpress-forums div.bbp-template-notice img.avatar,
+#bbpress-forums .widget_display_topics img.avatar,
+#bbpress-forums .widget_display_replies img.avatar,
+#bbpress-forums p.bbp-topic-meta img.avatar {
+	float: none;
+	margin-bottom: -7px;
+	border: 3px double #ddd;
+}
+
+fieldset div.avatar {
+	float: right;
+}
+
+/* =BuddyPress Activity Streams
+-------------------------------------------------------------- */
+
+.activity-list li.bbp_topic_create .activity-content .activity-inner,
+.activity-list li.bbp_reply_create .activity-content .activity-inner {
+	border-left: 2px solid #eaeaea;
+	margin-left: 5px;
+	padding-left: 10px;
+}
+
+/* =User Pages
+-------------------------------------------------------------- */
+
+#bbpress-forums h1 {
+	clear: none;
+	font-size: 1.8em;
+	line-height: 1em;
+	padding-bottom: 10px;
+}
+
+#bbpress-forums #bbp-user-wrapper {
+	float: left;
+	width: 100%;
+}
+
+#bbpress-forums #bbp-user-wrapper h2.entry-title {
+	font-size: 1.4em;
+	margin: 0;
+	padding-bottom: 10px;
+	padding-top: 0;
+	clear: none;
+}
+
+#bbpress-forums #bbp-user-wrapper ul.bbp-lead-topic,
+#bbpress-forums #bbp-user-wrapper ul.bbp-topics,
+#bbpress-forums #bbp-user-wrapper ul.bbp-forums,
+#bbpress-forums #bbp-user-wrapper ul.bbp-replies,
+#bbpress-forums #bbp-user-wrapper fieldset.bbp-form {
+	clear: none;
+}
+
+#bbpress-forums #bbp-single-user-details {
+	margin: 0;
+	width: 150px;
+	float: left;
+	overflow: hidden;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-avatar {
+	margin: 0;
+	width: 150px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-avatar img.avatar {
+	border: none;
+	height: 150px;
+	padding: 0;
+	margin: 0 0 20px 0;
+	width: 150px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-description {
+	float: none;
+	margin-left: 180px;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation {
+	float: none;
+	margin: 0;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation li {
+	margin: 0;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation a {
+	padding: 5px 8px;
+	display: block;
+	border: 1px solid transparent;
+	text-decoration: none;
+}
+
+#bbpress-forums #bbp-single-user-details #bbp-user-navigation li.current a {
+	background: #eee;
+	opacity: 0.8;
+}
+
+#bbpress-forums #bbp-user-body {
+	margin-left: 180px;
+}
+
+body.my-account #bbpress-forums {
+	border-top: none;
+	padding-top: 0;
+	margin-bottom: 0;
+}
+
+/* =User Capabilities
+-------------------------------------------------------------- */
+
+#bbpress-forums dl.bbp-user-capabilities {
+	display: inline-block;
+	vertical-align: top;
+}
+
+#bbpress-forums dl.bbp-user-capabilities dt {
+	margin: 0 0 10px;
+	text-transform: capitalize;
+}
+
+#bbpress-forums dl.bbp-user-capabilities dd {
+	margin: 0;
+	padding: 0;
+}
+
+/* =BuddyPress Group Forums
+-------------------------------------------------------------- */
+
+#bbpress-forums div.row-actions {
+	font-size: 11px;
+	visibility: hidden;
+}
+
+#bbpress-forums li:hover > div.row-actions {
+	visibility: visible;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/css/bbpress.min.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1 @@
+#bbpress-forums hr{margin:0 0 24px 0}#bbpress-forums{background:transparent;clear:both;margin-bottom:20px;overflow:hidden;font-size:12px}#bbpress-forums div.even,#bbpress-forums ul.even{background-color:#fff}#bbpress-forums div.odd,#bbpress-forums ul.odd{background-color:#fbfbfb}#bbpress-forums div.reply{height:auto}#bbpress-forums div.bbp-topic-header,#bbpress-forums div.bbp-reply-header{background-color:#f4f4f4}#bbpress-forums .status-trash.even,#bbpress-forums .status-spam.even{background-color:#fee}#bbpress-forums .status-trash.odd,#bbpress-forums .status-spam.odd{background-color:#fdd}#bbpress-forums .status-closed,#bbpress-forums .status-closed a{color:#ccc}#bbpress-forums ul{list-style:none;margin:0;padding:0}#bbpress-forums li{margin:0;list-style:none}#bbpress-forums ul.bbp-lead-topic,#bbpress-forums ul.bbp-topics,#bbpress-forums ul.bbp-forums,#bbpress-forums ul.bbp-replies{font-size:12px;overflow:hidden;border:1px solid #eee;margin-bottom:20px;clear:both}#bbpress-forums li.bbp-header,#bbpress-forums li.bbp-body,#bbpress-forums li.bbp-footer{clear:both}#bbpress-forums li.bbp-header,#bbpress-forums li.bbp-footer{background:#f3f3f3;border-top:1px solid #eee;font-weight:bold;padding:8px;text-align:center}#bbpress-forums li.bbp-header{background:#eaeaea}#bbpress-forums li.bbp-header ul{overflow:hidden}#bbpress-forums .bbp-forums-list{margin:0 0 0 5px;padding-left:15px;border-left:1px solid #ddd}#bbpress-forums .bbp-forums-list li{display:inline;font-size:11px}#bbpress-forums li.bbp-footer p{margin:0;line-height:1em}#bbpress-forums .bbp-topic-content img,#bbpress-forums .bbp-reply-content img{max-width:100%}#bbpress-forums .bbp-topic-content ul,#bbpress-forums .bbp-reply-content ul{list-style:square;padding-left:15px}#bbpress-forums .bbp-forum-content p{margin:5px 0 0;font-style:italic}li.bbp-forum-info,li.bbp-topic-title{float:left;text-align:left;width:55%}li.bbp-forum-topic-count,li.bbp-topic-voice-count,li.bbp-forum-reply-count,li.bbp-topic-reply-count{float:left;text-align:center;width:10%}li.bbp-forum-freshness,li.bbp-topic-freshness{text-align:center;float:left;width:22%}#bbpress-forums li.bbp-body ul.forum,#bbpress-forums li.bbp-body ul.topic{border-top:1px solid #eee;overflow:hidden;padding:8px}li.bbp-header div.bbp-topic-content span#subscription-toggle,li.bbp-header div.bbp-topic-content span#favorite-toggle,li.bbp-header div.bbp-reply-content span#subscription-toggle,li.bbp-header div.bbp-reply-content span#favorite-toggle{float:right}#bbpress-forums div.bbp-topic-author,#bbpress-forums div.bbp-reply-author{float:left;text-align:center;width:115px}#bbpress-forums div.bbp-topic-author img.avatar,#bbpress-forums div.bbp-reply-author img.avatar{border:0;max-width:80px;padding:0;margin:12px auto 0 auto;float:none}#bbpress-forums div.bbp-topic-author a.bbp-author-name,#bbpress-forums div.bbp-reply-author a.bbp-author-name{margin:0 12px;word-break:break-word}#bbpress-forums div.bbp-topic-author .bbp-author-role,#bbpress-forums div.bbp-reply-author .bbp-author-role{font-size:11px;font-style:italic}#bbpress-forums div.bbp-topic-content,#bbpress-forums div.bbp-reply-content{margin-left:140px;padding:12px 12px 12px 0;text-align:left}#bbpress-forums li.bbp-header .bbp-topic-author,#bbpress-forums li.bbp-footer .bbp-topic-author,#bbpress-forums li.bbp-header .bbp-reply-author,#bbpress-forums li.bbp-footer .bbp-reply-author{float:left;margin:0;padding:0;width:120px}#bbpress-forums li.bbp-header .bbp-topic-content,#bbpress-forums li.bbp-footer .bbp-topic-content,#bbpress-forums li.bbp-header .bbp-reply-content,#bbpress-forums li.bbp-footer .bbp-reply-content{margin-left:140px;padding:0;text-align:left}div.bbp-topic-header,div.bbp-reply-header,li.bbp-body div.hentry{margin-bottom:0;overflow:hidden;padding:8px}div.bbp-topic-header,div.bbp-reply-header{border-top:1px solid #ddd;clear:both}span.bbp-author-ip{font-family:'Helvetica Neue',Arial,Helvetica,'Nimbus Sans L',sans-serif;font-size:11px;font-weight:bold;color:#aaa}div.bbp-breadcrumb{float:left}div.bbp-breadcrumb,div.bbp-topic-tags{font-size:12px}#bbpress-forums div.bbp-breadcrumb p,#bbpress-forums div.bbp-topic-tags p{margin-bottom:10px}div.bbp-topic-tags{float:right}span.bbp-admin-links{float:right;color:#ddd}span.bbp-admin-links a{color:#bbb;font-weight:normal;font-size:10px;text-transform:uppercase;text-decoration:none}fieldset span.bbp-admin-links{float:left}tr td span.bbp-admin-links a:hover{color:#ff4b33}td.bbp-topic-admin-links,td.bbp-topic-counts{width:50%}.bbp-topic-header a.bbp-topic-permalink,.bbp-reply-header a.bbp-reply-permalink{float:right;margin-left:10px;color:#ccc}.bbp-topic-action #favorite-toggle a{text-decoration:none;padding:0 3px 1px;color:#7c7;border:1px solid #aca;background-color:#dfd;font-weight:bold;font-size:13px}.bbp-topic-action #favorite-toggle a:hover{color:#5a5;border-color:#7c7;background-color:#beb}.bbp-topic-action #favorite-toggle span.is-favorite a{color:#faa;border:1px solid #faa;background-color:#fee}.bbp-topic-action #favorite-toggle span.is-favorite a:hover{color:#c88;border-color:#c88;background-color:#fdd}.bbp-topic-action #subscription-toggle a{text-decoration:none;padding:0 3px 1px;color:#7c7;border:1px solid #aca;background-color:#dfd;font-weight:bold;font-size:13px}.bbp-topic-action #subscription-toggle a:hover{color:#5a5;border-color:#7c7;background-color:#beb}.bbp-topic-action #subscription-toggle span.is-subscribed a{color:#faa;border:1px solid #faa;background-color:#fee}.bbp-topic-action #subscription-toggle span.is-subscribed a:hover{color:#c88;border-color:#c88;background-color:#fdd}#bbpress-forums p.bbp-topic-meta{margin:5px 0 5px;font-size:11px}#bbpress-forums p.bbp-topic-meta span{white-space:nowrap}.bbp-pagination-count{float:left}.bbp-pagination-links{float:right}.bbp-pagination{float:left;width:100%;margin-bottom:15px}.bbp-topic-pagination{display:inline-block;margin-left:5px;margin-bottom:2px}.bbp-topic-pagination a{font-size:10px;line-height:10px;padding:1px 3px;border:1px solid #ddd;text-decoration:none}#bbpress-forums fieldset.bbp-form{clear:left}#bbpress-forums fieldset.bbp-form{border:1px solid #eee;padding:10px 20px;margin-bottom:10px}#bbpress-forums fieldset.bbp-form legend{padding:5px}#bbpress-forums fieldset.bbp-form label{margin:0;display:inline-block}#bbp-edit-topic-tag.bbp-form fieldset.bbp-form label,#bbp-login fieldset label,#bbp-register fieldset label,#bbp-lost-pass fieldset label{width:100px}#bbpress-forums fieldset.bbp-form p,#bbpress-forums fieldset.bbp-form textarea,#bbpress-forums fieldset.bbp-form select,#bbpress-forums fieldset.bbp-form input{margin:0 0 8px}textarea#bbp_reply_content,textarea#bbp_topic_content,textarea#bbp_forum_content{width:97%;box-sizing:border-box}textarea#bbp_forum_content{height:210px}#bbpress-forums fieldset.bbp-forum-form-attributes{width:200px;float:right;clear:none;margin-left:25px}#bbpress-forums fieldset select#bbp_forum_id{max-width:200px}.bbp-topic-form,.bbp-reply-form,.bbp-topic-tag-form{clear:left}body.topic-edit .bbp-topic-form div.avatar img,body.reply-edit .bbp-reply-form div.avatar img,body.single-forum .bbp-topic-form div.avatar img,body.single-reply .bbp-reply-form div.avatar img{margin-right:0;padding:10px;border:1px solid #ddd;line-height:0;background-color:#efefef}body.page .bbp-reply-form code,body.page .bbp-topic-form code,body.single-topic .bbp-reply-form code,body.single-forum .bbp-topic-form code,body.topic-edit .bbp-topic-form code,body.reply-edit .bbp-reply-form code{font-size:10px;background-color:#f0fff8;border:1px solid #ceefe1;display:block;padding:8px;margin-top:5px;width:369px}#merge_tag,#delete_tag{display:inline}div.bbp-submit-wrapper{margin-top:15px;float:right;clear:both}p.form-allowed-tags{width:462px}#bbpress-forums div.bbp-the-content-wrapper{margin-bottom:10px}#bbpress-forums div.bbp-the-content-wrapper textarea.bbp-the-content{width:100%;margin:0;font-size:12px}#bbpress-forums div.bbp-the-content-wrapper table,#bbpress-forums div.bbp-the-content-wrapper tbody,#bbpress-forums div.bbp-the-content-wrapper tr,#bbpress-forums div.bbp-the-content-wrapper td{border:0;padding:0;margin:0;width:auto;line-height:1em}#bbpress-forums div.bbp-the-content-wrapper input{font-size:12px;padding:5px;margin:3px 0 0;line-height:1em;margin:0}#bbpress-forums div.bbp-the-content-wrapper div.quicktags-toolbar{padding:5px;min-height:26px}#bbpress-forums div.bbp-the-content-wrapper td.mceToolbar{padding:4px 4px 8px}#bbpress-forums div.wp-editor-container{margin:0;padding:0;line-height:0}#bbpress-forums div.bbp-the-content-wrapper td.mceStatusbar{line-height:16px}#bbpress-forums #bbp-your-profile fieldset{padding:20px 20px 0 20px}#bbpress-forums #bbp-your-profile fieldset div{margin-bottom:20px;float:left;width:100%;clear:left}#bbpress-forums #bbp-your-profile fieldset select{margin-bottom:0}#bbpress-forums #bbp-your-profile fieldset input,#bbpress-forums #bbp-your-profile fieldset textarea{margin-bottom:0;width:300px;background:#f9f9f9;border:1px solid #ddd;box-shadow:none;padding:4px;border-radius:0}#bbpress-forums #bbp-your-profile fieldset input:focus,#bbpress-forums #bbp-your-profile fieldset textarea:focus{border:1px solid #ccc;box-shadow:inset 1px 1px 1px rgba(0,0,0,0.1);outline-color:rgba(240,255,240,0.1)}#bbpress-forums #bbp-your-profile fieldset.bbp-form input.checkbox{width:auto}#bbpress-forums #bbp-your-profile fieldset legend{display:none}#bbpress-forums #bbp-your-profile fieldset label[for]{float:left;width:150px;padding-right:20px;text-align:right;cursor:pointer}#bbpress-forums #bbp-your-profile fieldset dl label[for]{text-align:left;width:160px}#bbpress-forums #bbp-your-profile fieldset span.description{margin:5px 0 0 170px;font-size:12px;font-style:italic;float:left;clear:left;width:288px;padding:5px 10px;border:#cee1ef 1px solid;background-color:#f0f8ff}#bbpress-forums #bbp-your-profile fieldset fieldset{margin:0;border:0;padding:0;clear:none;float:none}#bbpress-forums #bbp-your-profile fieldset fieldset.password{width:260px}#bbpress-forums #bbp-your-profile fieldset fieldset.capabilities dl{margin:0}#bbpress-forums #bbp-your-profile fieldset fieldset.password span.description{margin-left:0;margin-bottom:20px}#bbpress-forums #bbp-your-profile fieldset.submit button{float:right}div.bbp-template-notice,div.indicator-hint{border-width:1px;border-style:solid;padding:0 .6em;margin:5px 0 15px;border-radius:3px;background-color:#ffffe0;border-color:#e6db55;color:#000;clear:both}div.bbp-template-notice a{color:#555;text-decoration:none}div.bbp-template-notice a:hover{color:#000}div.bbp-template-notice.info{border:#cee1ef 1px solid;background-color:#f0f8ff}div.bbp-template-notice.important{border:#e6db55 1px solid;background-color:#fffbcc}div.bbp-template-notice.error,div.bbp-template-notice.warning{background-color:#ffebe8;border-color:#c00}div.bbp-template-notice.error a,div.bbp-template-notice.warning a{color:#c00}div.bbp-template-notice p{margin:.5em 0 6px 0!important;padding:2px;font-size:12px;line-height:140%}.bbp-topics-front ul.super-sticky,.bbp-topics ul.super-sticky,.bbp-topics ul.sticky,.bbp-forum-content ul.sticky{background-color:#ffffe0!important;font-size:1.1em}#bbpress-forums .bbp-topic-revision-log,#bbpress-forums .bbp-reply-revision-log{border-top:1px dotted #ddd;list-style:none;width:100%;margin:0;padding:8px 0 0 0;font-size:11px;color:#aaa}.bbp-login-form fieldset legend{display:none}.bbp-login-form .bbp-username input,.bbp-login-form .bbp-email input,.bbp-login-form .bbp-password input{padding:5px}.bbp-login-form label{width:140px;display:inline-block}#sidebar .bbp-login-form label{width:70px}.bbp-login-form .bbp-username,.bbp-login-form .bbp-email,.bbp-login-form .bbp-password,.bbp-login-form .bbp-remember-me,.bbp-login-form .bbp-submit-wrapper{margin-top:10px}.bbp-login-form .bbp-submit-wrapper{text-align:right}.bbp-login-form .bbp-login-links a{float:left;clear:left}.bbp-logged-in img.avatar{float:left;margin:0 15px 0 0}.bbp-logged-in h4{font-weight:bold;font-size:1.3em;clear:none;margin-bottom:10px}#bbpress-forums p.bbp-topic-meta img.avatar,#bbpress-forums ul.bbp-reply-revision-log img.avatar,#bbpress-forums ul.bbp-topic-revision-log img.avatar,#bbpress-forums div.bbp-template-notice img.avatar,#bbpress-forums .widget_display_topics img.avatar,#bbpress-forums .widget_display_replies img.avatar,#bbpress-forums p.bbp-topic-meta img.avatar{float:none;margin-bottom:-7px;border:3px double #ddd}fieldset div.avatar{float:right}.activity-list li.bbp_topic_create .activity-content .activity-inner,.activity-list li.bbp_reply_create .activity-content .activity-inner{border-left:2px solid #eaeaea;margin-left:5px;padding-left:10px}#bbpress-forums h1{clear:none;font-size:1.8em;line-height:1em;padding-bottom:10px}#bbpress-forums h2.entry-title{font-size:1.4em;margin:0;padding-bottom:10px;padding-top:0}#bbpress-forums #bbp-single-user-details{display:inline-block;margin:0;width:150px;vertical-align:top;overflow:hidden}#bbpress-forums #bbp-single-user-details #bbp-user-avatar{margin:0;width:150px}#bbpress-forums #bbp-single-user-details #bbp-user-avatar img.avatar{border:0;height:150px;padding:0;margin:0 0 20px 0;width:150px}#bbpress-forums #bbp-single-user-details #bbp-user-description{float:none;margin-left:180px}#bbpress-forums #bbp-single-user-details #bbp-user-navigation{float:none;margin:0}#bbpress-forums #bbp-single-user-details #bbp-user-navigation li{margin:0}#bbpress-forums #bbp-single-user-details #bbp-user-navigation a{padding:5px 8px;display:block;border:1px solid transparent;text-decoration:none}#bbpress-forums #bbp-single-user-details #bbp-user-navigation li.current a{background:#eee;opacity:.8}#bbpress-forums #bbp-user-body{display:inline-block;vertical-align:top;margin:0 0 0 30px;width:80%}body.my-account #bbpress-forums{border-top:0;padding-top:0;margin-bottom:0}#bbpress-forums dl.bbp-user-capabilities{display:inline-block;vertical-align:top}#bbpress-forums dl.bbp-user-capabilities dt{margin:0 0 10px;text-transform:capitalize}#bbpress-forums dl.bbp-user-capabilities dd{margin:0;padding:0}#bbpress-forums div.row-actions{font-size:11px;visibility:hidden}#bbpress-forums li:hover>div.row-actions{visibility:visible}
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/archive-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * bbPress - Forum Archive
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="forum-front" class="bbp-forum-front">
+		<h1 class="entry-title"><?php bbp_forum_archive_title(); ?></h1>
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'archive-forum' ); ?>
+
+		</div>
+	</div><!-- #forum-front -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/archive-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * bbPress - Topic Archive
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="topic-front" class="bbp-topics-front">
+		<h1 class="entry-title"><?php bbp_topic_archive_title(); ?></h1>
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'archive-topic' ); ?>
+
+		</div>
+	</div><!-- #topics-front -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-create-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Template Name: bbPress - Create Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-new-topic" class="bbp-new-topic">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<?php bbp_get_template_part( 'form', 'topic' ); ?>
+
+			</div>
+		</div><!-- #bbp-new-topic -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-forum-statistics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,123 @@
+<?php
+
+/**
+ * Template Name: bbPress - Statistics
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+// Get the statistics and extract them for later use in this template
+// @todo - remove variable references
+extract( bbp_get_statistics(), EXTR_SKIP );
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-statistics" class="bbp-statistics">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php get_the_content() ? the_content() : _e( '<p>Here are the statistics and popular topics of our forums.</p>', 'bbpress' ); ?>
+
+				<div id="bbpress-forums">
+
+					<dl role="main">
+
+						<?php do_action( 'bbp_before_statistics' ); ?>
+
+						<dt><?php _e( 'Registered Users', 'bbpress' ); ?></dt>
+						<dd>
+							<strong><?php echo $user_count; ?></strong>
+						</dd>
+
+						<dt><?php _e( 'Forums', 'bbpress' ); ?></dt>
+						<dd>
+							<strong><?php echo $forum_count; ?></strong>
+						</dd>
+
+						<dt><?php _e( 'Topics', 'bbpress' ); ?></dt>
+						<dd>
+							<strong><?php echo $topic_count; ?></strong>
+						</dd>
+
+						<dt><?php _e( 'Replies', 'bbpress' ); ?></dt>
+						<dd>
+							<strong><?php echo $reply_count; ?></strong>
+						</dd>
+
+						<dt><?php _e( 'Topic Tags', 'bbpress' ); ?></dt>
+						<dd>
+							<strong><?php echo $topic_tag_count; ?></strong>
+						</dd>
+
+						<?php if ( !empty( $empty_topic_tag_count ) ) : ?>
+
+							<dt><?php _e( 'Empty Topic Tags', 'bbpress' ); ?></dt>
+							<dd>
+								<strong><?php echo $empty_topic_tag_count; ?></strong>
+							</dd>
+
+						<?php endif; ?>
+
+						<?php if ( !empty( $topic_count_hidden ) ) : ?>
+
+							<dt><?php _e( 'Hidden Topics', 'bbpress' ); ?></dt>
+							<dd>
+								<strong>
+									<abbr title="<?php echo esc_attr( $hidden_topic_title ); ?>"><?php echo $topic_count_hidden; ?></abbr>
+								</strong>
+							</dd>
+
+						<?php endif; ?>
+
+						<?php if ( !empty( $reply_count_hidden ) ) : ?>
+
+							<dt><?php _e( 'Hidden Replies', 'bbpress' ); ?></dt>
+							<dd>
+								<strong>
+									<abbr title="<?php echo esc_attr( $hidden_reply_title ); ?>"><?php echo $reply_count_hidden; ?></abbr>
+								</strong>
+							</dd>
+
+						<?php endif; ?>
+
+						<?php do_action( 'bbp_after_statistics' ); ?>
+
+					</dl>
+
+					<?php do_action( 'bbp_before_popular_topics' ); ?>
+
+					<?php bbp_set_query_name( 'bbp_popular_topics' ); ?>
+
+					<?php if ( bbp_has_topics( array( 'meta_key' => '_bbp_reply_count', 'posts_per_page' => 15, 'max_num_pages' => 1, 'orderby' => 'meta_value_num', 'show_stickies' => false ) ) ) : ?>
+
+						<h2 class="entry-title"><?php _e( 'Popular Topics', 'bbpress' ); ?></h2>
+
+						<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+						<?php bbp_get_template_part( 'loop',       'topics' ); ?>
+
+						<?php bbp_get_template_part( 'pagination', 'topics' ); ?>
+
+					<?php endif; ?>
+
+					<?php bbp_reset_query_name(); ?>
+
+					<?php do_action( 'bbp_after_popular_topics' ); ?>
+
+				</div>
+			</div>
+		</div><!-- #bbp-statistics -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-front-forums.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Template Name: bbPress - Forums (Index)
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="forum-front" class="bbp-forum-front">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<?php bbp_get_template_part( 'content', 'archive-forum' ); ?>
+
+			</div>
+		</div><!-- #forum-front -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-front-topics.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,34 @@
+<?php
+
+/**
+ * Template Name: bbPress - Topics (Newest)
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="topics-front" class="bbp-topics-front">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<?php bbp_get_template_part( 'content', 'archive-topic' ); ?>
+
+			</div>
+		</div><!-- #topics-front -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-topic-tags.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,42 @@
+<?php
+
+/**
+ * Template Name: bbPress - Topic Tags
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-topic-tags" class="bbp-topic-tags">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php get_the_content() ? the_content() : _e( '<p>This is a collection of tags that are currently popular on our forums.</p>', 'bbpress' ); ?>
+
+				<div id="bbpress-forums">
+
+					<?php bbp_breadcrumb(); ?>
+
+					<div id="bbp-topic-hot-tags">
+
+						<?php wp_tag_cloud( array( 'smallest' => 9, 'largest' => 38, 'number' => 80, 'taxonomy' => bbp_get_topic_tag_tax_id() ) ); ?>
+
+					</div>
+				</div>
+			</div>
+		</div><!-- #bbp-topic-tags -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-topics-no-replies.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,55 @@
+<?php
+
+/**
+ * Template Name: bbPress - Topics (No Replies)
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="topics-front" class="bbp-topics-front">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<div id="bbpress-forums">
+
+					<?php bbp_breadcrumb(); ?>
+
+					<?php bbp_set_query_name( 'bbp_no_replies' ); ?>
+
+					<?php if ( bbp_has_topics( array( 'meta_key' => '_bbp_reply_count', 'meta_value' => '1', 'meta_compare' => '<', 'orderby' => 'date', 'show_stickies' => false ) ) ) : ?>
+
+						<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+						<?php bbp_get_template_part( 'loop',       'topics'    ); ?>
+
+						<?php bbp_get_template_part( 'pagination', 'topics'    ); ?>
+
+					<?php else : ?>
+
+						<?php bbp_get_template_part( 'feedback',   'no-topics' ); ?>
+
+					<?php endif; ?>
+
+					<?php bbp_reset_query_name(); ?>
+
+				</div>
+			</div>
+		</div><!-- #topics-front -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-user-login.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Template Name: bbPress - User Login
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+// No logged in users
+bbp_logged_in_redirect();
+
+// Begin Template
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-login" class="bbp-login">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<div id="bbpress-forums">
+
+					<?php bbp_breadcrumb(); ?>
+
+					<?php bbp_get_template_part( 'form', 'user-login' ); ?>
+
+				</div>
+			</div>
+		</div><!-- #bbp-login -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-user-lost-pass.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Template Name: bbPress - User Lost Password
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+// No logged in users
+bbp_logged_in_redirect();
+
+// Begin Template
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-lost-pass" class="bbp-lost-pass">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<div id="bbpress-forums">
+
+					<?php bbp_breadcrumb(); ?>
+
+					<?php bbp_get_template_part( 'form', 'user-lost-pass' ); ?>
+
+				</div>
+			</div>
+		</div><!-- #bbp-lost-pass -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/page-user-register.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,43 @@
+<?php
+
+/**
+ * Template Name: bbPress - User Register
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+// No logged in users
+bbp_logged_in_redirect();
+
+// Begin Template
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-register" class="bbp-register">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php the_content(); ?>
+
+				<div id="bbpress-forums">
+
+					<?php bbp_breadcrumb(); ?>
+
+					<?php bbp_get_template_part( 'form', 'user-register' ); ?>
+
+				</div>
+			</div>
+		</div><!-- #bbp-register -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-forum-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Edit handler for forums
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-edit-page" class="bbp-edit-page">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php bbp_get_template_part( 'form', 'forum' ); ?>
+
+			</div>
+		</div><!-- #bbp-edit-page -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-forum.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Single Forum
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<?php if ( bbp_user_can_view_forum() ) : ?>
+
+			<div id="forum-<?php bbp_forum_id(); ?>" class="bbp-forum-content">
+				<h1 class="entry-title"><?php bbp_forum_title(); ?></h1>
+				<div class="entry-content">
+
+					<?php bbp_get_template_part( 'content', 'single-forum' ); ?>
+
+				</div>
+			</div><!-- #forum-<?php bbp_forum_id(); ?> -->
+
+		<?php else : // Forum exists, user no access ?>
+
+			<?php bbp_get_template_part( 'feedback', 'no-access' ); ?>
+
+		<?php endif; ?>
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-reply-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Edit handler for replies
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-edit-page" class="bbp-edit-page">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php bbp_get_template_part( 'form', 'reply' ); ?>
+
+			</div>
+		</div><!-- #bbp-edit-page -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-reply.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Single Reply
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php if ( bbp_user_can_view_forum( array( 'forum_id' => bbp_get_reply_forum_id() ) ) ) : ?>
+
+		<?php while ( have_posts() ) : the_post(); ?>
+
+			<div id="bbp-reply-wrapper-<?php bbp_reply_id(); ?>" class="bbp-reply-wrapper">
+				<h1 class="entry-title"><?php bbp_reply_title(); ?></h1>
+				<div class="entry-content">
+
+					<?php bbp_get_template_part( 'content', 'single-reply' ); ?>
+
+				</div><!-- .entry-content -->
+			</div><!-- #bbp-reply-wrapper-<?php bbp_reply_id(); ?> -->
+
+		<?php endwhile; ?>
+
+	<?php elseif ( bbp_is_forum_private( bbp_get_reply_forum_id(), false ) ) : ?>
+
+		<?php bbp_get_template_part( 'feedback', 'no-access' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-topic-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,30 @@
+<?php
+
+/**
+ * Edit handler for topics
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-edit-page" class="bbp-edit-page">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php bbp_get_template_part( 'form', 'topic' ); ?>
+
+			</div>
+		</div><!-- #bbp-edit-page -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-topic-merge.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Merge topic page
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-edit-page" class="bbp-edit-page">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php bbp_get_template_part( 'form', 'topic-merge' ); ?>
+
+			</div>
+		</div><!-- #bbp-edit-page -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-topic-split.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,32 @@
+<?php
+
+/**
+ * Split topic page
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php while ( have_posts() ) : the_post(); ?>
+
+		<div id="bbp-edit-page" class="bbp-edit-page">
+			<h1 class="entry-title"><?php the_title(); ?></h1>
+			<div class="entry-content">
+
+				<?php bbp_get_template_part( 'form', 'topic-split' ); ?>
+
+			</div>
+		</div><!-- #bbp-edit-page -->
+
+	<?php endwhile; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-topic.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,40 @@
+<?php
+
+/**
+ * Single Topic
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<?php if ( bbp_user_can_view_forum( array( 'forum_id' => bbp_get_topic_forum_id() ) ) ) : ?>
+
+		<?php while ( have_posts() ) : the_post(); ?>
+
+			<div id="bbp-topic-wrapper-<?php bbp_topic_id(); ?>" class="bbp-topic-wrapper">
+				<h1 class="entry-title"><?php bbp_topic_title(); ?></h1>
+				<div class="entry-content">
+
+					<?php bbp_get_template_part( 'content', 'single-topic' ); ?>
+
+				</div>
+			</div><!-- #bbp-topic-wrapper-<?php bbp_topic_id(); ?> -->
+
+		<?php endwhile; ?>
+
+	<?php elseif ( bbp_is_forum_private( bbp_get_topic_forum_id(), false ) ) : ?>
+
+		<?php bbp_get_template_part( 'feedback', 'no-access' ); ?>
+
+	<?php endif; ?>
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-user-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * bbPress User Profile Edit
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<div id="bbp-user-<?php bbp_current_user_id(); ?>" class="bbp-single-user">
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'single-user' ); ?>
+
+		</div><!-- .entry-content -->
+	</div><!-- #bbp-user-<?php bbp_current_user_id(); ?> -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-user.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,25 @@
+<?php
+
+/**
+ * User Profile
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<div id="bbp-user-<?php bbp_current_user_id(); ?>" class="bbp-single-user">
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'single-user' ); ?>
+
+		</div><!-- .entry-content -->
+	</div><!-- #bbp-user-<?php bbp_current_user_id(); ?> -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/single-view.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Single View
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="bbp-view-<?php bbp_view_id(); ?>" class="bbp-view">
+		<h1 class="entry-title"><?php bbp_view_title(); ?></h1>
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'single-view' ); ?>
+
+		</div>
+	</div><!-- #bbp-view-<?php bbp_view_id(); ?> -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/taxonomy-topic-tag-edit.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,29 @@
+<?php
+
+/**
+ * Topic Tag Edit
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="topic-tag" class="bbp-topic-tag">
+		<h1 class="entry-title"><?php printf( __( 'Topic Tag: %s', 'bbpress' ), '<span>' . bbp_get_topic_tag_name() . '</span>' ); ?></h1>
+
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'topic-tag-edit' ); ?>
+
+		</div>
+	</div><!-- #topic-tag -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/extras/taxonomy-topic-tag.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,28 @@
+<?php
+
+/**
+ * Topic Tag
+ *
+ * @package bbPress
+ * @subpackage Theme
+ */
+
+get_header(); ?>
+
+	<?php do_action( 'bbp_before_main_content' ); ?>
+
+	<?php do_action( 'bbp_template_notices' ); ?>
+
+	<div id="topic-tag" class="bbp-topic-tag">
+		<h1 class="entry-title"><?php printf( __( 'Topic Tag: %s', 'bbpress' ), '<span>' . bbp_get_topic_tag_name() . '</span>' ); ?></h1>
+		<div class="entry-content">
+
+			<?php bbp_get_template_part( 'content', 'archive-topic' ); ?>
+
+		</div>
+	</div><!-- #topic-tag -->
+
+	<?php do_action( 'bbp_after_main_content' ); ?>
+
+<?php get_sidebar(); ?>
+<?php get_footer(); ?>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/js/topic.js	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,87 @@
+bbpTopicJS = jQuery.extend( {
+	// User and Topic
+	currentUserId: '0',
+	topicId: '0',
+
+	// Favorites
+	favoritesLink: '',
+	favoritesActive: 0,
+	isFav: 0,
+	favLinkYes: 'favorites',
+	favLinkNo: '?',
+	favYes: 'This topic is one of your %favLinkYes% [%favDel%]',
+	favNo: '%favAdd% (%favLinkNo%)',
+	favDel: 'x',
+	favAdd: 'Add this topic to your favorites',
+
+	// Subscriptions
+	subsLink: '',
+	subsActive: 0,
+	isSubscribed: 0,
+	subsSub: 'Subscribe',
+	subsUns: 'Unsubscribe'
+}, bbpTopicJS );
+
+// Topic Global
+bbpTopicJS.favoritesActive = parseInt( bbpTopicJS.favoritesActive );
+bbpTopicJS.isFav           = parseInt( bbpTopicJS.isFav );
+bbpTopicJS.subsActive      = parseInt( bbpTopicJS.subsActive );
+bbpTopicJS.isSubscribed    = parseInt( bbpTopicJS.isSubscribed );
+
+// Run it
+jQuery(document).ready( function() {
+
+	/** Favorites *************************************************************/
+
+	if ( 1 == bbpTopicJS.favoritesActive ) {
+		var favoritesToggle = jQuery( '#favorite-toggle' )
+			.addClass( 'list:favorite' )
+			.wpList( { alt: '', dimAfter: favLinkSetup } );
+
+		var favoritesToggleSpan = favoritesToggle.children( 'span' )
+			[bbpTopicJS.isFav ? 'addClass' : 'removeClass' ]( 'is-favorite' );
+	}
+
+	function favLinkSetup() {
+		bbpTopicJS.isFav = favoritesToggleSpan.is( '.is-favorite' );
+		var aLink = "<a href='" + bbpTopicJS.favoritesLink + "'>";
+		var aDim  = "<a href='" + favoritesToggleSpan.find( 'a[class^="dim:"]' ).attr( 'href' ) + "' class='dim:favorite-toggle:" + favoritesToggleSpan.attr( 'id' ) + ":is-favorite'>";
+		if ( bbpTopicJS.isFav ) {
+			html = bbpTopicJS.favYes
+				.replace( /%favLinkYes%/, aLink + bbpTopicJS.favLinkYes + "</a>" )
+				.replace( /%favDel%/, aDim + bbpTopicJS.favDel + "</a>" );
+		} else {
+			html = bbpTopicJS.favNo
+				.replace( /%favLinkNo%/, aLink + bbpTopicJS.favLinkNo + "</a>" )
+				.replace( /%favAdd%/, aDim + bbpTopicJS.favAdd + "</a>" );
+		}
+		favoritesToggleSpan.html( html );
+		favoritesToggle.get(0).wpList.process( favoritesToggle );
+	}
+
+	/** Subscriptions *********************************************************/
+
+	if ( 1 == bbpTopicJS.subsActive ) {
+		var subscriptionToggle = jQuery( '#subscription-toggle' )
+			.addClass( 'list:subscription' )
+			.wpList( { alt: '', dimAfter: subsLinkSetup } );
+
+		var subscriptionToggleSpan = subscriptionToggle.children( 'span' )
+			[bbpTopicJS.isSubscribed ? 'addClass' : 'removeClass' ]( 'is-subscribed' );
+	}
+
+	function subsLinkSetup() {
+		bbpTopicJS.isSubscribed = subscriptionToggleSpan.is( '.is-subscribed' );
+		var aLink = "<a href='" + bbpTopicJS.subsLink + "'>";
+		var aDim  = "<a href='" + subscriptionToggleSpan.find( 'a[class^="dim:"]' ).attr( 'href' ) + "' class='dim:subscription-toggle:" + subscriptionToggleSpan.attr( 'id' ) + ":is-subscribed'>";
+
+		if ( bbpTopicJS.isSubscribed ) {
+			html = aDim + bbpTopicJS.subsUns + '</a>';
+		} else {
+			html = aDim + bbpTopicJS.subsSub + '</a>';
+		}
+
+		subscriptionToggleSpan.html( html );
+		subscriptionToggle.get(0).wpList.process( subscriptionToggle );
+	}
+} );
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/default/js/topic.min.js	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1 @@
+bbpTopicJS=jQuery.extend({currentUserId:"0",topicId:"0",favoritesLink:"",favoritesActive:0,isFav:0,favLinkYes:"favorites",favLinkNo:"?",favYes:"This topic is one of your %favLinkYes% [%favDel%]",favNo:"%favAdd% (%favLinkNo%)",favDel:"x",favAdd:"Add this topic to your favorites",subsLink:"",subsActive:0,isSubscribed:0,subsSub:"Subscribe",subsUns:"Unsubscribe"},bbpTopicJS);bbpTopicJS.favoritesActive=parseInt(bbpTopicJS.favoritesActive);bbpTopicJS.isFav=parseInt(bbpTopicJS.isFav);bbpTopicJS.subsActive=parseInt(bbpTopicJS.subsActive);bbpTopicJS.isSubscribed=parseInt(bbpTopicJS.isSubscribed);jQuery(document).ready(function(){if(1==bbpTopicJS.favoritesActive){var e=jQuery("#favorite-toggle").addClass("list:favorite").wpList({alt:"",dimAfter:d});var f=e.children("span")[bbpTopicJS.isFav?"addClass":"removeClass"]("is-favorite")}function d(){bbpTopicJS.isFav=f.is(".is-favorite");var g="<a href='"+bbpTopicJS.favoritesLink+"'>";var h="<a href='"+f.find('a[class^="dim:"]').attr("href")+"' class='dim:favorite-toggle:"+f.attr("id")+":is-favorite'>";if(bbpTopicJS.isFav){html=bbpTopicJS.favYes.replace(/%favLinkYes%/,g+bbpTopicJS.favLinkYes+"</a>").replace(/%favDel%/,h+bbpTopicJS.favDel+"</a>")}else{html=bbpTopicJS.favNo.replace(/%favLinkNo%/,g+bbpTopicJS.favLinkNo+"</a>").replace(/%favAdd%/,h+bbpTopicJS.favAdd+"</a>")}f.html(html);e.get(0).wpList.process(e)}if(1==bbpTopicJS.subsActive){var b=jQuery("#subscription-toggle").addClass("list:subscription").wpList({alt:"",dimAfter:c});var a=b.children("span")[bbpTopicJS.isSubscribed?"addClass":"removeClass"]("is-subscribed")}function c(){bbpTopicJS.isSubscribed=a.is(".is-subscribed");var g="<a href='"+bbpTopicJS.subsLink+"'>";var h="<a href='"+a.find('a[class^="dim:"]').attr("href")+"' class='dim:subscription-toggle:"+a.attr("id")+":is-subscribed'>";if(bbpTopicJS.isSubscribed){html=h+bbpTopicJS.subsUns+"</a>"}else{html=h+bbpTopicJS.subsSub+"</a>"}a.html(html);b.get(0).wpList.process(b)}});
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/bbpress/templates/index.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,7 @@
+<?php
+
+/**
+ * Do not put custom themes here. They will be deleted on bbPress updates.
+ *
+ * Keep custom bbPress themes in /wp-content/themes/
+ */
--- a/web/wp-content/plugins/pik-slider/pik-slider.php	Mon Dec 03 16:30:36 2012 -0800
+++ b/web/wp-content/plugins/pik-slider/pik-slider.php	Tue Dec 04 18:43:10 2012 -0800
@@ -22,14 +22,14 @@
 	$labels = array(
 		'name'=>'Slide',
 		'singular_name'=>'Slide',
-		'add_new'=>'Ajouter',
-		'add_new_item'=>'Ajouter item',
-		'edit_item'=>'Editer',
+		'add_new'=>'Ajouter une slide',
+		'add_new_item'=>'Ajouter une slide',
+		'edit_item'=>'Editer unde slide',
 		'new_item'=>'Nouveau',
-		'view_item'=>'Voir',
-		'search_items'=>'Rechercher',
+		'view_item'=>'Voir la slide',
+		'search_items'=>'Rechercher une slide',
 		'not_found'=>'Aucun slide',
-		'not_found_in_trash'=>'Aucun slide dans la corbeille',
+		'not_found_in_trash'=>'Aucune slide dans la corbeille',
 		'parent_item_colon'=>'',
 		'menu_name'=>'Slides'
 	);
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/LICENSE.txt	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,280 @@
+		    GNU GENERAL PUBLIC LICENSE
+		       Version 2, June 1991
+
+ Copyright (C) 1989, 1991 Free Software Foundation, Inc.
+ 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA
+
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+			    Preamble
+
+  The licenses for most software are designed to take away your
+freedom to share and change it.  By contrast, the GNU General Public
+License is intended to guarantee your freedom to share and change free
+software--to make sure the software is free for all its users.  This
+General Public License applies to most of the Free Software
+Foundation's software and to any other program whose authors commit to
+using it.  (Some other Free Software Foundation software is covered by
+the GNU Library General Public License instead.)  You can apply it to
+your programs, too.
+
+  When we speak of free software, we are referring to freedom, not
+price.  Our General Public Licenses are designed to make sure that you
+have the freedom to distribute copies of free software (and charge for
+this service if you wish), that you receive source code or can get it
+if you want it, that you can change the software or use pieces of it
+in new free programs; and that you know you can do these things.
+
+  To protect your rights, we need to make restrictions that forbid
+anyone to deny you these rights or to ask you to surrender the rights.
+These restrictions translate to certain responsibilities for you if you
+distribute copies of the software, or if you modify it.
+
+  For example, if you distribute copies of such a program, whether
+gratis or for a fee, you must give the recipients all the rights that
+you have.  You must make sure that they, too, receive or can get the
+source code.  And you must show them these terms so they know their
+rights.
+
+  We protect your rights with two steps: (1) copyright the software, and
+(2) offer you this license which gives you legal permission to copy,
+distribute and/or modify the software.
+
+  Also, for each author's protection and ours, we want to make certain
+that everyone understands that there is no warranty for this free
+software.  If the software is modified by someone else and passed on, we
+want its recipients to know that what they have is not the original, so
+that any problems introduced by others will not reflect on the original
+authors' reputations.
+
+  Finally, any free program is threatened constantly by software
+patents.  We wish to avoid the danger that redistributors of a free
+program will individually obtain patent licenses, in effect making the
+program proprietary.  To prevent this, we have made it clear that any
+patent must be licensed for everyone's free use or not licensed at all.
+
+  The precise terms and conditions for copying, distribution and
+modification follow.
+
+		    GNU GENERAL PUBLIC LICENSE
+   TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+  0. This License applies to any program or other work which contains
+a notice placed by the copyright holder saying it may be distributed
+under the terms of this General Public License.  The "Program", below,
+refers to any such program or work, and a "work based on the Program"
+means either the Program or any derivative work under copyright law:
+that is to say, a work containing the Program or a portion of it,
+either verbatim or with modifications and/or translated into another
+language.  (Hereinafter, translation is included without limitation in
+the term "modification".)  Each licensee is addressed as "you".
+
+Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope.  The act of
+running the Program is not restricted, and the output from the Program
+is covered only if its contents constitute a work based on the
+Program (independent of having been made by running the Program).
+Whether that is true depends on what the Program does.
+
+  1. You may copy and distribute verbatim copies of the Program's
+source code as you receive it, in any medium, provided that you
+conspicuously and appropriately publish on each copy an appropriate
+copyright notice and disclaimer of warranty; keep intact all the
+notices that refer to this License and to the absence of any warranty;
+and give any other recipients of the Program a copy of this License
+along with the Program.
+
+You may charge a fee for the physical act of transferring a copy, and
+you may at your option offer warranty protection in exchange for a fee.
+
+  2. You may modify your copy or copies of the Program or any portion
+of it, thus forming a work based on the Program, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+    a) You must cause the modified files to carry prominent notices
+    stating that you changed the files and the date of any change.
+
+    b) You must cause any work that you distribute or publish, that in
+    whole or in part contains or is derived from the Program or any
+    part thereof, to be licensed as a whole at no charge to all third
+    parties under the terms of this License.
+
+    c) If the modified program normally reads commands interactively
+    when run, you must cause it, when started running for such
+    interactive use in the most ordinary way, to print or display an
+    announcement including an appropriate copyright notice and a
+    notice that there is no warranty (or else, saying that you provide
+    a warranty) and that users may redistribute the program under
+    these conditions, and telling the user how to view a copy of this
+    License.  (Exception: if the Program itself is interactive but
+    does not normally print such an announcement, your work based on
+    the Program is not required to print an announcement.)
+
+These requirements apply to the modified work as a whole.  If
+identifiable sections of that work are not derived from the Program,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works.  But when you
+distribute the same sections as part of a whole which is a work based
+on the Program, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote it.
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Program.
+
+In addition, mere aggregation of another work not based on the Program
+with the Program (or with a work based on the Program) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+  3. You may copy and distribute the Program (or a work based on it,
+under Section 2) in object code or executable form under the terms of
+Sections 1 and 2 above provided that you also do one of the following:
+
+    a) Accompany it with the complete corresponding machine-readable
+    source code, which must be distributed under the terms of Sections
+    1 and 2 above on a medium customarily used for software interchange; or,
+
+    b) Accompany it with a written offer, valid for at least three
+    years, to give any third party, for a charge no more than your
+    cost of physically performing source distribution, a complete
+    machine-readable copy of the corresponding source code, to be
+    distributed under the terms of Sections 1 and 2 above on a medium
+    customarily used for software interchange; or,
+
+    c) Accompany it with the information you received as to the offer
+    to distribute corresponding source code.  (This alternative is
+    allowed only for noncommercial distribution and only if you
+    received the program in object code or executable form with such
+    an offer, in accord with Subsection b above.)
+
+The source code for a work means the preferred form of the work for
+making modifications to it.  For an executable work, complete source
+code means all the source code for all modules it contains, plus any
+associated interface definition files, plus the scripts used to
+control compilation and installation of the executable.  However, as a
+special exception, the source code distributed need not include
+anything that is normally distributed (in either source or binary
+form) with the major components (compiler, kernel, and so on) of the
+operating system on which the executable runs, unless that component
+itself accompanies the executable.
+
+If distribution of executable or object code is made by offering
+access to copy from a designated place, then offering equivalent
+access to copy the source code from the same place counts as
+distribution of the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+  4. You may not copy, modify, sublicense, or distribute the Program
+except as expressly provided under this License.  Any attempt
+otherwise to copy, modify, sublicense or distribute the Program is
+void, and will automatically terminate your rights under this License.
+However, parties who have received copies, or rights, from you under
+this License will not have their licenses terminated so long as such
+parties remain in full compliance.
+
+  5. You are not required to accept this License, since you have not
+signed it.  However, nothing else grants you permission to modify or
+distribute the Program or its derivative works.  These actions are
+prohibited by law if you do not accept this License.  Therefore, by
+modifying or distributing the Program (or any work based on the
+Program), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Program or works based on it.
+
+  6. Each time you redistribute the Program (or any work based on the
+Program), the recipient automatically receives a license from the
+original licensor to copy, distribute or modify the Program subject to
+these terms and conditions.  You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties to
+this License.
+
+  7. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License.  If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Program at all.  For example, if a patent
+license would not permit royalty-free redistribution of the Program by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Program.
+
+If any portion of this section is held invalid or unenforceable under
+any particular circumstance, the balance of the section is intended to
+apply and the section as a whole is intended to apply in other
+circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system, which is
+implemented by public license practices.  Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+  8. If the distribution and/or use of the Program is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Program under this License
+may add an explicit geographical distribution limitation excluding
+those countries, so that distribution is permitted only in or among
+countries not thus excluded.  In such case, this License incorporates
+the limitation as if written in the body of this License.
+
+  9. The Free Software Foundation may publish revised and/or new versions
+of the General Public License from time to time.  Such new versions will
+be similar in spirit to the present version, but may differ in detail to
+address new problems or concerns.
+
+Each version is given a distinguishing version number.  If the Program
+specifies a version number of this License which applies to it and "any
+later version", you have the option of following the terms and conditions
+either of that version or of any later version published by the Free
+Software Foundation.  If the Program does not specify a version number of
+this License, you may choose any version ever published by the Free Software
+Foundation.
+
+  10. If you wish to incorporate parts of the Program into other free
+programs whose distribution conditions are different, write to the author
+to ask for permission.  For software which is copyrighted by the Free
+Software Foundation, write to the Free Software Foundation; we sometimes
+make exceptions for this.  Our decision will be guided by the two goals
+of preserving the free status of all derivatives of our free software and
+of promoting the sharing and reuse of software generally.
+
+			    NO WARRANTY
+
+  11. BECAUSE THE PROGRAM IS LICENSED FREE OF CHARGE, THERE IS NO WARRANTY
+FOR THE PROGRAM, TO THE EXTENT PERMITTED BY APPLICABLE LAW.  EXCEPT WHEN
+OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR OTHER PARTIES
+PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED
+OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.  THE ENTIRE RISK AS
+TO THE QUALITY AND PERFORMANCE OF THE PROGRAM IS WITH YOU.  SHOULD THE
+PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF ALL NECESSARY SERVICING,
+REPAIR OR CORRECTION.
+
+  12. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
+WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY AND/OR
+REDISTRIBUTE THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES,
+INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING
+OUT OF THE USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED
+TO LOSS OF DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY
+YOU OR THIRD PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER
+PROGRAMS), EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE
+POSSIBILITY OF SUCH DAMAGES.
+
+		     END OF TERMS AND CONDITIONS
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/README.txt	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,335 @@
+=== Social ===
+Contributors: crowdfavorite, alexkingorg
+Tags: comments, facebook, twitter, social, broadcast, import, integrate, integration
+Requires at least: 3.3
+Tested up to: 3.4.2
+Stable tag: 2.6
+License: GPLv2
+License URI: http://www.gnu.org/licenses/gpl-2.0.html
+
+Broadcast posts to Twitter and/or Facebook, pull in reactions from each (replies, retweets, comments, "likes") as comments, and allow commenters to log in with their Twitter/Facebook identities.
+
+== Description ==
+
+Brought to you by [MailChimp](http://mailchimp.com/), [Social](http://mailchimp.com/social-plugin-for-wordpress/) is a lightweight plugin that handles a lot of the heavy lifting of making your blog seamlessly integrate with social networking sites [Twitter](http://twitter.com/) and [Facebook](http://facebook.com/).
+
+**Broadcast Published Posts**
+
+Through use of a proxy application, you can associate your Twitter and Facebook accounts with your blog and its users. Once you publish a new post, you can then choose to automatically broadcast a message to any accounts authenticated with the overall blog or your current logged-in user.
+
+- Automatically broadcast posts to Twitter and/or Facebook
+- Supports multiple accounts associated per user and per blog
+- Customize the broadcast message using tokens
+
+**Pull in Tweets and Replies as Comments**
+
+When publishing to Facebook and Twitter, the discussion is likely to continue there. Through Social, we can aggregate the various mentions, retweets, @replies, comments and responses and republish them as WordPress comments.
+
+- Automatically polls Twitter and Facebook for mentions of your post
+- Displays mentions inline with comments
+- Filter comments by originating source (Facebook, Twitter, or your blog as comments)
+- Allow users to reply to the offsite responses
+
+**Comment as Facebook and/or Twitter Identity**
+
+Many individuals use Facebook or Twitter as their primary identity(ies) on the web. Allow your commenters to log in and leave a comment as that identity. Furthermore, they can publish their response directly to their Twitter or Facebook account.
+
+- Allow users to leave comments as Facebook or Twitter identity
+- Links point back to users' Facebook or Twitter profiles
+- Indicators let you and visitors know people are who they say they are
+
+**Developers**
+
+Please [fork, contribute and file technical bugs on GitHub](https://github.com/crowdfavorite/wp-social).
+
+== Installation ==
+
+1. Upload `social` to the `/wp-content/plugins/` directory or install it from the Plugin uploader
+2. Activate the plugin through the `Plugins` menu in the WordPress administrator dashboard
+3. Visit the settings page under `Settings > Social` to add Twitter and Facebook accounts for all authors on your site
+4. Visit your profile page under `Users > Profile` to add Twitter and Facebook accounts that only you can broadcast to
+5. Make sure your plugin or uploads directory writable to allow the cron jobs to fetch new comments from Twitter and Facebook
+
+== Frequently Asked Questions ==
+
+= Who created this plugin? =
+
+Social was conceptualized and co-designed by the fine folks at [MailChimp](http://mailchimp.com "Email Marketing from MailChimp") led by [Aarron Walter](http://aarronwalter.com/). The application proxy is maintained and hosted by [MailChimp](http://mailchimp.com) and the plugin was co-designed and developed by [Crowd Favorite](http://crowdfavorite.com/ "Custom WordPress and web development").
+
+= How can I customize the comments form in my theme? =
+
+We recommend using CSS styles to selectively change the look and feel of your comments and comment form. The classes `social-comments-[no-comments|wordpress|twitter|facebook|pingbacks]` are available as as class names. More specific classes include:
+
+- `.social-comment-header `- contains the author information, avatar, and meta information
+- `.social-comment-inner` - a wrapper for the actual comment content, allowing more freedom with comment styling.
+- `.social-comment-body` - the container for the comment content.
+- `.social-comment-collapsed` - use this hook to create a more compact version of a comment.  hide comment text, shrink the size of the avatar, etc.
+- `.social-post-form` - where the comment form controls reside.  Use this hook to customize the look of form inputs and labels.
+- `#facebook_signin` - style the link that activates Facebook oAuthorization
+- `#twitter_signin` - style the link that activates Facebook oAuthorization
+- `.social-quiet` - a muted typography style, for subdued display of text
+- `.bypostauthor` - a class added to the comment thread to style comments from the author of the post
+
+The icons used for the plugin are currently 16x16 pixels, and reside in a vertical sprite with each icon at 100px intervals.  Adhering to these intervals will ensure that icon positions will not need to change
+
+Note: we do not recommend making changes to the included plugin files as they may be overwritten during an upgrade.
+
+= Can I define a custom comments.php for Social? =
+
+Yes, if you'd rather create more 'advanced' customizations beyond CSS tweaks simply add the following line to your theme's `functions.php` file:
+
+    define('SOCIAL_COMMENTS_FILE', STYLESHEETPATH.'/social-comments.php');
+
+Then you will need to create the `social-comments.php` file with your custom markup (perhaps copy it directly from the provided comments.php in the plugin) into your theme's directory.
+
+= How can I define custom JS and/or CSS, or disable Social's JS/CSS? =
+
+There are three constants that can be altered to your liking:
+
+1. `SOCIAL_ADMIN_CSS` - CSS file for WP-Admin.
+2. `SOCIAL_ADMIN_JS` - JS file for WP-Admin.
+3. `SOCIAL_COMMENTS_CSS` - CSS file for the comments form.
+4. `SOCIAL_COMMENTS_JS` - JS file used on the comments form and WP-Admin
+
+To define custom JS/CSS in your theme's functions.php add the following line (Replace `SOCIAL_ADMIN_CSS` with one of the
+constants listed above):
+
+    define('SOCIAL_ADMIN_CSS', STYLESHEETPATH.'/path/to/stylesheet.css');
+
+To disable Social's JS/CSS in your theme's functions.php add the following line (Replace `SOCIAL_ADMIN_CSS` With one of
+the constants defined above):
+
+    define('SOCIAL_ADMIN_CSS', false);
+
+= Why are the tabs on my comment form not displaying correctly? =
+
+Chances are your theme is missing the `<?php wp_footer(); ?>` snippet in the footer.php.
+
+= How often are comments aggregated from Facebook and Twitter? =
+
+Once a post has been broadcasted to Facebook and/or Twitter Social will attempt to aggregate comments every 2, 4, 8, 12, 24, 48, and every 24 hours after the 48 hour mark after being broadcasted. If the post was broadcasted more than 48 hours ago, and there have been no replies through Facebook and/or Twitter then aggregation for that post will stop.
+
+These are performed using cron jobs noted below.
+
+= How are comments aggregated from Facebook and Twitter? =
+
+When the aggregation process runs Social uses the Facebook and Twitter search APIs to aggregate comments to the system.
+
+For Twitter, Social first searches for retweets and mentions of the broadcasted tweet using the following API calls: /statuses/retweets/:id, /statuses/mentions. Social then stores those IDs in a collection of aggregated comments. Social then hits Twitter's search API and searches by URL for tweets that contain a link to the blog post. Social then iterates over the search results and adds them to the collection, if the tweet does not already exist in the collection.
+
+For Facebook, Social first uses the Facebook search API to find any post that has the http://example.com?p=:id, the permalink generated by get_permalink($post_id) or the short link generated by the active short link delegate at the time the post was created. These posts are then stored in a collection. Next, Social loads the comments for the broadcasted post by calling http://graph.facebook.com/:id/comments. Social then iterates over the search results and adds them to the collection, if the comment does not already exist in the collection.
+
+For both Facebook and Twitter, the final collection of tweets/comments are then added to the blog post as comments. The IDs of the tweets and comments are then stored to the database so when aggregation runs again the tweets and comments already aggregated are not duplicated.
+
+= What tweets will be seen by the Twitter search during aggregation? =
+
+Twitter converts most short URLs to longer URLs, so searches by the final URL will typically find all of the tweets you want. Social also explicitly searches by the short link for the post (using whatever short link generator or plugin was active when the post was broadcast).
+
+= What CRON jobs are built into Social? =
+
+Currently Social contains one CRON job, `cron_15`.
+
+= How can I override Social's internal CRON service with system CRON jobs? =
+
+If you want to run system CRON jobs and disable Social's built in CRON jobs then do the following:
+
+1. Go to Social's settings page.
+2. Disable Social's internal CRON mechanism by selecting "Yes" under "Disable Internal CRON Mechanism" and clicking on "Save Settings".
+3. Now you should have an API key that you'll find under "API Key" under "Disable Internal CRON Mechanism". Use this API key for the "api_key" parameter on the URL your system CRON fires.
+	- An example system CRON could run `http://example.com/?social_controller=cron&social_action=cron_15&api_key=your_api_key_here`
+
+= How can I hook into a CRON for extra functionality? =
+
+If you want to hook into a CRON for extra functionality for a service, all you have to do is add an action:
+
+    <?php add_action('social_cron_15', array('Your_Class', 'your_method')); ?>
+
+= Does the proxy application have access to my passwords now? =
+
+No, the proxy acts just like any Twitter or Facebook application. We've simply pass commands back and forth through this application so you don't have to set up your own.
+
+= If a user comments using Twitter and that user has an existing local WordPress account, can they add the twitter account to the existing WordPress account? =
+
+Yes, they can add the account to their profile page.
+
+= Why are some custom posts with my blog post's URL not being found during aggregation? =
+
+This may be due to the bug with Facebook's search API. Currently, for a post to return on the search the URL must not be at the beginning of the post.
+
+Valid post that will be included:
+
+Hey, check out this post! http://example.com/?p=5
+
+Invalid post that will not included:
+
+http://example.com/?p=5 This was a cool post, go read it.
+
+Track this bug on Facebook: http://bugs.developers.facebook.net/show_bug.cgi?id=20611
+
+= Why are some of comments/posts not returning from Facebook right away? =
+
+We have noticed some latency around the inclusion of some items when querying the Graph API. We have seen some comments and posts take up to 72 hours to be included in aggregation requests.
+
+= Does your permalink have apostrophes in it? Is Social stripping these from the URL when disconnecting? =
+
+This is due to the fact that older versions of WordPress did not remove apostrophes from the permalink and newer versions of WordPress do. It is possible that your blog post was created on a version of WordPress that contained this bug. To fix this, simply login to your WP-Admin and edit the post by doing the following (assuming you're running WordPress 3.2+):
+
+1. Click on Posts in the WP-Admin menu.
+2. Find your post and click on "Edit".
+3. Under your post's title, click on the "Edit" link that is next to the permalink.
+4. Click "OK" to save the new permalink. (This will automatically remove the apostrophes for you.)
+
+= Can Social use Bit.ly, Bit.ly Pro or another URL shortener when broadcasting? =
+
+Social uses the core WordPress shortlink feature when broadcasting blog posts. Any plugin that interacts with the shortlink will also be reflected in Social's broadcasts.
+
+wp_get_shortlink Documentation: http://codex.wordpress.org/Function_Reference/wp_get_shortlink
+Bit.ly Plugin: http://wordpress.org/extend/plugins/bitly-shortlinks/
+
+When using the Bit.ly plugin, you will need to add the following to your wp-config.php to get it working:
+
+    /**
+     * Settings for Bit.ly Shortlinks Plugin
+     * http://yoast.com/wordpress/bitly-shortlinks/
+     **/
+    define('BITLY_USERNAME', '<your username>');
+    define('BITLY_APIKEY', '<your API key>');
+
+    // optional, if you want to use j.mp instead of bit.ly URL's
+    define('BITLY_JMP', true);
+
+
+= I have Apache's 401 auth enabled on my website, why is Social not working? =
+
+The proxy Social connects to requires your website to be publicly accessible to properly authorize your Facebook and Twitter accounts.
+
+= How can I be notified via email of comments left using Social? =
+
+You can install the "Subscribe to Comments Reloaded" plugin written by coolman (http://profiles.wordpress.org/users/coolmann/).
+
+Download: http://wordpress.org/extend/plugins/subscribe-to-comments-reloaded/
+
+= I occasionally receive a PHP notice of "Undefined property: WP_Http_Curl::$headers", what does this mean? =
+
+This is actually a bug in the WordPress core. This will be fixed in WordPress 3.3 according to this ticket http://core.trac.wordpress.org/ticket/18157.
+
+= Where can I update my default social broadcast accounts? =
+
+Connect your social account and after that you can add/remove your default broadcast accounts under the Social Settings Page and from your user profile page (Users/Your Profile).
+
+= Why can't I set up my social accounts on my local WordPress site? =
+
+Accounts can not be authorized on local environments, unless your local environment is publicly accessible via DNS.
+
+= I previously used a custom comments.php template with Social and it no longer works when I upgrade to 2.0, why is this? =
+
+This is because we completely refactored Social's codebase for 2.0. Chances are your old comments template is using some code that we removed in 2.0. For now you should be able to use the built in Social comments template, but if you want to continue using your old template, we suggest you take a look at social/views/comments.php to see how the new implementation works.
+
+For a more in-depth look at what you need to be aware of when upgrading from 1.x to 2.0 please have a look at the wiki entry: https://github.com/crowdfavorite/wp-social/wiki/Upgrading-from-1.x-to-2.0
+
+= How do I include Facebook Likes and Twitter Retweets in my comments feed? =
+
+The following code should add "meta" comments such as Likes as Retweets to your comments RSS and Atom feeds:
+
+	function social_enable_meta_comments_in_feed() {
+		$social = Social::instance();
+		remove_filter('comment_feed_where', array($social, 'comments_feed_exclusions'));
+	}
+	add_action('init', 'social_enable_meta_comments_in_feed');
+
+= Does Social output Facebook Open Graph tags for my site? =
+
+No it does not. If you would like to have these tags on your site, please install one of the many available plugins that add this feature.
+
+= I have a lot of comments and loading the avatars makes the page load slowly, what can I do? =
+
+Social supports the [Lazy Load plugin](http://wordpress.org/extend/plugins/lazy-load/). Install this plugin and Social's avatars will hang out on the couch eating potato chips and watching TV until they are needed.
+
+== Screenshots ==
+
+1. Allow your visitors to leave a comment as their Facebook or Twitter identities
+
+2. Social settings screen to connect accounts, set up default broadcast settings and more
+
+3. Post edit screen settings: broadcast the post, manually import comments, view a log of imported items
+
+4. Send customized broadcasts to each social account 
+
+5. View of replies imported from Twitter as comments
+
+
+== Upgrade Notice ==
+
+= 2.6 =
+This version fixes numerous bugs, provides compatibility with the newest Twitter API, and provides a few new filters to customize the date output.  See the Changelog for details
+
+== Changelog ==
+
+= 2.6 =
+* Now utilizes the newest Twitter API (1.1)
+* Removed the discontinued Twitter @anywhere service
+* Automatically approve Likes and Retweets
+* New date format filters: `social_formatted_date`, `social_comment_date`, `social_fuzzy_date`
+* XML-RPC / posts via email / scheduled posts now auto broadcast correctly
+* Enable Pages support in user profile social accounts is working correctly
+* Now utilizing longer timeouts for broadcast requests
+* Properly post links to facebook
+* Remove 'social' namespace for login i18n
+* Properly truncate comment broadcasting, giving the url priority
+
+
+= 2.5 =
+* Fix race condition that could cause users to be authenticated as the wrong user when both requests happened simultaneously.
+* Improve Facebook posting (post links with comments and broadcasts, except for status posts)
+* Improve Social as a platform (can disable broadcasting, comment display, comment importing, "add an account" alert is dismissable)
+* Revise broadcasting screen to allow sending different messages to each account
+* Revise account management UI
+* Add a Manual Tweet Import field on the front-end (via admin bar)
+* Twitter search expanded to receive 100 results per request
+* Ability to reply to a tweet with a broadcast
+* Import replies via Twitter to broadcasted comments (if found)
+* Automatically select proper social account when replying to a comment
+* When posting a comment back to Facebook, attempt to reply in an existing comment thread where appropriate
+* Automatically check the "broadcast" box when replying to a social comment and authenticated as a user on the same social network
+* Don't include Retweet and Like comments in comment RSS/Atom feeds
+* Improved relative date functions for comments (3 months ago, etc.)
+* Support lazy loading of avatars (via plugin)
+* Change comment header title based on context (creating a new comment, replying to a comment, etc.)
+* Fix issue causing reactions to Facebook broadcasts to not be imported consistently as comments
+* Various bug fixes and improvements
+
+
+= 2.0.1 =
+* Localization fixes (props thomasclausen)
+* Minor bug fixes
+
+= 2.0 =
+* Complete re-write for improved reliability and ease of future expansion.
+* Enables broadcasting to Facebook Pages.
+* Facebook Likes are now imported during comment aggregation.
+* Twitter retweets and Facebook Likes have more compact visual presentation.
+* Smart detection of retweets as understood by humans (where possible).
+* Enable broadcasting to selected by default.
+* Future posts are not broadcast until they are published.
+* Comments are not broadcast until they are approved.
+* Directly imported tweets (by URL) are approved immediately (not held for moderation).
+* Only public tweets are imported as comments.
+* New authentication scheme improves security.
+* Manual comment check commands from the admin bar and posts list admin page.
+* Improved queue and locking system to reduce the possibility of social reactions being imported twice.
+* Filter: social_broadcast_format now contains a third parameter, $service_key.
+* Filter: social_broadcast_permalink now contains a third parameter, $service_key.
+* Filter: social_format_content now contains a fourth parameter, $service_key.
+* Filter: social_broadcast_content_formatted now contains a third parameter, $service_key.
+
+= 1.0.2 =
+* Added the social_kses method to cleanse data coming back from the services.
+* WP accounts are no longer created with usernames of "facebook_" and "twitter_".
+
+= 1.0.1 =
+* Automatic CRON jobs now run correctly.
+* Facebook replies to broadcasted posts are now aggregated.
+* Miscellaneous bug fixes.
+
+= 1.0 =
+* Initial release
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/assets/admin.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,808 @@
+/**
+ * Wrapping form
+ */
+.social-view {
+	max-width: 70em!important;
+}
+
+/**
+ * Image replacement util
+ */
+.social-ir {
+	display: block;
+	text-indent: -999em;
+}
+
+.social-view-header {
+	margin: 10px;
+}
+
+.social-view-header h2 {
+	border-bottom: 1px solid #ddd;
+	margin-bottom: 10px;
+}
+
+.social-view-subtitle {
+	color: #777;
+	font-style: italic;
+}
+
+.social-mailchimp-link {
+	background: url(mailchimp.png) no-repeat;
+	display: inline-block;
+	height: 27px;
+	overflow: hidden;
+	text-indent: -999em;
+	*text-indent: 0;
+	font-size: 0;
+	line-height: 0;
+	margin: 0 4px;
+	vertical-align: middle;
+	width: 111px;
+}
+
+#social_proxy_keys {
+	margin-top: 10px;
+}
+
+#social_error {
+	background-color: #ffebe8;
+	border: 1px solid #c00;
+	margin: 5px 0 15px;
+	border-radius: 3px;
+	-webkit-border-radius: 3px;
+	-moz-border-radius: 3px;
+	-khtml-border-radius: 3px;;
+	padding: .6em;
+	font-size: 12px;
+	color: #333;
+}
+
+#social-broadcast-error h4 {
+	margin-bottom: 0;
+}
+
+.social-accounts {
+	margin: 20px 0 0;
+	max-width: 60em;
+}
+.social-accounts:first-child {
+	margin-top: 0;
+}
+
+.social-accounts .social-connect-button {
+	margin-bottom: 5px;
+}
+
+.social-accounts ul {
+	border-top: 1px solid #e5e5e5;
+	margin-top: 0;
+}
+
+.social-accounts ul li {
+	background: #fff;
+	margin: 0;
+	padding: 0;
+}
+
+.social-accounts ul ul li {
+	background: url(child-account-bullet.gif) no-repeat;
+	padding-left: 32px;
+}
+
+.social-accounts .social-accounts-item {
+	border-bottom: 1px solid #e5e5e5;
+	min-height: 32px;
+	line-height: 32px;
+	margin: 0;
+	position: relative;
+}
+.social-accounts .social-accounts-item .social-accounts-item:last-child {
+	border-bottom: 0;
+}
+.social-accounts .social-accounts-item img {
+	position: absolute;
+}
+.social-accounts .social-accounts-item .name {
+	padding-left: 38px;
+}
+.social-accounts .social-accounts-item label {
+	display: block;
+	height: 32px;
+	line-height: 32px;
+	position: absolute;
+	top: 0;
+}
+.social-accounts .social-accounts-item label.default {
+	right: 100px;
+}
+.social-accounts .social-accounts-item label.enabled {
+	right: 8px;
+}
+
+.social-accounts .name a {
+	font-weight: bold;
+	text-decoration: none;
+}
+
+#social-broadcast-by-default-yes,
+#social-broadcast-by-default-no {
+	margin: 0 5px;
+}
+
+#social-broadcast-by-default-no {
+	margin-left: 15px;
+}
+
+#social-default-accounts {
+	margin-top: 0;
+}
+
+#social-default-accounts.profile-page {
+	max-width: 60em;
+}
+
+.social-accounts ul h5,
+.social-accounts ul h6,
+#social-default-accounts li h5 {
+	margin: 0;
+}
+
+.social-accounts ul ul a {
+	position: relative;
+	top: -2px;
+}
+
+.social-accounts-item .name span {
+	position: relative;
+	top: -1px;
+	font-size: 11px;
+}
+.social-accounts-item.none {
+	color: #999;
+}
+
+.social-accounts-item .name span a {
+	font-weight: normal;
+}
+
+.social-accounts-item .social-facebook-pages {
+	display: none;
+}
+
+.social-accounts-item .social-facebook-pages-spinner {
+	display: none;
+	position: relative;
+	top: 3px;
+}
+
+.social-accounts .disconnect {
+	display: block;
+	height: 32px;
+	line-height: 32px;
+	position: absolute;
+	right: 8px;
+	top: 0;
+}
+
+.social-broadcast-options .social-accounts ul {
+	padding: 0;
+}
+
+.social-broadcast-options .social-accounts li {
+	list-style: none;
+	padding: 0;
+}
+
+.social-broadcast-options .social-facebook-pages,
+#social-default-accounts .social-facebook-pages {
+	margin-left: 45px;
+}
+
+.social-broadcast-options .social-facebook-pages ul,
+#social-default-accounts .social-facebook-pages ul {
+	margin-bottom: 10px;
+}
+
+.social-broadcast-options .social-facebook-pages li,
+#social-default-accounts .social-facebook-pages li {
+	margin-bottom: 2px;
+}
+
+.social-facebook-pages img,
+.social-accounts-item span {
+	position: relative;
+}
+
+.social-facebook-pages img {
+	top: 6px;
+}
+
+.social-facebook-pages span {
+	top: -1px;
+}
+
+.social-accounts-item.error .social-broadcast-editable span {
+	display: block;
+	font-size: 11px;
+	color: #f00;
+}
+
+#social-default-accounts .name span {
+	top: 0;
+}
+
+#social-default-accounts .name a {
+	text-decoration: none;
+}
+
+.social-login span {
+	display: none;
+}
+
+.social-login {
+	display: inline-block;
+	width: 150px;
+	height: 22px;
+}
+
+.social-disconnect {
+	position: relative;
+}
+
+.social-collapsible {
+	margin: 20px 0;
+}
+
+.social-collapsible > .social-title {
+	background: url(e5e5e5.gif) repeat-x 0 center;
+	font-size: 14px;
+	margin: 0 10px 20px;
+}
+
+.social-collapsible > .social-title a {
+	background: #fff url(toggle.gif) no-repeat 0 0;
+	display: -moz-inline-box; /* FF2 */
+	display: inline-block; /* Standard. IE8+, Saf, FF3+ */
+	padding: 0 5px 0 15px;
+	text-decoration: none;
+}
+
+.social-collapsible .social-content {
+	display: none;
+	overflow: hidden;
+	zoom: 1;
+}
+
+.social-collapsible.social-open .social-title a {
+	background-position: 0 -100px;
+}
+
+.social-collapsible.social-open .social-content {
+	display: block;
+}
+
+/**
+ * Twitter/Facebook Specific Styles
+ */
+#twitter_signin {
+	background: url('social.png') 0 0;
+}
+
+#twitter_signin:hover {
+	background-position: 0 -22px;
+}
+
+#twitter_signin:active {
+	background-position: 0 -44px;
+}
+
+#facebook_signin {
+	background: url('social.png') -150px 0;
+}
+
+#facebook_signin:hover {
+	background-position: -150px -22px;
+}
+
+#facebook_signin:active {
+	background-position: -150px -44px;
+}
+
+.social-connect-button {
+	clear: both;
+}
+
+.social-connect-button input,
+.social-connect-button label {
+	float: left;
+	margin: 6px 0 0 10px;
+	line-height: 16px;
+}
+
+.social-connect-button label {
+	margin: 4px 0 0 4px;
+}
+
+.social-connect-button a {
+	float: left;
+}
+
+.social-settings-connect .social-twitter-icon,
+.social-settings-connect .social-facebook-icon {
+	display: block;
+	height: 35px;
+	margin-bottom: 10px;
+}
+
+.social-twitter-icon i,
+.social-facebook-icon i {
+	background: url('social.png') 0 -150px;
+	display: block;
+	float: left;
+	margin-right: 5px;
+	width: 16px;
+	height: 16px;
+	line-height: 16px;
+}
+
+.social-facebook-icon i {
+	background-position: 0 -250px;
+}
+
+.social-twitter-icon.big,
+.social-facebook-icon.big {
+	line-height: 30px;
+}
+
+.social-twitter-icon.big i,
+.social-facebook-icon.big i {
+	background-position: 0 -82px;
+	margin-right: 10px;
+	width: 30px;
+	height: 30px;
+}
+
+.social-facebook-icon.big i {
+	background-position: -30px -82px;
+}
+
+.social-facebook-pages {
+	clear: both;
+}
+
+#social_meta_aggregation_log .inside {
+	margin: 0;
+	padding: 0;
+}
+
+.social-meta-box-block {
+	border-top: 1px solid #fff;
+	border-bottom: 1px solid #dfdfdf;
+	padding: 12px 12px 6px 12px;
+}
+
+.social-meta-box-block h4,
+.social-meta-box h4 {
+	margin: 8px 0;
+}
+
+.social-meta-box-block p,
+.social-meta-box-block ul,
+.social-meta-box p,
+.social-meta-box ul {
+	margin: 0 0 8px 0;
+}
+
+.social-meta-box-block h4 span {
+	font-size: 11px;
+	font-weight: normal;
+}
+
+#social-broadcast-meta-private p {
+	margin: auto;
+}
+
+.mar-top-none {
+	margin-top: 0 !important;
+}
+
+.social-kv {
+	margin-bottom: 10px;
+}
+
+.social-kv dt {
+	font-size: 11px;
+	font-weight: bold;
+	text-transform: uppercase;
+	margin-bottom: 5px;
+}
+
+.social-kv dd,
+.social-kv code {
+	font-size: 16px;
+}
+
+.social-callout,
+.social-note {
+	-moz-border-radius: 5px; /* FF1+ */
+	-webkit-border-radius: 5px; /* Saf3+, Chrome */
+	-khtml-border-radius: 5px; /* Konqueror */
+	border-radius: 5px; /* Standard. IE9 */
+	/**
+	 * @bugfix border-radius background bleed
+	 * @see http://tumble.sneak.co.nz/post/928998513/fixing-the-background-bleed
+	 */
+	-webkit-background-clip: padding-box;
+	margin: 10px 0;
+	padding: 10px;
+}
+
+.social-callout {
+	background: #f5f5f5;
+	border: 1px solid #ddd;
+}
+
+.social-note {
+	background: #fff;
+	border: 1px solid #e5db6c;
+}
+
+.social-note .social-title,
+.social-callout .social-title {
+	font: normal normal 16px/1.2 "HelveticaNeue-Light", "Helvetica Neue Light", "Helvetica Neue", Helvetica, Arial, sans-serif;
+	margin: 0 0 10px;
+}
+
+#social-import-error {
+	display: none;
+	color: #f00;
+}
+
+#aggregation_log {
+	margin-bottom: 10px;
+}
+
+#aggregation_log h5 {
+	border-top: 1px solid #eee;
+	font-size: 1em;
+	font-weight: normal;
+	line-height: 0.9em;
+	padding: 8px 5px;
+	margin: 0;
+}
+
+#aggregation_log h5:hover {
+	background-color: #fff;
+	cursor: pointer;
+}
+
+#aggregation_log ul {
+	color: #666;
+	font-size: 0.9em;
+	list-style: disc inside;
+	margin: 0px 15px 5px 15px;
+}
+
+#run_aggregation,
+#import_from_url {
+	color: #000;
+}
+
+.row-actions.social_run_aggregation {
+	visibility: visible;
+}
+
+.social_run_aggregation_loader {
+	display: none;
+	vertical-align: middle;
+}
+
+.social-aggregation-results.social-comments-found {
+	font-weight: bold;
+}
+
+.cf-clearfix {
+	display: block;
+	zoom: 1;
+}
+
+.cf-clearfix:after {
+	content: " ";
+	display: block;
+	font-size: 0;
+	height: 0;
+	clear: both;
+	visibility: hidden;
+}
+
+/**
+ * Meta Broadcast Box
+ */
+#social_meta_broadcast .service-label,
+#social_proxy_keys label {
+	float: left;
+	width: 135px;
+	padding-top: 2px;
+}
+
+#social_meta_broadcast .broadcast-label {
+	float: left;
+}
+
+#social_proxy_keys label {
+	padding-top: 6px;
+}
+
+#social_proxy_keys input {
+	width: 350px;
+}
+
+#social_meta_broadcast .social-toggle-label {
+	margin-right: 10px;
+}
+
+#social_meta_broadcast .social-broadcast-options {
+	position: relative;
+	top: 2px;
+}
+
+.social-meta-broadcast-button a {
+	float: right;
+	padding-top: 4px;
+}
+
+.social-meta-broadcast-button {
+	padding-bottom: 0;
+}
+
+.social-meta-broadcast-button.broadcasted {
+	margin-top: 0;
+	padding: 0;
+}
+
+#social_meta_broadcast .inside {
+	margin: 0;
+	padding: 0;
+}
+#social_meta_broadcast .broadcast-button {
+	border-bottom: 0;
+	padding: 10px 10px 8px;
+}
+#social_meta_broadcast .broadcast-button p {
+	margin: 0;
+	padding: 0;
+}
+
+.social-broadcasted {
+	margin-bottom: 4px !important;
+	margin-left: 2px !important;
+}
+
+.social-broadcasted li {
+	clear: both;
+	height: 24px;
+	margin-bottom: 2px;
+}
+
+.social-broadcasted li img {
+	float: left;
+}
+
+.social-broadcasted li span {
+	height: 24px;
+	line-height: 24px;
+	margin-left: 5px;
+}
+
+/* Errors */
+.error ul.social-posting-errors {
+	margin: 0 5px;
+	padding: 0 10px;
+}
+.error ul.social-posting-errors li {
+	list-style: disc;
+}
+
+/* Interstitial */
+.social-broadcast-options section {
+	margin-bottom: 30px;
+}
+.broadcast-interstitial {
+}
+.broadcast-interstitial ul {
+	list-style: none;
+	margin: 0;
+	padding: 0;
+}
+.broadcast-interstitial li.account {
+	border-bottom: 1px solid #ddd;
+	margin: 0 0 18px;
+	padding: 0 0 18px;
+	position: relative;
+}
+.broadcast-interstitial li.account:last-child {
+	border: 0;
+}
+.broadcast-interstitial li.account p.error {
+	background: #f00;
+	color: #fff;
+	font-size: 12px;
+	line-height: 120%;
+	margin: 0 0 0 20px;
+	padding: 5px 8px;
+	position: relative;
+}
+.broadcast-interstitial li.account label {
+	cursor: pointer;
+	display: block;
+	height: 32px;
+	left: 0;
+	position: absolute;
+	top: 5px;
+	width: 200px;
+}
+.broadcast-interstitial li.account label img {
+	position: absolute;
+}
+.broadcast-interstitial li.account label span {
+	display: block;
+	height: 32px;
+	line-height: 32px;
+	margin-left: 40px;
+}
+.broadcast-interstitial li.account .broadcast-content {
+	margin-left: 200px;
+	position: relative;
+}
+.broadcast-interstitial li.account .broadcast-content h3 {
+	color: #666;
+	font-size: 11px;
+	font-weight: normal;
+	margin: 0 0 0 27px;
+}
+.broadcast-interstitial ul.broadcasts {
+	margin-left: 27px;
+}
+.broadcast-interstitial ul.broadcasts li,
+.broadcast-interstitial ul.broadcasts li p {
+	font-size: 12px;
+}
+.broadcast-interstitial li.account .broadcast-edit {
+	padding-left: 20px;
+	position: relative;
+}
+.broadcast-interstitial li.account .broadcast-edit input[type="checkbox"] {
+	left: -5px;
+	position: absolute;
+	top: 7px;
+}
+.broadcast-interstitial li.account .broadcast-edit .readonly {
+	font-size: 16px;
+	line-height: 140%;
+	margin: 0;
+	opacity: .3;
+	padding: 6px 7px;
+	width: 90%;
+}
+.broadcast-interstitial li.account .broadcast-edit a.edit,
+.broadcast-interstitial li.account .broadcast-edit a.tweet-reply-link {
+	font-size: 12px;
+	line-height: 100%;
+	opacity: .3;
+	padding-left: 7px;
+}
+.broadcast-interstitial li.account .broadcast-edit textarea {
+	display: none;
+	font-size: 16px;
+	height: 70px;
+	line-height: 140%;
+	opacity: .3;
+	padding: 5px;
+	width: 90%;
+}
+.broadcast-interstitial li.account.twitter .broadcast-edit textarea {
+	margin-bottom: 5px;
+}
+.broadcast-interstitial li.account.facebook .broadcast-edit textarea {
+	height: 180px;
+}
+.broadcast-interstitial li.account .broadcast-edit .tweet-reply-fields {
+	display: none;
+	opacity: .3;
+	padding: 5px 0 0 7px;
+}
+.broadcast-interstitial li.account .broadcast-edit .tweet-reply-fields label {
+	color: #666;
+	font-size: 11px;
+	height: 15px;
+	position: relative;
+	top: 0;
+}
+.broadcast-interstitial li.account .broadcast-edit .tweet-reply-fields input {
+	padding: 5px;
+	width: 85%;
+}
+.broadcast-interstitial li.account .broadcast-edit .counter {
+	color: #999;
+	display: none;
+	font-size: 11px;
+	left: -35px;
+	opacity: .3;
+	position: absolute;
+	text-align: right;
+	top: 65px;
+	width: 50px;
+}
+.broadcast-interstitial li.account.facebook .broadcast-edit .counter {
+	top: 174px;
+}
+.broadcast-interstitial li.account .checked .readonly,
+.broadcast-interstitial li.account .checked a.edit,
+.broadcast-interstitial li.account .checked a.tweet-reply-link,
+.broadcast-interstitial li.account .checked textarea,
+.broadcast-interstitial li.account .checked .tweet-reply-fields,
+.broadcast-interstitial li.account .checked .counter,
+.broadcast-interstitial li.account .broadcast-edit:hover a.edit,
+.broadcast-interstitial li.account .broadcast-edit:hover a.tweet-reply-link {
+	opacity: 1;
+}
+.broadcast-interstitial li.account .broadcast-edit.edit .readonly,
+.broadcast-interstitial li.account .broadcast-edit.edit a.edit {
+	display: none;
+}
+.broadcast-interstitial li.account .broadcast-edit.edit textarea,
+.broadcast-interstitial li.account .broadcast-edit.edit .counter {
+	display: block;
+}
+.broadcast-interstitial p.step {
+	padding: 20px;
+	text-align: center;
+}
+.broadcast-interstitial p.step input {
+	margin-right: 5px;
+}
+
+.broadcast-interstitial li.account .broadcast-edit.edit .maxlength-remaining-short {
+	color: #900;
+}
+.broadcast-interstitial .facebook-link-preview {
+	border-left: 2px solid #ccc;
+	margin: 8px 0 0 27px;
+	padding: 0 0 0 10px;
+	position: relative;
+	width: 380px;
+}
+.broadcast-interstitial .facebook-link-preview.has-img {
+	border-left: 0;
+	min-height: 90px;
+	padding: 0;
+}
+.broadcast-interstitial .facebook-link-preview img {
+	height: 90px;
+	position: absolute;
+	width: 90px;
+}
+.broadcast-interstitial .facebook-link-preview h4,
+.broadcast-interstitial .facebook-link-preview h5,
+.broadcast-interstitial .facebook-link-preview p {
+	color: gray;
+	font: normal 11px "lucida grande",tahoma,verdana,arial,sans-serif;
+	line-height: 14px;
+	margin: 0;
+	padding: 0;
+}
+.broadcast-interstitial .facebook-link-preview.has-img h4,
+.broadcast-interstitial .facebook-link-preview.has-img h5,
+.broadcast-interstitial .facebook-link-preview.has-img p {
+	padding: 0 0 0 100px;
+}
+.broadcast-interstitial .facebook-link-preview h4,
+.broadcast-interstitial .facebook-link-preview h4 a,
+.broadcast-interstitial .facebook-link-preview h4 a:visited {
+	color: #3B5998;
+	font-weight: bold;
+}
+.broadcast-interstitial .facebook-link-preview p {
+	margin-top: 5px;
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/assets/admin.js	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,206 @@
+(function($) {
+	$(function() {
+		$('.social-collapsible').each(function() {
+			var $t = $(this);
+			$t.find('.social-title a').click(function(e) {
+				$t.toggleClass('social-open');
+				e.preventDefault();
+			});
+		});
+
+		/**
+		 * Import from URL
+		 */
+		var running_import = false;
+		$('#import_from_url').click(function(e) {
+			e.preventDefault();
+
+			if (!running_import) {
+				running_import = true;
+
+				var $this = $(this);
+				$this.attr('disabled', 'disabled');
+				$('input[name=source_url]').attr('disabled', 'disabled');
+				$('#import_from_url_loader').show();
+				$('#social-import-error').hide();
+
+				$.get($this.attr('href'), {
+					url: $('input[name=source_url]').val()
+				}, function(response) {
+					running_import = false;
+					$('#import_from_url_loader').hide();
+					$('input[name=source_url]').removeAttr('disabled').val('');
+					$this.removeAttr('disabled');
+					if (response == 'protected') {
+						$('#social-import-error').html(socialAdminL10n.protectedTweet).fadeIn();
+					} else if (response == 'invalid') {
+						$('#social-import-error').html(socialAdminL10n.invalidUrl).fadeIn();
+					} else {
+						$('#aggregation_log').hide().html(response).find('.parent:not(:first)').hide().end().fadeIn();
+					}
+				});
+			}
+		});
+
+		$('#social-source-url').keydown(function(e) {
+			if (e.keyCode == 13) {
+				e.preventDefault();
+				$('#import_from_url').trigger('click');
+			}
+		});
+
+		/**
+		 * Manual Aggregation
+		 */
+		var running_aggregation = false;
+		$('#run_aggregation').click(function(e) {
+			e.preventDefault();
+
+			if (!running_aggregation) {
+				running_aggregation = true;
+
+				var $this = $(this);
+				$this.attr('disabled', 'disabled');
+				$('#run_aggregation_loader').show();
+
+				$.get($this.attr('href'), {}, function(response) {
+					running_aggregation = false;
+					$('#run_aggregation_loader').hide();
+					$this.removeAttr('disabled');
+
+					if (response.next_run != '0') {
+						$('#social-next-run span').html(response.next_run);
+					}
+					$('#aggregation_log').hide().html(response.html).find('.parent:not(:first)').hide().end().fadeIn();
+				}, 'json');
+			}
+		});
+		$('#aggregation_log .parent:not(:first)').hide();
+		$('#aggregation_log h5').live('click', function() {
+			$('#' + $(this).attr('id') + '-output').toggle();
+		});
+
+		var running_row_aggregation = [];
+		$('.row-actions .social_aggregation a').click(function(e) {
+			e.preventDefault();
+			var rel = $(this).attr('rel');
+			if (!in_running_row_aggregation(rel)) {
+				var $this = $(this);
+				var $loader = $this.parent().find('.social_run_aggregation_loader');
+				$this.hide().closest('.row-actions').addClass('social_run_aggregation');
+				$loader.show();
+				$.get(
+					$this.attr('href'),
+					{
+						render: 'false',
+						hide_li: 'true'
+					},
+					function(response) {
+						remove_running_row_aggregation(rel);
+						$loader.hide();
+						$this.parent().find('.social-aggregation-results').remove();
+						$this.parent().append(' ' + response.html).find('a').fadeIn();
+					},
+					'json'
+				);
+			}
+		});
+
+		var in_running_row_aggregation = function(rel) {
+			for (var i = 0; i < running_row_aggregation.length; ++i) {
+				if (running_row_aggregation[i] == rel) {
+					return true;
+				}
+			}
+			return false;
+		};
+		var remove_running_row_aggregation = function(rel) {
+			var _running_row_aggregation = [];
+			for (var i = 0; i < running_row_aggregation.length; ++i) {
+				if (running_row_aggregation[i] != rel) {
+					_running_row_aggregation.push(running_row_aggregation[i]);
+				}
+			}
+			running_row_aggregation = _running_row_aggregation;
+		};
+
+		/**
+		 * Regenerate API Key
+		 */
+		$('#social_regenerate_api_key').click(function(e) {
+			e.preventDefault();
+			$.get($(this).attr('href'), {}, function(response) {
+				$('.social_api_key').html(response);
+			});
+		});
+
+		/**
+		 * Dismissal of notices.
+		 */
+		$('.social_dismiss').click(function(e) {
+			e.preventDefault();
+			var $this = $(this);
+			$.get($this.attr('href'), {}, function() {
+				$this.parent().parent().fadeOut();
+			});
+		});
+		
+		/**
+		 * Facebook Pages support
+		 */
+		$('#social-facebook-pages').click(function() {
+			var href = $(this).data('href');
+			if (typeof href == 'undefined') {
+				href = $('#facebook_signin').attr('href');
+				$(this).data('href', href);
+			}
+			if ($(this).is(':checked')) {
+				href += '&use_pages=true';
+			}
+			$('#facebook_signin').attr('href', href);
+		});
+
+		$('.broadcast-interstitial .broadcast-edit a.edit').click(function(e) {
+			$(this).closest('.broadcast-edit').addClass('edit')
+				.find('input[type="checkbox"]').prop('checked', true).change().end()
+				.find('textarea').focus().select();
+			e.preventDefault();
+		});
+		
+		$('.broadcast-interstitial li.account input[type="checkbox"]').change(function() {
+			var $parent = $(this).closest('.broadcast-edit');
+			if ($(this).is(':checked')) {
+				$parent.addClass('checked').find('textarea:visible').focus().select();
+			}
+			else {
+				$parent.removeClass('checked');
+			}
+		});
+
+		$('.broadcast-interstitial .broadcast-edit textarea').on('keyup change click focus', function() {
+			$counter = $(this).closest('.broadcast-edit').find('.counter');
+			var diff = parseInt($(this).attr('maxlength')) - parseInt($(this).val().length),
+				diffClass = '';
+			if (diff < 10) {
+				diffClass = 'maxlength-remaining-short';
+			}
+			$counter.removeClass('maxlength-remaining-short').addClass(diffClass).html(diff);
+		}).change();
+		
+		$('.broadcast-interstitial .broadcast-edit a.tweet-reply-link').click(function(e) {
+			$(this).hide().closest('.broadcast-edit')
+				.find('input[type="checkbox"]').prop('checked', true).change().end()
+				.find('.tweet-reply-fields').show().find(':input').focus();
+			e.preventDefault();
+		});
+
+		$('body.clean ul.accounts li.proto .broadcast-edit textarea').on('keyup change click focus', function() {
+			var val = $(this).val();
+			$(this).closest('ul.accounts').find('.broadcast-edit').not('.edit').each(function() {
+				$(this).find('.readonly').text(val).end()
+					.find('textarea').val(val);
+			});
+		});
+
+	});
+})(jQuery);
Binary file web/wp-content/plugins/social/assets/background-strikethrough.gif has changed
Binary file web/wp-content/plugins/social/assets/child-account-bullet.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/assets/comments.css	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,891 @@
+/**
+ * Social comments styles
+ * @package social-comments
+ * ================================================ */
+
+/** @section Basics
+ * Covers resets and typography
+ * a #social id is used to namespace our styles and create enough
+ * specificity to make sure they take work.
+ *
+ * Always use a social- prefix on classes and IDs to prevent naming conflicts
+ -------------------------------------------------- */
+
+/* Override default theme line-height */
+#social {
+	background: #fff;
+	line-height: 1.5;
+	margin: 40px 0;
+}
+
+/**
+ * Browser/theme style reset
+ * This gives us a reliable foundation for our styles, regardless of theme
+ * but scoped to our comments.
+ *
+ * Based on work by Eric Meyer
+ * @see http://meyerweb.com/eric/thoughts/2007/05/01/reset-reloaded/
+ */
+#social * {
+	margin: 0;
+	padding: 0;
+	border: 0;
+	font-size: 100%;
+	font: inherit;
+	vertical-align: baseline;
+}
+
+#social a {
+	text-decoration: none;
+	outline: 0;
+}
+
+#social a:hover {
+	text-decoration: underline;
+}
+
+/** @section Utility
+ -------------------------------------------------- */
+
+/**
+ * Updated super safe clearfix
+ * Taken from CSS section of HTML5 Boilerplate http://html5boilerplate.com/. Thanks guys!
+ */
+#social .social-clearfix:before,
+#social .social-clearfix:after {
+	content: "\0020";
+	display: block;
+	height: 0;
+	visibility: hidden;
+}
+
+#social .social-clearfix:after {
+	clear: both;
+}
+
+#social .social-clearfix {
+	zoom: 1;
+}
+
+#social .social-imr {
+	font-size: 0;
+	line-height: 0;
+	overflow: hidden;
+	text-indent: -32000px;
+}
+
+/**
+ * Subtext, help text, etc
+ */
+#social .social-help,
+#social .social-psst {
+	color: #999;
+	font-family: Helvetica, Arial, sans-serif;
+	font-size: 12px;
+}
+
+#social .social-help {
+	font-style: italic;
+}
+
+/** @section Sign-in and forms
+ -------------------------------------------------- */
+
+#social #commentform {
+	overflow: hidden;
+}
+
+/* Threaded respond form */
+#social .social-commentlist #respond {
+	margin: 6px 0;
+	padding: 0 0 0 7px;
+}
+
+#social .social-commentlist #reply-title {
+	background-position: 0 -400px;
+}
+
+#social .social-commentlist #commentform {
+	border-left: 1px solid #e1e1e1;
+	padding-left: 10px;
+}
+
+/* Specificity of selector is dialed to
+override TwentyEleven's treatment of text inputs in
+the respond form */
+#social input.social-input,
+#social textarea.social-input,
+#social .social-select {
+	background: #f8f8f8;
+	border: 1px solid #ccc;
+	-moz-border-radius: 3px; /* FF1+ */
+	-webkit-border-radius: 3px; /* Saf3+, Chrome */
+	-khtml-border-radius: 3px; /* Konqueror */
+	border-radius: 3px; /* Standard. IE9 */
+	/**
+	 * @bugfix border-radius background bleed
+	 * @see http://tumble.sneak.co.nz/post/928998513/fixing-the-background-bleed
+	 */
+	-webkit-background-clip: padding-box;
+	-moz-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.1); /* FF3.5+ */
+	-webkit-box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.1); /* Saf3+, Chrome */
+	box-shadow: inset 1px 1px 1px rgba(0, 0, 0, 0.1); /* Standard. Opera 10.5, IE9 */
+	font-family: Helvetica, Arial, sans-serif;
+	font-size: 14px;
+	padding: 2px 4px;
+	text-indent: 0;
+}
+
+/**
+ * Line-height fix
+ */
+#social input.social-input,
+#social .social-select {
+	height: 22px;
+	padding-bottom: 1px;
+	padding-top: 3px;
+}
+
+#social .social-select {
+	margin-top: 2px;
+}
+
+#social .social-select optgroup {
+	padding: 2px;
+	font-weight: bold;
+}
+
+#social .social-select option {
+	font-weight: normal;
+}
+
+#social .social-post {
+	font-family: Helvetica, Arial, sans-serif;
+}
+
+/* Input row styles */
+#social .social-input-row,
+#social .form-submit {
+	clear: left;
+	margin: 0 0 10px;
+	overflow: hidden;
+	padding-left: 80px;
+	position: relative;
+	zoom: 1;
+}
+
+/* Override TwentyEleven
+Remove float from para wrapping submit button. */
+#social .form-submit {
+	float: none;
+}
+
+#social .form-submit,
+#social .social-input-row-submit {
+	height: 30px;
+	margin-bottom: 0;
+}
+
+#social .social-input-row .social-label {
+	color: #333;
+	cursor: pointer;
+	font-size: 14px;
+	display: block;
+	left: 7px;
+	position: absolute;
+	top: 4px;
+	width: 70px;
+}
+
+#social #submit,
+#social .social-input-row .social-input {
+	/* Bypasses vertical alignment issues.
+	only effects social-input-row inputs */
+	float: left;
+	/* Specifically here to counteract issues with margins in TwentyTen,
+	but good to have either way */
+	margin: 0;
+}
+
+#social .social-input-row .social-help {
+	float: left;
+	line-height: 28px;
+	margin-left: 7px;
+}
+
+#social #respond {
+	/* Override TwentyEleven theme
+	Remove grey background */
+	background: transparent;
+	margin-bottom: 30px;
+	width: auto;
+}
+
+#social #respond input.social-input {
+	width: 314px;
+}
+
+#social #respond textarea.social-input {
+	height: 83px;
+	max-width: 464px;
+}
+
+/* Specificity of this selector is dialed in to
+override submit styles in TwentyEleven theme */
+#social input#submit {
+	background: #e9e9e9 url(sprite-y-24.png) 0 0 no-repeat;
+	border: 1px solid #ccc;
+	-moz-border-radius: 4px; /* FF1+ */
+	-webkit-border-radius: 4px; /* Saf3+, Chrome */
+	-khtml-border-radius: 4px; /* Konqueror */
+	border-radius: 4px; /* Standard. IE9 */
+	/* Workaround for TwentyEleven theme
+	Remove box shadow */
+	-moz-box-shadow: none; /* FF3.5+ */
+	-webkit-box-shadow: none; /* Saf3+, Chrome */
+	box-shadow: none; /* Standard. Opera 10.5, IE9 */
+	color: #0867ab;
+	cursor: pointer;
+	font: bold 14px/13px Helvetica, Arial, sans-serif;
+	height: 24px;
+	margin: 0;
+	/**
+	 * @bugfix input width issue
+	 * @affected IE7
+	 * IE7 likes to make buttons with CSS applied WIDE, unless you apply overflow:visible
+	 */
+	overflow: visible;
+	padding: 4px 13px;
+	/* Override TwentyEleven theme styles
+	Remove left offset */
+	position: static;
+	text-shadow: #fff 0 1px 0;
+}
+
+/* Specificity of this selector is dialed in to
+override submit styles in TwentyEleven theme */
+#social input#submit:active {
+	background: #dedede url(sprite-y-24.png) 0 -100px no-repeat;
+	color: #0867ab;
+}
+
+/**
+ * @bugfix invisible hidden element
+ * FF adds an invisible pseudo element to inputs. Reset it here.
+ * @affected Firefox
+ * @valid no
+ */
+#social #submit::-moz-focus-inner {
+	border: 0;
+	margin: 0;
+	padding: 0;
+}
+
+#social .social-twitter-icon,
+#social .social-facebook-icon,
+#social .social-facebook-like-icon {
+	background: url(sprite-y-24-icons.png) 0 -99px no-repeat;
+	display: block;
+	padding-left: 21px;
+	/**
+	 * @bugfix hasLayout fix
+	 * @affected	IE6
+	 * Keeps background from showing up twice.
+	 */
+	zoom: 1;
+}
+
+#social .social-facebook-icon,
+#social .social-facebook-like-icon {
+	background-position: 0 -199px;
+}
+
+#social .social-sign-in-links {
+	margin: 0 auto 9px;
+	width: 360px;
+}
+
+#social .social-sign-in-links a {
+	display: inline;
+	float: left;
+	height: 22px;
+	margin: 0 15px;
+	width: 150px;
+}
+
+#social .social-sign-in-links .social-twitter {
+	background: url('social.png') 0 0 no-repeat;
+}
+
+#social .social-sign-in-links .social-twitter:hover {
+	background-position: 0 -22px;
+}
+
+#social .social-sign-in-links .social-twitter:active {
+	background-position: 0 -44px;
+}
+
+#social .social-sign-in-links .social-facebook {
+	background: url('social.png') -150px 0 no-repeat;
+}
+
+#social .social-sign-in-links .social-facebook:hover {
+	background-position: -150px -22px;
+}
+
+#social .social-sign-in-links .social-facebook:active {
+	background-position: -150px -44px;
+}
+
+/* Logged in form */
+
+.logged-in #social .social-input-row-comment .social-label {
+	/* Hide visually, but remain readable by screen readers */
+	left: -999em;
+	position: absolute;
+}
+
+.logged-in #social #respond .form-submit,
+.logged-in #social .social-input-row {
+	/* Override TwentyEleven theme
+	remove float:right */
+	float: none;
+	padding-left: 50px;
+}
+
+/** @section Tabs
+ -------------------------------------------------- */
+
+/**
+ * Work around Javascript FOUC accessibly
+ * Prevent flash before tabs init...
+ * Relies on snippet in master.js
+ */
+.social-js .social-tabs-panel {
+	display: none;
+}
+
+.social-js .social-tabs-first-panel {
+	display: block;
+}
+
+#social .social-heading {
+	background: url('background-strikethrough.gif') 0 13px repeat-x;
+	font-family: Helvetica, Arial, sans-serif;
+	margin-bottom: 10px;
+}
+
+#social .social-title {
+	margin: 0 0 0 9px;
+	zoom: 1;
+}
+
+#social .social-title span {
+	display: block;
+}
+
+#social .social-divider {
+	background: url('background-strikethrough.gif') center repeat-x;
+	clear: both;
+	font: italic 13px/1.5 Helvetica, Arial, sans-serif;
+	margin: 0 7px 10px;
+	text-align: center;
+}
+
+#social .social-divider span {
+	background-color: #fff;
+	padding: 0 10px;
+}
+
+#social .must-log-in {
+	text-align: center;
+}
+
+#social .social-must-log-in {
+	margin-bottom: 25px;
+}
+
+/** @section Comments List
+ -------------------------------------------------- */
+#social .social-commentlist {
+	list-style-image: none;
+	list-style-position: outside;
+	list-style-type: none;
+	margin: 10px 0 0;
+}
+
+#social .social-comment {
+	position: relative;
+	border-top: 1px solid #e1e1e1;
+	border-left: 1px solid #e1e1e1;
+	-moz-border-radius-topleft: 4px; /* FF1+ */
+	-webkit-border-top-left-radius: 4px; /* Saf3+, Chrome */
+	-khtml-border-top-left-radius: 4px; /* Konqueror */
+	border-top-left-radius: 4px; /* Standard. IE9 */
+	margin: 0 0 10px;
+	zoom: 1;
+}
+
+#social .social-comment-header {
+	margin-bottom: 6px;
+	position: relative;
+	z-index: 4;
+}
+
+#social .social-comment-author {
+	margin-right: 125px;
+}
+
+#social .social-fn {
+	display: block;
+	font-size: 16px;
+	line-height: 1.2;
+	-o-text-overflow: ellipsis; /* Opera */
+	text-overflow: ellipsis; /* IE6+, Safari, Konqueror, Standard? */
+	overflow: hidden;
+	/**
+	 * @workaround Prevent ugly overflow issues in IE6
+	 * @valid yes
+	 * @affected IE6
+	 */
+	width: 100%;
+}
+
+/* Callout post-author name */
+#social .bypostauthor .social-fn {
+	font-weight: bold;
+}
+
+#social .social-identity {
+	margin-top: 10px;
+	position: relative;
+}
+
+#social .social-identity .avatar {
+	left: 0;
+	position: absolute;
+	top: 2px;
+}
+
+#social #cancel-comment-reply-link {
+	display: inline;
+	font-family: Helvetica, Arial, sans-serif;
+	font-size: 12px;
+	margin: 3px 10px;
+	position: static;
+	text-transform: none;
+}
+
+#social .social-comment-header .avatar {
+	left: 0px;
+	position: absolute;
+	/**
+	 * Align with visual text top
+	 */
+	top: 3px;
+}
+
+#social .social-replied {
+	background: url(sprite-y-24-icons.png) 0 -300px no-repeat;
+	display: block;
+	height: 16px;
+	left: -67px;
+	position: absolute;
+	top: -17px;
+	width: 16px;
+}
+
+#social .social-comment-inner {
+	margin-right: 10px;
+	padding: 7px 0 0 10px;
+	position: relative;
+	zoom: 1;
+}
+
+#social .social-comment-header,
+#social .social-comment-body,
+#social .social-comment-entry-meta {
+	padding-left: 50px;
+}
+
+#social .social-comment-body {
+	font-size: 14px;
+	line-height: 18px;
+	overflow: hidden;
+	/**
+	 * @workaround Prevent ugly overflow issues in IE6
+	 * @valid yes
+	 * @affected IE6
+	 */
+	width: 100%;
+}
+
+#social .social-comment-body p {
+	margin: 0 0 5px;
+}
+
+/* Children Comments */
+#social .social-children {
+	margin: 0;
+	padding: 0;
+	zoom: 1;
+}
+
+#social .social-children li {
+	list-style: none;
+	margin: 0;
+}
+
+#social .social-children .social-comment {
+	border-right: 0;
+	-moz-border-radius-topright: 0; /* FF1+ */
+	-webkit-border-top-right-radius: 0; /* Saf3+, Chrome */
+	-khtml-border-top-right-radius: 0; /* Konqueror */
+	border-top-right-radius: 0; /* Standard. IE9 */
+	-moz-border-radius-bottomright: 0; /* FF1+ */
+	-webkit-border-bottom-right-radius: 0; /* Saf3+, Chrome */
+	-khtml-border-bottom-right-radius: 0; /* Konqueror */
+	border-bottom-right-radius: 0; /* Standard. IE9 */
+	margin-left: 6px;
+}
+
+#social .social-actions,
+#social .social-actions a,
+#social .social-comment-meta,
+#social .social-comment-meta a,
+#social .social-last-reply-when {
+	color: #999;
+	font-family: Helvetica, Arial, sans-serif;
+	font-size: 12px;
+}
+
+#social a.comment-reply-link {
+	/* Override TwentyEleven theme
+	Remove background from reply links. */
+	background: transparent;
+}
+
+#social .social-actions {
+	margin-bottom: 8px;
+}
+
+#social .social-actions a,
+#social .social-comment-meta a {
+	text-decoration: underline;
+}
+
+#social .social-comment-meta {
+	background: url('sprite-y-24-icons.png') no-repeat;
+	line-height: 16px;
+	padding-right: 20px;
+	position: absolute;
+	right: 0;
+	top: 2px;
+	white-space: nowrap;
+}
+
+#social .social-comment-meta .social-posted-from a,
+#social .social-comment-meta .social-posted-from {
+	display: block;
+	position: absolute;
+	right: 0;
+	width: 16px;
+	height: 16px;
+	margin-left: 5px;
+}
+
+#social .social-comment-meta .social-posted-from span {
+	display: none;
+}
+
+#social .social-actions,
+#social .social-actions a,
+#social .social-last-reply-when,
+#social .social-last-reply-when a {
+	text-transform: lowercase;
+}
+
+#social .social-last-reply-when {
+	float: right;
+	font-size: 11px;
+	font-style: italic;
+	margin-bottom: 4px;
+	text-align: right;
+}
+
+#social .social-comment-meta {
+	background-position: right -1px;
+}
+
+#social .social-comment-meta-twitter {
+	background-position: right -100px;
+}
+
+#social .social-comment-meta-facebook {
+	background-position: right -200px;
+}
+
+#social .social-comment-meta-pingback {
+	background-position: right -400px;
+}
+
+#social .social-pingback > .social-comment-inner {
+	padding-left: 10px;
+}
+
+#social .social-comment-collapse > .social-comment-inner > .social-comment-body,
+#social .social-comment-collapse > .social-comment-inner > .social-actions,
+#social .social-comment-collapse > .social-comment-inner > .social-items-comment {
+	display: none;
+}
+
+#social .social-comment-collapse > .social-comment-inner > .social-comment-header,
+#social .social-comment-collapse.social-facebook-like > .social-comment-inner > .social-comment-body {
+	filter: alpha(opacity = 30);
+	font-size: 12px;
+	min-height: 18px;
+	opacity: .3;
+	padding-left: 35px;
+}
+
+#social .social-facebook-like {
+	margin-bottom: 5px;
+}
+
+#social .social-facebook-like > .social-comment-inner > .social-comment-body {
+	z-index: 3;
+	position: relative;
+	top: -1px;
+	font-size: 12px;
+}
+
+#social .social-comment-collapse.social-facebook-like > .social-comment-inner > .social-comment-body {
+	top: -5px;
+}
+
+#social .social-facebook-like > .social-comment-inner > .social-comment-header > .social-comment-author img {
+	top: 1px;
+}
+
+#social .social-comment-collapse > .social-comment-inner > .social-comment-header .social-fn {
+	font-size: 12px;
+	position: relative;
+	left: -10px;
+}
+
+#social .social-pingback.social-comment-collapse > .social-comment-inner > .social-comment-header .social-fn {
+	left: 0;
+}
+
+#social .social-comment-collapse > .social-comment-inner > .social-comment-header > .social-comment-author img {
+	width: 16px;
+	height: 16px;
+	top: -1px;
+}
+
+/*Tabs*/
+#social .social-nav {
+	background: url('background-strikethrough.gif') 0 13px repeat-x;
+	font-family: Helvetica, Arial, sans-serif;
+	font-size: 13px;
+	line-height: 28px;
+	list-style: none;
+	margin: 0 0 3px;
+	padding: 0 0 0 4px;
+}
+
+#social .social-nav li {
+	display: inline;
+	float: left;
+	margin-left: 10px;
+}
+
+#social .social-nav .social-tab-main {
+	margin-left: 0;
+}
+
+#social #social-tabs-comments .social-nav li a span {
+	background: url('sprite-y-24-icons.png') 0 100px no-repeat;
+	display: block;
+}
+
+#social #social-tabs-comments .social-nav .social-wordpress a span {
+	background-position: 0 4px;
+	padding-left: 19px;
+}
+
+#social #social-tabs-comments .social-nav .social-twitter a span {
+	background-position: 0 -96px;
+	padding-left: 19px;
+}
+
+#social #social-tabs-comments .social-nav .social-facebook a span {
+	background-position: 0 -195px;
+	padding-left: 19px;
+}
+
+#social #social-tabs-comments .social-nav .social-pingback a span {
+	background-position: 0 -394px;
+	padding-left: 19px;
+}
+
+/* Tab graphical treatment - selected tabs, and section headers*/
+#social #reply-title {
+	margin: 0;
+	overflow: hidden;
+	padding-left: 13px;
+	zoom: 1;
+}
+
+#social #reply-title span,
+#social .social-nav li a {
+	float: left;
+	font-size: 14px;
+	height: 26px;
+	line-height: 26px;
+}
+
+#social .social-nav li a {
+	background: #fff;
+	padding: 0 12px 4px 12px;
+}
+
+#social #reply-title span,
+#social .social-nav .social-current-tab a {
+	padding: 0 12px 4px 8px;
+}
+
+#social #reply-title,
+#social .social-nav .social-current-tab {
+	background: url(sprite-y-24.png) 0 -200px no-repeat;
+}
+
+#social .social-nav .social-current-tab {
+	background-position: -9px -200px;
+	padding-left: 4px;
+}
+
+#social #reply-title span,
+#social .social-nav .social-current-tab a {
+	background: url(sprite-y-24.png) right -300px no-repeat;
+	color: #000;
+}
+
+/**
+ * This is for the "more important" tabs
+ */
+#social .social-tab-main,
+#social .social-heading .social-title {
+	color: #000;
+	font-size: 14px;
+	font-weight: bold;
+}
+
+#social #post_to {
+	margin: 0 10px;
+}
+
+#social #post_to label {
+	cursor: pointer;
+	width: auto;
+}
+
+#social #post_to input {
+	width: auto;
+}
+
+/**
+ * Comment Aggregation Widget
+ */
+.social-aggregation-spinner {
+	vertical-align: middle;
+}
+
+#wp-adminbar-comments-social {
+	position: absolute;
+	visibility: hidden;
+}
+
+.social-aggregation-results {
+	white-space: nowrap;
+}
+
+/**
+ * Social items display (retweets, likes, etc...)
+ */
+#social-items-wrapper {
+	float: left;
+}
+
+#social .social-items {
+	clear: both;
+}
+
+#social .social-items-icon {
+	display: block;
+	float: left;
+	margin: 9px 7px 0 7px;
+	width: 14px;
+}
+
+#social .social-items-comments {
+	float: left;
+}
+
+#social .social-items-comment {
+	margin: 6px 0;
+}
+
+#social .social-items.social-twitter .social-items-icon {
+	background-image: url('retweet.png');
+	height: 8px;
+}
+
+#social .social-items.social-facebook .social-items-icon {
+	background-image: url('like.png');
+	width: 13px;
+	margin: 6px 8px 0 7px;
+	height: 12px;
+}
+
+#social .social-comment .social-items-icon {
+	margin-top: 6px;
+}
+
+#social .social-items.social-comment-collapse {
+	filter: alpha(opacity = 30);
+	opacity: .3;
+}
+
+#social .social-items img {
+	margin: 0 2px;
+}
+
+#social .social-items-comments a {
+	float: left;
+}
+
+#social .social-items-and-more {
+	margin: 8px 0 0 5px;
+	font-size: 12px;
+	color: #666;
+}
+
+#social .social-items-comments .social-items-and-more {
+	font-size: 11px;
+	margin-top: 4px;
+}
+
+.cf-clearfix {
+	display: block;
+	zoom: 1;
+}
+
+.cf-clearfix:after {
+	content: " ";
+	display: block;
+	font-size: 0;
+	height: 0;
+	clear: both;
+	visibility: hidden;
+}
Binary file web/wp-content/plugins/social/assets/e5e5e5.gif has changed
Binary file web/wp-content/plugins/social/assets/like.png has changed
Binary file web/wp-content/plugins/social/assets/mailchimp.png has changed
Binary file web/wp-content/plugins/social/assets/retweet.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/assets/social.js	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,452 @@
+(function($) {
+	/*
+	 * Append social-js class to html element. This allows us to prevent JS FOUC
+	 * in an accessible way.
+	 * Run it ASAP. Doesn't need to run on domReady because the html element is
+	 * the first thing available.
+	 */
+	var c = document.getElementsByTagName('html')[0];
+	c.className += ' social-js';
+
+	$(function() {
+		$('.social-login').click(function(e) {
+			e.preventDefault();
+
+			var $window = $(this),
+				$auth_window = window.open($(this).attr('href'), "ServiceAssociate", 'width=700,height=400'),
+				auth_poll = null;
+
+			auth_poll = setInterval(function() {
+				if ($auth_window.closed) {
+					clearInterval(auth_poll);
+
+					if (!$window.hasClass('comments')) {
+						window.location.reload();
+					}
+					else {
+						var $parent = $('.social-post');
+						$.post($parent.find('#reload_url').val(), {}, function(response) {
+							if (response.result == 'success') {
+								// Add logged-in body class since we're not going to be refreshing the page.
+								$('body').addClass('logged-in');
+
+								var $cancel = $('#cancel-comment-reply-link'),
+									$parent = $cancel.closest('li'),
+									$clone = $cancel.clone(true);
+								$cancel.click();
+								$('#respond').replaceWith(response.html);
+								// replace the cancel button with the one we cloned, to retain actions
+								$('#respond').find('#cancel-comment-reply-link').remove().end()
+									.find('#reply-title small:first').append($clone);
+								$parent.find('.comment-reply-link:first').click();
+
+								$('#primary').find('#social_login').parent().html(response.disconnect_url);
+							}
+						}, 'json');
+					}
+				}
+			}, 100);
+		});
+
+		// comments.php
+		if ($('#social').length) {
+			// MCC Tabs
+			var $prevLink = null,
+				prevLink = null,
+				$nextLink = null,
+				nextLink = null;
+			if ($('#comments .nav-previous a').length) {
+				$prevLink = $('#comments .nav-previous a');
+				prevLink = $prevLink.attr('href');
+			}
+
+			if ($('#comments .nav-next a').length) {
+				$nextLink = $('#comments .nav-next a');
+				nextLink = $nextLink.attr('href');
+			}
+
+			$('.social-nav a').click(function(e) {
+				e.preventDefault();
+				$('#cancel-comment-reply-link').trigger('click');
+
+				$('.social-current-tab').removeClass('social-current-tab');
+				$(this).parent().addClass('social-current-tab');
+				$('.social-items').removeClass('social-comment-collapse');
+
+				var className = $(this).attr('rel');
+				if (className == 'social-all') {
+					if (nextLink !== null) {
+						$nextLink.attr('href', nextLink);
+					}
+
+					if (prevLink !== null) {
+						$prevLink.attr('href', prevLink);
+					}
+
+					$('.social-commentlist li').removeClass('social-comment-collapse');
+				} else {
+					$('.social-items:not(.' + className + ')').addClass('social-comment-collapse');
+					$('.social-commentlist li').each(function() {
+						if (!$(this).hasClass(className)) {
+							$(this).addClass('social-comment-collapse');
+						}
+						else {
+							$(this).removeClass('social-comment-collapse');
+						}
+					});
+
+					if (prevLink !== null) {
+						var _prevLink = prevLink.split('#comments');
+						if (_prevLink.indexOf('?') == -1) {
+							_prevLink[0] = _prevLink[0] + '?';
+						}
+						else {
+							_prevLink[0] = _prevLink[0] + '&';
+						}
+						$prevLink.attr('href', _prevLink[0] + 'social_tab=' + className + '#comments');
+					}
+
+					if (nextLink !== null) {
+						var _nextLink = nextLink.split('#comments');
+						if (_nextLink.indexOf('?') == -1) {
+							_nextLink[0] = _nextLink[0] + '?';
+						}
+						else {
+							_nextLink[0] = _nextLink[0] + '&';
+						}
+						$nextLink.attr('href', _nextLink[0] + 'social_tab=' + className + '#comments');
+					}
+				}
+			});
+
+			$('.social-current-tab a').trigger('click');
+
+			/**
+			 * Inserts the Twitter username for the reply to content.
+			 *
+			 * @param $author
+			 * @param $textarea
+			 * @param extraContent
+			 */
+			function insertTwitterUsername($author, $textarea, extraContent) {
+				var username = $author.html() + ' ';
+				if (username.substr(0, 1) != '@') {
+					username = '@' + username;
+				}
+				if (extraContent !== undefined) {
+					username += extraContent;
+				}
+				var val = $textarea.val();
+				if (val.substr(0, username.length) != username) {
+					var content = '';
+					var content = (val.length > 0 ? username + val : username);
+					var pos = content.length;
+					$textarea.val(content);
+					if ($textarea.get(0).setSelectionRange) {
+						$textarea.focus();
+						$textarea.get(0).setSelectionRange(pos, pos);
+					}
+					else if ($textarea.createTextRange) {
+						var range = $textarea.get(0).createTextRange();
+						range.collapse(true);
+						range.moveEnd('character', pos);
+						range.moveStart('character', pos);
+						range.select();
+					}
+				}
+			}
+
+			/**
+			 * Removes the inserted Twitter username from the content.
+			 *
+			 * @param $author
+			 * @param $textarea
+			 */
+			function removeTwitterUsername($author, $textarea) {
+				var username = $author.html() + ' ';
+				if (username.substr(0, 1) != '@') {
+					username = '@' + username;
+				}
+				var val = $textarea.val();
+				if (val.substr(0, username.length) == username) {
+					var content = val.substr(username.length);
+					var pos = content.length;
+					$textarea.val(content);
+					if ($textarea.get(0).setSelectionRange) {
+						$textarea.focus();
+						$textarea.get(0).setSelectionRange(pos, pos);
+					}
+					else if ($textarea.createTextRange) {
+						var range = $textarea.get(0).createTextRange();
+						range.collapse(true);
+						range.moveEnd('character', pos);
+						range.moveStart('character', pos);
+						range.select();
+					}
+				}
+			}
+
+			$('.comment-reply-link').click(function() {
+				$('.comment-reply-link').show();
+				$(this).hide();
+				var $title = $('#reply-title'),
+					$cancel = null,
+					$parent = $(this).closest('li'),
+					$textarea = $parent.find('textarea'),
+					$form = $('#commentform');
+				// set data attr for current title
+				// set title to Sociali18n.commentReplyTitle
+				$cancel = $title.find('small').hide().appendTo($title);
+				$title.data('orig-title', $title.find('span').text())
+					.find('span').html(Sociali18n.commentReplyTitle + ' ')
+					.append($cancel.show());
+				if ($parent.hasClass('social-twitter') || $parent.hasClass('social-facebook')) {
+					var commentService = ($parent.hasClass('social-twitter') ? 'twitter' : 'facebook');
+					// check to see if the current user has a profile for the service
+					if ($('#post_accounts option[data-type="' + commentService + '"]').size() == 0 &&
+						$form.find('.social-identity .social-' + commentService + '-icon').size() == 0) {
+						return;
+					}
+					var username = '',
+						matched = false,
+						$option = false,
+						$options = $('#post_accounts option[data-type="' + commentService + '"]');
+					switch (commentService) {
+						case 'twitter':
+							// look for a username at the beginning of the comment
+							// if we have that account available, use it
+							// if not, select the first account for that service
+							var content = $.trim($parent.find('.social-comment-body:first').text());
+							if (content.substr(0, 1) == '@') {
+								username = content.split(' ')[0].substr(1);
+							}
+							$options.each(function() {
+								if ($(this).html() == username) {
+									matched = true;
+									$option = $(this);
+									return false;
+								}
+							});
+							var $author = $parent.find('.social-comment-author a'),
+								author_rel = $author.attr('rel').split(' ');
+							$('#in_reply_to_status_id').val(author_rel[0]);
+							// if click invoked programatically, do nothing.
+							if ($textarea.size()) {
+								insertTwitterUsername($author, $textarea);
+							}
+						break;
+						case 'facebook':
+						break;
+					}
+					if (!matched) {
+						$options.each(function() {
+							$option = $(this);
+							return false;
+						});
+					}
+					if ($option) {
+						$('#post_accounts').val($option.attr('value')).change();
+					}
+					$('#post_to_service').prop('checked', true);
+				}
+			});
+
+			// some actions need the "live" treatment
+			$(document).on('click', '#cancel-comment-reply-link', function() {
+				$('.comment-reply-link').show();
+				$('#post_to_service').prop('checked', false);
+				$('#in_reply_to_status_id').val('');
+			});
+			// due to the way WP's comment JS works, we can't run this on the "live" action above
+			// by the time this runs, the node is moved and $parent is an empty set
+			$('#cancel-comment-reply-link').click(function() {
+				var $title = $('#reply-title'),
+					$cancel = null,
+					$parent = $(this).closest('li'),
+					$textarea = $parent.find('textarea'),
+					$author = $parent.find('.social-comment-author a');
+				// if click invoked programatically, do nothing.
+				if ($textarea.size()) {
+					// restore title
+					$cancel = $title.find('small').hide().appendTo($title);
+					$title.find('span').html($title.data('orig-title') + ' ').append($cancel);
+					removeTwitterUsername($author, $textarea);
+				}
+			});
+
+			var $avatar = $('#commentform .avatar');
+			var original_avatar = $avatar.attr('src');
+			$(document).on('change', '#post_accounts', function() {
+				$(this).find('option:selected').each(function() {
+					var $parent = $(this).closest('li'),
+						$textarea = $parent.find('textarea'),
+						$author = $parent.find('.social-comment-author a');
+					if ($textarea.size()) {
+						if ($(this).data('type') == 'twitter') {
+							insertTwitterUsername($author, $textarea);
+						}
+						else {
+							removeTwitterUsername($author, $textarea);
+						}
+					}
+					var avatar = $(this).attr('rel');
+					if (avatar !== undefined) {
+						$avatar.attr('src', avatar);
+					}
+					else {
+						$avatar.attr('src', original_avatar);
+					}
+					var label = $(this).parent().attr('label');
+					if (label !== undefined) {
+						$('#post_to').show().find('span').html(label);
+					}
+					else {
+						$('#post_to').hide();
+					}
+				});
+			});
+			$('#post_accounts').trigger('change');
+		}
+
+		/**
+		 * Manual Aggregation
+		 */
+		var $social_comments_adminbar_item = $('#wp-admin-bar-social-find-comments');
+		if ($social_comments_adminbar_item.size()) {
+			var $social_spinner = $social_comments_adminbar_item.find('.social-aggregation-spinner');
+			var $social_aggregation = $('#social_aggregation');
+			var $comment_adminbar_item = $('#wp-admin-bar-comments');
+			$social_aggregation.click(function(e) {
+				if ($(this).attr('href') == '#') {
+					e.preventDefault();
+				}
+			}).removeClass('running-aggregation');
+			$comment_adminbar_item.removeClass('running-aggregation');
+
+			$social_comments_adminbar_item.find('a').click(function(e) {
+				e.preventDefault();
+				if (!$comment_adminbar_item.hasClass('running-aggregation')) {
+					$comment_adminbar_item.addClass('running-aggregation');
+
+					// remove old results (slide left)
+					$('#wp-adminbar-comments-social').animate({ width: '0' }, function() {
+						$(this).remove();
+					});
+
+					// show spinner
+					$comment_adminbar_item.find('#ab-awaiting-mod').hide().end()
+						.find('a:first').append($social_spinner);
+					$social_spinner.show();
+					SocialLoadingInterval = setInterval(function() {
+						var next = false;
+						var $dots = jQuery('.social-aggregation-spinner').find('.social-dot');
+						$dots.each(function() {
+							var active = jQuery(this).hasClass('dot-active');
+							if (next) {
+								jQuery(this).addClass('dot-active');
+							}
+							if (active) {
+								jQuery(this).removeClass('dot-active');
+								next = true;
+							}
+							else {
+								next = false;
+							}
+						});
+						if ($dots.filter('.dot-active').size() == 0) {
+							$dots.filter(':first').addClass('dot-active');
+						}
+					}, 425);
+
+					// make AJAX call
+					$.get(
+						$(this).attr('href'),
+						{ render: 'false' },
+						function(response) {
+							// hide spinner
+							$social_spinner.hide();
+							$social_comments_adminbar_item.append($social_spinner);
+							clearInterval(SocialLoadingInterval);
+
+							// update count, show count
+							$comment_adminbar_item.find('#ab-awaiting-mod')
+								.html(response.total).show();
+
+							// show results (slide right)
+							$comment_adminbar_item.addClass('social-comments-found').after(response.html);
+							var $social_comments_found = $('#wp-adminbar-comments-social');
+							var found_width = $social_comments_found.width();
+							$social_comments_found.css({
+								position: 'relative',
+								visibility: 'visible',
+								width: 0
+							}).animate({ width: found_width + 'px' });
+
+							// set params for next call
+							$social_aggregation.attr('href', response.link);
+
+							$comment_adminbar_item.removeClass('running-aggregation');
+						},
+						'json'
+					);
+				}
+			});
+		}
+		$('#wp-admin-bar-social-add-tweet-by-url a').each(function() {
+			$form = $(this).find('form');
+			$form.data('running-import', false).keydown(function(e) {
+				e.stopPropagation();
+			}).submit(function() {
+				if (!$(this).data('running-import')) {
+					var $this = $(this),
+						$inputs = $this.find('input');
+					$this.data('running-import', true);
+					$inputs.attr('disabled', 'disabled');
+
+					var $loading = $('<div class="loading"></div>')
+						.height($this.height())
+						.width($this.width());
+					$this.hide().closest('li')
+							.find('.msg').remove().end()
+						.end()
+						.after($loading);
+
+					$.get($this.attr('action'), {
+						url: $('input[name=url]').val()
+					}, function(response) {
+						var msg = msgClass = '';
+						switch (response) {
+							case 'protected':
+							case 'invalid':
+								msg = socialAdminBarMsgs[response];
+								msgClass = ' error';
+								break;
+							default:
+								msg = socialAdminBarMsgs['success'];
+						}
+						$loading.remove();
+						$this.data('running-import', false).show()
+							.after('<p class="msg' + msgClass + '">' + msg + '</p>');
+						$inputs.removeAttr('disabled').filter(':text').val('').focus();
+					});
+				}
+				return false;
+			}).appendTo($(this).closest('li'));
+		}).click(function(e) {
+			$(this).hide().closest('li').find('form').show().find(':text').focus().select();
+			return false;
+		});
+
+		/**
+		 * Social items
+		 */
+		if ($('.social-items-and-more').length) {
+			$('.social-items-and-more').click(function(e) {
+				e.preventDefault();
+
+				$(this).parent().find('a').show();
+				$(this).hide();
+			});
+		}
+	});
+})(jQuery);
Binary file web/wp-content/plugins/social/assets/social.png has changed
Binary file web/wp-content/plugins/social/assets/sprite-y-24-icons.png has changed
Binary file web/wp-content/plugins/social/assets/sprite-y-24.png has changed
Binary file web/wp-content/plugins/social/assets/toggle.gif has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lang/social.pot	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,1007 @@
+# Copyright (C) 2012 Social
+# This file is distributed under the same license as the Social package.
+msgid ""
+msgstr ""
+"Project-Id-Version: Social 2.5\n"
+"Report-Msgid-Bugs-To: http://wordpress.org/tag/social\n"
+"POT-Creation-Date: 2012-05-22 18:40:54+00:00\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"PO-Revision-Date: 2012-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+
+#: lib/social/aggregation/log.php:60
+msgid "Social failed to initialize the Aggregation_Log for post #%s."
+msgstr ""
+
+#: lib/social/aggregation/queue.php:247
+msgid "approximately %s"
+msgstr ""
+
+#: lib/social/comment/form.php:261
+msgid "Name"
+msgstr ""
+
+#: lib/social/comment/form.php:262
+msgid "Email"
+msgstr ""
+
+#: lib/social/comment/form.php:262
+msgid "Not published"
+msgstr ""
+
+#: lib/social/comment/form.php:263
+msgid "Website"
+msgstr ""
+
+#: lib/social/comment/form.php:267
+msgid "Post It"
+msgstr ""
+
+#: lib/social/comment/form.php:268
+msgid "Profile"
+msgstr ""
+
+#: lib/social/comment/form.php:269
+msgid "Post a Reply to %s"
+msgstr ""
+
+#: lib/social/comment/form.php:270
+msgid "cancel"
+msgstr ""
+
+#: lib/social/comment/form.php:274
+msgid "Comment"
+msgstr ""
+
+#: lib/social/comment/form.php:279
+msgid "Post a Comment"
+msgstr ""
+
+#: lib/social/comment/form.php:309 lib/social/comment/form.php:319
+msgid "Also post to %s"
+msgstr ""
+
+#: lib/social/controller/aggregation.php:144
+msgid "(%s New)"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:33
+msgid "View on %s"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:74
+#: lib/social/controller/broadcast.php:106
+msgid "Please enter content to be broadcasted."
+msgstr ""
+
+#: lib/social/controller/broadcast.php:79
+#: lib/social/controller/broadcast.php:111
+msgid "Content must not be longer than %s characters."
+msgstr ""
+
+#: lib/social/controller/broadcast.php:131
+msgid "Please select at least one account to broadcast to."
+msgstr ""
+
+#: lib/social/controller/broadcast.php:212
+msgid "Publish"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:218
+msgid "Update"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:222
+msgid "Broadcast"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:227
+msgid "Schedule"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:532
+msgid "Rate limit reached"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:549
+msgid "Duplicate status"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:566
+msgid "Account deauthorized"
+msgstr ""
+
+#: lib/social/controller/broadcast.php:693
+msgid "%s: Failed to broadcast post with Social."
+msgstr ""
+
+#: lib/social/date.php:120
+msgid "1 year"
+msgstr ""
+
+#: lib/social/date.php:123
+msgid "%s years"
+msgstr ""
+
+#: lib/social/date.php:130
+msgid "1 month"
+msgstr ""
+
+#: lib/social/date.php:133
+msgid "%s months"
+msgstr ""
+
+#: lib/social/date.php:140
+msgid "1 week"
+msgstr ""
+
+#: lib/social/date.php:143
+msgid "%s weeks"
+msgstr ""
+
+#: lib/social/date.php:150 lib/social/date.php:246
+msgid "1 day"
+msgstr ""
+
+#: lib/social/date.php:153
+msgid "%s days"
+msgstr ""
+
+#: lib/social/date.php:161 lib/social/date.php:257
+msgid "1 hour"
+msgstr ""
+
+#: lib/social/date.php:164 lib/social/date.php:260
+msgid "%s hours"
+msgstr ""
+
+#: lib/social/date.php:172 lib/social/date.php:268
+msgid "1 minute"
+msgstr ""
+
+#: lib/social/date.php:175 lib/social/date.php:271
+msgid "%s minutes"
+msgstr ""
+
+#: lib/social/date.php:183
+msgid "1 second"
+msgstr ""
+
+#: lib/social/date.php:186
+msgid "%s seconds"
+msgstr ""
+
+#: lib/social/date.php:226
+msgid "1 month ago"
+msgstr ""
+
+#: lib/social/date.php:229
+msgid "%s months ago"
+msgstr ""
+
+#: lib/social/date.php:236
+msgid "1 week ago"
+msgstr ""
+
+#: lib/social/date.php:239
+msgid "%s weeks ago"
+msgstr ""
+
+#: lib/social/date.php:249
+msgid "%s days ago"
+msgstr ""
+
+#: lib/social/date.php:277
+msgid "just now"
+msgstr ""
+
+#: lib/social/date.php:282 lib/social/date.php:285 lib/social/date.php:289
+msgid "%s ago"
+msgstr ""
+
+#: lib/social/date.php:315
+msgid "moments"
+msgstr ""
+
+#: lib/social/date.php:319
+msgid "a few minutes"
+msgstr ""
+
+#: lib/social/date.php:323
+msgid "less than an hour"
+msgstr ""
+
+#: lib/social/date.php:327
+msgid "a couple of hours"
+msgstr ""
+
+#: lib/social/date.php:331
+msgid "less than a day"
+msgstr ""
+
+#: lib/social/date.php:335
+msgid "about a day"
+msgstr ""
+
+#: lib/social/date.php:339
+msgid "a couple of days"
+msgstr ""
+
+#: lib/social/date.php:343
+msgid "less than a week"
+msgstr ""
+
+#: lib/social/date.php:347
+msgid "about a week"
+msgstr ""
+
+#: lib/social/date.php:351
+msgid "less than a month"
+msgstr ""
+
+#: lib/social/date.php:355
+msgid "about a month"
+msgstr ""
+
+#: lib/social/date.php:359
+msgid "a couple of months"
+msgstr ""
+
+#: lib/social/date.php:363
+msgid "less than a year"
+msgstr ""
+
+#: lib/social/date.php:367
+msgid "about a year"
+msgstr ""
+
+#: lib/social/date.php:371
+msgid "a couple of years"
+msgstr ""
+
+#: lib/social/date.php:375
+msgid "a few years"
+msgstr ""
+
+#: lib/social/date.php:379
+msgid "about a decade"
+msgstr ""
+
+#: lib/social/date.php:383
+msgid "a couple of decades"
+msgstr ""
+
+#: lib/social/date.php:387
+msgid "several decades"
+msgstr ""
+
+#: lib/social/date.php:391
+msgid "a long time"
+msgstr ""
+
+#: lib/social/date.php:396
+msgid "% ago"
+msgstr ""
+
+#: lib/social/date.php:401
+msgid "in %s"
+msgstr ""
+
+#: lib/social/response.php:96
+msgid ""
+"Unable to publish to %s with account %s. Please <a href=\"%\">re-authorize</"
+"a> this account."
+msgstr ""
+
+#: lib/social/service/account.php:141 lib/social/service/account.php:150
+msgid "Removed Account"
+msgstr ""
+
+#: lib/social/service/facebook.php:425
+msgid "Found %s additional likes."
+msgstr ""
+
+#: lib/social/service/twitter.php:338
+msgid "Retweet Search"
+msgstr ""
+
+#: lib/social/service/twitter.php:341
+#: views/wp-admin/post/meta/log/output.php:70
+msgid "Existing Comment"
+msgstr ""
+
+#: lib/social/service.php:126 lib/social/service.php:129
+msgid "Disconnect"
+msgstr ""
+
+#: lib/social/view.php:98
+msgid "You must set a file to be used before rendering."
+msgstr ""
+
+#: lib/social/view.php:135
+msgid "View %s does not exist."
+msgstr ""
+
+#: social-facebook.php:209
+msgid "Connect with Pages support"
+msgstr ""
+
+#: social-facebook.php:434
+msgid "%s liked this"
+msgstr ""
+
+#: social-twitter.php:358
+msgid " retweeted this"
+msgstr ""
+
+#: social-twitter.php:379
+msgid "Send as a reply"
+msgstr ""
+
+#: social-twitter.php:381
+msgid "URL of Tweet (to reply to)"
+msgstr ""
+
+#: social.php:118
+msgid "Failed to auto load class %s."
+msgstr ""
+
+#: social.php:149 social.php:152
+msgid "Example: %s"
+msgstr ""
+
+#: social.php:255
+msgid ""
+"Duplicate comment detected; it looks as though you&#8217;ve already said "
+"that!"
+msgstr ""
+
+#: social.php:340
+msgid ""
+"Sorry, Social requires PHP 5.2.4 or higher. Ask your host how to enable PHP "
+"5 as the default on your servers."
+msgstr ""
+
+#: social.php:394
+msgid "Post a Reply"
+msgstr ""
+
+#: social.php:431 social.php:1763
+msgid "Protected Tweet"
+msgstr ""
+
+#: social.php:432 social.php:1764
+msgid "Invalid URL"
+msgstr ""
+
+#: social.php:531
+msgid "Social Options"
+msgstr ""
+
+#. #-#-#-#-#  plugin.pot (Social 2.5)  #-#-#-#-#
+#. Plugin Name of the plugin/theme
+#: social.php:532 views/wp-admin/options.php:11
+msgid "Social"
+msgstr ""
+
+#: social.php:557
+msgid "Settings"
+msgstr ""
+
+#: social.php:573
+msgid ""
+"Social is shiny and new! Please <a href=\"%s\">verify and save your "
+"settings</a> to complete the upgrade."
+msgstr ""
+
+#: social.php:579 social.php:607
+msgid "<a href=\"%s\" class=\"social_dismiss\">[Dismiss]</a>"
+msgstr ""
+
+#: social.php:580
+msgid "To start using Social, please <a href=\"%s\">add an account</a>."
+msgstr ""
+
+#: social.php:593
+msgid "Social requires that either %s or %s be writable for CRON jobs."
+msgstr ""
+
+#: social.php:596
+msgid "Social requires that %s is writable for CRON jobs."
+msgstr ""
+
+#: social.php:606
+msgid ""
+"When you enable Social, users will be created when they log in with Facebook "
+"or Twitter to comment. These users are created without a role and will be "
+"prevented from accessing the admin side of WordPress until an administrator "
+"edits the user to give them a role."
+msgstr ""
+
+#: social.php:616
+msgid ""
+"%s needs to be writable for Social's logging. <a href=\"%\" class="
+"\"social_dismiss\">[Dismiss]</a>"
+msgstr ""
+
+#: social.php:626 social.php:660
+msgid "<a href=\"%s\" class=\"%s\">[Dismiss]</a>"
+msgstr ""
+
+#: social.php:652
+msgid ""
+"Social needs to re-authorize your Facebook account(s). Please re-connect "
+"your <a href=\"%s\">global</a> and <a href=\"%s\">personal</a> accounts."
+msgstr ""
+
+#: social.php:656
+msgid ""
+"Social needs to re-authorize your Facebook account(s).. Please re-connect "
+"your <a href=\"%s\">personal</a> accounts."
+msgstr ""
+
+#: social.php:774
+msgid "Social Broadcasting"
+msgstr ""
+
+#: social.php:782
+msgid "Social Comments"
+msgstr ""
+
+#: social.php:895
+msgid "Not Scheduled"
+msgstr ""
+
+#: social.php:1254 social.php:1255
+msgid "Log in"
+msgstr ""
+
+#: social.php:1393 social.php:1472
+msgid "Broadcasting comment #%s to %s using account #%s."
+msgstr ""
+
+#: social.php:1397 social.php:1486
+msgid ""
+"Error: Broadcast comment #%s to %s using account #%s, please go back and try "
+"again."
+msgstr ""
+
+#: social.php:1398
+msgid ""
+"Error: Your comment could not be sent to %s, please go back and try again."
+msgstr ""
+
+#: social.php:1410 social.php:1498
+msgid "Broadcasting comment #%s to %s using account #%s COMPLETE."
+msgstr ""
+
+#: social.php:1423
+msgid "Comment #%s saved."
+msgstr ""
+
+#: social.php:1661
+msgid "<a href=\"%s\" rel=\"%s\">Social Comments</a>"
+msgstr ""
+
+#: social.php:1690 views/wp-admin/post/meta/log/shell.php:23
+msgid "Find Social Comments"
+msgstr ""
+
+#: social.php:1701 social.php:1704 views/wp-admin/post/meta/log/shell.php:2
+msgid "Add Tweet by URL"
+msgstr ""
+
+#: social.php:1765
+msgid "Tweet Imported!"
+msgstr ""
+
+#: views/comment/comment.php:28
+msgid "Pingback"
+msgstr ""
+
+#: views/comment/comment.php:40
+msgid "replied:"
+msgstr ""
+
+#: views/comment/comment.php:50
+msgid "View"
+msgstr ""
+
+#: views/comment/comment.php:60
+msgid "Your comment is awaiting moderation."
+msgstr ""
+
+#: views/comment/comment.php:73 views/wp-admin/post/broadcast/options.php:71
+msgid "Edit"
+msgstr ""
+
+#: views/comment/logged_in_as.php:9
+msgid "WordPress Account"
+msgstr ""
+
+#: views/comment/logged_in_as.php:27
+msgid "Logged in as <a href=\"%1$s\">%2$s</a>."
+msgstr ""
+
+#: views/comment/social_item.php:12
+msgid "<a href=\"%s\" class=\"social-items-and-more\">... and %s more</a>"
+msgstr ""
+
+#: views/comment/top.php:3
+msgid "Sign in with %s"
+msgstr ""
+
+#: views/comment/top.php:7
+msgid "or"
+msgstr ""
+
+#: views/comments.php:6
+msgid ""
+"This post is password protected. Enter the password to view any comments."
+msgstr ""
+
+#: views/comments.php:11
+msgid "Logging In..."
+msgstr ""
+
+#: views/comments.php:17
+msgid "You must be <a href=\"%s\">logged in</a> to post a comment."
+msgstr ""
+
+#: views/comments.php:27
+msgid "Comments are closed."
+msgstr ""
+
+#: views/comments.php:90
+msgid "0 Replies"
+msgstr ""
+
+#: views/comments.php:90
+msgid "1 Reply"
+msgstr ""
+
+#: views/comments.php:90
+msgid "% Replies"
+msgstr ""
+
+#: views/comments.php:91
+msgid "1 Comment"
+msgid_plural "%1$s Comments"
+msgstr[0] ""
+msgstr[1] ""
+
+#: views/comments.php:92
+msgid "1 Tweet"
+msgid_plural "%1$s Tweets"
+msgstr[0] ""
+msgstr[1] ""
+
+#: views/comments.php:93
+msgid "1 Facebook"
+msgid_plural "%1$s Facebook"
+msgstr[0] ""
+msgstr[1] ""
+
+#: views/comments.php:94
+msgid "1 Pingback"
+msgid_plural "%1$s Pingbacks"
+msgstr[0] ""
+msgstr[1] ""
+
+#: views/comments.php:102
+msgid "Last reply was %s"
+msgstr ""
+
+#: views/comments.php:137
+msgid "Comment navigation"
+msgstr ""
+
+#: views/comments.php:138
+msgid "&larr; Older Comments"
+msgstr ""
+
+#: views/comments.php:139
+msgid "Newer Comments &rarr;"
+msgstr ""
+
+#: views/wp-admin/options.php:6
+msgid "Social settings have been updated."
+msgstr ""
+
+#: views/wp-admin/options.php:12
+msgid ""
+"Compliments of <a class=\"social-mailchimp-link\" href=\"%s\">MailChimp</a>"
+msgstr ""
+
+#: views/wp-admin/options.php:18 views/wp-admin/profile.php:5
+msgid "Accounts"
+msgstr ""
+
+#: views/wp-admin/options.php:19
+msgid ""
+"Available to all blog authors. Add accounts that only you can use in <a href="
+"\"%s\">your profile</a>."
+msgstr ""
+
+#: views/wp-admin/options.php:31
+msgid "Broadcasting is on by default"
+msgstr ""
+
+#: views/wp-admin/options.php:34
+#: views/wp-admin/post/meta/broadcast/default.php:5
+msgid "Yes"
+msgstr ""
+
+#: views/wp-admin/options.php:37
+#: views/wp-admin/post/meta/broadcast/default.php:8
+msgid "No"
+msgstr ""
+
+#: views/wp-admin/options.php:42
+msgid "Post broadcast format"
+msgstr ""
+
+#: views/wp-admin/options.php:46
+msgid ""
+"How you would like posts to be formatted when broadcasting to Twitter or "
+"Facebook?"
+msgstr ""
+
+#: views/wp-admin/options.php:49 views/wp-admin/options.php:74
+msgid "Tokens:"
+msgstr ""
+
+#: views/wp-admin/options.php:67
+msgid "Comment broadcast format"
+msgstr ""
+
+#: views/wp-admin/options.php:71
+msgid ""
+"How you would like comments to be formatted when broadcasting to Twitter or "
+"Facebook."
+msgstr ""
+
+#: views/wp-admin/options.php:91
+msgid "Twitter @anywhere"
+msgstr ""
+
+#: views/wp-admin/options.php:93
+msgid "Consumer API Key"
+msgstr ""
+
+#: views/wp-admin/options.php:95
+msgid ""
+"To enable Twitter's @anywhere hovercards for Twitter usernames, enter your "
+"application's Consumer API key here. (<a href=\"%1$s\" target=\"_blank"
+"\">Click here to get an API key</a>)"
+msgstr ""
+
+#: views/wp-admin/options.php:109
+msgid "Advanced Options"
+msgstr ""
+
+#: views/wp-admin/options.php:114
+msgid "Misc."
+msgstr ""
+
+#: views/wp-admin/options.php:121
+msgid "Disable Social's comment display (use standard theme output instead)."
+msgstr ""
+
+#: views/wp-admin/options.php:127
+msgid "Disable Social's broadcasting feature."
+msgstr ""
+
+#: views/wp-admin/options.php:134
+msgid "Fetch new comments"
+msgstr ""
+
+#: views/wp-admin/options.php:140
+msgid "Automatically"
+msgstr ""
+
+#: views/wp-admin/options.php:141
+msgid "(easiest)"
+msgstr ""
+
+#: views/wp-admin/options.php:147
+msgid "Never"
+msgstr ""
+
+#: views/wp-admin/options.php:148
+msgid "(disables fetching of comments)"
+msgstr ""
+
+#: views/wp-admin/options.php:154
+msgid "Using a custom CRON job <span class=\"description\">(advanced)</span>"
+msgstr ""
+
+#: views/wp-admin/options.php:156
+msgid ""
+"If you select this option, new tweets and Facebook posts will not be fetched "
+"unless you set up a system CRON job or fetch new items manually from the "
+"post edit screen. More help is also available in&nbsp;<code>README.txt</"
+"code>."
+msgstr ""
+
+#: views/wp-admin/options.php:159
+msgid "CRON Setup"
+msgstr ""
+
+#: views/wp-admin/options.php:161
+msgid "CRON API Key"
+msgstr ""
+
+#: views/wp-admin/options.php:161
+msgid "regenerate"
+msgstr ""
+
+#: views/wp-admin/options.php:166
+msgid ""
+"For your system CRON to run correctly, make sure it is pointing towards a "
+"URL that looks something like the following:"
+msgstr ""
+
+#: views/wp-admin/options.php:176
+msgid "Debug Mode"
+msgstr ""
+
+#: views/wp-admin/options.php:177
+msgid "(nerds only)"
+msgstr ""
+
+#: views/wp-admin/options.php:180
+msgid ""
+"If you turn debug on, Social will save additional information in "
+"<code>debug_log.txt</code> file. Not recommended for production environments."
+msgstr ""
+
+#: views/wp-admin/options.php:185
+msgid "Off <span class=\"description\">(recommended)</span>"
+msgstr ""
+
+#: views/wp-admin/options.php:191
+msgid "On <span class=\"description\">(for troubleshooting)</span>"
+msgstr ""
+
+#: views/wp-admin/options.php:196
+msgid "Debug log location:"
+msgstr ""
+
+#: views/wp-admin/parts/accounts.php:12
+msgid "Sign in with %s."
+msgstr ""
+
+#: views/wp-admin/parts/accounts.php:30 views/wp-admin/parts/accounts.php:64
+msgid "Default"
+msgstr ""
+
+#: views/wp-admin/parts/accounts.php:68
+msgid "Enabled"
+msgstr ""
+
+#: views/wp-admin/parts/accounts.php:87
+msgid "No Accounts"
+msgstr ""
+
+#: views/wp-admin/parts/accounts.php:97
+msgid ""
+"Default accounts will auto-broadcast when you publish via XML-RPC or email."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:4
+msgid "Hello"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:5
+#: views/wp-admin/post/broadcast/error/notice.php:4
+msgid ""
+"Social failed to broadcast the blog post \"%s\" to one or more of your "
+"Social accounts."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:24
+#: views/wp-admin/post/broadcast/error/notice.php:25
+msgid "Possible fixes:"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:33
+msgid ""
+"To reauthorize the deauthorized %s account above, please login and edit your "
+"accounts."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:36
+msgid ""
+"To reauthorize the deauthorized accounts above, please login and edit your "
+"accounts."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:39
+msgid "Personal accounts:"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:41
+msgid "Global accounts:"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:51
+#: views/wp-admin/post/broadcast/error/notice.php:57
+msgid ""
+"It is possible you have reached your broadcast limit, please try to "
+"broadcast again in an hour."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:54
+#: views/wp-admin/post/broadcast/error/notice.php:60
+msgid ""
+"It is possible you have broadcasted a duplicate message, please tweak your "
+"content a little and try again."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:57
+msgid ""
+"Social was not successful in broadcasting this post (perhaps the service is "
+"down?), please try broadcasting again. If you receive this message "
+"repeatedly, you can try the support forums."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/email.php:58
+msgid "Support forums:"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/notice.php:36
+msgid ""
+"To reauthorize the deauthorized %s account above, please edit your <a href="
+"\"%s\">global accounts</a> or your <a href=\"%s\">personal accounts</a>."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/notice.php:39
+msgid ""
+"To reauthorize the deauthorized %s account above, please edit your <a href="
+"\"%s\">personal accounts</a>."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/notice.php:44
+msgid ""
+"To reauthorize the deauthorized accounts above, please edit your <a href=\"%s"
+"\">global accounts</a> or your <a href=\"%s\">personal accounts</a>."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/notice.php:47
+msgid ""
+"To reauthorize the deauthorized account above, please edit your <a href=\"%s"
+"\">personal accounts</a>."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/error/notice.php:63
+msgid ""
+"Social was not successful in broadcasting this post (perhaps the service is "
+"down?), please try broadcasting again. If you receive this message "
+"repeatedly, you can try the <a href=\"%s\">support forums</a>."
+msgstr ""
+
+#: views/wp-admin/post/broadcast/facebook-link-preview.php:14
+msgid "Thumbnail image"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/options.php:5
+#: views/wp-admin/post/broadcast/options.php:14
+msgid "Social Broadcasts"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/options.php:50
+msgid "Previous Broadcasts"
+msgstr ""
+
+#: views/wp-admin/post/broadcast/options.php:93
+msgid "Cancel"
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/default.php:2
+msgid "Broadcast Post"
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/parts/broadcasted.php:10
+msgid "Sent to:"
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/parts/button.php:5
+msgid "My Accounts"
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/pending.php:4
+msgid "This post will not be broadcasted to any of your social accounts."
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/pending.php:8
+msgid "This post will be broadcasted to the following accounts."
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/private.php:2
+msgid "Broadcasting is disabled for private posts."
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/scheduled.php:5
+msgid ""
+"This post is scheduled to be published at a later date. However, it is not "
+"scheduled to be broadcasted to any of your social accounts."
+msgstr ""
+
+#: views/wp-admin/post/meta/broadcast/scheduled.php:9
+msgid "Scheduled for:"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:3
+msgid "Aggregation has not been run for this post yet."
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:14
+msgid "Manual Aggregation"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:17
+msgid "Automatic Aggregation"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:59
+msgid "Reply Search"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:62
+msgid "URL Search"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/output.php:87
+msgid "No results found."
+msgstr ""
+
+#: views/wp-admin/post/meta/log/shell.php:3
+msgid "Enter the URL of the tweet to add it as a comment."
+msgstr ""
+
+#: views/wp-admin/post/meta/log/shell.php:8
+msgid "Import Tweet"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/shell.php:18
+msgid "Manual Refresh"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/shell.php:19
+msgid "Next automatic run <span>%s</span>"
+msgstr ""
+
+#: views/wp-admin/post/meta/log/shell.php:30
+msgid "Log"
+msgstr ""
+
+#: views/wp-admin/profile.php:1
+msgid "Social Accounts"
+msgstr ""
+
+#: views/wp-admin/profile.php:6
+msgid "Only I can broadcast to these accounts."
+msgstr ""
+
+#. Plugin URI of the plugin/theme
+msgid "http://mailchimp.com/social-plugin-for-wordpress/"
+msgstr ""
+
+#. Description of the plugin/theme
+msgid ""
+"Broadcast newly published posts and pull in discussions using integrations "
+"with Twitter and Facebook. Brought to you by <a href=\"http://mailchimp.com"
+"\">MailChimp</a>."
+msgstr ""
+
+#. Author of the plugin/theme
+msgid "Crowd Favorite"
+msgstr ""
+
+#. Author URI of the plugin/theme
+msgid "http://crowdfavorite.com/"
+msgstr ""
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/aggregation/log.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,188 @@
+<?php
+/**
+ * Aggregation Logger
+ *
+ * @package Social
+ * @subpackage aggregation
+ */
+final class Social_Aggregation_Log {
+
+	/**
+	 * @var  array  array of singleton instances
+	 */
+	private static $instances = array();
+
+	/**
+	 * Initializes the aggregation logger for the defined post ID.
+	 *
+	 * [!!!] If the post ID is invalid an Exception will be thrown.
+	 *
+	 * @static
+	 * @param  int  $post_id
+	 * @return Social_Aggregation_Log
+	 */
+	public static function instance($post_id) {
+		if (!isset(self::$instances[$post_id])) {
+			self::$instances[$post_id] = new self($post_id);
+		}
+		return self::$instances[$post_id];
+	}
+
+	/**
+	 * @var  array  array of log items
+	 */
+	private $_log = array();
+
+	/**
+	 * @var  int  log timestamp
+	 */
+	private $_timestamp = 0;
+
+	/**
+	 * @var  int  post ID
+	 */
+	private $_post_id = 0;
+
+	/**
+	 * Loads the current log for the defined post ID.
+	 *
+	 * [!] For 1.0.2 we changed the logger to have a manual flag for each pull. This will
+	 *     apply the update if the loaded log is from older versions of the plugin.
+	 *
+	 * @param  int  $post_id
+	 */
+	public function __construct($post_id) {
+		$this->_post_id = $post_id;
+		$this->_timestamp = current_time('timestamp', 1);
+
+		$post = get_post($this->_post_id);
+		if ($post === null) {
+			throw new Exception(sprintf(__('Social failed to initialize the Aggregation_Log for post #%s.', 'social'), $this->_post_id));
+		}
+
+		// Load the current log for the post
+		$this->_log = get_post_meta($post_id, '_social_aggregation_log', true);
+	}
+
+	/**
+	 * Hook caught by echoing Social_Aggregate_Log.
+	 *
+	 * @return string
+	 */
+	public function __toString() {
+		return $this->render();
+	}
+
+	/**
+	 * Adds an item to the log.
+	 *
+	 * Log format:
+	 *
+	 *     array(
+	 *         '1234567890' => (object) array( // current_time('timestamp')
+	 *             'manual' => false, // Can be "true" or "false"
+	 *             'items' => array(
+	 *                 'twitter' => array(
+	 *                     (object) array(
+	 *                         'id' => '1234567890', // Broadcasted ID
+	 *                         'type' => 'url', // url|reply|retweet or whatever you want to group this item by
+	 *                         'ignored' => false, // Can be "true" or "false"
+	 *                         'data' => array(), // Extra data you want to use when displaying this item in the View
+	 *                     ),
+	 *                     // ... More items
+	 *                 ),
+	 *                 // ... Other registered services in aggregation
+	 *             )
+	 *         )
+	 *     )
+	 *
+	 * @param  string  $service  service key (twitter, facebook, etc.)
+	 * @param  string  $id       object id
+	 * @param  string  $type     type of response (reply, retweet, url)
+	 * @param  bool    $ignored  comment ignored?
+	 * @param  array   $data     extra data for output
+	 * @return Social_Aggregation_Log
+	 */
+	public function add($service, $id, $type, $ignored = false, array $data = null) {
+		if (!isset($this->_log[$this->_timestamp])) {
+			$this->_log[$this->_timestamp] = (object) array(
+				'manual' => false,
+				'items' => array(),
+			);
+		}
+		
+		if (!isset($this->_log[$this->_timestamp]->items[$service])) {
+			$this->_log[$this->_timestamp]->items[$service] = array();
+		}
+
+		foreach ($this->_log[$this->_timestamp]->items[$service] as $item) {
+			if ($item->id === $id) {
+				// Bail! Item already exists.
+				return $this;
+			}
+		}
+
+		$this->_log[$this->_timestamp]->items[$service][] = (object) array(
+			'id' => $id,
+			'type' => $type,
+			'ignored' => $ignored,
+			'data' => $data,
+		);
+
+		return $this;
+	}
+
+	/**
+	 * Force an item to be flagged as ignored.
+	 *
+	 * @param  int  $id
+	 * @return $this
+	 */
+	public function ignore($id) {
+		foreach ($this->_log[$this->_timestamp]->items as $service => $items) {
+			foreach ($items as $key => $item) {
+				if ($item->id == $id) {
+					$item->ignored = true;
+					$this->_log[$this->_timestamp]->items[$service][$key] = $item;
+
+					return $this;
+				}
+			}
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Saves the log.
+	 *
+	 * @param  bool  $manual
+	 * @return void
+	 */
+	public function save($manual = false) {
+		$this->_log[$this->_timestamp]->manual = $manual;
+		update_post_meta($this->_post_id, '_social_aggregation_log', $this->_log);
+	}
+
+	/**
+	 * Returns the current log.
+	 *
+	 * @return array
+	 */
+	public function current() {
+		return isset($this->_log[$this->_timestamp]) ? $this->_log[$this->_timestamp] : array();
+	}
+
+	/**
+	 * Renders the log to HTML.
+	 *
+	 * @return Social_View
+	 */
+	public function render() {
+		return Social_View::factory('wp-admin/post/meta/log/output', array(
+			'log' => $this->_log,
+			'services' => Social::instance()->services(),
+		))->render();
+	}
+
+} // End Social_Aggregation_Log
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/aggregation/queue.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,258 @@
+<?php
+/**
+ * Social's Aggregation Queue
+ *
+ * @package Social
+ * @subpackage aggregation
+ */
+final class Social_Aggregation_Queue {
+
+	/**
+	 * Initializes the queue.
+	 *
+	 * @static
+	 * @return Social_Aggregation_Queue
+	 */
+	public static function factory() {
+		return new Social_Aggregation_Queue;
+	}
+
+	/**
+	 * @var  array  queue of posts
+	 */
+	private $_queue = array();
+
+	/**
+	 * Populates Social_Aggregation_Queue with the queue from the database.
+	 */
+	public function __construct() {
+		$queue = Social::option('aggregation_queue');
+		if (!empty($queue)) {
+			$this->_queue = $queue;
+		}
+	}
+
+	/**
+	 * Returns an array of queue items that can be run.
+	 *
+	 * Format of returned content:
+	 *
+	 *     $runnable = array(
+	 *         '1234567890' => array( // Timestamp
+	 *             '23' => '15min', // Post ID => Next run interval key
+	 *             // ... Other posts => next run interval key
+	 *         ),
+	 *         // ... Other timestamps
+	 *     );
+	 *
+	 * @return array
+	 */
+	public function runnable() {
+		$queue = array();
+		$current_timestamp = current_time('timestamp', 1);
+		foreach ($this->_queue as $timestamp => $posts) {
+			if ($timestamp <= $current_timestamp) {
+				$queue[$timestamp] = $posts;
+			}
+		}
+
+		return $queue;
+	}
+
+	/**
+	 * Adds a post to the queue based on interval, if it's not already set.
+	 *
+	 * Add item to the first next run interval:
+	 *
+	 *     Social_Queue::factory()->add(23);
+	 *
+	 * Add item *after* the 15min interval:
+	 *
+	 *     Social_Queue::factory()->add(23, '15min');
+	 *
+	 *     [!!] If you provide an invalid interval key, the item will not be added to the queue.
+	 *
+	 * @param  int     $post_id   post id
+	 * @param  string  $interval  schedule key
+	 * @return Social_Aggregation_Queue
+	 */
+	public function add($post_id, $interval = null) {
+		$this->remove($post_id);
+
+		// Find the next interval to schedule
+		$next_run = 0;
+		if ($interval === null) {
+			foreach ($this->schedule() as $interval => $next_run) {
+				break;
+			}
+		}
+		else {
+			$schedule = $this->schedule();
+			$found = false;
+			foreach ($schedule as $key => $timestamp) {
+				if (!$found) {
+					if ($key == $interval) {
+						$found = true;
+						continue;
+					}
+				}
+				else {
+					$next_run = $timestamp;
+					$interval = $key;
+					break;
+				}
+			}
+
+			if (!$found) {
+				return $this;
+			}
+		}
+
+		if ($next_run) {
+			if (!isset($this->_queue[$next_run])) {
+				$this->_queue[$next_run] = array();
+			}
+
+			if (!isset($this->_queue[$next_run][$post_id])) {
+				$this->_queue[$next_run][$post_id] = $interval;
+				update_post_meta($post_id, '_social_aggregation_next_run', $next_run);
+			}
+
+			Social::log('Post #:post_id added to the aggregation queue. (Interval: :interval, Next run (approximately): :next_run)', array(
+				'post_id' => $post_id,
+				'interval' => $interval,
+				'next_run' => date(get_option('date_format').' '.get_option('time_format'), ($next_run + (get_option('gmt_offset') * 3600))),
+			));
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Removes a post from the queue completely, or by timestamp.
+	 *
+	 * @param  int  $post_id    post id
+	 * @param  int  $timestamp  (optional) timestamp to remove by
+	 * @return Social_Aggregation_Queue
+	 */
+	public function remove($post_id, $timestamp = null) {
+		$unset = false;
+		if ($timestamp === null) {
+			$queue = array();
+			foreach ($this->_queue as $timestamp => $posts) {
+				foreach ($posts as $id => $interval) {
+					if ($id !== $post_id) {
+						if (!isset($queue[$timestamp])) {
+							$queue[$timestamp] = array();
+						}
+
+						$queue[$timestamp][$id] = $interval;
+					}
+					else {
+						$unset = true;
+					}
+				}
+			}
+			$this->_queue = $queue;
+		}
+		else {
+			if (isset($this->_queue[$timestamp]) and isset($this->_queue[$timestamp][$post_id])) {
+				$unset = true;
+				unset($this->_queue[$timestamp][$post_id]);
+
+				if (empty($this->_queue[$timestamp])) {
+					unset($this->_queue[$timestamp]);
+				}
+			}
+		}
+
+		if ($unset) {
+			delete_post_meta($post_id, '_social_aggregation_next_run');
+			$this->save();
+
+			Social::log('Post #:post_id removed from the aggregation queue.', array(
+				'post_id' => $post_id
+			));
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Attempts to find the post in the queue.
+	 *
+	 * @param  int  $post_id
+	 * @return bool|object
+	 */
+	public function find($post_id) {
+		foreach ($this->_queue as $timestamp => $posts) {
+			foreach ($posts as $id => $interval) {
+				if ($id === $post_id) {
+					return (object) array(
+						'post_id' => $id,
+						'interval' => $interval,
+						'next_run' => $timestamp
+					);
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Saves the queue.
+	 *
+	 * @return void
+	 */
+	public function save() {
+		Social::option('aggregation_queue', $this->_queue);
+	}
+
+	/**
+	 * Returns a filterable list of schedules and their timestamp.
+	 *
+	 * @return mixed|void
+	 */
+	protected function schedule() {
+		$current_time = current_time('timestamp', 1);
+		return apply_filters('social_aggregation_schedule', array(
+			'15min' => $current_time + 900,
+			'30min' => $current_time + 1800,
+			'45min' => $current_time + 2700,
+			'60min' => $current_time + 3600,
+			'2hr' => $current_time + 7200,
+			'4hr' => $current_time + 14400,
+			'8hr' => $current_time + 28800,
+			'12hr' => $current_time + 43200,
+			'24hr' => $current_time + 86400,
+			'48hr' => $current_time + 172800,
+		));
+	}
+
+	/**
+	 * Builds the next run output.
+	 *
+	 * @static
+	 * @param  int  $timestamp
+	 * @return string
+	 */
+	public static function next_run($timestamp) {
+		$current_time = current_time('timestamp', 1);
+		$diff = $timestamp - $current_time;
+		if ($diff < 0) {
+			$next_run = Social_Date::fuzzy_span($current_time + 1, $current_time);
+		}
+		else if ($diff < Social_Date::HOUR) {
+			$next_run = Social_Date::fuzzy_span($timestamp, $current_time);
+		}
+		else if ($diff < (Social_Date::DAY * 2)) {
+			$next_run = Social_Date::span_formatted($timestamp, $current_time);
+			$next_run = sprintf(__('approximately %s', 'social'), $next_run);
+		}
+		else {
+			$next_run = Social_Date::fuzzy_span($timestamp, $current_time);
+		}
+		return $next_run;
+	}
+
+} // End Social_Aggregation_Queue
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/comment/form.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,411 @@
+<?php
+/**
+ * Just a singleton for filter methods to live under.
+ *
+ * @uses Social
+ * @package Social
+ * @subpackage comment
+ */
+final class Social_Comment_Form {
+
+	/**
+	 * @var  array  comment form instances
+	 */
+	protected static $instances = array();
+
+	/**
+	 * Loads an instance of the comment form.
+	 *
+	 * @static
+	 * @param  int    $post_id
+	 * @param  array  $args
+	 * @return Social_Comment_Form
+	 */
+	public static function instance($post_id, array $args = array()) {
+		if (!isset(self::$instances[$post_id])) {
+			self::$instances[$post_id] = new self($post_id, $args);
+		}
+		return self::$instances[$post_id];
+	}
+
+	/**
+	 * @var  object  post
+	 */
+	protected $post = null;
+
+	/**
+	 * @var  int  post ID
+	 */
+	protected $post_id = 0;
+
+	/**
+	 * @var  array  arguments to pass into the comment form
+	 */
+	protected $args = array();
+
+	/**
+	 * @var  bool  is logged in flag
+	 */
+	protected $is_logged_in = false;
+
+	/**
+	 * @var  WP_User  current user object
+	 */
+	protected $current_user = null;
+
+	/**
+	 * Initializes the comment form.
+	 *
+	 * @param  int    $post_id
+	 * @param  array  $args
+	 */
+	public function __construct($post_id, array $args = array()) {
+		global $post;
+
+		$this->post_id = $post_id;
+		$this->args = $args;
+		$this->is_logged_in = is_user_logged_in();
+		$this->current_user = wp_get_current_user();
+
+		if ($post === null) {
+			$post = get_post($this->post_id);
+		}
+
+		$this->post = $post;
+	}
+
+	/**
+	 * Magic method to render the form on echo.
+	 *
+	 * @return string
+	 */
+	public function __toString() {
+		return $this->render();
+	}
+
+	/**
+	 * Renders the comment form HTML.
+	 *
+	 * @static
+	 * @return string
+	 */
+	public function render() {
+		ob_start();
+		try {
+			$this->attach_hooks();
+			comment_form($this->args, $this->post_id);
+			$this->remove_hooks();
+		}
+		catch (Exception $e) {
+			ob_end_clean();
+			throw $e;
+		}
+
+		$comment_form = ob_get_clean();
+
+		return preg_replace('/<h3 id="reply-title">(.+)<\/h3>/', '<h3 id="reply-title"><span>$1</span></h3>', $comment_form);
+	}
+
+	/**
+	 * Attaches hooks before rending the comment form.
+	 *
+	 * @return void
+	 */
+	private function attach_hooks() {
+		add_action('comment_form_top', array($this, 'top'));
+		add_action('comment_form_defaults', array($this, 'configure_args'));
+		add_action('comment_form', array($this, 'comment_form_wrapper_open'), 0);
+		add_action('comment_form', array($this, 'comment_form_wrapper_close'), 99999);
+		add_filter('comment_form_logged_in', array($this, 'logged_in_as'));
+		add_filter('comment_id_fields', array($this, 'comment_id_fields'), 10, 3);
+	}
+
+	/**
+	 * Removes the hooks after rending the comment form.
+	 *
+	 * @return void
+	 */
+	private function remove_hooks() {
+		remove_action('comment_form_top', array($this, 'top'));
+		remove_action('comment_form_defaults', array($this, 'configure_args'));
+		remove_action('comment_form', array($this, 'comment_form_wrapper_open'), 0);
+		remove_action('comment_form', array($this, 'comment_form_wrapper_close'), 99999);
+		remove_filter('comment_form_logged_in', array($this, 'logged_in_as'));
+		remove_filter('comment_id_fields', array($this, 'comment_id_fields'), 10, 3);
+	}
+
+	/**
+	 * Echo opening wrapper around comment_form action.
+	 *
+	 * @return void
+	 */
+	public function comment_form_wrapper_open() {
+		echo '<div id="commentform-extras">';
+	}
+
+	/**
+	 * Echo closing wrapper around comment_form action.
+	 *
+	 * @return void
+	 */
+	public function comment_form_wrapper_close() {
+		echo '</div>';
+	}
+
+	/**
+	 * Creates a fieldgroup.
+	 *
+	 * @param  string  $label
+	 * @param  string  $id
+	 * @param  string  $tag
+	 * @param  string  $text
+	 * @param  array   $attr1
+	 * @param  array   $attr2
+	 * @param  string  $help_text
+	 * @return string
+	 */
+	public function to_field_group($label, $id, $tag, $text, $attr1 = array(), $attr2 = array(), $help_text = '') {
+		$attr = array_merge($attr1, $attr2);
+
+		$label = $this->to_tag('label', $label, array(
+			'for' => $id,
+			'class' => 'social-label'
+		));
+
+		$input_defaults = array(
+			'id' => $id,
+			'name' => $id,
+			'class' => 'social-input'
+		);
+		$input = $this->to_tag($tag, $text, $input_defaults, $attr);
+
+		$help = '';
+		if ($help_text) {
+			$help = $this->to_tag('small', $help_text, array('class' => 'social-help'));
+		}
+
+		return $this->to_tag('p', $label.$input.$help, array(
+			'class' => 'social-input-row social-input-row-'.$id
+		));
+	}
+
+	/**
+	 * Helper for generating input row HTML
+	 *
+	 * @param  string  $label
+	 * @param  int     $id
+	 * @param  string  $value
+	 * @param  bool    $req
+	 * @param  string  $help_text
+	 * @return string
+	 * @uses Social::to_tag()
+	 */
+	public function to_input_group($label, $id, $value, $req = false, $help_text = '') {
+		$maybe_req = ($req ? array('required' => 'required') : array());
+
+		return $this->to_field_group($label, $id, 'input', false, $maybe_req, array(
+			'type' => 'text',
+			'value' => $value
+		), $help_text);
+	}
+
+	/**
+	 * Creates a textarea.
+	 *
+	 * @param  string  $label
+	 * @param  string  $id
+	 * @param  string  $value
+	 * @param  bool    $req
+	 * @return string
+	 */
+	public function to_textarea_group($label, $id, $value, $req = true) {
+		$maybe_req = ($req ? array('required' => 'required') : array());
+		return $this->to_field_group($label, $id, 'textarea', $value, $maybe_req);
+	}
+
+	/**
+	 * @param  string  $result
+	 * @param  string  $id
+	 * @param  string  $replytoid
+	 * @return string
+	 */
+	public function comment_id_fields($result, $id, $replytoid) {
+		$html = $this->get_also_post_to_controls();
+
+		$html .= $result;
+
+		$hidden = array('type' => 'hidden');
+		$html .= $this->to_tag('input', false, $hidden, array(
+			'id' => 'use_twitter_reply',
+			'name' => 'use_twitter_reply',
+			'value' => 0
+		));
+		$html .= $this->to_tag('input', false, $hidden, array(
+			'id' => 'in_reply_to_status_id',
+			'name' => 'in_reply_to_status_id',
+			'value' => ''
+		));
+
+		return $html;
+	}
+
+	/**
+	 * @param  array  $default_args
+	 * @return array
+	 */
+	public function configure_args(array $default_args) {
+		$commenter = wp_get_current_commenter();
+		$req = get_option('require_name_email');
+
+		$fields = array(
+			'author' => $this->to_input_group(__('Name', 'social'), 'author', $commenter['comment_author'], $req),
+			'email' => $this->to_input_group(__('Email', 'social'), 'email', $commenter['comment_author_email'], $req, __('Not published', 'social')),
+			'url' => $this->to_input_group(__('Website', 'social'), 'url', $commenter['comment_author_url'])
+		);
+
+		$args = array(
+			'label_submit' => __('Post It', 'social'),
+			'title_reply' => __('Profile', 'social'),
+			'title_reply_to' => __('Post a Reply to %s', 'social'),
+			'cancel_reply_link' => __('cancel', 'social'),
+			'comment_notes_after' => '',
+			'comment_notes_before' => '',
+			'fields' => $fields,
+			'comment_field' => $this->to_textarea_group(__('Comment', 'social'), 'comment', '', true, 'textarea')
+		);
+
+		if ($this->is_logged_in) {
+			$override = array(
+				'title_reply' => __('Post a Comment', 'social')
+			);
+			$args = array_merge($args, $override);
+		}
+
+		return array_merge($default_args, $args);
+	}
+
+	/**
+	 * Outputs checkboxes for cross-posting
+	 * 
+	 * @uses Social::to_tag()
+	 * @return string
+	 */
+	public function get_also_post_to_controls() {
+		if ($this->is_logged_in and $this->post->post_status != 'private') {
+			$id = 'post_to_service';
+			$label_base = array(
+				'for' => $id,
+				'id' => 'post_to'
+			);
+
+			$checkbox = $this->to_tag('input', false, array(
+				'type' => 'checkbox',
+				'name' => $id,
+				'id' => $id,
+				'value' => 1
+			));
+
+			if (current_user_can('manage_options')) {
+				$text = sprintf(__('Also post to %s', 'social'), '<span></span>');
+				$post_to = $this->to_tag('label', $checkbox.' '.$text, $label_base, array('style' => 'display:none;'));
+			}
+			else {
+				$post_to = '';
+				foreach (Social::instance()->services() as $key => $service) {
+					if (count($service->accounts())) {
+						Social::log(print_r($service->accounts(), true));
+						foreach ($service->accounts() as $account) {
+							if ($account->personal()) {
+								$text = sprintf(__('Also post to %s', 'social'), $service->title());
+								$post_to .= $this->to_tag('label', $checkbox . ' ' . $text, $label_base);
+								break;
+							}
+						}
+					}
+				}
+			}
+
+			return $post_to;
+		}
+
+		return '';
+	}
+
+	/**
+	 * Hook for 'comment_form_top' action.
+	 *
+	 * @return void
+	 */
+	public function top() {
+		if (!$this->is_logged_in) {
+			echo Social_View::factory('comment/top', array(
+				'services' => Social::instance()->services()
+			));
+		}
+	}
+
+	/**
+	 * Hook for 'comment_form_logged_in' action.
+	 *
+	 * @return string
+	 */
+	public function logged_in_as() {
+		$services = Social::instance()->services();
+		$accounts = array();
+		foreach ($services as $key => $service) {
+			if (count($service->accounts())) {
+				$accounts[$key] = $service->accounts();
+			}
+		}
+		return Social_View::factory('comment/logged_in_as', array(
+			'services' => $services,
+			'accounts' => $accounts,
+			'current_user' => $this->current_user,
+		))->render();
+	}
+
+	/**
+	 * Helper for creating HTML tag from strings and arrays of attributes.
+	 *
+	 * @param  string  $tag
+	 * @param  string  $text
+	 * @param  array   $attr1
+	 * @param  array   $attr2
+	 * @return string
+	 */
+	private function to_tag($tag, $text = '', $attr1 = array(), $attr2 = array()) {
+		if (function_exists('esc_attr')) {
+			$tag = esc_attr($tag);
+		}
+
+		$attrs = $this->to_attr($attr1, $attr2);
+		if ($text !== false) {
+			return '<'.$tag.' '.$attrs.'>'.$text.'</'.$tag.'>';
+		}
+			// No text == self closing tag
+		else {
+			return '<'.$tag.' '.$attrs.' />';
+		}
+	}
+
+	/**
+	 * Helper: Turn an array or two into HTML attribute string
+	 *
+	 * @param  array  $arr1
+	 * @param  array  $arr2
+	 * @return string
+	 */
+	private function to_attr($arr1 = array(), $arr2 = array()) {
+		$attrs = array();
+		$arr = array_merge($arr1, $arr2);
+		foreach ($arr as $key => $value) {
+			if (function_exists('esc_attr')) {
+				$key = esc_attr($key);
+				$value = esc_attr($value);
+			}
+			$attrs[] = $key.'="'.$value.'"';
+		}
+		return implode(' ', $attrs);
+	}
+
+} // End Social_Comment_Form
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,45 @@
+<?php
+/**
+ * Core Controller
+ *
+ * @package Social
+ */
+abstract class Social_Controller {
+
+	/**
+	 * @var  Social_Request
+	 */
+	protected $request;
+
+	/**
+	 * @var  Social
+	 */
+	protected $social;
+
+	/**
+	 * Initializes the controller with the request and Social objects.
+	 *
+	 * @param  Social_Request  $request
+	 */
+	public function __construct(Social_Request $request) {
+		$this->request = $request;
+		$this->social = Social::instance();
+	}
+	
+	public function request() {
+		return $this->request;
+	}
+
+	public function social() {
+		return $this->social;
+	}
+	
+	protected function verify_nonce() {
+		$nonce = $this->request->query('_wpnonce');
+		if (!wp_verify_nonce($nonce, $this->request->action())) {
+			Social::log('NONCE Failure', array(), null, true);
+			wp_die('Oops, please try again.');
+		}
+	}
+
+} // End Social_Controller
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/aggregation.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,178 @@
+<?php
+/**
+ * Aggregation controller
+ *
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_Aggregation extends Social_Controller {
+
+	/**
+	 * Runs the aggregation for the requested post ID.
+	 *
+	 * @return void
+	 */
+	public function action_run() {
+
+		$this->verify_nonce();
+
+		$fetch = Social::option('fetch_comments');
+		if (empty($fetch)) {
+			Social::log('Aggregation has been disabled, exiting.');
+			return;
+		}
+
+		$post = get_post($this->request->query('post_id'));
+		if ($post === null) {
+			return;
+		}
+
+		Social::log('Begin aggregation for post #:post_id.', array(
+			'post_id' => $post->ID,
+		));
+
+		// Get URLs to query
+		$default_urls = array(
+			home_url('?p='.$post->ID)
+		);
+		$url = wp_get_shortlink($post->ID);
+		if (strpos($url, '?p=') === false) {
+			$default_urls[] = $url;
+		}
+
+		// Add the permalink?
+		$permalink = get_permalink($post->ID);
+		if ($default_urls[0] != $permalink) {
+			$default_urls[] = $permalink;
+		}
+
+		$broadcasted_ids = get_post_meta($post->ID, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids)) {
+			$broadcasted_ids = array();
+		}
+
+		$aggregated_ids = get_post_meta($post->ID, '_social_aggregated_ids', true);
+		if (empty($aggregated_ids)) {
+			$aggregated_ids = array();
+		}
+
+		$post->broadcasted_ids = $broadcasted_ids;
+		$post->aggregated_ids = $aggregated_ids;
+		$post->results = array();
+		foreach ($this->social->services() as $key => $service) {
+			$urls = $default_urls;
+			$post->results[$key] = array();
+			if (!isset($post->aggregated_ids[$key])) {
+				$post->aggregated_ids[$key] = array();
+			}
+
+			if (isset($broadcasted_ids[$key]) and count($broadcasted_ids[$key])) {
+				$service->aggregate_by_api($post);
+
+				foreach ($broadcasted_ids[$key] as $broadcasted) {
+					foreach ($broadcasted as $data) {
+						if (isset($data['urls']) and is_array($data['urls'])) {
+							foreach ($data['urls'] as $url) {
+								$urls[] = $url;
+							}
+						}
+					}
+				}
+			}
+
+			// URL Search
+			$urls = apply_filters('social_search_urls', $urls, $key);
+			$urls = array_unique($urls);
+			if (count($urls)) {
+				foreach ($urls as $key => $url) {
+					$urls[$key] = urlencode($url);
+				}
+				$service->aggregate_by_url($post, $urls);
+			}
+		}
+
+		if (count($post->results)) {
+			foreach ($post->results as $key => $results) {
+				if (count($results)) {
+					$this->social->service($key)->save_aggregated_comments($post);
+				}
+			}
+
+			update_post_meta($post->ID, '_social_aggregated_ids', $post->aggregated_ids);
+		}
+
+		Social::log('Aggregation for post #:post_id complete.', array(
+			'post_id' => $post->ID,
+		));
+
+		// Some cleanup...
+		unset($post->broadcasted_ids);
+		unset($post->aggregated_ids);
+		unset($post->results);
+
+		if ($this->request->is_ajax()) {
+			// Re-add to the queue?
+			$queue = Social_Aggregation_Queue::factory();
+			if (!$queue->find($post->ID)) {
+				$queue->add($post->ID, '24hr')->save();
+			}
+
+			$log = Social_Aggregation_Log::instance($post->ID);
+			$log->save(true);
+			if (isset($_GET['render']) and $_GET['render'] == 'false') {
+				$total = 0;
+				$log = $log->current();
+				if (isset($log->items)) {
+					foreach ($log->items as $service => $items) {
+						foreach ($items as $item) {
+							if (!$item->ignored) {
+								++$total;
+							}
+						}
+					}
+				}
+
+				$awaiting_mod = wp_count_comments();
+				$awaiting_mod = $awaiting_mod->moderated;
+
+				$link = esc_url(admin_url('edit-comments.php?p='.$post->ID));
+
+				$html = '';
+				if (!isset($_GET['hide_li']) or $_GET['hide_li'] == 'false') {
+					$html = '<li id="wp-adminbar-comments-social">';
+				}
+				$html .= '<a href="'.$link.'"><span class="social-aggregation-results">'.sprintf(__('(%s New)', 'social'), $total).'</span></a>';
+				if (!isset($_GET['hide_li']) or $_GET['hide_li'] == 'false') {
+					$html .= '</li>';
+				}
+
+				$response = array(
+					'total' => number_format_i18n($awaiting_mod),
+					'link' => $link,
+					'html' => $html,
+				);
+				echo json_encode($response);
+			}
+			else {
+				$queue = $queue->find($post->ID);
+				$next_run = 0;
+				if ($queue !== false) {
+					$next_run = Social_Aggregation_Queue::next_run($queue->next_run);
+				}
+
+				echo json_encode(array(
+					'html' => $log->render(),
+					'next_run' => $next_run,
+				));
+			}
+			exit;
+		}
+		else {
+			Social_Aggregation_Log::instance($post->ID)->save();
+		}
+
+		// Decrement the semaphore
+		Social_Semaphore::factory()->decrement();
+	}
+
+} // End Social_Controller_Aggregation
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/auth.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,264 @@
+<?php
+/**
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_Auth extends Social_Controller {
+
+	private function auth_nonce_key($salt = null) {
+		if (is_null($salt)) {
+			$salt = $this->auth_nonce_salt();
+		}
+		return md5('social_authentication'.AUTH_KEY.$salt);
+	}
+	
+	private function auth_nonce_salt() {
+		return md5(microtime().$_SERVER['SERVER_ADDR']);
+	}
+
+	/**
+	 * Sets the nonce cookie then redirects to Sopresto.
+	 *
+	 * @return void
+	 */
+	public function action_authorize() {
+		$proxy = urldecode($this->request->query('target'));
+		if (strpos($proxy, Social::$api_url) !== false) {
+			$salt = $this->auth_nonce_salt();
+			$id = wp_create_nonce($this->auth_nonce_key($salt));
+			$url = home_url('index.php');
+			$args = array(
+				'social_controller' => 'auth',
+				'social_action' => 'authorized',
+				'salt' => $salt,
+			);
+
+			if (is_admin()) {
+				$args['is_admin'] = 'true';
+				$args['user_id'] = get_current_user_id();
+				if (defined('IS_PROFILE_PAGE')) {
+					$args['personal'] = 'true';
+					$url = add_query_arg('personal', 'true', $url);
+				}
+			}
+			else {
+				$post_id = $this->request->query('post_id');
+				if ($post_id !== null) {
+					$args['p'] = $post_id;
+				}
+
+				// Set the nonce cookie
+				setcookie('social_auth_nonce', $id, 0, '/');
+			}
+
+			$proxy = add_query_arg(array(
+				'v' => '2',
+				'id' => $id,
+				'response_url' => urlencode(add_query_arg($args, $url))
+			), $proxy);
+
+			$proxy = apply_filters('social_proxy_url', $proxy);
+		}
+
+		Social::log('Authorizing with URL: '.$proxy);
+		wp_redirect($proxy);
+		exit;
+	}
+
+	/**
+	 * Handles the authorized response.
+	 *
+	 * @return void
+	 */
+	public function action_authorized() {
+		// User ID on the request? Must be set before nonce comparison
+		$user_id = stripslashes($this->request->query('user_id'));
+		if ($user_id !== null) {
+			wp_set_current_user($user_id);
+		}
+
+		$nonce = stripslashes($this->request->post('id'));
+		$salt = stripslashes($this->request->query('salt'));
+		if (wp_verify_nonce($nonce, $this->auth_nonce_key($salt)) === false) {
+			Social::log('Failed to verify authentication nonce.');
+			echo json_encode(array(
+				'result' => 'error',
+				'message' => 'Invalid nonce',
+			));
+			exit;
+		}
+
+		Social::log('Authorizing with nonce :nonce.', array('nonce' => $nonce));
+
+		$response = stripslashes_deep($this->request->post('response'));
+		$account = (object) array(
+			'keys' => (object) $response['keys'],
+			'user' => (object) $response['user'],
+		);
+		$account->user = $this->social->kses($account->user);
+
+		$class = 'Social_Service_'.$response['service'].'_Account';
+		$account = new $class($account);
+
+		$service = $this->social->service($response['service'])->account($account);
+		$is_personal = false;
+		$is_admin = $this->request->query('is_admin');
+		if ($is_admin == 'true') {
+			$user_id = get_current_user_id();
+
+			$personal = $this->request->query('personal');
+			if ($personal === 'true') {
+				$is_personal = true;
+				$account->personal(true);
+			}
+			else {
+				$account->universal(true);
+			}
+
+			$use_pages = $this->request->query('use_pages');
+			if ($use_pages == 'true') {
+				$account->use_pages($is_personal, true);
+			}
+		}
+		else {
+			$user_id = $service->create_user($account, $nonce);
+			$account->personal(true);
+			$is_personal = true;
+
+			// Store avatar
+			update_user_meta($user_id, 'social_avatar', $account->avatar());
+			update_user_meta($user_id, 'show_admin_bar_front', 'false');
+		}
+
+		if ($user_id !== false) {
+			Social::log('Saving account #:id.', array(
+				'id' => $account->id(),
+			));
+			$service->save($is_personal);
+
+			// Remove the service from the errors?
+			$deauthed = get_option('social_deauthed');
+			if (isset($deauthed[$response['service']][$account->id()])) {
+				unset($deauthed[$response['service']][$account->id()]);
+				update_option('social_deauthed', $deauthed);
+
+				// Remove from the global broadcast content as well.
+				$this->social->remove_from_default_accounts($response['service'], $account->id());
+			}
+
+			// 2.0 Upgrade
+			if ($response['service'] == 'facebook') {
+				delete_user_meta(get_current_user_id(), 'social_2.0_upgrade');
+			}
+
+			echo json_encode(array(
+				'result' => 'success',
+				'message' => 'User created',
+			));
+		}
+		else {
+			echo json_encode(array(
+				'result' => 'error',
+				'message' => 'Failed to create user',
+			));
+		}
+		exit;
+	}
+
+	/**
+	 * Disconnects an account.
+	 *
+	 * @return void
+	 */
+	public function action_disconnect() {
+		$id = $this->request->query('id');
+		$service_key = $this->request->query('service');
+		$personal = false;
+		if (defined('IS_PROFILE_PAGE')) {
+			Social::log('Disconnecting a personal account #:id', array('id' => $id));
+			$personal = true;
+		}
+		else {
+			Social::log('Disconnecting a universal account #:id', array('id' => $id));
+		}
+
+		$this->social->service($service_key)->disconnect($id);
+		$this->social->remove_from_default_accounts($service_key, $id);
+
+		// Flush the cache
+		wp_cache_delete('services', 'social');
+
+		if (is_admin()) {
+			wp_redirect(Social::settings_url(array(), $personal));
+		}
+		else {
+			wp_logout();
+			wp_redirect($this->request->query('redirect_to'));
+		}
+		exit;
+	}
+
+	/**
+	 * Renders the new comment form.
+	 *
+	 * @return void
+	 */
+	public function action_reload_form() {
+		if (!$this->request->is_ajax()) {
+			exit;
+		}
+
+		if (isset($_COOKIE['social_auth_nonce'])) {
+			$cookie_nonce = stripslashes($_COOKIE['social_auth_nonce']);
+			// Find the user by NONCE.
+			global $wpdb;
+			$user_id = $wpdb->get_var($wpdb->prepare("
+				SELECT user_id
+				  FROM $wpdb->usermeta
+				 WHERE meta_key = %s
+			", 'social_auth_nonce_'.$cookie_nonce));
+
+			if ($user_id !== null) {
+				Social::log('Found user #:id using nonce :nonce.', array(
+					'id' => $user_id,
+					'nonce' => $cookie_nonce
+				));
+
+				// Log the user in
+				wp_set_current_user($user_id);
+				add_filter('auth_cookie_expiration', array($this->social, 'auth_cookie_expiration'));
+				wp_set_auth_cookie($user_id, true);
+				remove_filter('auth_cookie_expiration', array($this->social, 'auth_cookie_expiration'));
+
+				delete_user_meta($user_id, 'social_auth_nonce_'.$cookie_nonce);
+				setcookie('social_auth_nonce', '', -3600, '/');
+
+				$post_id = $this->request->query('post_id');
+				$form = trim(Social_Comment_Form::instance($post_id)->render());
+				echo json_encode(array(
+					'result' => 'success',
+					'html' => $form,
+					'disconnect_url' => wp_loginout('', false)
+				));
+			}
+			else {
+				Social::log('Failed to find the user using nonce :nonce.', array(
+					'nonce' => $_COOKIE['social_auth_nonce']
+				));
+
+				echo json_encode(array(
+					'result' => 'error',
+					'html' => 'not logged in',
+				));
+			}
+		}
+		else {
+			echo json_encode(array(
+				'result' => 'error',
+				'html' => 'not logged in',
+			));
+		}
+		exit;
+	}
+
+} // End Social_Controller_Auth
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/broadcast.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,698 @@
+<?php
+/**
+ * Broadcast Controller
+ *
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_Broadcast extends Social_Controller {
+
+	/**
+	 * Formats previous broadcasts for display.
+	 *
+	 * @param  string $broadcasted_id
+	 * @param  array  $broadcast
+	 * @param  object $account
+	 * @param  object $service
+	 * @return string
+	 */
+	private function previous_broadcast_excerpt($broadcasted_id, $broadcast, $account, $service) {
+		$content = false;
+		if (($content = base64_decode($broadcast['message'])) !== false) {
+			if ($content = json_decode($content)) {
+				if (isset($content->text)) {
+					$content = $content->text;
+				}
+			}
+		}
+		if (!$content) {
+			$content = $broadcast['message'];
+		}
+		$content = esc_html($content);
+		if ($account->has_user() or $service->key() != 'twitter') {
+			$content .= ' &middot; <a href="'.esc_url($service->status_url($account->username(), $broadcasted_id)).'" target="_blank">'.sprintf(__('View on %s', 'social'), esc_html($service->title())).'</a>';
+		}
+		$content = wpautop($content);
+		return $content;
+	}
+	/**
+	 * Displays the broadcast options form.
+	 *
+	 * @return void
+	 */
+	public function action_options() {
+		$post = get_post($this->request->post('post_ID'));
+		if ($post === null or get_post_meta($post->ID, '_social_notify', true) != '1') {
+			if ($post === null) {
+				wp_redirect(admin_url('index.php'));
+			}
+
+			return;
+		}
+
+		$errors = array();
+		$services = $this->social->services();
+
+		$accounts_selected = false;
+		if ($this->request->post('social_action') !== null) {
+			// this is coming from $_POST unmodified, WP normalizes with slashes - strip them.
+			$service_accounts = stripslashes_deep($this->request->post('social_accounts'));
+			$account_content = stripslashes_deep($this->request->post('social_account_content'));
+
+			$account_content_meta = $account_service_meta = array();
+			foreach ($services as $key => $service) {
+				if (count($service->accounts())) {
+					if (isset($service_accounts[$key])) {
+						$accounts_selected = true;
+						foreach ($service_accounts[$key] as $account_id) {
+							$account_id = explode('|', $account_id);
+							if (empty($account_content[$key][$account_id[0]])) {
+								if (isset($errors[$key])) {
+									$errors[$key] = array();
+								}
+
+								$errors[$key][$account_id[0]] = __('Please enter content to be broadcasted.', 'social');
+							}
+							else {
+								$account_content[$key][$account_id[0]] = $account_content[$key][$account_id[0]];
+								if (strlen($account_content[$key][$account_id[0]]) > $service->max_broadcast_length()) {
+									$errors[$key][$account_id[0]] = sprintf(__('Content must not be longer than %s characters.', 'social'), $service->max_broadcast_length());
+								}
+								else {
+									if (!isset($account_content_meta[$key])) {
+										$account_content_meta[$key] = $account_service_meta[$key] = array();
+									}
+
+									$account_content_meta[$key][$account_id[0]] = $account_content[$key][$account_id[0]];
+									$account_service_meta[$key][$account_id[0]] = $service->get_broadcast_extras($account_id[0], $post);
+								}
+							}
+						}
+					}
+
+					// TODO - refactor this to make it more efficient (and, as below to move into Facebook plugin)
+					if ($key == 'facebook') {
+						$pages = $this->request->post('social_facebook_pages');
+						if (!empty($pages) && is_array($pages) && count($pages)) {
+							foreach ($service->accounts() as $account) {
+								if (isset($pages[$account->id()])) {
+									$accounts_selected = true;
+									foreach ($pages[$account->id()] as $page_id) {
+										if (empty($account_content[$key][$page_id])) {
+											if (isset($errors[$key])) {
+												$errors[$key] = array();
+											}
+
+											$errors[$key][$page_id] = __('Please enter content to be broadcasted.', 'social');
+										}
+										else {
+											$account_content[$key][$page_id] = $account_content[$key][$page_id];
+											if (strlen($account_content[$key][$page_id]) > $service->max_broadcast_length()) {
+												$errors[$key][$page_id] = sprintf(__('Content must not be longer than %s characters.', 'social'), $service->max_broadcast_length());
+											}
+											else {
+												if (!isset($account_content_meta[$key])) {
+													$account_content_meta[$key] = array();
+												}
+
+												$account_content_meta[$key][$page_id] = $account_content[$key][$page_id];
+												$account_service_meta[$key][$page_id] = $service->get_broadcast_extras($page_id, $post);
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+			}
+
+			if (!in_array($post->post_status, array('future', 'pending')) and !$accounts_selected and !isset($errors['rebroadcast'])) {
+				$errors['rebroadcast'] = __('Please select at least one account to broadcast to.', 'social');
+			}
+
+			if (!count($errors)) {
+				$broadcast_accounts = array();
+				foreach ($services as $key => $service) {
+					if (isset($service_accounts[$key])) {
+						$accounts = array();
+						foreach ($service_accounts[$key] as $account) {
+							$account = explode('|', $account);
+
+							$accounts[$account[0]] = (object) array(
+								'id' => $account[0],
+								'universal' => isset($account[1]),
+							);
+						}
+
+						if (!empty($accounts)) {
+							$broadcast_accounts[$key] = $accounts;
+						}
+					}
+
+					// TODO abstract to Facebook plugin.
+					if ($key == 'facebook') {
+						$pages = $this->request->post('social_facebook_pages');
+						if (is_array($pages)) {
+							foreach ($service->accounts() as $account) {
+								if (isset($pages[$account->id()])) {
+									// TODO This could use some DRY love
+									$universal_pages = $account->pages();
+									$personal_pages = $account->pages(null, true);
+									foreach ($pages[$account->id()] as $page_id) {
+										if (!isset($broadcast_accounts[$key])) {
+											$broadcast_accounts[$key] = array();
+										}
+
+										if (!isset($broadcast_accounts[$key][$page_id])) {
+											if (isset($universal_pages[$page_id])) {
+												$broadcast_accounts[$key][$page_id] = (object) array(
+													'id' => $page_id,
+													'name' => $universal_pages[$page_id]->name,
+													'universal' => true,
+													'page' => true,
+												);
+											}
+											else if (isset($personal_pages[$page_id])) {
+												$broadcast_accounts[$key][$page_id] = (object) array(
+													'id' => $page_id,
+													'name' => $personal_pages[$page_id]->name,
+													'universal' => false,
+													'page' => true,
+												);
+											}
+										}
+									}
+								}
+							}
+						}
+					}
+				}
+
+				// Store the content, add slashes since update_post_meta() strips them
+				update_post_meta($post->ID, '_social_broadcast_content', addslashes_deep($account_content_meta));
+				update_post_meta($post->ID, '_social_broadcast_meta', addslashes_deep($account_service_meta));
+				update_post_meta($post->ID, '_social_broadcast_accounts', addslashes_deep($broadcast_accounts));
+
+				if (!in_array($this->request->post('social_action'), array('Schedule', 'Update'))) {
+					$this->action_run($post);
+				}
+
+				$location = $this->request->post('location');
+				if ($location == null) {
+					$location = get_edit_post_link($post->ID, false);
+				}
+
+				wp_redirect($location);
+				exit;
+			}
+		}
+
+		$step = 'Publish';
+		$step_text = __('Publish', 'social');
+		if ($this->request->post('social_broadcast') !== null or $this->request->post('social_action') !== null) {
+			if (($this->request->post('social_action') === null and $this->request->post('social_broadcast') == 'Edit') or
+				$this->request->post('social_action') == 'Update')
+			{
+				$step = 'Update';
+				$step_text = __('Update', 'social');
+			}
+			else if ($this->request->post('social_action') != 'Publish') {
+				$step = 'Broadcast';
+				$step_text = __('Broadcast', 'social');
+			}
+		}
+		else if ($post->post_status == 'future' or ($this->request->post('publish') == 'Schedule')) {
+			$step = 'Schedule';
+			$step_text = __('Schedule', 'social');
+		}
+
+// find previous broadcasts
+		$broadcasted_ids = get_post_meta($post->ID, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids)) {
+			$broadcasted_ids = array();
+		}
+
+// consolidate accounts (merge child accounts into single list)
+		$_services = array(); // the data we prep for the view will be in here
+		$_defaults = array(
+			'name' => '',
+			'avatar' => '',
+			'field_name_content' => '',
+			'field_name_checked' => '',
+			'field_value_checked' => '',
+			'checked' => false,
+			'content' => '',
+			'broadcasts' => array(),
+			'error' => '',
+		);
+		foreach ($services as $key => $service) {
+			$_services[$key] = array();
+			if (isset($broadcasted_ids[$key])) {
+				$service_broadcasts = $broadcasted_ids[$key];
+			}
+			else {
+				$service_broadcasts = array();
+			}
+			$accounts = $service->accounts();
+			if (count($accounts)) {
+				$i = 0;
+				foreach ($accounts as $account) {
+					$data = array(
+						'name' => $account->name(),
+						'avatar' => $account->avatar(),
+						'field_name_content' => 'social_account_content['.$key.']['.$account->id().']',
+						'field_name_checked' => 'social_accounts['.$key.'][]',
+						'field_value_checked' => $account->id().($account->universal() ? '|true' : ''),
+						'edit' => false,
+						'maxlength' => $service->max_broadcast_length(),
+					);
+					if ($i == 0) {
+						$data['edit'] = true;
+					}
+					$i++;
+// assign previous broadcasts
+					if (isset($broadcasted_ids[$key]) && isset($broadcasted_ids[$key][$account->id()])) {
+						foreach ($broadcasted_ids[$key][$account->id()] as $broadcasted_id => $broadcast) {
+							// TODO - shouldn't need to do Facebook specific checks here
+							if ($key == 'facebook' && isset($broadcast['page']) && !empty($broadcast['page']->id)) {
+								// this was broadcast to a page, don't attach it here.
+								continue;
+							}
+							$data['broadcasts'][] = $this->previous_broadcast_excerpt(
+								$broadcasted_id,
+								$broadcast,
+								$account,
+								$service
+							);
+							// already broadcasted? not editable by default
+							$data['edit'] = false;
+						}
+					}
+// assign errors
+					if (isset($errors[$key]) && isset($errors[$key][$account->id()])) {
+						$data['error'] = $errors[$key][$account->id()];
+					}
+					$_services[$key][$account->id()] = array_merge($_defaults, $data);
+					foreach ($account->child_accounts() as $child_account) {
+						$data = array(
+							'name' => $child_account->name,
+							'avatar' => $service->page_image_url($child_account),
+							'field_name_content' => 'social_account_content['.$key.']['.$child_account->id.']',
+							'field_name_checked' => 'social_facebook_pages['.$account->id().'][]',
+							'field_value_checked' => $child_account->id,
+							'edit' => false,
+							'maxlength' => $service->max_broadcast_length(),
+						);
+// assign previous broadcasts
+						if (isset($broadcasted_ids[$key]) && isset($broadcasted_ids[$key][$account->id()])) {
+							foreach ($broadcasted_ids[$key][$account->id()] as $broadcasted_id => $broadcast) {
+								// TODO - shouldn't need to do Facebook specific checks here
+								if ($key == 'facebook' && isset($broadcast['page']) &&
+									!empty($broadcast['page']->id) && $broadcast['page']->id == $child_account->id) {
+									$data['broadcasts'][] = $this->previous_broadcast_excerpt(
+										$broadcasted_id,
+										$broadcast,
+										$account,
+										$service
+									);
+									// already broadcasted? not editable by default
+									$data['edit'] = false;
+								}
+							}
+						}
+// assign errors
+						if (isset($errors[$key]) && isset($errors[$key][$child_account->id])) {
+							$data['error'] = $errors[$key][$child_account->id];
+						}
+						$_services[$key][$child_account->id] = array_merge($_defaults, $data);
+						$i++;
+					}
+				}
+			}
+		}
+
+		$default_accounts = $this->social->default_accounts($post);
+
+		$broadcast_accounts = array();
+		$_broadcast_accounts = get_post_meta($post->ID, '_social_broadcast_accounts', true);
+		if (!empty($_broadcast_accounts) and count($_broadcast_accounts)) {
+			foreach ($_broadcast_accounts as $service => $accounts) {
+				foreach ($accounts as $account) {
+					if (!isset($broadcast_accounts[$service])) {
+						$broadcast_accounts[$service] = array();
+					}
+
+					$broadcast_accounts[$service][$account->id] = true;
+				}
+			}
+		}
+
+		$broadcast_content = get_post_meta($post->ID, '_social_broadcast_content', true);
+		if (empty($broadcast_content)) {
+			$broadcast_content = array();
+		}
+
+		// check to see if we have any previous broadcasts or saved content
+		$previous_activity = 0;
+		foreach ($_services as $key => $accounts) {
+			$broadcast_default = $services[$key]->format_content($post, Social::option('broadcast_format'));
+// set content format and checked status for each
+			foreach ($accounts as $id => $data) {
+				$previous_activity += count($data['broadcasts']);
+// check for error - populate with previouly posted content
+				if (count($errors)) {
+					$content = stripslashes($_POST['social_account_content'][$key][$id]);
+					$checked = (
+						isset($_POST['social_accounts']) &&
+						isset($_POST['social_accounts'][$key]) &&
+						in_array($data['field_value_checked'], $_POST['social_accounts'][$key])
+					);
+					// TODO - Facebook pages check, abstract this
+					if (!$checked && $key == 'facebook') {
+						if (isset($_POST['social_facebook_pages']) &&
+							is_array($_POST['social_facebook_pages'])) {
+							foreach ($_POST['social_facebook_pages'] as $account) {
+								if (in_array($data['field_value_checked'], $account)) {
+									$checked = true;
+									break;
+								}
+							}
+						}
+					}
+				}
+// use defaults or saved broadcast info
+				else {
+					$content = $broadcast_default;
+					$checked = (isset($default_accounts[$key]) && in_array($id, $default_accounts[$key]));
+					// TODO - abstract this
+					// check to see if a facebook page should be selected by default
+					// our data structure currently makes this awkward
+					if (!$checked && $key == 'facebook' &&
+						isset($default_accounts[$key]) &&
+						isset($default_accounts[$key]['pages']) &&
+						is_array($default_accounts[$key]['pages'])) {
+						foreach ($default_accounts[$key]['pages'] as $page_parent_account) {
+							if (in_array($id, $page_parent_account)) {
+								$checked = true;
+								break;
+							}
+						}
+					}
+// check for saved broadcast
+					if (isset($broadcast_content[$key]) && isset($broadcast_content[$key][$id])) {
+						$content = $broadcast_content[$key][$id];
+						$previous_activity++;
+					}
+					if (count($broadcast_accounts) && isset($broadcast_accounts[$key]) && isset($broadcast_accounts[$key][$id])) {
+						$checked = true;
+					}
+					if (count($data['broadcasts'])) {
+						$checked = false;
+					}
+// override for scheduled broadcasts
+					if ($post->post_status == 'future') {
+						$checked = (count($broadcast_accounts) && isset($broadcast_accounts[$key]) && isset($broadcast_accounts[$key][$id]));
+					}
+				}
+				$_services[$key][$id]['content'] = $content;
+				$_services[$key][$id]['checked'] = $checked;
+				if ($content != $broadcast_default) {
+					$_services[$key][$id]['edit'] = true;
+				}
+			}
+		}
+
+		echo Social_View::factory('wp-admin/post/broadcast/options', array(
+			'clean' => ($previous_activity ? '' : 'clean'),
+			'services' => $services,
+			'_services' => $_services,
+			'post' => $post,
+			'step' => $step,
+			'step_text' => $step_text,
+			'location' => $this->request->post('location'),
+		));
+		exit;
+	}
+
+	/**
+	 * Broadcasts a post to the services.
+	 *
+	 * @param  int|WP_Post  $post_id  post id or post object
+	 * @return void
+	 */
+	public function action_run($post_id = null) {
+		if ($post_id === null) {
+			$post_id = intval($this->request->query('post_ID'));
+		}
+
+		$post = $post_id;
+		if (is_int($post_id)) {
+			$post = get_post($post_id);
+		}
+
+		if ($post === null) {
+			Social::log('Failed to broadcast post :post_id.', array(
+				'post_id' => $post_id,
+			));
+			return;
+		}
+
+		// Load content to broadcast (accounts, broadcast message, etc)
+		$personal_accounts = null;
+		$errored_accounts = false;
+		$broadcast_accounts = get_post_meta($post->ID, '_social_broadcast_accounts', true);
+		$broadcasted_ids = get_post_meta($post->ID, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids)) {
+			$broadcasted_ids = array();
+		}
+
+		$account_content = get_post_meta($post->ID, '_social_broadcast_content', true);
+		if (empty($account_content)) {
+			$account_content = array();
+		}
+		$account_meta = get_post_meta($post->ID, '_social_broadcast_meta', true);
+		if (empty($account_meta)) {
+			$account_meta = array();
+		}
+
+		Social::log('About to start broadcasting.');
+		foreach ($broadcast_accounts as $key => $accounts) {
+			Social::log('Loading service :service', array('service' => $key));
+			$service = $this->social->service($key);
+			if ($service) {
+				Social::log('Found service :service', array('service' => $key));
+				foreach ($accounts as $_account) {
+					if ($_account->universal != '1') {
+						if ($personal_accounts === null) {
+							$personal_accounts = get_user_meta($post->post_author, 'social_accounts', true);
+						}
+
+						if (isset($personal_accounts[$key][$_account->id])) {
+							$class = 'Social_Service_'.$key.'_Account';
+							$account = new $class($personal_accounts[$key][$_account->id]);
+						}
+						else {
+							$account = false;
+						}
+					}
+					else {
+						$account = $service->account($_account->id);
+					}
+
+					if ($account == false) {
+						$account = apply_filters('social_get_broadcast_account', $_account, $post, $service);
+					}
+
+					if ($account !== false) {
+						// Load the message
+						$message = '';
+						if (isset($account_content[$key][$_account->id])) {
+							$message = $account_content[$key][$_account->id];
+						}
+						$args = array();
+						if (isset($account_meta[$key][$_account->id])) {
+							$args = $account_meta[$key][$_account->id];
+						}
+
+						if (!empty($message)) {
+							Social::log('Broadcasting to :username, account #:id. (:service)', array(
+								'id' => $account->id(),
+								'username' => $account->name(),
+								'service' => $service->title(),
+							));
+
+							$response = $service->broadcast($account, $message, $args, $post->ID);
+							if ($response !== false) {
+								if ($response->limit_reached()) {
+									if (!isset($errored_accounts[$key])) {
+										$errored_accounts[$key] = array();
+									}
+
+									$reason = __('Rate limit reached', 'social');
+									$errored_accounts[$key][] = (object) array(
+										'account' => $account,
+										'reason' => $reason,
+										'type' => 'limit_reached',
+									);
+									Social::log('Broadcasting to :username, account #:id FAILED. Reason: :reason', array(
+										'id' => $account->id(),
+										'username' => $account->name(),
+										'reason' => $reason,
+									));
+								}
+								else if ($response->duplicate_status()) {
+									if (!isset($errored_accounts[$key])) {
+										$errored_accounts[$key] = array();
+									}
+
+									$reason = __('Duplicate status', 'social');
+									$errored_accounts[$key][] = (object) array(
+										'account' => $account,
+										'reason' => $reason,
+										'type' => 'duplicate_status',
+									);
+									Social::log('Broadcasting to :username, account #:id FAILED. Reason: :reason', array(
+										'id' => $account->id(),
+										'username' => $account->name(),
+										'reason' => $reason,
+									));
+								}
+								else if ($response->deauthorized() or $response->deauthorized(true)) {
+									if (!isset($errored_accounts[$key])) {
+										$errored_accounts[$key] = array();
+									}
+
+									$reason = __('Account deauthorized', 'social');
+									$errored_accounts[$key][] = (object) array(
+										'account' => $account,
+										'reason' => $reason,
+										'deauthed' => true,
+									);
+									Social::log('Broadcasting to :username, account #:id FAILED. Reason: :reason', array(
+										'id' => $account->id(),
+										'username' => $account->name(),
+										'reason' => $reason,
+									));
+								}
+								else if ($response->general_error()) {
+									if (!isset($errored_accounts[$key])) {
+										$errored_accounts[$key] = array();
+									}
+
+									$reason = $response->body()->response;
+									$errored_accounts[$key][] = (object) array(
+										'account' => $account,
+										'reason' => $reason,
+										'type' => 'general',
+									);
+									Social::log('Broadcasting to :username, account #:id FAILED. Reason: :reason'."\n\n".'Response:'."\n\n".':response', array(
+										'id' => $account->id(),
+										'username' => $account->name(),
+										'reason' => $reason,
+										'response' => print_r($response, true),
+									));
+								}
+								else {
+									if (!isset($broadcasted_ids[$key])) {
+										$broadcasted_ids[$key] = array();
+									}
+
+									$this->social->add_broadcasted_id($post->ID, $key, $response->id(), $response->message($message), $account, $response);
+									do_action('social_broadcast_response', $response, $key, $post);
+
+									Social::log('Broadcasting to :username, account #:id COMPLETE. (:service)', array(
+										'id' => $account->id(),
+										'username' => $account->name(),
+										'service' => $service->title(),
+									));
+								}
+							}
+						}
+					}
+				}
+			}
+		}
+
+		// Errored accounts?
+		if ($errored_accounts !== false) {
+			$deauthed_accounts = false;
+			$_broadcast_accounts = array();
+			foreach ($errored_accounts as $key => $accounts) {
+				foreach ($accounts as $account) {
+					if (isset($account->deauthed)) {
+						if (!isset($deauthed_accounts[$key])) {
+							$deauthed_accounts[$key] = array();
+						}
+
+						$deauthed_accounts[$key][] = $account;
+					}
+
+					if (isset($broadcasted_ids[$key]) and isset($broadcast_accounts[$key][$account->id])) {
+						if (!isset($_broadcast_accounts[$key])) {
+							$_broadcast_accounts[$key] = array();
+						}
+
+						$service = $this->social->service($key);
+						if ($service !== false) {
+							$account = $service->account($account->id);
+							if ($account !== false) {
+								$_broadcast_accounts[$key][$account->id] = (object) array(
+									'id' => $account->id,
+									'universal' => $account->universal(),
+								);
+							}
+						}
+					}
+				}
+			}
+
+			update_post_meta($post->ID, '_social_broadcast_error', $errored_accounts);
+			if (count($_broadcast_accounts)) {
+				update_post_meta($post->ID, '_social_broadcast_accounts', $_broadcast_accounts);
+			}
+			else {
+				delete_post_meta($post->ID, '_social_broadcast_accounts');
+			}
+
+			// Retry?
+			$retry = Social::option('retry_broadcast');
+			if (is_array($retry) and !in_array($post->ID, $retry)) {
+				$retry[] = $post->ID;
+				Social::option('retry_broadcast', $retry);
+			}
+
+			// Deauthed accounts?
+			if ($deauthed_accounts !== false or defined('XMLRPC_REQUEST')) {
+				if (defined('XMLRPC_REQUEST')) {
+					$deauthed_accounts = $errored_accounts;
+				}
+				$this->send_publish_error($post, $deauthed_accounts);
+			}
+		}
+		else {
+			delete_post_meta($post->ID, '_social_broadcast_accounts');
+		}
+	}
+
+	/**
+	 * Sends an email to notify the post author about deauthorized accounts.
+	 *
+	 * @param  object  $post
+	 * @param  array   $accounts
+	 * @return void
+	 */
+	private function send_publish_error($post, $accounts) {
+		$author = get_userdata($post->post_author);
+		$message = Social_View::factory('wp-admin/post/broadcast/error/email', array(
+			'social' => $this->social,
+			'accounts' => $accounts,
+			'post' => $post,
+		));
+
+		$subject = sprintf(__('%s: Failed to broadcast post with Social.', 'social'), get_bloginfo('name'));
+
+		wp_mail($author->user_email, $subject, $message);
+	}
+
+} // End Social_Controller_Broadcast
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/cron.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,81 @@
+<?php
+/**
+ * CRON Controller
+ *
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_CRON extends Social_Controller {
+
+	/**
+	 * Initializes the CRON controller.
+	 *
+	 * @param  Social_Request  $request
+	 */
+	public function __construct(Social_Request $request) {
+		parent::__construct($request);
+
+		if ($this->request->action() != 'check_crons') {
+			// Social system cron?
+			if (Social::option('fetch_comments') == '2' or $this->request->query('api_key') !== null) {
+				$api_key = $this->request->query('api_key');
+				if ($api_key != Social::option('system_cron_api_key')) {
+					Social::log('Api key failed');
+					wp_die('Oops, you have provided an invalid API key.');
+				}
+			}
+			else {
+				$this->verify_nonce();
+			}
+		}
+	}
+
+	/**
+	 * Handles the CRON 15 logic.
+	 *
+	 * @throws Exception
+	 * @return void
+	 */
+	public function action_cron_15() {
+		$semaphore = Social_Semaphore::factory();
+		Social::log('Attempting semaphore lock');
+		if ($semaphore->lock()) {
+			Social::log('Running social_cron_15_action.');
+			do_action('social_cron_15');
+			$semaphore->unlock();
+		}
+	}
+
+	/**
+	 * Makes sure Social CRONs are not scheduled more than once.
+	 *
+	 * @return void
+	 */
+	public function action_check_crons() {
+		// this is an internal only call, so manually calling URL decode
+		if (urldecode($this->request->query('social_api_key')) != Social::option('system_cron_api_key')) {
+			Social::log('API key failed');
+			wp_die('Oops, invalid API key.');
+		}
+		
+		$crons = _get_cron_array();
+		$social_crons = array(
+			'15' => false,
+		);
+		foreach ($crons as $timestamp => $_crons) {
+			foreach ($_crons as $key => $cron) {
+				foreach ($social_crons as $cron_key => $status) {
+					$event_key = 'social_cron_'.$cron_key.'_core';
+					if ($key == $event_key and $social_crons[$cron_key]) {
+						wp_unschedule_event($timestamp, $event_key);
+						Social::log('Unscheduled extra event: '.$event_key);
+					}
+					else {
+						$social_crons[$cron_key] = true;
+					}
+				}
+			}
+		}
+	}
+
+} // End Social_Controller_CRON
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/import.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,41 @@
+<?php
+/**
+ * Importer
+ *
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_Import extends Social_Controller {
+
+	/**
+	 * Imports a tweet by URL.
+	 *
+	 * @return void
+	 */
+	public function action_from_url() {
+
+		$this->verify_nonce();
+
+		Social::log('Import tweet by URL started.');
+
+		$service = $this->social->service('twitter');
+		if ($service !== false) {
+			$response = $service->import_tweet_by_url(
+				$this->request->query('post_id'),
+				$this->request->query('url')
+			);
+			if ($response !== true) {
+				echo $response;
+				exit;
+			}
+			Social::log('Import tweet by URL finished.');
+		}
+		else {
+			Social::log('Import tweet by URL failed, Twitter class not found.');
+		}
+
+		echo Social_Aggregation_Log::instance($this->request->query('post_id'));
+		exit;
+	}
+
+} // End Social_Controller_Import
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/controller/settings.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,178 @@
+<?php
+/**
+ * Settings Controller
+ *
+ * @package Social
+ * @subpackage controllers
+ */
+final class Social_Controller_Settings extends Social_Controller {
+
+	/**
+	 * Handles the request for Social's settings.
+	 *
+	 * @return void
+	 */
+	public function action_index() {
+		if ($this->request->post('submit')) {
+			Social::option('broadcast_format', $this->request->post('social_broadcast_format'));
+			Social::option('comment_broadcast_format', $this->request->post('social_comment_broadcast_format'));
+			Social::option('debug', $this->request->post('social_debug'));
+
+			if (!Social::option('debug')) {
+				delete_option('social_log_write_error');
+			}
+
+			if (isset($_POST['social_broadcast_by_default'])) {
+				Social::option('broadcast_by_default', $_POST['social_broadcast_by_default']);
+			}
+			else {
+				delete_option('social_broadcast_by_default');
+			}
+
+			// Store the default accounts
+			$accounts = array();
+			if (is_array($this->request->post('social_default_accounts'))) {
+				foreach ($this->request->post('social_default_accounts') as $account) {
+					$account = explode('|', $account);
+					$accounts[$account[0]][] = $account[1];
+				}
+			}
+
+			$accounts = apply_filters('social_settings_default_accounts', $accounts, $this);
+
+			if (count($accounts)) {
+				Social::option('default_accounts', $accounts);
+			}
+			else {
+				delete_option('social_default_accounts');
+			}
+
+			// API accounts
+			if ($this->request->post('social_api_accounts')) {
+				Social::option('social_api_accounts', $this->request->post('social_api_accounts'));
+			}
+
+			// System CRON
+			if ($this->request->post('social_fetch_comments') !== null) {
+				Social::option('fetch_comments', $this->request->post('social_fetch_comments'));
+
+				// Unschedule the CRONs
+				if ($this->request->post('social_fetch_comments') != '1' and ($timestamp = wp_next_scheduled('social_cron_15_init')) !== false) {
+					wp_unschedule_event($timestamp, 'social_cron_15_init');
+				}
+			}
+
+			// Disable Social's comment display feature
+			if (isset($_POST['social_use_standard_comments'])) {
+				Social::option('use_standard_comments', '1');
+			}
+			else {
+				delete_option('social_use_standard_comments');
+			}
+
+			// Disable Social's broadcast feature
+			if (isset($_POST['social_disable_broadcasting'])) {
+				Social::option('disable_broadcasting', '1');
+			}
+			else {
+				delete_option('social_disable_broadcasting');
+			}
+
+			do_action('social_settings_save', $this);
+
+			wp_redirect(Social::settings_url(array('saved' => 'true')));
+			exit;
+		}
+
+		$accounts = array();
+		foreach ($this->social->services() as $key => $service) {
+			if (!isset($accounts[$key])) {
+				$accounts[$key] = array();
+			}
+			foreach ($service->accounts() as $account) {
+				if ($account->universal()) {
+					$accounts[$key][] = $account->id();
+				}
+			}
+		}
+
+		echo Social_View::factory('wp-admin/options', array(
+			'services' => $this->social->services(),
+			'accounts' => $accounts,
+			'defaults' => Social::option('default_accounts'),
+		));
+	}
+
+	/**
+	 * Suppresses the enable notice.
+	 *
+	 * @return void
+	 */
+	public function action_suppress_enable_notice() {
+		update_user_meta(get_current_user_id(), 'social_suppress_enable_notice', 'true');
+	}
+
+	/**
+	 * Supress the no accounts notice.
+	 *
+	 * @return void
+	 */
+	public function action_suppress_no_accounts_notice() {
+		update_user_meta(get_current_user_id(), 'social_suppress_no_accounts_notice', 'true');
+	}
+
+	/**
+	 * Clears the deauthorized notice.
+	 *
+	 * @return void
+	 */
+	public function action_clear_deauth() {
+		$id = $_GET['clear_deauth'];
+		$service = $_GET['service'];
+		$deauthed = get_option('social_deauthed', array());
+		if (isset($deauthed[$service][$id])) {
+			unset($deauthed[$service][$id]);
+			update_option('social_deauthed', $deauthed);
+
+			$this->social->remove_from_default_accounts($service, $id);
+		}
+	}
+
+	/**
+	 * Clears the log write error notice.
+	 *
+	 * @return void
+	 */
+	public function action_clear_log_write_error() {
+		delete_option('social_log_write_error');
+	}
+
+	/**
+	 * Clears the 2.0 upgrade notice.
+	 *
+	 * @return void
+	 */
+	public function action_clear_2_0_upgrade() {
+		delete_user_meta(get_current_user_id(), 'social_2.0_upgrade');
+	}
+
+	/**
+	 * Regenerates the API key.
+	 *
+	 * @return void
+	 */
+	public function action_regenerate_api_key() {
+
+		$this->verify_nonce();
+
+		if (!$this->request->is_ajax()) {
+			wp_die('Oops, this method can only be accessed via an AJAX request.');
+		}
+
+		$key = wp_generate_password(16, false);
+		Social::option('system_cron_api_key', $key, true);
+		echo $key;
+		exit;
+	}
+
+} // End Social_Controller_Settings
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/date.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,413 @@
+<?php
+/**
+ * Date helper.
+ *
+ * This helper is originally Kohana_Date in the Kohana Framework. This has been renamed and modified for Social's needs.
+ *
+ * @package    Kohana
+ * @category   Helpers
+ * @author     Kohana Team
+ * @copyright  (c) 2007-2011 Kohana Team
+ * @license    http://kohanaframework.org/license
+ */
+class Social_Date {
+
+	// Second amounts for various time increments
+	const YEAR = 31556926;
+	const MONTH = 2629744;
+	const WEEK = 604800;
+	const DAY = 86400;
+	const HOUR = 3600;
+	const MINUTE = 60;
+
+	/**
+	 * Returns time difference between two timestamps, in human readable format.
+	 * If the second timestamp is not given, the current time will be used.
+	 * Also consider using [self::fuzzy_span] when displaying a span.
+	 *
+	 *     $span = self::span(60, 182, 'minutes,seconds'); // array('minutes' => 2, 'seconds' => 2)
+	 *     $span = self::span(60, 182, 'minutes'); // 2
+	 *
+	 * @param   integer  timestamp to find the span of
+	 * @param   integer  timestamp to use as the baseline
+	 * @param   string   formatting string
+	 * @return  string   when only a single output is requested
+	 * @return  array    associative list of all outputs requested
+	 */
+	public static function span($remote, $local = NULL, $output = 'years,months,weeks,days,hours,minutes,seconds') {
+		// Normalize output
+		$output = trim(strtolower((string)$output));
+
+		if (!$output) {
+			// Invalid output
+			return FALSE;
+		}
+
+		// Array with the output formats
+		$output = preg_split('/[^a-z]+/', $output);
+
+		// Convert the list of outputs to an associative array
+		$output = array_combine($output, array_fill(0, count($output), 0));
+
+		// Make the output values into keys
+		extract(array_flip($output), EXTR_SKIP);
+
+		if ($local === NULL) {
+			// Calculate the span from the current time
+			$local = time();
+		}
+
+		// Calculate timespan (seconds)
+		$timespan = abs($remote - $local);
+
+		if (isset($output['years'])) {
+			$timespan -= self::YEAR * ($output['years'] = (int)floor($timespan / self::YEAR));
+		}
+
+		if (isset($output['months'])) {
+			$timespan -= self::MONTH * ($output['months'] = (int)floor($timespan / self::MONTH));
+		}
+
+		if (isset($output['weeks'])) {
+			$timespan -= self::WEEK * ($output['weeks'] = (int)floor($timespan / self::WEEK));
+		}
+
+		if (isset($output['days'])) {
+			$timespan -= self::DAY * ($output['days'] = (int)floor($timespan / self::DAY));
+		}
+
+		if (isset($output['hours'])) {
+			$timespan -= self::HOUR * ($output['hours'] = (int)floor($timespan / self::HOUR));
+		}
+
+		if (isset($output['minutes'])) {
+			$timespan -= self::MINUTE * ($output['minutes'] = (int)floor($timespan / self::MINUTE));
+		}
+
+		// Seconds ago, 1
+		if (isset($output['seconds'])) {
+			$output['seconds'] = $timespan;
+		}
+
+		if (count($output) === 1) {
+			// Only a single output was requested, return it
+			return array_pop($output);
+		}
+
+		// Return array
+		return $output;
+	}
+
+	/**
+	 * Returns a formatted span.
+	 *
+	 * @static
+	 * @param  string  $remote
+	 * @param  string  $local
+	 * @return string
+	 */
+	public static function span_formatted($remote, $local = NULL) {
+		if ($local === NULL) {
+			$local = current_time('timestamp', 1);
+		}
+
+		$span = self::span($remote, $local);
+		$timespan = abs($remote - $local);
+		$output = '';
+
+		// Years
+		if (!empty($span['years'])) {
+			if ($span['years'] == '1') {
+				$output = __('1 year', 'social');
+			}
+			else {
+				$output = sprintf(__('%s years', 'social'), $span['years']);
+			}
+		}
+
+		// Months
+		if (!empty($span['months'])) {
+			if ($span['months'] == '1') {
+				$output = __('1 month', 'social');
+			}
+			else {
+				$output = sprintf(__('%s months', 'social'), $span['months']);
+			}
+		}
+
+		// Weeks
+		if (!empty($span['weeks'])) {
+			if ($span['weeks'] == '1') {
+				$output = __('1 week', 'social');
+			}
+			else {
+				$output = sprintf(__('%s weeks', $span['weeks']), $span['weeks']);
+			}
+		}
+
+		// Days
+		if (!empty($span['days'])) {
+			if ($span['days'] == '1') {
+				$output = __('1 day', 'social');
+			}
+			else {
+				$output = sprintf(__('%s days', 'social'), $span['days']);
+			}
+		}
+
+		// Hours
+		$hours = '';
+		if (!empty($span['hours'])) {
+			if ($span['hours'] == '1') {
+				$hours = __('1 hour', 'social');
+			}
+			else {
+				$hours = sprintf(__('%s hours', 'social'), $span['hours']);
+			}
+		}
+
+		// Minutes
+		$minutes = '';
+		if (!empty($span['minutes'])) {
+			if ($span['minutes'] == '1') {
+				$minutes = __('1 minute', 'social');
+			}
+			else {
+				$minutes = sprintf(__('%s minutes', 'social'), $span['minutes']);
+			}
+		}
+
+		// Seconds
+		if (empty($hours) and empty($minutes)) {
+			if (!empty($span['seconds'])) {
+				if ($span['seconds'] == '1') {
+					$output = __('1 second', 'social');
+				}
+				else {
+					$output = sprintf(__('%s seconds', 'social'), $span['seconds']);
+				}
+			}
+		}
+
+		if (!empty($hours) and !empty($minutes)) {
+			$output = $hours.' '.$minutes;
+		}
+		else if (!empty($hours)) {
+			$output = $hours;
+		}
+		else {
+			$output = $minutes;
+		}
+
+		return apply_filters('social_formatted_date', $output, $remote, $local);
+	}
+
+	/**
+	 * Returns a formatted span for comments. Uses absolute date after 1 year.
+	 *
+	 * @static
+	 * @param  string  $remote
+	 * @param  string  $local
+	 * @return string
+	 */
+	public static function span_comment($remote, $local = NULL) {
+		if ($local === NULL) {
+			$local = current_time('timestamp', 1);
+		}
+
+		$span = self::span($remote, $local);
+		$timespan = abs($remote - $local);
+		$output = '';
+
+		// Years
+		if (!empty($span['years'])) {
+			$output = get_comment_date();
+		}
+
+		// Months
+		if (!empty($span['months'])) {
+			if ($span['months'] == '1') {
+				$output = __('1 month ago', 'social');
+			}
+			else {
+				$output = sprintf(__('%s months ago', 'social'), $span['months']);
+			}
+		}
+
+		// Weeks
+		if (!empty($span['weeks'])) {
+			if ($span['weeks'] == '1') {
+				$output = __('1 week ago', 'social');
+			}
+			else {
+				$output = sprintf(__('%s weeks ago', $span['weeks']), $span['weeks']);
+			}
+		}
+
+		// Days
+		if (!empty($span['days'])) {
+			if ($span['days'] == '1') {
+				$output = __('1 day', 'social');
+			}
+			else {
+				$output = sprintf(__('%s days ago', 'social'), $span['days']);
+			}
+		}
+
+		// Hours
+		$hours = '';
+		if (!empty($span['hours'])) {
+			if ($span['hours'] == '1') {
+				$hours = __('1 hour', 'social');
+			}
+			else {
+				$hours = sprintf(__('%s hours', 'social'), $span['hours']);
+			}
+		}
+
+		// Minutes
+		$minutes = '';
+		if (!empty($span['minutes'])) {
+			if ($span['minutes'] == '1') {
+				$minutes = __('1 minute', 'social');
+			}
+			else {
+				$minutes = sprintf(__('%s minutes', 'social'), $span['minutes']);
+			}
+		}
+
+		// Seconds
+		if (empty($hours) and empty($minutes)) {
+			$output =  __('just now', 'social');
+		}
+
+		if (!empty($hours)) {
+			if ($span['hours'] > 1) {
+				$output = sprintf(__('%s ago', 'social'), $hours);
+			}
+			else {
+				$output = sprintf(__('%s ago', 'social'), $hours.' '.$minutes);
+			}
+		}
+		else {
+			$output = sprintf(__('%s ago', 'social'), $minutes);
+		}
+
+		return apply_filters('social_comment_date', $output, $remote, $local);
+	}
+
+	/**
+	 * Returns the difference between a time and now in a "fuzzy" way.
+	 * Displaying a fuzzy time instead of a date is usually faster to read and understand.
+	 *
+	 *     $span = self::fuzzy_span(time() - 10); // "moments ago"
+	 *     $span = self::fuzzy_span(time() + 20); // "in moments"
+	 *
+	 * A second parameter is available to manually set the "local" timestamp,
+	 * however this parameter shouldn't be needed in normal usage and is only
+	 * included for unit tests
+	 *
+	 * @param   integer  "remote" timestamp
+	 * @param   integer  "local" timestamp, defaults to time()
+	 * @return  string
+	 */
+	public static function fuzzy_span($timestamp, $local_timestamp = NULL) {
+		$local_timestamp = ($local_timestamp === NULL) ? time() : (int)$local_timestamp;
+
+		// Determine the difference in seconds
+		$offset = abs($local_timestamp - $timestamp);
+
+		if ($offset <= self::MINUTE) {
+			$span = __('a few moments', 'social');
+		}
+		elseif ($offset < (self::MINUTE * 20))
+		{
+			$span = __('a few minutes', 'social');
+		}
+		elseif ($offset < self::HOUR)
+		{
+			$span = __('less than an hour', 'social');
+		}
+		elseif ($offset < (self::HOUR * 4))
+		{
+			$span = __('a couple of hours', 'social');
+		}
+		elseif ($offset < self::DAY)
+		{
+			$span = __('less than a day', 'social');
+		}
+		elseif ($offset < (self::DAY * 2))
+		{
+			$span = __('about a day', 'social');
+		}
+		elseif ($offset < (self::DAY * 4))
+		{
+			$span = __('a couple of days', 'social');
+		}
+		elseif ($offset < self::WEEK)
+		{
+			$span = __('less than a week', 'social');
+		}
+		elseif ($offset < (self::WEEK * 2))
+		{
+			$span = __('about a week', 'social');
+		}
+		elseif ($offset < self::MONTH)
+		{
+			$span = __('less than a month', 'social');
+		}
+		elseif ($offset < (self::MONTH * 2))
+		{
+			$span = __('about a month', 'social');
+		}
+		elseif ($offset < (self::MONTH * 4))
+		{
+			$span = __('a couple of months', 'social');
+		}
+		elseif ($offset < self::YEAR)
+		{
+			$span = __('less than a year', 'social');
+		}
+		elseif ($offset < (self::YEAR * 2))
+		{
+			$span = __('about a year', 'social');
+		}
+		elseif ($offset < (self::YEAR * 4))
+		{
+			$span = __('a couple of years', 'social');
+		}
+		elseif ($offset < (self::YEAR * 8))
+		{
+			$span = __('a few years', 'social');
+		}
+		elseif ($offset < (self::YEAR * 12))
+		{
+			$span = __('about a decade', 'social');
+		}
+		elseif ($offset < (self::YEAR * 24))
+		{
+			$span = __('a couple of decades', 'social');
+		}
+		elseif ($offset < (self::YEAR * 64))
+		{
+			$span = __('several decades', 'social');
+		}
+		else
+		{
+			$span = __('a long time', 'social');
+		}
+
+		if ($timestamp <= $local_timestamp) {
+			// This is in the past
+			$output = sprintf(__('%s ago', 'social'), $span);
+		}
+		else
+		{
+			// This in the future
+			$output = sprintf(__('in %s', 'social'), $span);
+		}
+
+		return apply_filters('social_fuzzy_date', $output, $remote, $local);
+	}
+
+} // End Social_Date
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/interface/service.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,191 @@
+<?php
+/**
+ * All services that are registered to Social should implement this interface.
+ *
+ * @package Social
+ */
+interface Social_Interface_Service {
+
+	/**
+	 * Use the construct to load all of the accounts for this service.
+	 *
+	 * @abstract
+	 */
+	function __construct();
+
+	/**
+	 * Returns the service key.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function key();
+
+	/**
+	 * Gets the title for the service.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function title();
+
+	/**
+	 * Builds the authorize URL for the service.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function authorize_url();
+
+	/**
+	 * Method to get or set all accounts associated with the service.
+	 *
+	 * @abstract
+	 * @param  array|null  $accounts
+	 * @return array|Social_Service
+	 */
+	function accounts(array $accounts = null);
+
+	/**
+	 * @abstract
+	 * @param  int|Social_Service_Account  $account
+	 * @return Social_Service
+	 */
+	function remove_account($account);
+
+	/**
+	 * Formats the provided content to the defined tokens.
+	 *
+	 * @abstract
+	 * @param  object  $post
+	 * @param  string  $format
+	 * @return string
+	 */
+	function format_content($post, $format);
+
+	/**
+	 * Formats the provided content to the defined tokens.
+	 *
+	 * @abstract
+	 * @param  object  $comment
+	 * @param  string  $format
+	 * @return string
+	 */
+	function format_comment_content($comment, $format);
+
+	/**
+	 * The max length a post can be when broadcasted.
+	 *
+	 * @abstract
+	 * @return int
+	 */
+	function max_broadcast_length();
+
+	/**
+	 * Broadcasts the message to the specified account. Returns the broadcasted ID.
+	 *
+	 * @abstract
+	 * @param  Social_Service_Account  $account  account to broadcast to
+	 * @param  string  $message  message to broadcast
+	 * @param  array   $args  extra arguments to pass to the request
+	 * @param  int     $post_id  post ID being broadcasted
+	 * @return Social_Response
+	 */
+	function broadcast($account, $message, array $args = array(), $post_id = null);
+
+	/**
+	 * Aggregates comments by URL.
+	 *
+	 * @abstract
+	 * @param  object  $post
+	 * @param  array   $urls
+	 * @return array
+	 */
+	function aggregate_by_url(&$post, array $urls);
+
+	/**
+	 * Aggregates comments by the service's API.
+	 *
+	 * @abstract
+	 * @param  object  $post
+	 * @return array
+	 */
+	function aggregate_by_api(&$post);
+
+	/**
+	 * Saves the aggregated comments.
+	 *
+	 * @abstract
+	 * @param  object  $post
+	 * @return void
+	 */
+	function save_aggregated_comments(&$post);
+
+	/**
+	 * Hook to allow services to define their aggregation row items based on the passed in type.
+	 *
+	 * @param  string  $type
+	 * @param  object  $item
+	 * @param  string  $username
+	 * @param  int     $id
+	 * @return string
+	 */
+	function aggregation_row($type, $item, $username, $id);
+
+	/**
+	 * Checks the response to see if the broadcast limit has been reached.
+	 *
+	 * @abstract
+	 * @param  string  $response
+	 * @return bool
+	 */
+	function limit_reached($response);
+
+	/**
+	 * Checks the response to see if the broadcast is a duplicate.
+	 *
+	 * @abstract
+	 * @param  string  $response
+	 * @return bool
+	 */
+	function duplicate_status($response);
+
+	/**
+	 * Checks the response to see if the account has been deauthorized.
+	 *
+	 * @abstract
+	 * @param  string  $response
+	 * @param  bool    $check_invalid_key
+	 * @return bool
+	 */
+	function deauthorized($response, $check_invalid_key = false);
+
+	/**
+	 * Returns the key to use on the request response to pull the ID.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function response_id_key();
+
+	/**
+	 * Returns the response message.
+	 *
+	 * @abstract
+	 * @param  object  $body
+	 * @param  string  $default
+	 * @return string
+	 */
+	function response_message($body, $default);
+
+	/**
+	 * Returns the status URL to a broadcasted item.
+	 *
+	 * @abstract
+	 * @param  string      $username
+	 * @param  string|int  $id
+	 * @return string
+	 */
+	function status_url($username, $id);
+
+} // End Social_Interface_Service
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/interface/service/account.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,89 @@
+<?php
+/**
+ * @package Social
+ * @subpackage interfaces
+ */
+interface Social_Interface_Service_Account {
+
+	/**
+	 * Returns an array object of the account.
+	 *
+	 * @return object
+	 */
+	function as_object();
+
+	/**
+	 * Returns whether the account is public or not.
+	 *
+	 * @abstract
+	 * @param  bool|null  $personal
+	 * @return Social_Service_Account|bool
+	 */
+	function personal($personal = null);
+
+	/**
+	 * Returns whether the account is universal or not.
+	 *
+	 * @abstract
+	 * @param  bool|null  $universal
+	 * @return Socail_Service_Account|bool
+	 */
+	function universal($universal = null);
+
+	/**
+	 * Gets the ID of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function id();
+
+	/**
+	 * Gets the name of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function name();
+
+	/**
+	 * Gets the URL of the account.
+	 * 
+	 * @abstract
+	 * @return string
+	 */
+	function url();
+
+	/**
+	 * Gets the avatar of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function avatar();
+
+	/**
+	 * Gets the username of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function username();
+
+	/**
+	 * Returns the account's public key.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function public_key();
+
+	/**
+	 * Returns the account's private key.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	function private_key();
+
+} // End Social_Interface_Service_Account
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/log.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,93 @@
+<?php
+/**
+ * Social logger
+ *
+ * @package Social
+ */
+final class Social_Log {
+
+	/**
+	 * Returns the instance of Social_Log.
+	 *
+	 * @static
+	 * @param  string  $file  file to log to
+	 * @return Social_Log
+	 */
+	public static function factory($file = null) {
+		if ($file == null) {
+			$file = Social::$plugins_path.'debug_log.txt';
+
+			// Attempt to create the file if it doesn't exist.
+			if (is_writable(Social::$plugins_path)) {
+				try {
+					$fh = fopen($file, 'a');
+					fclose($fh);
+				}
+				catch (Exception $e) {
+					// Failed to create the file, oh well...
+					$file = null;
+				}
+			}
+		}
+		return new Social_Log($file);
+	}
+
+	/**
+	 * @var  string  log file
+	 */
+	private $_file = '';
+
+	/**
+	 * Sets the log pile path.
+	 *
+	 * @param  string  $file
+	 */
+	public function __construct($file = null) {
+		$this->_file = $file;
+	}
+
+	/**
+	 * Add a message to the log.
+	 *
+	 * @static
+	 * @param  string  $message    message to add to the log
+	 * @param  array   $args       arguments to pass to the writer
+	 * @param  string  $context    context of the log message
+	 * @param  bool    $backtrace  show the backtrace
+	 * @return void
+	 */
+	public function write($message, array $args = null, $context = null, $backtrace = false) {
+		if (!Social::option('debug') and !in_array($context, apply_filters('social_log_contexts', array()))) {
+			return;
+		}
+
+		if ($args !== null) {
+			foreach ($args as $key => $value) {
+				$message = str_replace(':'.$key, $value, $message);
+			}
+		}
+
+		if ($context !== null) {
+			$context = '['.strtoupper(str_replace('-', ' ', $context)).'] ';
+		}
+
+		$error_str = $context.'[SOCIAL - '.current_time('mysql', 1).' - '.$_SERVER['REMOTE_ADDR'].'] '.$message;
+
+		if ($backtrace) {
+			ob_start();
+			debug_print_backtrace();
+			$trace = ob_get_contents();
+			ob_end_clean();
+
+			$error_str .= "\n\n".$trace."\n\n";
+		}
+
+		if (is_writable($this->_file)) {
+			error_log($error_str."\n", 3, $this->_file);
+		}
+		else {
+			error_log($error_str);
+		}
+	}
+
+} // End Social_Log
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/request.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,402 @@
+<?php
+/**
+ * Social_Request
+ *
+ * Handles Social's requests. Inspired by Kohana's request class.
+ * @link https://github.com/kohana/core/blob/v3.2.0/classes/kohana/request.php
+ *
+ * @package Social
+ */
+final class Social_Request {
+
+	/**
+	 * Returns the singleton request object.
+	 *
+	 * @static
+	 * @param  string  $uri
+	 * @return Social_Request
+	 */
+	public static function factory($uri = null) {
+		return new self($uri);
+	}
+
+	/**
+	 * @var  string  request controller
+	 */
+	protected $_controller = '';
+
+	/**
+	 * @var  string  request action
+	 */
+	protected $_action = '';
+
+	/**
+	 * @var  string  the x-requested-with header which most likely will be xmlhttprequest
+	 */
+	protected $_requested_with;
+
+	/**
+	 * @var  string  method: GET, POST
+	 */
+	protected $_method = 'GET';
+
+	/**
+	 * @var  array  query parameters
+	 */
+	protected $_get = array();
+
+	/**
+	 * @var  array  post parameters
+	 */
+	protected $_post = array();
+
+	/**
+	 * @var  string  request user agent
+	 */
+	protected $_user_agent = 'social';
+
+	/**
+	 * @var  string  client's IP address
+	 */
+	protected $_client_ip = '0.0.0.0';
+
+	/**
+	 * @var  string  trusted proxy server IPs
+	 */
+	protected $_trusted_proxies = array('127.0.0.1', 'localhost', 'localhost.localdomain');
+
+	/**
+	 * @var  mixed  response
+	 */
+	protected $_response = null;
+
+	/**
+	 * Initializes the request.
+	 *
+	 * @param  string  $uri
+	 */
+	public function __construct($uri = null) {
+		if (isset($_SERVER['REQUEST_METHOD'])) {
+			// Use the server request method
+			$method = $_SERVER['REQUEST_METHOD'];
+		}
+		else {
+			// Default to GET requests
+			$method = 'GET';
+		}
+
+		if (isset($_SERVER['HTTP_USER_AGENT'])) {
+			// Browser type
+			$user_agent = $_SERVER['HTTP_USER_AGENT'];
+		}
+
+		if (isset($_SERVER['HTTP_X_REQUESTED_WITH'])) {
+			// Typically used to denote AJAX requests
+			$requested_with = $_SERVER['HTTP_X_REQUESTED_WITH'];
+		}
+
+		if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])
+			and isset($_SERVER['REMOTE_ADDR'])
+			and in_array($_SERVER['REMOTE_ADDR'], $this->_trusted_proxies))
+		{
+			// Use the forwarded IP address, typically set when the
+			// client is using a proxy server.
+			// Format: "X-Forwarded-For: client1, proxy1, proxy2"
+			$client_ips = explode(',', $_SERVER['HTTP_X_FORWARDED_FOR']);
+
+			$client_ip = array_shift($client_ips);
+
+			unset($client_ips);
+		}
+		else if (isset($_SERVER['HTTP_CLIENT_IP'])
+			and isset($_SERVER['REMOTE_ADDR'])
+			and in_array($_SERVER['REMOTE_ADDR'], $this->_trusted_proxies))
+		{
+			// Use the forwarded IP address, typically set when the
+			// client is using a proxy server.
+			$client_ips = explode(',', $_SERVER['HTTP_CLIENT_IP']);
+
+			$client_ip = array_shift($client_ips);
+
+			unset($client_ips);
+		}
+		else if (isset($_SERVER['REMOTE_ADDR'])) {
+			// The remote IP address
+			$client_ip = $_SERVER['REMOTE_ADDR'];
+		}
+
+		if ($uri != null) {
+			$uri = explode('/', $uri);
+			if (!empty($uri[0])) {
+				$this->controller($uri[0]);
+			}
+
+			if (isset($uri[1]) and !empty($uri[1])) {
+				$this->action($uri[1]);
+			}
+		}
+		else {
+			if (isset($_GET['social_controller'])) {
+				$this->controller($_GET['social_controller']);
+				unset($_GET['social_controller']);
+			}
+
+			if (isset($_GET['social_action'])) {
+				$this->action($_GET['social_action']);
+				unset($_GET['social_action']);
+			}
+		}
+
+		$this->query($_GET)->post($_POST);
+
+		if (isset($method)) {
+			$this->method($method);
+		}
+
+		if (isset($requested_with)) {
+			// Apply the requested with variable
+			$this->requested_with($requested_with);
+		}
+
+		if (isset($user_agent)) {
+			$this->user_agent($user_agent);
+		}
+
+		if (isset($client_ip)) {
+			$this->client_ip($client_ip);
+		}
+	}
+
+	/**
+	 * Executes the request.
+	 *
+	 * @return Social_Request
+	 */
+	public function execute() {
+		require 'controller.php';
+		$controller = apply_filters('social_controller', Social::$plugins_path.'lib/social/controller/'.$this->controller());
+		if (file_exists($controller.'.php')) {
+			require $controller.'.php';
+
+			$controller = 'Social_Controller_'.$this->controller();
+			$controller = new $controller($this);
+
+			$action = 'action_'.$this->action();
+			if (method_exists($controller, $action)) {
+				Social::log('Running request: :controller/:action', array(
+					'controller' => str_replace('Social_Controller_', '', get_class($controller)),
+					'action' => $action
+				));
+
+				$controller->{$action}();
+			}
+			else {
+				Social::log('Invalid action :action called on controller :controller.', array(
+					'action' => $this->action(),
+					'controller' => $this->controller(),
+				));
+				die;
+			}
+		}
+		else {
+			Social::log('Controller :controller does not exist.', array(
+				'controller' => $this->controller(),
+			));
+			die;
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Gets and sets the requested controller.
+	 *
+	 * @param  string  $value
+	 * @return Social_Request|string
+	 */
+	public function controller($value = null) {
+		if ($value === null) {
+			return $this->_controller;
+		}
+
+		$this->_controller = $value;
+		return $this;
+	}
+
+	/**
+	 * Gets and sets the requested action.
+	 *
+	 * @param  string  $value
+	 * @return Social_Request|string
+	 */
+	public function action($value = null) {
+		if ($value === null) {
+			return $this->_action;
+		}
+
+		$this->_action = $value;
+		return $this;
+	}
+
+	/**
+	 * Gets and sets the requested with property, which should
+	 * be relative to the x-requested-with pseudo header.
+	 *
+	 * @param   string    $requested_with Requested with value
+	 * @return  mixed|Social_Request
+	 */
+	public function requested_with($requested_with = null) {
+		if ($requested_with === null) {
+			// Act as a getter
+			return $this->_requested_with;
+		}
+
+		// Act as a setter
+		$this->_requested_with = strtolower($requested_with);
+
+		return $this;
+	}
+
+	/**
+	 * Gets or sets the HTTP method.
+	 *
+	 * @param   string   $method  Method to use for this request
+	 * @return  mixed|Social_Request
+	 */
+	public function method($method = null) {
+		if ($method === null) {
+			// Act as a getter
+			return $this->_method;
+		}
+
+		// Act as a setter
+		$this->_method = strtoupper($method);
+
+		return $this;
+	}
+
+	/**
+	 * Gets or sets the user agent.
+	 *
+	 * @param   string   $user_agent
+	 * @return  mixed|Social_Request
+	 */
+	public function user_agent($user_agent = null) {
+		if ($user_agent === null) {
+			// Act as a getter
+			return $this->_user_agent;
+		}
+
+		// Act as a setter
+		$this->_user_agent = $user_agent;
+
+		return $this;
+	}
+
+	/**
+	 * Gets or sets the client IP.
+	 *
+	 * @param   string   $client_ip
+	 * @return  mixed|Social_Request
+	 */
+	public function client_ip($client_ip = null) {
+		if ($client_ip === null) {
+			// Act as a getter
+			return $this->_client_ip;
+		}
+
+		// Act as a setter
+		$this->_client_ip = $client_ip;
+
+		return $this;
+	}
+
+	/**
+	 * Returns whether this is an AJAX request.
+	 *
+	 * @return  boolean
+	 */
+	public function is_ajax() {
+		return ($this->requested_with() === 'xmlhttprequest');
+	}
+
+	/**
+	 * Gets or sets HTTP query string.
+	 *
+	 * @param   mixed   $key    Key or key value pairs to set
+	 * @param   string  $value  Value to set to a key
+	 * @return  mixed|Social_Request
+	 */
+	public function query($key = null, $value = null) {
+		if (is_array($key)) {
+			// Act as a setter, replace all query strings
+			$this->_get = $this->_get + $key;
+
+			return $this;
+		}
+
+		if ($key === null) {
+			// Act as a getter, all query strings
+			return $this->_get;
+		}
+		else if ($value === null) {
+			// Act as a getter, single query string
+			return isset($this->_get[$key]) ? $this->_get[$key] : null;
+		}
+
+		// Act as a setter, single query string
+		$this->_get[$key] = $value;
+
+		return $this;
+	}
+
+	/**
+	 * Gets or sets HTTP POST parameters to the request.
+	 *
+	 * @param   mixed  $key    Key or key value pairs to set
+	 * @param   string $value  Value to set to a key
+	 * @return  mixed|Social_Request
+	 */
+	public function post($key = null, $value = null) {
+		if (is_array($key)) {
+			// Act as a setter, replace all fields
+			$this->_post = $this->_post + $key;
+
+			return $this;
+		}
+
+		if ($key === null) {
+			// Act as a getter, all fields
+			return $this->_post;
+		}
+		else if ($value === null) {
+			// Act as a getter, single field
+			return isset($this->_post[$key]) ? $this->_post[$key] : null;
+		}
+
+		// Act as a setter, single field
+		$this->_post[$key] = $value;
+
+		return $this;
+	}
+
+	/**
+	 * Sets the response.
+	 *
+	 * @param  mixed  $value
+	 * @return mixed|Social_Request
+	 */
+	public function response($value = null) {
+		if ($value === null) {
+			return $this->_response;
+		}
+
+		if (is_array($value)) {
+			$value = json_encode($value);
+		}
+
+		$this->_response = $value;
+		return $this;
+	}
+
+} // End Social_Request
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/response.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,161 @@
+<?php
+/**
+ * Handles the response from wp_remote_post|get requests.
+ *
+ * @package Social
+ */
+final class Social_Response {
+
+	/**
+	 * Initializes a response object.
+	 *
+	 * @static
+	 * @param  Social_Service  $service
+	 * @param  array  $request
+	 * @param  Social_Service_Account $account
+	 * @return Social_Response
+	 */
+	public static function factory(&$service, array $request, &$account) {
+		return new Social_Response($service, $request, $account);
+	}
+
+	/**
+	 * @var  Social_Service|Social_Service_Facebook|Social_Service_Twitter  service object
+	 */
+	private $_service = null;
+
+	/**
+	 * @var  array  request object
+	 */
+	private $_request = array();
+
+	/**
+	 * @var Social_Service_Account  account object
+	 */
+	private $_account = null;
+
+	/**
+	 * @param  Social_Service  $service
+	 * @param  array  $request
+	 * @param  Social_Service_Account $account
+	 */
+	public function __construct(&$service, array $request, &$account) {
+		$this->_service = $service;
+		$this->_request = $request;
+		$this->_account = $account;
+	}
+
+	/**
+	 * Checks to see if the response has reached it's limit.
+	 *
+	 * @return bool
+	 */
+	public function limit_reached() {
+		$body = $this->body();
+		if (isset($body->result) and $body->result == 'error' and isset($body->response)) {
+			return $this->_service->limit_reached($body->response);
+		}
+
+		return false;
+	}
+
+	/**
+	 * Checks to see if the status is a duplicate.
+	 *
+	 * @return bool
+	 */
+	public function duplicate_status() {
+		$body = $this->body();
+		if (isset($body->result) and $body->result == 'error' and isset($body->response)) {
+			return $this->_service->duplicate_status($body->response);
+		}
+
+		return false;
+	}
+
+	/**
+	 * Checks to see if the broadcasting account has been deauthorized.
+	 *
+	 * @param  bool  $check_invalid_key
+	 * @return bool
+	 */
+	public function deauthorized($check_invalid_key = FALSE) {
+		$body = $this->body();
+		if ((isset($body->result) and $body->result == 'error') and isset($body->response) and $this->_service->deauthorized($body->response, $check_invalid_key)) {
+			if ($this->_account->personal()) {
+				$url = Social::settings_url(array(), true);
+			}
+			else {
+				$url = Social::settings_url();
+			}
+
+			$deauthorized = get_option('social_deauthorized', array());
+			if (!isset($deauthorized[$this->_service->key()])) {
+				$deauthorized[$this->_service->key()] = array();
+			}
+			$deauthorized[$this->_service->key()][$this->_account->id()] = sprintf(__('Unable to publish to %s with account %s. Please <a href="%">re-authorize</a> this account.', 'social'), esc_html($this->_service->title()), esc_html($this->_account->name()), esc_url($url));
+			update_option('social_deauthorized', $deauthorized);
+
+			Social::log('Removing deauthorized account: :account', array(
+				'account' => print_r($this->_account)
+			));
+			$this->_service->remove_account($this->_account)->save();
+
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Checks the response to see if an unknown error occurred.
+	 *
+	 * @return bool
+	 */
+	public function general_error() {
+		$body = $this->body();
+		if (is_wp_error($this->_request) or isset($body->result) and $body->result == 'error' and isset($body->response)) {
+			return true;
+		}
+
+		return false;
+	}
+
+	/**
+	 * Returns the request response ID.
+	 *
+	 * @return string
+	 */
+	public function id() {
+		if ($body = $this->body()) {
+			if (isset($body->response) && isset($body->response->{$this->_service->response_id_key()})) {
+				return $body->response->{$this->_service->response_id_key()};
+			}
+		}
+		return '0';
+	}
+
+	/**
+	 * Returns the request body.
+	 *
+	 * @return bool|object
+	 */
+	public function body() {
+		if (isset($this->_request['body'])) {
+			return $this->_request['body'];
+		}
+
+		return false;
+	}
+
+	/**
+	 * Returns the response message.
+	 *
+	 * @param  string  $default  default message to use
+	 * @return mixed
+	 */
+	public function message($default) {
+		return $this->_service->response_message($this->body(), $default);
+	}
+
+} // End Social_Response
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/semaphore.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,182 @@
+<?php
+/**
+ * Semaphore Lock Management
+ *
+ * @package Social
+ */
+final class Social_Semaphore {
+
+	/**
+	 * Initializes the semaphore object.
+	 *
+	 * @static
+	 * @return Social_Semaphore
+	 */
+	public static function factory() {
+		return new self;
+	}
+
+	/**
+	 * @var bool
+	 */
+	protected $lock_broke = false;
+
+	/**
+	 * Attempts to start the lock. If the rename works, the lock is started.
+	 *
+	 * @return bool
+	 */
+	public function lock() {
+		global $wpdb;
+
+		// Attempt to set the lock
+		$affected = $wpdb->query("
+			UPDATE $wpdb->options
+			   SET option_name = 'social_locked'
+			 WHERE option_name = 'social_unlocked'
+		");
+
+		if ($affected == '0' and !$this->stuck_check()) {
+			Social::log('Semaphore lock failed. (Line '.__LINE__.')');
+			return false;
+		}
+
+		// Check to see if all processes are complete
+		$affected = $wpdb->query("
+			UPDATE $wpdb->options
+			   SET option_value = CAST(option_value AS UNSIGNED) + 1
+			 WHERE option_name = 'social_semaphore'
+			   AND option_value = '0'
+		");
+		if ($affected != '1') {
+			if (!$this->stuck_check()) {
+				Social::log('Semaphore lock failed. (Line '.__LINE__.')');
+				return false;
+			}
+
+			// Reset the semaphore to 1
+			$wpdb->query("
+				UPDATE $wpdb->options
+				   SET option_value = '1'
+				 WHERE option_name = 'social_semaphore'
+			");
+
+			Social::log('Semaphore reset to 1.');
+		}
+
+		// Set the lock time
+		$wpdb->query($wpdb->prepare("
+			UPDATE $wpdb->options
+			   SET option_value = %s
+			 WHERE option_name = 'social_last_lock_time'
+		", current_time('mysql', 1)));
+		Social::log('Set semaphore last lock time to '.current_time('mysql', 1));
+
+		Social::log('Semaphore lock complete.');
+		return true;
+	}
+
+	/**
+	 * Increment the semaphore.
+	 *
+	 * @param  array  $filters
+	 * @return Social_Semaphore
+	 */
+	public function increment(array $filters = array()) {
+		global $wpdb;
+
+		if (count($filters)) {
+			// Loop through all of the filters and increment the semaphore
+			foreach ($filters as $priority) {
+				for ($i = 0, $j = count($priority); $i < $j; ++$i) {
+					$this->increment();
+				}
+			}
+		}
+		else {
+			$wpdb->query("
+				UPDATE $wpdb->options
+				   SET option_value = CAST(option_value AS UNSIGNED) + 1
+				 WHERE option_name = 'social_semaphore'
+			");
+			Social::log('Incremented the semaphore by 1.');
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Decrements the semaphore.
+	 *
+	 * @return void
+	 */
+	public function decrement() {
+		global $wpdb;
+
+		$wpdb->query("
+			UPDATE $wpdb->options
+			   SET option_value = CAST(option_value AS UNSIGNED) - 1
+			 WHERE option_name = 'social_semaphore'
+			   AND CAST(option_value AS UNSIGNED) > 0
+		");
+		Social::log('Decremented the semaphore by 1.');
+	}
+
+	/**
+	 * Unlocks the process.
+	 *
+	 * @return bool
+	 */
+	public function unlock() {
+		global $wpdb;
+
+		// Decrement for the master process.
+		$this->decrement();
+
+		$result = $wpdb->query("
+			UPDATE $wpdb->options
+			   SET option_name = 'social_unlocked'
+			 WHERE option_name = 'social_locked'
+		");
+
+		if ($result == '1') {
+			Social::log('Semaphore unlocked.');
+			return true;
+		}
+
+		Social::log('Semaphore still locked.');
+		return false;
+	}
+
+	/**
+	 * Attempts to jiggle the stuck lock loose.
+	 *
+	 * @return bool
+	 */
+	private function stuck_check() {
+		global $wpdb;
+
+		// Check to see if we already broke the lock.
+		if ($this->lock_broke) {
+			return true;
+		}
+
+		$current_time = current_time('mysql', 1);
+		$affected = $wpdb->query($wpdb->prepare("
+			UPDATE $wpdb->options
+			   SET option_value = %s
+			 WHERE option_name = 'social_last_lock_time'
+			   AND option_value <= DATE_SUB(%s, INTERVAL 30 MINUTE)
+		", $current_time, $current_time));
+
+		if ($affected == '1') {
+			Social::log('Semaphore was stuck, set lock time to '.$current_time);
+
+			$this->lock_broke = true;
+			return true;
+		}
+
+		return false;
+	}
+
+} // End Social_Semaphore
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,804 @@
+<?php
+/**
+ * @package    Social
+ * @subpackage services
+ */
+abstract class Social_Service {
+
+	/**
+	 * @var  string  service key
+	 */
+	protected $_key = '';
+
+	/**
+	 * @var  array  collection of account objects
+	 */
+	protected $_accounts = array();
+
+	/**
+	 * Instantiates the
+	 *
+	 * @param  array  $accounts
+	 */
+	public function __construct(array $accounts = array()) {
+		$this->accounts($accounts);
+	}
+
+	/**
+	 * Returns the service key.
+	 *
+	 * @return string
+	 */
+	public function key() {
+		return $this->_key;
+	}
+
+	/**
+	 * Gets the title for the service.
+	 *
+	 * @return string
+	 */
+	public function title() {
+		return ucwords(str_replace('_', ' ', $this->_key));
+	}
+
+	/**
+	 * The max length a post can be when broadcasted.
+	 *
+	 * @return int
+	 */
+	public function max_broadcast_length() {
+		return 140; // default to Twitter length
+	}
+
+	/**
+	 * Builds the authorize URL for the service.
+	 *
+	 * @return string
+	 */
+	public function authorize_url() {
+		global $post;
+
+		$proxy = Social::$api_url.$this->_key.'/authorize';
+		$url = apply_filters('social_authorize_url', $proxy, $this->_key);
+
+		$params = '?social_controller=auth&social_action=authorize&target='.urlencode($url);
+		if (is_admin()) {
+			$url = (defined('IS_PROFILE_PAGE') ? 'profile.php' : 'options-general.php');
+			$url = admin_url($url.$params);
+		}
+		else {
+			$url = home_url('index.php'.$params.'&post_id='.$post->ID);
+		}
+
+		return $url;
+	}
+
+	/**
+	 * Returns the disconnect URL.
+	 *
+	 * @static
+	 *
+	 * @param  object  $account
+	 * @param  bool    $is_admin
+	 * @param  string  $before
+	 * @param  string  $after
+	 *
+	 * @return string
+	 */
+	public function disconnect_url($account, $is_admin = false, $before = '', $after = '') {
+		$params = array(
+			'social_controller' => 'auth',
+			'social_action' => 'disconnect',
+			'id' => $account->id(),
+			'service' => $this->_key
+		);
+
+		if ($is_admin) {
+			$personal = defined('IS_PROFILE_PAGE');
+			$url = Social::settings_url($params, $personal);
+		}
+		else {
+			$params['redirect_to'] = (isset($_GET['redirect_to']) ? $_GET['redirect_to'] : $_SERVER['REQUEST_URI']);
+			foreach ($params as $key => $value) {
+				$params[$key] = urlencode($value);
+			}
+			$url = add_query_arg($params, home_url());
+		}
+		return $url;
+	}
+
+	/**
+	 * Returns the disconnect link.
+	 *
+	 * @static
+	 *
+	 * @param  object  $account
+	 * @param  bool    $is_admin
+	 * @param  string  $before
+	 * @param  string  $after
+	 *
+	 * @return string
+	 */
+	public function disconnect_link($account, $is_admin = false, $before = '', $after = '') {
+		$url = $this->disconnect_url($account, $is_admin, $before, $after);
+		if ($is_admin) {
+			$text = '<span title="'.__('Disconnect', 'social').'" class="social-disconnect">'.__('Disconnect', 'social').'</span>';
+		}
+		else {
+			$text = __('Disconnect', 'social');
+		}
+		return sprintf('%s<a href="%s">%s</a>%s', $before, esc_url($url), $text, $after);
+	}
+
+	/**
+	 * Creates a WordPress user with the passed in account.
+	 *
+	 * @param  Social_Service_Account  $account
+	 * @param  string                  $nonce
+	 * @return int|bool
+	 */
+	public function create_user($account, $nonce = null) {
+		$username = $account->username();
+		$username = sanitize_user($username, true);
+		if (!empty($username)) {
+			$user = get_user_by('login', $this->_key.'_'.$username);
+			if ($user === false) {
+				$id = wp_create_user($this->_key.'_'.$username, wp_generate_password(20, false), $this->_key.'.'.$username.'@example.com');
+				if (is_wp_error($id)) {
+					Social::log('Failed to create/find user with username of :username.', array(
+						'username' => $username,
+					));
+					return false;
+				}
+
+				$role = '';
+				if (get_option('users_can_register') == '1') {
+					$role = get_option('default_role');
+				}
+				else {
+					// Set commenter flag
+					update_user_meta($id, 'social_commenter', 'true');
+				}
+
+				$user = new WP_User($id);
+				$user->set_role($role);
+				$user->show_admin_bar_front = 'false';
+				wp_update_user(get_object_vars($user));
+			}
+			else {
+				$id = $user->ID;
+			}
+
+			// Set the nonce
+			if ($nonce !== null) {
+				wp_set_current_user($id);
+				update_user_meta($id, 'social_commenter', 'true');
+				update_user_meta($id, 'social_auth_nonce_'.$nonce, 'true');
+			}
+
+			Social::log('Created/found user :username. (#:id)', array(
+				'username' => $username,
+				'id' => $id,
+			));
+			return $id;
+		}
+
+		Social::log('Failed to create/find user with username of :username.', array(
+			'username' => $username,
+		));
+		return false;
+	}
+
+	/**
+	 * Saves the accounts on the service.
+	 *
+	 * @param  bool  $personal  personal account?
+	 * @return void
+	 */
+	public function save($personal = false) {
+		// Flush the cache
+		wp_cache_delete('services', 'social');
+
+		$accounts = array();
+		if ($personal) {
+			foreach ($this->_accounts AS $account) {
+				if ($account->personal()) {
+					$accounts[$account->id()] = $account->as_object();
+				}
+
+				$account->universal(false);
+			}
+
+			$current = get_user_meta(get_current_user_id(), 'social_accounts', true);
+			Social::log('Current accounts: :accounts', array(
+				'accounts' => print_r($current, true)
+			));
+			if (count($accounts)) {
+				$current[$this->_key] = $accounts;
+
+			}
+			else if (isset($current[$this->_key])) {
+				unset($current[$this->_key]);
+			}
+
+			if (count($current)) {
+				Social::log('New accounts: :accounts', array(
+					'accounts' => print_r($current, true)
+				));
+				update_user_meta(get_current_user_id(), 'social_accounts', $current);
+			}
+			else {
+				Social::log('No accounts, deleting user meta for user #:user_id social_accounts', array(
+					'user_id' => get_current_user_id(),
+				));
+				delete_user_meta(get_current_user_id(), 'social_accounts');
+			}
+		}
+		else {
+			foreach ($this->_accounts AS $account) {
+				if ($account->universal()) {
+					$accounts[$account->id()] = $account->as_object();
+				}
+
+				$account->personal(false);
+			}
+
+			$current = Social::option('accounts');
+			if ($current == null) {
+				$current = array();
+			}
+			Social::log('Current accounts: :accounts', array(
+				'accounts' => print_r($current, true)
+			));
+
+			if (count($accounts)) {
+				$current[$this->_key] = $accounts;
+			}
+			else if (isset($current[$this->_key])) {
+				unset($current[$this->_key]);
+			}
+
+			if (count($current)) {
+				Social::log('New accounts: :accounts', array(
+					'accounts' => print_r($current, true)
+				));
+				Social::option('accounts', $current);
+			}
+			else {
+				Social::log('No accounts, deleting option social_accounts');
+				delete_option('social_accounts');
+			}
+		}
+	}
+
+	/**
+	 * Checks to see if the account exists on the object.
+	 *
+	 * @param  int  $id  account id
+	 * @return bool
+	 */
+	public function account_exists($id) {
+		return isset($this->_accounts[$id]);
+	}
+
+	/**
+	 * Gets the requested account.
+	 *
+	 * @param  int|Social_Service_Account  $account  account id/object
+	 * @return Social_Service_Account|Social_Service|bool
+	 */
+	public function account($account) {
+		if ($account instanceof Social_Service_Account) {
+			$this->_accounts[$account->id()] = $account;
+			return $this;
+		}
+
+		if ($this->account_exists($account)) {
+			return $this->_accounts[$account];
+		}
+
+		return false;
+	}
+
+	/**
+	 * Gets the specified "api" account.
+	 *
+	 * @return Social_Service_Account|Social_Service|bool
+	 */
+	public function api_account() {
+		if ($social_api_accounts = Social::option('social_api_accounts')) {
+			if (isset($social_api_accounts[$this->key()])) {
+				return $this->account($social_api_accounts[$this->key()]);
+			}
+		}
+
+		return null;
+	}
+
+	/**
+	 * Acts as a getter and setter for service accounts.
+	 *
+	 * @param  array  $accounts  accounts to add to the service
+	 * @return array|Social_Service
+	 */
+	public function accounts(array $accounts = null) {
+		if ($accounts === null) {
+			return $this->_accounts;
+		}
+
+		$class = 'Social_Service_'.$this->_key.'_Account';
+		foreach ($accounts as $account) {
+			$account = new $class($account);
+			if (!$this->account_exists($account->id())) {
+				$this->_accounts[$account->id()] = $account;
+			}
+		}
+		return $this;
+	}
+
+	/**
+	 * Removes an account from the service.
+	 *
+	 * @abstract
+	 * @param  int|Social_Service_Account  $account
+	 * @return Social_Service
+	 */
+	public function remove_account($account) {
+		Social::log('Starting account removal...');
+		if (is_int($account)) {
+			$account = $this->account($account);
+		}
+
+		Social::log('Accounts: :accounts', array(
+			'accounts' => print_r($this->_accounts, true),
+		));
+		if ($account !== false) {
+			Social::log('Removing...');
+			unset($this->_accounts[$account->id()]);
+		}
+		Social::log('Accounts: :accounts', array(
+			'accounts' => print_r($this->_accounts, true)
+		));
+
+		return $this;
+	}
+	
+	/**
+	 * Removes all accounts from the service.
+	 *
+	 * @abstract
+	 * @return Social_Service
+	 */
+	public function clear_accounts() {
+		$this->_accounts = array();
+		return $this;
+	}
+
+	/**
+	 * Formats the broadcast content.
+	 *
+	 * @param  object  $post
+	 * @param  string  $format
+	 * @return string
+	 */
+	public function format_content($post, $format) {
+		// Filter the format
+		$format = apply_filters('social_broadcast_format', $format, $post, $this);
+
+		$_format = $format;
+		$available = $this->max_broadcast_length();
+		foreach (Social::broadcast_tokens() as $token => $description) {
+			$_format = str_replace($token, '', $_format);
+		}
+		$available = $available - strlen($_format);
+
+		$_format = explode(' ', $format);
+		foreach (Social::broadcast_tokens() as $token => $description) {
+			$content = '';
+			switch ($token) {
+				case '{url}':
+					$url = wp_get_shortlink($post->ID);
+					if (empty($url)) {
+						$url = home_url('?p='.$post->ID);
+					}
+					$url = apply_filters('social_broadcast_permalink', $url, $post, $this);
+					$content = esc_url($url);
+					break;
+				case '{title}':
+					$content = htmlspecialchars_decode($post->post_title);
+					break;
+				case '{content}':
+					$content = htmlspecialchars_decode(strip_tags($post->post_content));
+ 					$content = str_replace(array("\n", "\r", PHP_EOL, '&nbsp;'), ' ', $content);
+					$content = preg_replace('/\s+/', ' ', $content);
+					break;
+				case '{author}':
+					$user = get_userdata($post->post_author);
+					$content = htmlspecialchars_decode($user->display_name);
+					break;
+				case '{date}':
+					$content = get_date_from_gmt($post->post_date_gmt);
+					break;
+			}
+
+			if (strlen($content) > $available) {
+				if (in_array($token, array('{date}', '{author}'))
+				) {
+					$content = '';
+				}
+				else {
+					$content = substr($content, 0, ($available - 3)).'...';
+				}
+			}
+
+			// Filter the content
+			$content = apply_filters('social_format_content', $content, $post, $format, $this);
+
+			foreach ($_format as $haystack) {
+				if (strpos($haystack, $token) !== false and $available > 0) {
+					$haystack = str_replace($token, $content, $haystack);
+					$available = $available - strlen($haystack);
+					$format = str_replace($token, $content, $format);
+					break;
+				}
+			}
+		}
+
+		// Filter the content
+		$format = apply_filters('social_broadcast_content_formatted', $format, $post, $this);
+
+		return $format;
+	}
+
+	/**
+	 * Formats a comment before it's broadcasted.
+	 *
+	 * @param  WP_Comment  $comment
+	 * @param  array       $format
+	 * @return string
+	 */
+	public function format_comment_content($comment, $format) {
+		// Filter the format
+		$format = apply_filters('social_comment_broadcast_format', $format, $comment, $this);
+
+		$_format = $format;
+		$available = $this->max_broadcast_length();
+		$used_tokens = array();
+
+		// Gather used tokens and subtract remaining characters from available length
+		foreach (Social::comment_broadcast_tokens() as $token => $description) {
+			$replaced = 0;
+			$_format = str_replace($token, '', $_format, $replaced);
+			if ($replaced) {
+				$used_tokens[$token] = '';
+			}
+		}
+		$available = $available - strlen($_format);
+
+		// Prep token replacement content
+		foreach ($used_tokens as $token => $content) {
+			switch ($token) {
+				case '{url}':
+					$url = wp_get_shortlink($comment->comment_post_ID);
+					if (empty($url)) {
+						$url = home_url('?p='.$comment->comment_post_ID);
+					}
+					$url .= '#comment-'.$comment->comment_ID;
+					$url = apply_filters('social_comment_broadcast_permalink', $url, $comment, $this);
+					$used_tokens[$token] = esc_url($url);
+					break;
+				case '{content}':
+					$used_tokens[$token] = strip_tags($comment->comment_content);
+					$used_tokens[$token] = str_replace(array("\n", "\r", PHP_EOL), '', $used_tokens[$token]);
+					$used_tokens[$token] = str_replace('&nbsp;', '', $used_tokens[$token]);
+					break;
+			}
+		}
+
+		// if {url} is used, pre-allocate its length
+		if (isset($used_tokens['{url}'])) {
+			$available = $available - strlen($used_tokens['{url}']);
+		}
+
+		$used_tokens['{content}'] = apply_filters('social_format_comment_content', $used_tokens['{content}'], $comment, $format, $this);
+
+		// Truncate content to size limit
+		if (strlen($used_tokens['{content}']) > $available) {
+			$used_tokens['{content}'] = substr($used_tokens['{content}'], 0, ($available - 3)).'...';
+		}
+
+		foreach ($used_tokens as $token => $replacement) {
+			if (strpos($format, $token) !== false) {
+				$format = str_replace($token, $replacement, $format);
+			}
+		}
+
+		$format = apply_filters('social_comment_broadcast_content_formatted', $format, $comment, $this);
+		return $format;
+	}
+
+	/**
+	 * Handles the requests to the proxy.
+	 *
+	 * @param  Social_Service_Account|int  $account
+	 * @param  string                      $api
+	 * @param  array                       $args
+	 * @param  string                      $method
+	 * @return Social_Response|bool
+	 */
+	public function request($account, $api, array $args = array(), $method = 'GET') {
+		if (!is_object($account)) {
+			$account = $this->account($account);
+		}
+		if ($account !== false) {
+			$proxy = apply_filters('social_api_proxy', Social::$api_url.$this->_key, $this->_key);
+			$api = apply_filters('social_api_endpoint', $api, $this->_key);
+			$method = apply_filters('social_api_endpoint_method', $method, $this->_key);
+			$args = apply_filters('social_api_endpoint_args', $args, $this->_key);
+			$request = wp_remote_post($proxy, array(
+				'timeout' => 60, // default of 5 seconds if not set here
+				'sslverify' => false,
+				'body' => array(
+					'api' => $api,
+					'method' => $method,
+					'public_key' => $account->public_key(),
+					'hash' => sha1($account->public_key().$account->private_key()),
+					'params' => json_encode($args)
+				)
+			));
+			if (!is_wp_error($request)) {
+				$request['body'] = apply_filters('social_response_body', $request['body'], $this->_key);
+				if (is_string($request['body'])) {
+					// slashes are normalized (always added) by WordPress
+					$request['body'] = json_decode(stripslashes_deep($request['body']));
+				}
+				return Social_Response::factory($this, $request, $account);
+			}
+			else {
+				Social::log('Service::request() error: '.$request->get_error_message());
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Show full comment?
+	 *
+	 * @param  string  $type
+	 * @return bool
+	 */
+	public function show_full_comment($type) {
+		return (!in_array($type, self::comment_types_meta()));
+	}
+
+	/**
+	 * Disconnects an account from the user's account.
+	 *
+	 * @param  int  $id
+	 * @return void
+	 */
+	public function disconnect($id) {
+		if (!is_admin() or defined('IS_PROFILE_PAGE')) {
+			$accounts = get_user_meta(get_current_user_id(), 'social_accounts', true);
+			if (isset($accounts[$this->_key][$id])) {
+				if (defined('IS_PROFILE_PAGE')) {
+					unset($accounts[$this->_key][$id]);
+				}
+				else {
+					unset($accounts[$this->_key][$id]->user);
+				}
+
+				if (!count($accounts[$this->_key])) {
+					unset($accounts[$this->_key]);
+				}
+
+				update_user_meta(get_current_user_id(), 'social_accounts', $accounts);
+			}
+		}
+		else {
+			$accounts = Social::option('accounts');
+			if (isset($accounts[$this->_key][$id])) {
+				unset($accounts[$this->_key][$id]);
+
+				if (!count($accounts[$this->_key])) {
+					unset($accounts[$this->_key]);
+				}
+
+				Social::option('accounts', $accounts);
+			}
+		}
+		do_action('social_account_disconnected', $this->_key, $id);
+	}
+
+	/**
+	 * Loads all of the accounts to use for aggregation.
+	 *
+	 * Format of returned data:
+	 *
+	 *     $accounts = array(
+	 *         'twitter' => array(
+	 *             '1234567890' => Social_Service_Twitter_Account,
+	 *             '0987654321' => Social_Service_Twitter_Account,
+	 *             // ... Other connected accounts
+	 *         ),
+	 *         'facebook' => array(
+	 *             '1234567890' => Social_Service_Facebook_Account,
+	 *             '0987654321' => Social_Service_Facebook_Account,
+	 *             // ... Other connected accounts
+	 *         ),
+	 *         // ... Other registered services
+	 *     );
+	 *
+	 * @param  object  $post
+	 * @return array
+	 */
+	protected function get_aggregation_accounts($post) {
+		$accounts = array();
+		foreach ($this->accounts() as $account) {
+			if (!isset($accounts[$this->_key])) {
+				$accounts[$this->_key] = array();
+			}
+
+			if (!isset($accounts[$this->_key][$account->id()])) {
+				$accounts[$this->_key][$account->id()] = $account;
+			}
+		}
+
+		return $accounts;
+	}
+
+	/**
+	 * Checks to see if the result ID is the original broadcasted ID.
+	 *
+	 * @param  WP_Post|int  $post
+	 * @param  int          $result_id
+	 * @return bool
+	 */
+	public function is_original_broadcast($post, $result_id) {
+		if (!is_object($post)) {
+			$broadcasted_ids = get_post_meta($post, '_social_broadcasted_ids', true);
+			if (empty($broadcasted_ids)) {
+				$broadcasted_ids = array();
+			}
+
+			$post = (object) array(
+				'broadcasted_ids' => $broadcasted_ids,
+			);
+		}
+
+		if (isset($post->broadcasted_ids[$this->_key])) {
+			foreach ($post->broadcasted_ids[$this->_key] as $account_id => $broadcasted) {
+				if (isset($broadcasted[$result_id])) {
+					Social::log('This is the original broadcast. (:result_id)', array('result_id' => $result_id));
+					return true;
+				}
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Checks to make sure the comment hasn't already been created.
+	 *
+	 * @param  object  $post
+	 * @param  int     $result_id
+	 * @return bool
+	 */
+	public function is_duplicate_comment($post, $result_id) {
+		global $wpdb;
+
+		$results = $wpdb->get_results($wpdb->prepare("
+			SELECT meta_value
+			  FROM $wpdb->commentmeta
+			 WHERE comment_id = %s
+			   AND meta_key = 'social_status_id'
+		", $post->ID));
+
+		foreach ($results as $result) {
+			if ($result->meta_value == $result_id) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Builds the social item output.
+	 *
+	 * @param  object  $item         social item being rendered
+	 * @param  int     $count        current display count
+	 * @param  array   $avatar_size  array containing the width and height attributes
+	 * @return string
+	 */
+	public function social_item_output($item, $count, array $avatar_size = array()) {
+		$style = '';
+		if ($count >= 10) {
+			$style = ' style="display:none"';
+		}
+
+		$width = '24';
+		$height = '24';
+		if (isset($avatar_size['width'])) {
+			$width = $avatar_size['width'];
+		}
+		if (isset($avatar_size['height'])) {
+			$height = $avatar_size['height'];
+		}
+
+		$status_url = $this->status_url($item->comment_author, $item->social_status_id);
+		$title = apply_filters('social_item_output_title', $item->comment_author, $this->key());
+		$image_format = apply_filters('social_item_output_image_format', '<img src="%1$s" width="%2$s" height="%3$s" alt="%4$s" />');
+		$image = sprintf($image_format, esc_url($item->social_profile_image_url), esc_attr($width), esc_attr($height), esc_attr($title));
+		return sprintf('<a href="%s" title="%s"%s>%s</a>', esc_url($status_url), esc_attr($title), $style, $image);
+	}
+
+	/**
+	 * Checks to see if the comment is allowed.
+	 *
+	 * [!!] Handles the exception for duplicate comments.
+	 *
+	 * @param  array   $commentdata
+	 * @param  int     $result_id
+	 * @param  object  $post
+	 * @return array|bool
+	 */
+	public function allow_comment(array $commentdata, $result_id, &$post) {
+		try {
+			add_filter('wp_die_handler', array('Social', 'wp_die_handler'));
+			$commentdata['comment_approved'] = wp_allow_comment($commentdata);
+			remove_filter('wp_die_handler', array('Social', 'wp_die_handler'));
+			return $commentdata;
+		} catch (Exception $e) {
+			remove_filter('wp_die_handler', array('Social', 'wp_die_handler'));
+			if ($e->getMessage() == Social::$duplicate_comment_message) {
+				// Remove the aggregation ID from the stack
+				unset($post->results[$this->_key][$result_id]);
+				$aggregated_ids = array();
+				foreach ($post->aggregated_ids[$this->_key] as $id) {
+					if ($id != $result_id) {
+						$aggregated_ids[] = $id;
+					}
+				}
+				$post->aggregated_ids[$this->_key] = $aggregated_ids;
+
+				// Mark the result as ignored
+				Social_Aggregation_Log::instance($post->ID)->ignore($result_id);
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Comment types for this service.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types() {
+		return array();
+	}
+
+	/**
+	 * Comment types that are "meta" (not displayed in full).
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types_meta() {
+		return array();
+	}
+
+	/**
+	 * Any additional parameters that should be passed with a broadcast.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public function get_broadcast_extras($account_id, $post, $args = array()) {
+		return apply_filters($this->key().'_broadcast_extras', $args, $this, $account_id, $post);
+	}
+
+} // End Social_Service
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service/account.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,198 @@
+<?php
+/**
+ * Core for Social accounts.
+ *
+ * @package Social
+ * @subpackage services
+ */
+abstract class Social_Service_Account {
+
+	/**
+	 * @var  object  user object
+	 */
+	protected $_user = array();
+
+	/**
+	 * @var  object  access keys
+	 */
+	protected $_keys = array();
+
+	/**
+	 * @var  bool  personal account flag
+	 */
+	protected $_personal = false;
+
+	/**
+	 * @var  bool  universal account flag
+	 */
+	protected $_universal = false;
+
+	/**
+	 * Populates the account object.
+	 *
+	 * @param  object  $account
+	 */
+	public function __construct($account) {
+		$this->_user = $account->user;
+
+		if (isset($account->keys)) {
+			$this->_keys = $account->keys;
+		}
+
+		if (isset($account->personal)) {
+			$this->_personal = $account->personal;
+		}
+
+		if (isset($account->universal)) {
+			$this->_universal = $account->universal;
+		}
+	}
+
+	/**
+	 * Returns an array object of the account.
+	 *
+	 * @return object
+	 */
+	public function as_object() {
+		return (object) array(
+			'user' => $this->_user,
+			'keys' => $this->_keys,
+			'personal' => $this->_personal,
+			'universal' => $this->_universal,
+		);
+	}
+
+	/**
+	 * Returns whether the account is public or not.
+	 *
+	 * @abstract
+	 * @param  bool|null  $personal
+	 * @return Social_Service_Account|bool
+	 */
+	public function personal($personal = null) {
+		if ($personal === null) {
+			return $this->_personal;
+		}
+
+		$this->_personal = $personal;
+		return $this;
+	}
+
+	/**
+	 * Returns whether the account is universal or not.
+	 *
+	 * @abstract
+	 * @param  bool|null  $universal
+	 * @return Social_Service_Account|bool
+	 */
+	public function universal($universal = null) {
+		if ($universal === null) {
+			return $this->_universal;
+		}
+
+		$this->_universal = $universal;
+		return $this;
+	}
+
+	/**
+	 * Returns the account's public key.
+	 *
+	 * @return string
+	 */
+	public function public_key() {
+		return $this->_keys->public;
+	}
+
+	/**
+	 * Returns the account's private key.
+	 *
+	 * @return string
+	 */
+	public function private_key() {
+		return $this->_keys->secret;
+	}
+
+	/**
+	 * Does this account have a user object with it?
+	 *
+	 * [!!] This is for pre-2.0 accounts. Used to help keep views clean.
+	 *
+	 * @return bool
+	 */
+	public function has_user() {
+		return $this->_user !== null;
+	}
+
+	/**
+	 * Default avatar.
+	 *
+	 * @return string
+	 */
+	public function _avatar() {
+		return 'http://www.gravatar.com/avatar/a06082e4f876182b547f635d945e744e?s=32&d=mm';
+	}
+
+	/**
+	 * Default name
+	 *
+	 * @return string
+	 */
+	public function _name() {
+		return __('Removed Account', 'social');
+	}
+
+	/**
+	 * Default username
+	 *
+	 * @return string
+	 */
+	public function _username() {
+		return __('Removed Account', 'social');
+	}
+	
+	/**
+	 * Return child accounts (Facebook pages, for example)
+	 *
+	 * @return array
+	 */
+	public function child_accounts($update = false) {
+		if ($update) {
+			$this->fetch_child_accounts();
+		}
+		return array();
+	}
+
+	/**
+	 * Get child account list from service.
+	 *
+	 * @return void
+	 */
+	public function fetch_child_accounts() {
+	}
+
+	/**
+	 * Child account key.
+	 *
+	 * @return string
+	 */
+	public function child_account_key() {
+		return '';
+	}
+
+	/**
+	 * Child account avatar.
+	 *
+	 * @return string
+	 */
+	public function child_account_avatar() {
+		return $this->_avatar();
+	}
+
+	/**
+	 * Update child accounts of a service account
+	 * @abstract
+	 * @param array $enabled_child_ids - array of enabled child account ids
+	 */
+	abstract public function update_enabled_child_accounts($enabled_child_ids);
+
+} // End Social_Service_Account
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service/facebook.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,633 @@
+<?php
+/**
+ * Facebook implementation for the service.
+ *
+ * @package    Social
+ * @subpackage services
+ */
+final class Social_Service_Facebook extends Social_Service implements Social_Interface_Service {
+
+	/**
+	 * @var  string  service key
+	 */
+	protected $_key = 'facebook';
+
+	/**
+	 * The max length a post can be when broadcasted.
+	 *
+	 * @return int
+	 */
+	public function max_broadcast_length() {
+		return 420;
+	}
+
+	/**
+	 * Handles the requests to the proxy.
+	 *
+	 * @param  Social_Service_Account|int  $account
+	 * @param  string                      $api
+	 * @param  array                       $args
+	 * @param  string                      $method
+	 * @return Social_Response|bool
+	 */
+	public function request($account, $api, array $args = array(), $method = 'GET') {
+		$api = urlencode($api);
+		return parent::request($account, $api, $args, $method);
+	}
+
+	/**
+	 * Any additional parameters that should be passed with a broadcast.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public function get_broadcast_extras($account_id, $post, $args = array()) {
+		if (get_post_format($post->ID) !== 'status') {
+			setup_postdata($post);
+			$link_args = array(
+				'link' => get_post_permalink($post->ID),
+				'title' => get_the_title($post->ID),
+				'description' => get_the_excerpt(),
+			);
+			if (function_exists('has_post_thumbnail') and has_post_thumbnail($post->ID)) {
+				$image = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'single-post-thumbnail');
+				$link_args = $link_args + array(
+					'picture' => $image[0],
+				);
+			}
+			wp_reset_postdata();
+			$args = $args + $link_args;
+		}
+		return parent::get_broadcast_extras($account_id, $post, $args);
+	}
+
+	/**
+	 * Broadcasts the message to the specified account. Returns the broadcasted ID.
+	 *
+	 * @param  Social_Service_Facebook_Account|object  $account     account to broadcast to
+	 * @param  string                                  $message     message to broadcast
+	 * @param  array                                   $args        extra arguments to pass to the request
+	 * @param  int                                     $post_id     post ID being broadcasted
+	 * @param  int                                     $comment_id  comment ID being broadcasted
+	 *
+	 * @return Social_Response
+	 */
+	public function broadcast($account, $message, array $args = array(), $post_id = null, $comment_id = null) {
+		global $post;
+		// if post ID is set, this is a broadcast of a post,
+		// if the comment ID is set it is a broadcast of a comment
+		// TODO - add wrapper functions that abstract these actions out to separate methods
+
+		// check comment being replied to, if it is a facebook comment on a post then
+		// send the comment as a reply on the same post.
+		// If that fails, then send as posting a link with a comment.
+
+		$args = $args + array(
+			'message' => $message,
+		);
+
+		// first try to send comment to an existing Fb post
+		if (!is_null($comment_id)) {
+			$comment = get_comment($comment_id);
+			if (!empty($comment->comment_parent)) {
+				$parent_comment = get_comment($comment->comment_parent);
+				if (!is_null($parent_comment) && in_array($parent_comment->comment_type, self::comment_types())) {
+					$status_id = get_comment_meta($parent_comment->comment_ID, 'social_status_id', true);
+					if (!empty($status_id)) {
+						// we have a Facebook post to reply to
+						$parts = explode('_', $status_id);
+						if (count($parts) == 3) {
+							$status_id = $parts[0].'_'.$parts[1];
+						}
+						$args = apply_filters($this->key().'_broadcast_args', $args, $post_id, $comment_id);
+						$response = $this->request($account, $status_id.'/comments', $args, 'POST');
+						if ($response !== false && $response->id() !== '0') {
+							// post succeeded, return response
+							return $response;
+						}
+						// ...broadcast failed, continue and send as post to feed
+					}
+				}
+			}
+
+			// posting with a link, do not include URL in comment.
+			$format = trim(str_replace('{url}', '', Social::option('comment_broadcast_format')));
+			$message = $this->format_comment_content($comment, $format);
+			$args['message'] = $message;
+
+			// prep data
+			$post = get_post($comment->comment_post_ID);
+			setup_postdata($post);
+			$link_args = array(
+				'link' => get_post_permalink($post->ID),
+				'title' => get_the_title($post->ID),
+				'description' => get_the_excerpt(),
+			);
+			if (function_exists('has_post_thumbnail') and has_post_thumbnail($post->ID)) {
+				$image = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'single-post-thumbnail');
+				$link_args = $link_args + array(
+					'picture' => $image[0],
+				);
+			}
+			wp_reset_postdata();
+			$args = $args + $link_args;
+		}
+
+		// Set access token?
+		$broadcast_account = $account->broadcast_page();
+		if ($broadcast_account !== null) {
+			$args = $args + array(
+				'access_token' => $broadcast_account->access_token,
+				'page_id' => $broadcast_account->id,
+			);
+		}
+
+		$args = apply_filters($this->key().'_broadcast_args', $args, $post_id, $comment_id);
+		$endpoint = isset($args['link']) ? 'links' : 'feed';
+		return $this->request($account, 'me/'.$endpoint, $args, 'POST');
+	}
+
+	/**
+	 * Aggregates comments by URL.
+	 *
+	 * @param  object  $post
+	 * @param  array   $urls
+	 *
+	 * @return void
+	 */
+	public function aggregate_by_url(&$post, array $urls) {
+		foreach ($urls as $url) {
+			if (!empty($url)) {
+				$url = 'https://graph.facebook.com/search?type=post&q='.$url;
+				Social::log('Searching by URL(s) for post #:post_id. (Query: :url)', array(
+					'post_id' => $post->ID,
+					'url' => $url,
+				));
+				$response = wp_remote_get($url);
+				if (!is_wp_error($response)) {
+					$response = json_decode($response['body']);
+
+					if (isset($response->data) and is_array($response->data) and count($response->data)) {
+						foreach ($response->data as $result) {
+							if (in_array($result->id, $post->aggregated_ids[$this->_key])) {
+								Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'url', true);
+								continue;
+							}
+							else {
+								if ($this->is_original_broadcast($post, $result->id)) {
+									continue;
+								}
+							}
+
+							Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'url');
+							$post->aggregated_ids[$this->_key][] = $result->id;
+							$post->results[$this->_key][$result->id] = $result;
+						}
+					}
+				}
+				else {
+					Social::log('URL search failed for post #:post_id.', array(
+						'post_id' => $post->ID,
+					));
+				}
+			}
+		}
+	}
+
+	/**
+	 * Aggregates comments by the service's API.
+	 *
+	 * @param  object  $post
+	 *
+	 * @return array
+	 */
+	public function aggregate_by_api(&$post) {
+		// find broadcasts for service
+		$accounts = $this->get_aggregation_accounts($post);
+
+		if (isset($accounts[$this->_key]) and count($accounts[$this->_key])) {
+			$like_count = 0;
+			foreach ($accounts[$this->_key] as $account) {
+				if (isset($post->broadcasted_ids[$this->_key][$account->id()])) {
+					foreach ($post->broadcasted_ids[$this->_key][$account->id()] as $broadcasted_id => $data) {
+						$id = explode('_', $broadcasted_id);
+						$request = $this->request($account, $broadcasted_id.'/comments');
+						if ($request !== false && isset($request->body()->response)) {
+							$response = $request->body()->response;
+							if (isset($response->data) and is_array($response->data) and count($response->data)) {
+								foreach ($response->data as $result) {
+									$data = array(
+										'parent_id' => $broadcasted_id,
+									);
+									if (in_array($result->id, $post->aggregated_ids[$this->_key])) {
+										Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'reply', true, $data);
+										continue;
+									}
+									else {
+										if ($this->is_original_broadcast($post, $result->id)) {
+											continue;
+										}
+									}
+
+									Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'reply', false, $data);
+									$result->status_id = $broadcasted_id;
+									$post->results[$this->_key][$result->id] = $result;
+								}
+							}
+						}
+
+						$this->search_for_likes($account, $broadcasted_id, $id[0], $post, $like_count);
+					}
+				}
+			}
+
+			if (count($like_count)) {
+				Social_Aggregation_Log::instance($post->ID)->add($this->_key, $post->ID.time(), 'like', !$like_count, array('total' => $like_count));
+			}
+		}
+	}
+
+	/**
+	 * Searches for likes on the post.
+	 *
+	 * @param  object       $account
+	 * @param  string       $id
+	 * @param  int          $parent_id
+	 * @param  WP_Post      $post
+	 * @param  int          $like_count
+	 * @param  bool|string  $next
+	 * @return void
+	 */
+	private function search_for_likes(&$account, $id, $parent_id, &$post, &$like_count, $next = false) {
+		$url = $id.'/likes';
+		$args = array(
+			'limit' => '100'
+		);
+		if ($next !== false) {
+			$args['offset'] = $next;
+		}
+
+		$request = $this->request($account, $url, $args);
+		if ($request !== false && isset($request->body()->response)) {
+			$response = $request->body()->response;
+			if (isset($response->data) && is_array($response->data) && count($response->data)) {
+				foreach ($response->data as $result) {
+					if ((isset($post->results) && isset($post->results[$this->_key]) && isset($post->results[$this->_key][$result->id])) ||
+						(in_array($result->id, $post->aggregated_ids[$this->_key]))
+					) {
+						continue;
+					}
+					$post->aggregated_ids[$this->_key][] = $result->id;
+					$post->results[$this->_key][$result->id] = (object) array_merge(array(
+						'like' => true,
+						'status_id' => $id,
+						'raw' => $result,
+					), (array) $result);
+					++$like_count;
+				}
+			}
+
+			if (isset($response->paging) && isset($response->paging->next)) {
+				$url = parse_url($response->paging->next);
+				if (!empty($url['query'])) {
+					parse_str($url['query'], $query);
+					if (!empty($query['offset'])) {
+						$this->search_for_likes($account, $id, $parent_id, $post, $like_count, $query['offset']);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Saves the aggregated comments.
+	 *
+	 * @param  object  $post
+	 * @return void
+	 */
+	public function save_aggregated_comments(&$post) {
+		if (isset($post->results[$this->_key])) {
+			global $wpdb;
+
+			foreach ($post->results[$this->_key] as $result) {
+				$commentdata = array(
+					'comment_post_ID' => $post->ID,
+					'comment_author_email' => $wpdb->escape($this->_key.'.'.$result->id.'@example.com'),
+					'comment_author_IP' => $_SERVER['SERVER_ADDR'],
+					'comment_agent' => 'Social Aggregator'
+				);
+				if (!isset($result->like)) {
+					$url = 'http://graph.facebook.com/'.$result->from->id;
+					$request = wp_remote_get($url);
+					if (!is_wp_error($request)) {
+						$response = json_decode($request['body']);
+
+						$account = (object) array(
+							'user' => $response
+						);
+						$class = 'Social_Service_'.$this->_key.'_Account';
+						$account = new $class($account);
+
+						$commentdata = array_merge($commentdata, array(
+							'comment_type' => 'social-facebook',
+							'comment_author' => $wpdb->escape($result->from->name),
+							'comment_author_url' => $account->url(),
+							'comment_content' => $wpdb->escape($result->message),
+							'comment_date' => date('Y-m-d H:i:s', strtotime($result->created_time) + (get_option('gmt_offset') * 3600)),
+							'comment_date_gmt' => gmdate('Y-m-d H:i:s', strtotime($result->created_time)),
+						));
+
+					}
+				}
+				else {
+					$url = 'http://facebook.com/profile.php?id='.$result->id;
+					$commentdata = array_merge($commentdata, array(
+						'comment_type' => 'social-facebook-like',
+						'comment_author' => $wpdb->escape($result->name),
+						'comment_author_url' => $url,
+						'comment_content' => $wpdb->escape('<a href="'.$url.'" target="_blank">'.$result->name.'</a> liked this on Facebook.'),
+						'comment_date' => current_time('mysql'),
+						'comment_date_gmt' => current_time('mysql', 1),
+					));
+				}
+
+				$user_id = (isset($result->like) ? $result->id : $result->from->id);
+				$commentdata = array_merge($commentdata, array(
+					'comment_post_ID' => $post->ID,
+					'comment_author_email' => $this->_key.'.'.$user_id.'@example.com',
+				));
+
+				$result_id = (isset($result->status_id) ? $result->status_id : $result->id);
+				if (apply_filters('social_approve_likes_and_retweets', true) && isset($result->like)) {
+					$commentdata['comment_approved'] = 1;
+				}
+				else if (($commentdata = $this->allow_comment($commentdata, $result_id, $post)) === false) {
+					continue;
+				}
+
+				// sanity check to make sure this comment is not a duplicate
+				if ($this->is_duplicate_comment($post, $result->id)) {
+					Social::log('Result #:result_id already exists, skipping.', array(
+						'result_id' => $result->id
+					), 'duplicate-comment');
+					continue;
+				}
+
+				Social::log('Saving #:result_id.', array(
+					'result_id' => (isset($result->status_id) ? $result->status_id : $result->id)
+				));
+
+				$comment_id = 0;
+				try
+				{
+					Social::Log('Attempting to save commentdata: :commentdata', array(
+						'commentdata' => print_r($commentdata, true)
+					));
+					$comment_id = wp_insert_comment($commentdata);
+
+					update_comment_meta($comment_id, 'social_account_id', addslashes_deep($user_id));
+					update_comment_meta($comment_id, 'social_profile_image_url', addslashes_deep('http://graph.facebook.com/'.$user_id.'/picture'));
+					update_comment_meta($comment_id, 'social_status_id', addslashes_deep((isset($result->status_id) ? $result->status_id : $result->id)));
+
+					if (!isset($result->raw)) {
+						$result = (object) array_merge((array) $result, array('raw' => $result));
+					}
+					update_comment_meta($comment_id, 'social_raw_data', addslashes_deep(base64_encode(json_encode($result->raw))));
+
+					if ($commentdata['comment_approved'] !== 'spam') {
+						if ($commentdata['comment_approved'] == '0') {
+							wp_notify_moderator($comment_id);
+						}
+
+						if (get_option('comments_notify') and $commentdata['comment_approved'] and (!isset($commentdata['user_id']) or $post->post_author != $commentdata['user_id'])) {
+							wp_notify_postauthor($comment_id, 'comment');
+						}
+					}
+				}
+				catch (Exception $e) {
+					// Something went wrong, remove the aggregated ID.
+					if (($key = array_search((isset($result->status_id) ? $result->status_id : $result->id), $post->aggregated_ids['facebook'])) !== false) {
+						unset($post->aggregated_ids['facebook'][$key]);
+					}
+
+					if ((int) $comment_id) {
+						// Delete the comment in case it wasn't the insert that failed.
+						wp_delete_comment($comment_id);
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Hook to allow services to define their aggregation row items based on the passed in type.
+	 *
+	 * @param  string  $type
+	 * @param  object  $item
+	 * @param  string  $username
+	 * @param  int     $id
+	 * @return string
+	 */
+	public function aggregation_row($type, $item, $username, $id) {
+		if ($type == 'like') {
+			return sprintf(__('Found %s additional likes.', 'social'), $item->data['total']);
+		}
+		return '';
+	}
+
+	/**
+	 * Checks the response to see if the broadcast limit has been reached.
+	 *
+	 * @param  string  $response
+	 * @return bool
+	 */
+	public function limit_reached($response) {
+		return ($response == '(#341) Feed action request limit reached');
+	}
+
+	/**
+	 * Checks the response to see if the broadcast is a duplicate.
+	 *
+	 * @param  string  $response
+	 * @return bool
+	 */
+	public function duplicate_status($response) {
+		return ($response == '(#506) Duplicate status message');
+	}
+
+	/**
+	 * Checks the response to see if the account has been deauthorized.
+	 *
+	 * @param  string  $response
+	 * @param  bool    $check_invalid_key
+	 * @return bool
+	 */
+	public function deauthorized($response, $check_invalid_key = false) {
+		if (($check_invalid_key and $response == 'invalid key') or $response == 'Error validating access token') {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns the key to use on the request response to pull the ID.
+	 *
+	 * @return string
+	 */
+	public function response_id_key() {
+		return 'id';
+	}
+
+	/**
+	 * Returns the response message.
+	 *
+	 * @param  object  $body
+	 * @param  string  $default
+	 *
+	 * @return mixed
+	 */
+	public function response_message($body, $default) {
+		if (isset($body->response) and isset($body->response->message)) {
+			return $body->response->message;
+		}
+
+		return $default;
+	}
+
+	/**
+	 * Returns the status URL to a broadcasted item.
+	 *
+	 * @param  string      $username
+	 * @param  string|int  $id
+	 * @return string|null
+	 */
+	public function status_url($username, $id) {
+		if (strpos($id, '_') === false) {
+			return null;
+		}
+
+		$ids = explode('_', $id);
+		return 'http://facebook.com/permalink.php?story_fbid='.$ids[1].'&id='.$ids[0];
+	}
+
+	/**
+	 * Loads the pages for the account.
+	 *
+	 * @param  Social_Service_Account  $account
+	 * @param  bool                    $is_profile
+	 * @param  bool                    $save
+	 * @return array
+	 */
+	public function get_pages(Social_Service_Account $account, $is_profile = false, $save = true) {
+		$pages = array();
+		if ($account->use_pages() or $account->use_pages(true)) {
+			$response = $this->request($account, $account->id().'/accounts');
+			if ($response !== false and isset($response->body()->response)) {
+				if (isset($response->body()->response->data)) {
+					foreach ($response->body()->response->data as $item) {
+						if ($item->category != 'Application') {
+							$pages[$item->id] = $item;
+						}
+					}
+				}
+			    else if ($response->body()->response == 'incorrect method') {
+					// Account no longer has page permissions.
+					$service = Social::instance()->service('facebook');
+					$accounts = $service->accounts();
+					foreach ($accounts as $account_id => $_account) {
+						if ($account_id == $account->id()) {
+							$_account->use_pages(false, false);
+							$_account->use_pages(true, false);
+							$_account->pages(array(), $is_profile);
+						}
+
+						$accounts[$account_id] = $account->as_object();
+					}
+
+					if ($save) {
+						$service->accounts($accounts)->save($is_profile);
+					}
+				}
+			}
+		}
+		return $pages;
+	}
+
+	/**
+	 * Builds the page's image URL.
+	 *
+	 * @param  object  $account
+	 * @return string
+	 */
+	public function page_image_url($account) {
+		return apply_filters('social_facebook_page_image_url', 'http://graph.facebook.com/'.$account->id.'/picture', $account);
+	}
+
+	/**
+	 * Comment types for this service.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types() {
+		return array(
+			'social-facebook',
+			'social-facebook-like',
+		);
+	}
+
+	/**
+	 * Comment types that are "meta". In this case, Likes (and perhaps Shares in the future).
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types_meta() {
+		return array(
+			'social-facebook-like',
+		);
+	}
+
+	public static function social_settings_save($controller) {
+		// Save Facebook pages
+		$is_profile = ($controller->request()->post('social_profile') == 'true');
+		if ($is_profile and !defined('IS_PROFILE_PAGE')) {
+			define('IS_PROFILE_PAGE', true);
+		}
+
+		$enabled_child_accounts = $controller->request()->post('social_enabled_child_accounts');
+		if (!is_array($enabled_child_accounts)) {
+			$enabled_child_accounts = array();
+		}
+		$service = $controller->social()->service('facebook');
+		if ($service !== false) {
+			foreach ($service->accounts() as $account) {
+				$updated_accounts = array();
+				foreach ($service->accounts() as $account) {
+					//default service to empty array in case it is not set
+					$enabled_child_accounts[$service->key()] = isset($enabled_child_accounts[$service->key()]) ? $enabled_child_accounts[$service->key()] : array();
+
+					$account->update_enabled_child_accounts($enabled_child_accounts[$service->key()]);
+					$updated_accounts[$account->id()] = $account->as_object();
+				}
+				$service->accounts($updated_accounts)->save($is_profile);
+			}
+		}
+	}
+
+	public static function social_settings_default_accounts($accounts, $controller) {
+		if (is_array($controller->request()->post('social_default_pages'))) {
+			if (!isset($accounts['facebook'])) {
+				$accounts['facebook'] = array(
+					'pages' => array()
+				);
+			}
+			$accounts['facebook']['pages'] = $controller->request()->post('social_default_pages');
+		}
+		else {
+			$accounts['facebook']['pages'] = array();
+		}
+		return $accounts;
+	}
+
+} // End Social_Service_Facebook
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service/facebook/account.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,330 @@
+<?php
+/**
+ * @package Social
+ * @subpackge services
+ */
+final class Social_Service_Facebook_Account extends Social_Service_Account implements Social_Interface_Service_Account {
+
+	/**
+	 * @var  array
+	 */
+	protected $_pages = array();
+
+	/**
+	 * @var  bool
+	 */
+	protected $_use_personal_pages = false;
+
+	/**
+	 * @var  bool
+	 */
+	protected $_use_universal_pages = false;
+
+	/**
+	 * @var  object  broadcast page
+	 */
+	protected $_broadcast_page = null;
+
+	/**
+	 * Sets the use pages flag.
+	 *
+	 * @param  object  $account
+	 */
+	public function __construct($account) {
+		parent::__construct($account);
+
+		if (isset($account->use_personal_pages)) {
+			$this->_use_personal_pages = (bool) $account->use_personal_pages;
+		}
+
+		if (isset($account->use_universal_pages)) {
+			$this->_use_universal_pages = (bool) $account->use_universal_pages;
+		}
+
+		if (isset($account->pages)) {
+			$this->_pages = $account->pages;
+		}
+		else {
+			$this->_pages = (object) array(
+				'personal' => array(),
+				'universal' => array()
+			);
+		}
+	}
+
+	/**
+	 * Returns an array object of the account.
+	 *
+	 * @return object
+	 */
+	public function as_object() {
+		$object = parent::as_object();
+		$object->use_personal_pages = $this->_use_personal_pages;
+		$object->use_universal_pages = $this->_use_universal_pages;
+		$object->pages = $this->_pages;
+		return $object;
+	}
+
+	/**
+	 * Returns whether the account uses pages as well.
+	 *
+	 * @abstract
+	 * @param  bool       $personal check
+	 * @param  bool|null  $use_pages
+	 * @return Social_Service_Account|bool
+	 */
+	public function use_pages($personal = false, $use_pages = null) {
+		if ($use_pages === null) {
+			if ($personal) {
+				return $this->_use_personal_pages;
+			}
+			
+			return $this->_use_universal_pages;
+		}
+
+		if ($personal) {
+			$this->_use_personal_pages = $use_pages;
+		}
+		else {
+			$this->_use_universal_pages = $use_pages;
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Gets the ID of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	public function id() {
+		return $this->_user->id;
+	}
+
+	/**
+	 * Gets the name of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	public function name() {
+		if ($this->has_user()) {
+			return $this->_user->name;
+		}
+
+		return parent::_name();
+	}
+
+	/**
+	 * Gets the URL of the account.
+	 *
+	 * @return string
+	 */
+	public function url() {
+		$url = 'http://facebook.com/';
+		if ($this->has_user()) {
+			$url .= 'profile.php?id='.$this->_user->id;
+		}
+
+		return $url;
+	}
+
+	/**
+	 * Gets the avatar of the account.
+	 *
+	 * @return string
+	 */
+	public function avatar() {
+		if ($this->has_user()) {
+			return 'http://graph.facebook.com/'.$this->_user->id.'/picture';
+		}
+
+		return parent::_avatar();
+	}
+
+	/**
+	 * Gets the username of the account.
+	 *
+	 * @return string
+	 */
+	public function username() {
+		if ($this->has_user()) {
+			if (!isset($this->_user->username)) {
+				$this->_user->username = $this->_user->name.'.'.$this->_user->id;
+			}
+
+			return $this->_user->username;
+		}
+
+		return parent::_username();
+	}
+
+	/**
+	 * Sets and gets the page.
+	 *
+	 * @param  object|int  $page
+	 * @param  bool        $is_profile
+	 * @return bool|Social_Service_Facebook_Account
+	 */
+	public function page($page, $is_profile = false) {
+		if (is_object($page)) {
+			if ($is_profile) {
+				$this->_pages->personal[$page->id] = $page;
+			}
+			else {
+				$this->_pages->universal[$page->id] = $page;
+			}
+			return $this;
+		}
+		else {
+			if ($is_profile and isset($this->_pages->personal[$page])) {
+				return $this->_pages->personal[$page];
+			}
+			else if (!$is_profile and isset($this->_pages->universal[$page])) {
+				return $this->_pages->universal[$page];
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Gets all of the pages.
+	 *
+	 * @param  array  $pages
+	 * @param  bool   $is_profile
+	 * @return array|Social_Service_Facebook_Account
+	 */
+	public function pages(array $pages = null, $is_profile = false) {
+		if ($pages === null) {
+			if ($is_profile === true) {
+				return $this->_pages->personal;
+			}
+			else if ($is_profile === false) {
+				return $this->_pages->universal;
+			}
+			else if ($is_profile === 'combined') {
+				$pages = $this->_pages->personal;
+				foreach ($this->_pages->universal as $page) {
+					if (!isset($pages[$page->id])) {
+						$pages[$page->id] = $page;
+					}
+				}
+				return $pages;
+			}
+
+			return array();
+		}
+
+		if (count($pages)) {
+			foreach ($pages as $_page) {
+				if ($is_profile) {
+					$this->_pages->personal[$_page->id] = $_page;
+				}
+				else {
+					$this->_pages->universal[$_page->id] = $_page;
+				}
+			}
+		}
+		else {
+			if ($is_profile) {
+				$this->_pages->personal = array();
+			}
+			else {
+				$this->_pages->universal = array();
+			}
+		}
+		
+		return $this;
+	}
+
+	/**
+	 * Sets and gets the page to broadcast to.
+	 *
+	 * @param  object  $page
+	 * @return object|Social_Service_Facebook_Account
+	 */
+	public function broadcast_page($page = null) {
+		if ($page === null) {
+			return $this->_broadcast_page;
+		}
+
+		$this->_broadcast_page = $page;
+		return $this;
+	}
+
+	/**
+	 *
+	 *
+	 */
+	public function update_enabled_child_accounts($enabled_child_ids) {
+		$is_profile = defined('IS_PROFILE_PAGE');
+
+		// reset enabled pages for account
+		$this->pages(array(), $is_profile);
+		// get available pages for account
+		$pages = $this->fetch_child_accounts();
+
+		// rebuild based on selections
+		foreach ($enabled_child_ids as $enabled_child_id) {
+			if (isset($pages[$enabled_child_id])) {
+				$this->page($pages[$enabled_child_id], $is_profile);
+			}
+		}
+	}
+
+	/**
+	 * Get all pages (the accounts are already segregated by personal/universal so we just want all of the pages).
+	 *
+	 * @param  bool  $refresh  Update list of child accounts from service.
+	 * @return array
+	 */
+	public function child_accounts($update = false) {
+		if ($update) {
+			$pages = $this->fetch_child_accounts();
+			if (defined('IS_PROFILE_PAGE')) {
+				$this->_pages->personal = $pages;
+			}
+			else {
+				$this->_pages->universal = $pages;
+			}
+		}
+		return array_merge($this->_pages->personal, $this->_pages->universal);
+	}
+	
+	/**
+	 * Get pages list from Facebook.
+	 *
+	 * @param  bool  $refresh  Update list of child accounts from service.
+	 * @return array
+	 */
+	public function fetch_child_accounts() {
+		$pages = array();
+		if ($this->use_pages() or $this->use_pages(true)) {
+			$service = new Social_Service_Facebook;
+			$pages = $service->get_pages($this);
+		}
+		return $pages;
+	}
+
+	/**
+	 * Child account key.
+	 *
+	 * @return string
+	 */
+	public function child_account_key() {
+		return 'pages';
+	}
+
+	/**
+	 * Child account avatar.
+	 *
+	 * @return string
+	 */
+	public function child_account_avatar($child_account) {
+		$service = new Social_Service_Facebook;
+		return $service->page_image_url($child_account);
+	}
+
+} // End Social_Service_Facebook_Account
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service/twitter.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,679 @@
+<?php
+// Service Filters
+add_filter('social_response_body', array('Social_Service_Twitter', 'response_body'));
+add_filter('get_comment_author_link', array('Social_Service_Twitter', 'get_comment_author_link'));
+
+/**
+ * Twitter implementation for the service.
+ *
+ * @package    Social
+ * @subpackage services
+ */
+final class Social_Service_Twitter extends Social_Service implements Social_Interface_Service {
+
+	/**
+	 * @var  string  service key
+	 */
+	protected $_key = 'twitter';
+
+	/**
+	 * The max length a post can be when broadcasted.
+	 *
+	 * @return int
+	 */
+	public function max_broadcast_length() {
+		return 140;
+	}
+
+	/**
+	 * Any additional parameters that should be passed with a broadcast.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public function get_broadcast_extras($account_id, $post, $args = array()) {
+		if (isset($_POST['social_account_in_reply_to']) &&
+			isset($_POST['social_account_in_reply_to'][$this->key()]) &&
+			!empty($_POST['social_account_in_reply_to'][$this->key()][$account_id])) {
+			$id = $this->tweet_url_to_id(stripslashes($_POST['social_account_in_reply_to'][$this->key()][$account_id]));
+			if (!empty($id)) {
+				$args['in_reply_to_status_id'] = $id;
+			}
+		}
+		return parent::get_broadcast_extras($account_id, $post, $args);
+	}
+
+	/**
+	 * Broadcasts the message to the specified account. Returns the broadcasted ID.
+	 *
+	 * @param  Social_Service_Account  $account     account to broadcast to
+	 * @param  string                  $message     message to broadcast
+	 * @param  array                   $args        extra arguments to pass to the request
+	 * @param  int                     $post_id     post ID being broadcasted
+	 * @param  int                     $comment_id  comment ID being broadcasted
+	 *
+	 * @return Social_Response
+	 */
+	public function broadcast($account, $message, array $args = array(), $post_id = null, $comment_id = null) {
+		$args = $args + array(
+			'status' => $message
+		);
+
+		$args = apply_filters($this->key().'_broadcast_args', $args, $post_id);
+		return $this->request($account, 'statuses/update', $args, 'POST');
+	}
+
+	/**
+	 * Aggregates comments by URL.
+	 *
+	 * @param  object  $post
+	 * @param  array   $urls
+	 * @return void
+	 */
+	public function aggregate_by_url(&$post, array $urls) {
+		if ( ! ($account = $this->api_account())) {
+			return;
+		}
+
+		Social::log('Searching by URL(s) for post #:post_id. urls -> :urls', array(
+			'post_id' => $post->ID,
+			'urls' => print_r($url, true),
+			'rpp' => 100
+		));
+
+		$social_response = $this->request($account, 'search', array(
+			'q' => implode('+OR+', $urls)
+		));
+
+		if (isset($social_response->body()->response) and is_array($social_response->body()->response) and count($social_response->body()->response)) {
+			foreach ($social_response->body()->response as $result) {
+				$data = array(
+					'username' => $result->from_user,
+				);
+
+				if (in_array($result->id, $post->aggregated_ids[$this->_key])) {
+					Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'url', true, $data);
+					continue;
+				}
+				else {
+					if ($this->is_original_broadcast($post, $result->id)) {
+						continue;
+					}
+				}
+
+				$result->comment_type = (Social_Twitter::is_retweet(null, $result) ? 'social-twitter-rt' : 'social-twitter');
+
+				Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'url', false, $data);
+				$post->aggregated_ids[$this->_key][] = $result->id;
+				$post->results[$this->_key][$result->id] = $result;
+			}
+		}
+		else {
+			Social::log('URL search failed for post #:post_id.', array(
+				'post_id' => $post->ID,
+			));
+		}
+	}
+
+	/**
+	 * Aggregates comments by the service's API.
+	 *
+	 * @param  object  $post
+	 * @return array
+	 */
+	public function aggregate_by_api(&$post) {
+		$accounts = $this->get_aggregation_accounts($post);
+		if (isset($accounts[$this->_key]) and count($accounts[$this->_key])) {
+			foreach ($accounts[$this->_key] as $account) {
+				if (isset($post->broadcasted_ids[$this->_key][$account->id()])) {
+					$broadcasted_ids = $post->broadcasted_ids[$this->_key][$account->id()];
+
+					// Retweets
+					foreach ($broadcasted_ids as $broadcasted_id => $data) {
+						Social::log('Aggregating Twitter via statuses/retweets');
+						$response = $this->request($account, 'statuses/retweets/'.$broadcasted_id, array(
+							'count' => 200,
+						));
+						if ($response !== false and is_array($response->body()->response) and count($response->body()->response)) {
+							foreach ($response->body()->response as $result) {
+								$data = array(
+									'username' => $result->user->screen_name,
+								);
+
+								if (in_array($result->id, $post->aggregated_ids[$this->_key])) {
+									Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'retweet', true, $data);
+									continue;
+								}
+								// sanity check
+								if ($this->is_original_broadcast($post, $result->id)) {
+									continue;
+								}
+
+								Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'retweet', false, $data);
+								$post->aggregated_ids[$this->_key][] = $result->id;
+								$post->results[$this->_key][$result->id] = (object) array(
+									'id' => $result->id,
+									'from_user_id' => $result->user->id,
+									'from_user' => $result->user->screen_name,
+									'text' => $result->text,
+									'created_at' => $result->created_at,
+									'profile_image_url' => $result->user->profile_image_url,
+									'in_reply_to_status_id' => $result->in_reply_to_status_id,
+									'raw' => $result,
+									'comment_type' => 'social-twitter-rt',
+								);
+							}
+						}
+					}
+
+					// Mentions
+					Social::log('Aggregating Twitter via statuses/mentions');
+					$response = $this->request($account, 'statuses/mentions', array(
+						'count' => 200,
+					));
+					if ($response !== false and is_array($response->body()->response) and count($response->body()->response)) {
+						foreach ($response->body()->response as $result) {
+							if ($this->is_original_broadcast($post, $result->id) || isset($post->results[$this->_key][$result->id])) {
+								continue;
+							}
+							$data = array(
+								'username' => $result->user->screen_name,
+							);
+							// existing comment
+							if (in_array($result->id, $post->aggregated_ids[$this->_key])) {
+								Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'reply', true, $data);
+								continue;
+							}
+							// not a reply to a broadcast, or a reply to an aggregated (or broadcast) comment
+							if (!isset($broadcasted_ids[$result->in_reply_to_status_id]) &&
+								(
+									!isset($post->aggregated_ids[$this->_key]) ||
+									!in_array($result->in_reply_to_status_id, $post->aggregated_ids[$this->_key])
+								)) {
+								continue;
+							}
+
+							Social_Aggregation_Log::instance($post->ID)->add($this->_key, $result->id, 'reply', false, $data);
+							$post->aggregated_ids[$this->_key][] = $result->id;
+							$post->results[$this->_key][$result->id] = (object) array(
+								'id' => $result->id,
+								'from_user_id' => $result->user->id,
+								'from_user' => $result->user->screen_name,
+								'text' => $result->text,
+								'created_at' => $result->created_at,
+								'profile_image_url' => $result->user->profile_image_url,
+								'in_reply_to_status_id' => $result->in_reply_to_status_id,
+								'raw' => $result,
+								'comment_type' => (Social_Twitter::is_retweet(null, $result) ? 'social-twitter-rt' : 'social-twitter'),
+							);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Saves the aggregated comments.
+	 *
+	 * @param  object  $post
+	 * @param  bool    $skip_approval
+	 * @return void
+	 */
+	public function save_aggregated_comments(&$post, $skip_approval = false) {
+		if (isset($post->results[$this->_key])) {
+			global $wpdb;
+
+			foreach ($post->results[$this->_key] as $result) {
+				if (!isset($result->user->protected) or $result->user->protected == false) {
+					$account = (object) array(
+						'user' => (object) array(
+							'id' => $result->from_user_id,
+							'screen_name' => $result->from_user,
+						),
+					);
+					$class = 'Social_Service_'.$this->_key.'_Account';
+					$account = new $class($account);
+
+					$commentdata = array(
+						'comment_post_ID' => $post->ID,
+						'comment_type' => $result->comment_type,
+						'comment_author' => $wpdb->escape($account->username()),
+						'comment_author_email' => $wpdb->escape($this->_key.'.'.$account->id().'@example.com'),
+						'comment_author_url' => $account->url(),
+						'comment_content' => $wpdb->escape($result->text),
+						'comment_date' => date('Y-m-d H:i:s', strtotime($result->created_at) + (get_option('gmt_offset') * 3600)),
+						'comment_date_gmt' => gmdate('Y-m-d H:i:s', strtotime($result->created_at)),
+						'comment_author_IP' => $_SERVER['SERVER_ADDR'],
+						'comment_agent' => 'Social Aggregator',
+					);
+
+					if ($skip_approval || (apply_filters('social_approve_likes_and_retweets', true) && Social_Twitter::is_retweet(null, $result))) {
+						$commentdata['comment_approved'] = 1;
+					}
+					else if (($commentdata = $this->allow_comment($commentdata, $result->id, $post)) === false) {
+						continue;
+					}
+
+					// sanity check to make sure this comment is not a duplicate
+					if ($this->is_duplicate_comment($post, $result->id)) {
+						Social::log('Result #:result_id already exists, skipping.', array(
+							'result_id' => $result->id
+						), 'duplicate-comment');
+						continue;
+					}
+
+					Social::log('Saving #:result_id for account :account_id.', array(
+						'result_id' => $result->id,
+						'account_id' => $account->id()
+					));
+
+					$comment_id = 0;
+					try
+					{
+						Social::Log('Attempting to save commentdata: :commentdata', array(
+							'commentdata' => print_r($commentdata, true)
+						));
+						$comment_id = wp_insert_comment($commentdata);
+
+						update_comment_meta($comment_id, 'social_account_id', addslashes_deep($result->from_user_id));
+						update_comment_meta($comment_id, 'social_profile_image_url', addslashes_deep($result->profile_image_url));
+						update_comment_meta($comment_id, 'social_status_id', addslashes_deep($result->id));
+
+						// Attempt to see if the comment is in response to an existing Tweet.
+						if (!isset($result->in_reply_to_status_id)) {
+							// This "should" only happen on tweets found on the URL search
+							foreach ($this->accounts() as $account) {
+								$response = $this->request($account, 'statuses/show/'.$result->id)->body();
+
+								if (isset($response->in_reply_to_status_id)) {
+									if (!empty($response->in_reply_to_status_id)) {
+										$result->in_reply_to_status_id = $response->in_reply_to_status_id;
+									}
+									break;
+								}
+							}
+						}
+
+						if (isset($result->in_reply_to_status_id)) {
+							update_comment_meta($comment_id, 'social_in_reply_to_status_id', addslashes_deep($result->in_reply_to_status_id));
+						}
+
+						if (!isset($result->raw)) {
+							$result = (object) array_merge((array) $result, array('raw' => $result));
+						}
+						update_comment_meta($comment_id, 'social_raw_data', addslashes_deep(base64_encode(json_encode($result->raw))));
+
+						if ($commentdata['comment_approved'] !== 'spam') {
+							if ($commentdata['comment_approved'] == '0') {
+								wp_notify_moderator($comment_id);
+							}
+
+							if (get_option('comments_notify') and $commentdata['comment_approved'] and (!isset($commentdata['user_id']) or $post->post_author != $commentdata['user_id'])) {
+								wp_notify_postauthor($comment_id, 'comment');
+							}
+						}
+					}
+					catch (Exception $e) {
+						// Something went wrong, remove the aggregated ID.
+						if (($key = array_search($result->id, $post->aggregated_ids['twitter'])) !== false) {
+							unset($post->aggregated_ids['twitter'][$key]);
+						}
+
+						if ((int) $comment_id) {
+							// Delete the comment in case it wasn't the insert that failed.
+							wp_delete_comment($comment_id);
+						}
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Hook to allow services to define their aggregation row items based on the passed in type.
+	 *
+	 * @param  string  $type
+	 * @param  object  $item
+	 * @param  string  $username
+	 * @param  int     $id
+	 * @return string
+	 */
+	public function aggregation_row($type, $item, $username, $id) {
+		if ($type == 'retweet') {
+			$link = $this->status_url($username, $id);
+			$output = '<a href="'.esc_url($link).'" target="_blank">#'.$item->id.'</a> ('.__('Retweet Search', 'social').')';
+
+			if ($item->ignored) {
+				$output .= ' ('.__('Existing Comment', 'social').')';
+			}
+
+			return $output;
+		}
+		return '';
+	}
+
+	/**
+	 * Parse a Twitter URL and return the tweet ID.
+	 *
+	 * @param  string  $url
+	 * @return string
+	 */
+	public function tweet_url_to_id($url) {
+		if (substr($url, 0, 4) != 'http' || strpos($url, '/') === false) {
+			return '';
+		}
+		$url = explode('/', $url);
+		return end($url);
+	}
+
+	/**
+	 * Imports a Tweet by URL.
+	 *
+	 * @param  int     $post_id
+	 * @param  string  $url
+	 * @return bool|string
+	 */
+	public function import_tweet_by_url($post_id, $url) {
+		if ( ! ($account = $this->api_account())) {
+			return;
+		}
+
+		$post = get_post($post_id);
+
+		$post->broadcasted_ids = get_post_meta($post->ID, '_social_broadcasted_ids', true);
+		if (empty($post->broadcasted_ids)) {
+			$post->broadcasted_ids = array();
+		}
+
+		$invalid = false;
+		$id = $this->tweet_url_to_id($url);
+		if (!empty($id) and !$this->is_original_broadcast($post, $id)) {
+			Social::log('Importing tweet. -- ID: :id -- URL: :url', array("id" => $id, "url" => $url));
+			$social_response = $this->request($account, 'statuses/show/'.$id, array(
+				'include_entities' => 'true',
+			));
+			error_log(print_r($social_response, true));
+			if ($social_response !== false and is_object($social_response->body()->response)) {
+				$response = $social_response->body()->response;
+				if ($response !== null and !isset($response->error)) {
+					$logger = Social_Aggregation_Log::instance($post->ID);
+
+					$post->aggregated_ids = get_post_meta($post->ID, '_social_aggregated_ids', true);
+					if (empty($post->aggregated_ids)) {
+						$post->aggregated_ids = array();
+					}
+
+					if (!isset($post->aggregated_ids[$this->_key])) {
+						$post->aggregated_ids[$this->_key] = array();
+					}
+
+					if (in_array($id, $post->aggregated_ids[$this->_key])) {
+						$logger->add($this->_key, $response->id, 'Imported', true, array(
+							'username' => $response->user->screen_name,
+						));
+					}
+					else {
+						$logger->add($this->_key, $response->id, 'Imported', false, array(
+							'username' => $response->user->screen_name,
+						));
+
+						$post->aggregated_ids[$this->_key][] = $response->id;
+						$post->results = array(
+							$this->_key => array(
+								$response->id => (object) array(
+									'id' => $response->id,
+									'from_user_id' => $response->user->id,
+									'from_user' => $response->user->screen_name,
+									'text' => $response->text,
+									'created_at' => $response->created_at,
+									'profile_image_url' => $response->user->profile_image_url,
+									'in_reply_to_status_id' => $response->in_reply_to_status_id,
+									'raw' => $response,
+									'comment_type' => 'social-twitter',
+								),
+							),
+						);
+
+						$this->save_aggregated_comments($post, true);
+
+						// Some cleanup...
+						unset($post->aggregated_ids);
+						unset($post->results);
+					}
+					$logger->save(true);
+				}
+				else {
+					Social::log('Something went wrong... -- :response', array(
+						'response' => print_r($response, true)
+					));
+
+					if (isset($response->error)) {
+						if ($response->error == 'Sorry, you are not authorized to see this status.') {
+							return 'protected';
+						}
+						else {
+							$invalid = true;
+						}
+					}
+				}
+			}
+			else {
+				$invalid = true;
+			}
+		}
+		else {
+			Social::log('Something went wrong... -- ID: :id -- URL: :url', array(
+				'id' => $id,
+				'url' => implode('/', $url)
+			));
+
+			$invalid = true;
+		}
+		unset($post->broadcasted_ids);
+
+		if ($invalid) {
+			return 'invalid';
+		}
+
+		return true;
+	}
+
+	/**
+	 * Checks the response to see if the broadcast limit has been reached.
+	 *
+	 * @param  string  $response
+	 * @return bool
+	 */
+	public function limit_reached($response) {
+		return false;
+	}
+
+	/**
+	 * Checks the response to see if the broadcast is a duplicate.
+	 *
+	 * @param  string  $response
+	 * @return bool
+	 */
+	public function duplicate_status($response) {
+		return ($response == 'Status is a duplicate.');
+	}
+
+	/**
+	 * Checks the response to see if the account has been deauthorized.
+	 *
+	 * @param  string  $response
+	 * @param  bool    $check_invalid_key
+	 * @return bool
+	 */
+	public function deauthorized($response, $check_invalid_key = false) {
+		if (($check_invalid_key and $response == 'invalid key') or $response == 'Could not authenticate with OAuth.') {
+			return true;
+		}
+		return false;
+	}
+
+	/**
+	 * Returns the key to use on the request response to pull the ID.
+	 *
+	 * @return string
+	 */
+	public function response_id_key() {
+		return 'id_str';
+	}
+
+	/**
+	 * Returns the response message.
+	 *
+	 * @param  object  $body
+	 * @param  string  $default
+	 * @return mixed
+	 */
+	public function response_message($body, $default) {
+		if (isset($body->response) and isset($body->response->text)) {
+			return $body->response->text;
+		}
+
+		return $default;
+	}
+
+	/**
+	 * Returns the status URL to a broadcasted item.
+	 *
+	 * @param  string      $username
+	 * @param  string|int  $id
+	 * @return string
+	 */
+	public function status_url($username, $id) {
+		return 'http://twitter.com/'.$username.'/status/'.$id;
+	}
+
+	/**
+	 * Stores the recovered meta.
+	 *
+	 * @param  int     $post_id
+	 * @param  int     $broadcasted_id
+	 * @param  object  $response
+	 * @return bool
+	 */
+	public function recovered_meta($post_id, $broadcasted_id, $response) {
+		// Load the broadcasted IDs meta
+		$broadcasted = get_post_meta($post_id, '_social_broadcasted_ids', true);
+		foreach ($broadcasted['twitter'] as $account_id => $broadcasted_items) {
+			// Loop through the broadcasted items until we find a match.
+			foreach ($broadcasted_items as $id => $data) {
+				if ($broadcasted_id == $id) {
+					// Store the recovered data.
+					$data = array(
+						'message' => $response->text,
+						'account' => (object) array(
+							'user' => $response->user
+						)
+					);
+					$broadcasted['twitter'][$account_id][$id] = $data;
+					update_post_meta($post_id, '_social_broadcasted_ids', addslashes_deep($broadcasted));
+					return true;
+				}
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Attempts to recover the tweet data for the broadcasted post.
+	 *
+	 * @param  int  $broadcasted_id
+	 * @param  int  $post_id
+	 * @return array|bool|mixed
+	 */
+	public function recover_broadcasted_tweet_data($broadcasted_id, $post_id) {
+		if ( ! ($account = $this->api_account())) {
+			return;
+		}
+
+		$social_response = $this->request($account, '/statuses/show/'.$broadcasted_id, array(
+			'include_entities' => true,
+		));
+
+		if ($social_response !== false && is_object($social_response->body()->response)) {
+			$body = $social_response->body()->response;
+			if (!isset($body->error)) {
+				$post_meta = get_post_meta($post_id, '_social_broadcasted_ids', true);
+				if (!empty($post_meta) and isset($post_meta['twitter']) and isset($post_meta['twitter'][$body->user->id]) and isset($post_meta['twitter'][$body->user->id][$broadcasted_id])) {
+					$post_meta['twitter'][$body->user->id][$broadcasted_id] = array(
+						'message' => $body->text,
+						'account' => $body->user
+					);
+
+					update_post_meta($post_id, '_social_broadcasted_ids', addslashes_deep($post_meta));
+				}
+				return $body;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Hack to fix the "Twitpocalypse" bug on 32-bit systems.
+	 *
+	 * @static
+	 * @param  string  $body
+	 * @return object
+	 */
+	public static function response_body($body) {
+		$body = preg_replace('/"id":(\d+)/', '"id":"$1"', $body);
+		$body = preg_replace('/"in_reply_to_status_id":(\d+)/', '"in_reply_to_status_id":"$1"', $body);
+		return json_decode($body);
+	}
+
+	/**
+	 * Adds the account ID to the rel for the author link.
+	 *
+	 * @static
+	 * @param  string  $url
+	 * @return string
+	 */
+	public static function get_comment_author_link($url) {
+		if (Social::option('use_standard_comments') == '1') {
+			return $url;
+		}
+		global $comment;
+		if (in_array($comment->comment_type, self::comment_types())) {
+			$status_id = get_comment_meta($comment->comment_ID, 'social_status_id', true);
+			$output = str_replace("rel='", "rel='".$status_id." ", $url);
+			$output = str_replace("'>", "'>@", $output);
+
+			return $output;
+		}
+
+		return $url;
+	}
+
+	/**
+	 * Comment types for this service.
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types() {
+		return array(
+			'social-twitter',
+			'social-twitter-rt',
+		);
+	}
+
+	/**
+	 * Comment types that are "meta". In this case, Retweets (and perhaps Favorites in the future).
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function comment_types_meta() {
+		return array(
+			'social-twitter-rt',
+		);
+	}
+
+} // End Social_Service_Twitter
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/service/twitter/account.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,81 @@
+<?php
+/**
+ * @package Social
+ * @subpackge services
+ */
+final class Social_Service_Twitter_Account extends Social_Service_Account implements Social_Interface_Service_Account {
+
+	/**
+	 * Gets the ID of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	public function id() {
+		return $this->_user->id;
+	}
+
+	/**
+	 * Gets the name of the account.
+	 *
+	 * @abstract
+	 * @return string
+	 */
+	public function name() {
+		if ($this->has_user()) {
+			return $this->_user->screen_name;
+		}
+
+		return parent::_name();
+	}
+
+	/**
+	 * Gets the URL of the account.
+	 *
+	 * @return string
+	 */
+	public function url() {
+		$url = 'http://twitter.com/';
+		if ($this->has_user()) {
+			$url .= $this->_user->screen_name;
+		}
+
+		return $url;
+	}
+
+	/**
+	 * Gets the avatar of the account.
+	 *
+	 * @return string
+	 */
+	public function avatar() {
+		if ($this->has_user()) {
+			return $this->_user->profile_image_url;
+		}
+
+		return parent::_avatar();
+	}
+
+	/**
+	 * Gets the username of the account.
+	 *
+	 * @return string
+	 */
+	public function username() {
+		if ($this->has_user()) {
+			return $this->_user->screen_name;
+		}
+
+		return parent::_username();
+	}
+
+	/**
+	 * Update the enabled child accounts
+	 * ( Currently not in use by twitter )
+	 *
+	 * @param array $enabled_child_ids Array of enabled child account ids
+	 */
+	public function update_enabled_child_accounts($enabled_child_ids) {
+	}
+
+} // End Social_Service_Twitter_Account
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/view.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,149 @@
+<?php
+/**
+ * View
+ *
+ * Handles all of the views.
+ *
+ * @package Social
+ */
+final class Social_View {
+
+	/**
+	 * Initializes a view.
+	 *
+	 * @static
+	 * @param  string  $file
+	 * @param  array   $data
+	 * @return Social_View
+	 */
+	public static function factory($file = null, array $data = array()) {
+		return new Social_View($file, $data);
+	}
+
+	/**
+	 * @var  string  view file
+	 */
+	protected $_file;
+
+	/**
+	 * @var  array  view data
+	 */
+	protected $_data = array();
+
+	/**
+	 * Sets the view file and data. Should be called by Social_View::factory().
+	 *
+	 * @param  string  $file
+	 * @param  array   $data
+	 */
+	public function __construct($file = null, array $data = array()) {
+		if (empty($this->_data)) {
+			$this->_data = $data;
+		}
+		
+		if ($file !== null) {
+			$this->set_file($file);
+		}
+	}
+
+	/**
+	 * Calls render() when the object is echoed.
+	 *
+	 * @return string
+	 */
+	public function __toString() {
+		try {
+			return $this->render();
+		}
+		catch (Exception $e) {
+			// Log the exception
+			error_log(print_r($e, true));
+			return '';
+		}
+	}
+
+	/**
+	 * Sets view data.
+	 *
+	 * @param  mixed  $key
+	 * @param  string  $value
+	 * @return Social_View
+	 */
+	public function set($key, $value = null) {
+		if (is_array($key)) {
+			foreach ($key as $name => $value) {
+				$this->_data[$name] = $value;
+			}
+		}
+		else {
+			$this->_data[$key] = $value;
+		}
+
+		return $this;
+	}
+
+	/**
+	 * Renders the view.
+	 *
+	 * @throws Exception
+	 * @param  string  $file
+	 * @return string
+	 */
+	public function render($file = null) {
+		if ($file !== null) {
+			$this->set_file($file);
+		}
+
+		if (empty($this->_file)) {
+			throw new Exception(__('You must set a file to be used before rendering.', 'social'));
+		}
+
+		$this->_data = apply_filters('social_view_data', $this->_data, $this->_file);
+		extract($this->_data, EXTR_SKIP);
+		ob_start();
+		try {
+			include $this->path($this->_file);
+		}
+		catch (Exception $e) {
+			ob_end_clean();
+			throw $e;
+		}
+
+		return ob_get_clean();
+	}
+
+	/**
+	 * Sets the file to use for the view.
+	 *
+	 * @throws Exception
+	 * @param  string  $file
+	 * @return void
+	 */
+	private function set_file($file) {
+		$file = apply_filters('social_view_set_file', $file, $this->_data);
+		
+		if (file_exists($file)) {
+			$this->_file = $file;
+		}
+		else {
+			if (file_exists($this->path($file))) {
+				$this->_file = $file;
+			}
+		}
+
+		if ($this->_file === null) {
+			throw new Exception(sprintf(__('View %s does not exist.', 'social'), $file));
+		}
+	}
+
+	/**
+	 * Builds the absolute URL path to the view.
+	 *
+	 * @param  string  $file
+	 * @return string
+	 */
+	private function path($file) {
+		return Social::$plugins_path.'views/'.$file.'.php';
+	}
+
+} // End Social_View
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/lib/social/walker/comment.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,61 @@
+<?php
+/**
+ * Custom comment walker.
+ *
+ * @package Social
+ * @subpackage walkers
+ */
+final class Social_Walker_Comment extends Walker_Comment {
+
+	/**
+	 * @see Walker::start_lvl()
+	 * @since 2.7.0
+	 *
+	 * @param string $output Passed by reference. Used to append additional content.
+	 * @param int $depth Depth of comment.
+	 * @param array $args Uses 'style' argument for type of HTML list.
+	 */
+	public function start_lvl(&$output, $depth, $args) {
+		$GLOBALS['comment_depth'] = $depth + 1;
+
+		switch ($args['style']) {
+			case 'div':
+			break;
+			case 'ol':
+				echo "<ol class='social-children'>\n";
+			break;
+			default:
+			case 'ul':
+				echo "<ul class='social-children'>\n";
+			break;
+		}
+	}
+
+	/**
+	 * @see Walker::end_lvl()
+	 * @since 2.7.0
+	 *
+	 * @param string $output Passed by reference. Used to append additional content.
+	 * @param int $depth Depth of comment.
+	 * @param array $args Will only append content if style argument value is 'ol' or 'ul'.
+	 */
+	public function end_lvl(&$output, $depth, $args) {
+		$GLOBALS['comment_depth'] = $depth + 1;
+
+		switch ($args['style']) {
+			case 'div':
+			break;
+			case 'ol':
+				echo "</ol>\n";
+			break;
+			default:
+			case 'ul':
+				echo "</ul>\n";
+			break;
+		}
+
+		echo "</li>\n";
+	}
+
+} // End Social_Walker_Comment
+
Binary file web/wp-content/plugins/social/screenshot-1.png has changed
Binary file web/wp-content/plugins/social/screenshot-2.png has changed
Binary file web/wp-content/plugins/social/screenshot-3.png has changed
Binary file web/wp-content/plugins/social/screenshot-4.png has changed
Binary file web/wp-content/plugins/social/screenshot-5.png has changed
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/social-facebook.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,503 @@
+<?php
+/**
+ * Twitter implementation for Social.
+ *
+ * @package    Social
+ * @subpackage plugins
+ */
+if (class_exists('Social') and !class_exists('Social_Facebook')) {
+
+final class Social_Facebook {
+
+	/**
+	 * Registers Facebook to Social.
+	 *
+	 * @static
+	 * @wp-filter  social_register_service
+	 *
+	 * @param  array  $services
+	 *
+	 * @return array
+	 */
+	public static function register_service(array $services) {
+		$services[] = 'facebook';
+		return $services;
+	}
+
+	/**
+	 * Adds the permissions stuff in for Facebook.
+	 *
+	 * @static
+	 * @wp-filter  social_authorize_url
+	 * @param  string  $url  authorization url
+	 * @param  string  $key  service key
+	 * @return string
+	 */
+	public static function social_authorize_url($url, $key) {
+		if ($key == 'facebook') {
+			$perms = 'publish_stream';
+			if (is_admin()) {
+				$perms .= ',read_stream,offline_access';
+			}
+
+			$url = $url.'?req_perms='.$perms;
+		}
+
+		return $url;
+	}
+
+	/**
+	 * Adds to the avatar comment types array.
+	 *
+	 * @static
+	 * @param  array  $types
+	 * @return array
+	 */
+	public static function get_avatar_comment_types(array $types) {
+		return array_merge($types, Social_Service_Facebook::comment_types());
+	}
+
+	/**
+	 * Gets the avatar based on the comment type.
+	 *
+	 * @static
+	 * @wp-filter  get_avatar
+	 * @param  string  $avatar
+	 * @param  object  $comment
+	 * @param  int     $size
+	 * @param  string  $default
+	 * @param  string  $alt
+	 * @return string
+	 */
+	public static function get_avatar($avatar, $comment, $size, $default, $alt) {
+		if (is_object($comment) and in_array($comment->comment_type, Social_Service_Facebook::comment_types())) {
+			$image = esc_url(get_comment_meta($comment->comment_ID, 'social_profile_image_url', true));
+			if ($image !== null) {
+				$size = esc_attr($size);
+				$type = esc_attr($comment->comment_type);
+				return '<img alt="'.$alt.'" src="'.$image.'" class="avatar avatar-'.$size.' photo '.$type.'" height="'.$size.'" width="'.$size.'" />';
+			}
+		}
+		return $avatar;
+	}
+
+	/**
+	 * Pre-processor to the comments.
+	 *
+	 * @wp-filter social_comments_array
+	 * @static
+	 * @param  array  $comments
+	 * @param  int    $post_id
+	 * @return array
+	 */
+	public static function comments_array(array $comments, $post_id) {
+		// pre-load the hashes for broadcasted tweets
+		$broadcasted_ids = get_post_meta($post_id, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids) or empty($broadcasted_ids['facebook'])) {
+			$broadcasted_ids = array();
+		}
+		global $wpdb;
+
+		// we need comments to be keyed by ID, check for Facebook comments
+		$facebook_comments = $facebook_likes = $_comments = $comment_ids = array();
+		foreach ($comments as $key => $comment) {
+			if (is_object($comment)) {
+				$_comments['id_'.$comment->comment_ID] = $comment;
+				if (in_array($comment->comment_type, Social_Service_Facebook::comment_types())) {
+					$comment_ids[] = $comment->comment_ID;
+					$facebook_comments['id_'.$comment->comment_ID] = $comment;
+				}
+			}
+			else { // social items
+				$_comments[$key] = $comment;
+			}
+		}
+
+		// if no Facebook comments, get out now
+		if (!count($facebook_comments)) {
+			return $comments;
+		}
+
+		// use our keyed array
+		$comments = $_comments;
+		unset($_comments);
+
+		// Load the comment meta
+		$results = $wpdb->get_results("
+			SELECT meta_key, meta_value, comment_id
+			  FROM $wpdb->commentmeta
+			 WHERE comment_id IN (".implode(',', $comment_ids).")
+			   AND (
+			       meta_key = 'social_status_id'
+			    OR meta_key = 'social_profile_image_url'
+			    OR meta_key = 'social_comment_type'
+			)
+		");
+
+		// Set up social data for facebook comments
+		foreach ($facebook_comments as $key => &$comment) {
+			$comment->social_items = array();
+
+			// Attach meta
+			foreach ($results as $result) {
+				if ($comment->comment_ID == $result->comment_id) {
+					$comment->{$result->meta_key} = $result->meta_value;
+				}
+			}
+		}
+
+		// merge data so that $comments has the data we've set up
+		$comments = array_merge($comments, $facebook_comments);
+
+		// set-up the likes
+		foreach ($facebook_comments as $key => &$comment) {
+			if (is_object($comment) and isset($broadcasted_ids['facebook'])) {
+				foreach ($broadcasted_ids['facebook'] as $account_id => $broadcasted) {
+					if (isset($comment->social_status_id) and isset($broadcasted[$comment->social_status_id]) and $comment->comment_type == 'social-facebook-like') {
+						$facebook_likes[] = $comment;
+						unset($comments['id_'.$comment->comment_ID]);
+					}
+				}
+			}
+		}
+
+		// Add the likes
+		if (!isset($comments['social_items'])) {
+			$comments['social_items'] = array();
+		}
+
+		if (count($facebook_likes)) {
+			$comments['social_items']['facebook'] = $facebook_likes;
+		}
+
+		return $comments;
+	}
+
+	/**
+	 * Filters the groups.
+	 *
+	 * @static
+	 * @param  array  $groups
+	 * @param  array  $comments
+	 * @return array
+	 */
+	public static function comments_array_groups(array $groups, array $comments) {
+		if (isset($groups['social-facebook-like'])) {
+			if (!isset($groups['social-facebook'])) {
+				$groups['social-facebook'] = 0;
+			}
+
+			$groups['social-facebook'] = $groups['social-facebook'] + $groups['social-facebook-like'];
+			unset($groups['social-facebook-like']);
+		}
+
+		return $groups;
+	}
+
+	/**
+	 * Adds the Facebook Pages checkbox to the button.
+	 *
+	 * @static
+	 * @param  string                   $button
+	 * @param  Social_Service_Facebook  $service
+	 * @param  bool                     $profile_page
+	 * @return string
+	 */
+	public static function social_service_button($button, $service, $profile_page = false) {
+		if ($service->key() == 'facebook') {
+			$label = '<input type="checkbox" id="social-facebook-pages" value="true" />'
+			       . '<label for="social-facebook-pages">'.__('Connect with Pages support', 'social').'</label>';
+
+			if (!$profile_page) {
+				$button = explode('</div>', $button);
+				$button = $button[0].$label.'</div>';
+			}
+		}
+		return $button;
+	}
+
+	/**
+	 * Adds the manage pages permission onto the URL.
+	 *
+	 * @static
+	 * @param  string  $url
+	 * @return array|string
+	 */
+	public static function social_proxy_url($url) {
+		if (isset($_GET['use_pages']) and strpos($url, 'req_perms') !== false) {
+			$url = explode('req_perms=', $url);
+			$url = $url[0].'req_perms=manage_pages,'.$url[1];
+
+			// Now add the query param to the response URL
+			$url = explode('response_url=', $url);
+			$response_url = add_query_arg(array(
+				'use_pages' => 'true'
+			), urldecode($url[1]));
+			$url = $url[0].'response_url='.urlencode($response_url);
+		}
+		return $url;
+	}
+
+	/**
+	 * Saves the Facebook pages.
+	 *
+	 * @wp-action social_settings_save
+	 * @static
+	 * @param  bool $is_personal
+	 */
+	public static function social_settings_save($is_personal = false) {
+		$service = Social::instance()->service('facebook');
+		if ($service !== false) {
+			$accounts = $service->accounts();
+			if (count($accounts)) {
+				foreach ($accounts as $account_id => $account) {
+					if (isset($_POST['social_facebook_pages_'.$account->id()])) {
+						$pages = $service->get_pages($account);
+
+						$account->pages(array());
+						if (count($pages)) {
+							foreach ($_POST['social_facebook_pages_'.$account->id()] as $page_id) {
+								if (isset($pages[$page_id])) {
+									$accounts[$account_id] = $account->page($pages[$page_id]);
+								}
+							}
+						}
+					}
+
+					if (defined('IS_PROFILE_PAGE')) {
+						$accounts[$account_id]->universal(false);
+						$accounts[$account_id]->use_pages(false, false);
+						$accounts[$account_id]->pages(array(), false);
+					}
+					else {
+						$accounts[$account_id]->personal(false);
+						$accounts[$account_id]->use_pages(true, false);
+						$accounts[$account_id]->pages(array(), true);
+					}
+
+					$accounts[$account_id] = $accounts[$account_id]->as_object();
+				}
+
+				$service->accounts($accounts)->save($is_personal);
+			}
+		}
+	}
+
+	/**
+	 * @static
+	 * @param  object                   $account
+	 * @param  WP_Post                  $post
+	 * @param  Social_Service_Facebook  $service
+	 *
+	 * @return object|bool
+	 */
+	public static function social_get_broadcast_account($account, $post, $service) {
+		if ($service->key() == 'facebook') {
+			// Load accounts
+			$found = false;
+			$accounts = $service->accounts();
+			foreach ($accounts as $_account) {
+				$pages = $_account->pages(null, 'combined');
+				if (isset($pages[$account->id])) {
+					$found = true;
+					$account = $_account->broadcast_page($pages[$account->id]);
+					break;
+				}
+			}
+
+			if (!$found) {
+				$personal_accounts = get_user_meta($post->post_author, 'social_accounts', true);
+				if (isset($personal_accounts['facebook'])) {
+					foreach ($personal_accounts['facebook'] as $account_id => $_account) {
+						$_account = new Social_Service_Facebook_Account($_account);
+						$pages = $_account->pages(null, 'combined');
+						if (isset($pages[$account->id])) {
+							$found = true;
+							$account = $_account->broadcast_page($pages[$account->id]);
+							break;
+						}
+					}
+				}
+			}
+
+			if ($found) {
+				return $account;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Sets the raw data for the broadcasted post.
+	 *
+	 * @wp-filter social_broadcast_response
+	 * @static
+	 * @param  array                   $data
+	 * @param  Social_Service_Account  $account
+	 * @param  string                  $service_key
+	 * @param  int                     $post_id
+	 * @param  Social_Response         $response
+	 * @return array
+	 */
+	public static function social_save_broadcasted_ids_data(array $data, Social_Service_Account $account, $service_key, $post_id, Social_Response $response = null) {
+		if ($service_key == 'facebook') {
+			$broadcast_page = $account->broadcast_page();
+			if ($broadcast_page !== null) {
+				$data['page'] = (object) array(
+					'id' => $broadcast_page->id,
+					'name' => $broadcast_page->name
+				);
+			}
+
+			$data['account'] = (object) array(
+				'user' => $account->as_object()->user
+			);
+		}
+
+		return $data;
+	}
+
+	/**
+	 * Filter to change the view for Facebook Pages
+	 *
+	 * @static
+	 * @param  string  $file
+	 * @param  array   $data
+	 * @return string
+	 */
+	public static function social_view_set_file($file, $data) {
+		if (isset($data['service']) and
+			$data['service'] != false and
+			$data['service']->key() == 'facebook' and
+			(isset($data['data']) and isset($data['data']['page'])) or
+			(isset($data['account']) and !$data['account'] instanceof Social_Service_Account))
+		{
+			$file = 'wp-admin/post/meta/broadcast/parts/facebook/page';
+		}
+
+		return $file;
+	}
+
+	/**
+	 * Sets the Social view data.
+	 *
+	 * @static
+	 * @param  array   $data
+	 * @param  string  $file
+	 * @return array
+	 */
+	public static function social_view_data($data, $file) {
+		if ($file == 'wp-admin/post/meta/broadcast/parts/facebook/page') {
+			if (isset($data['data']) and isset($data['data']['page'])) {
+				$data['account'] = $data['data']['page'];
+			}
+			else if ($data['account'] instanceof Social_Service_Account) {
+				$data['account'] = (object) array(
+					'id' => $data['account']->id(),
+					'name' => $data['account']->username()
+				);
+			}
+		}
+
+		return $data;
+	}
+
+	/**
+	 * Merges the personal pages into the universal account.
+	 *
+	 * @static
+	 * @param  object  $universal
+	 * @param  object  $personal
+	 * @param  string  $service_key
+	 * @return object
+	 */
+	public static function social_merge_accounts($universal, $personal, $service_key) {
+		// Merge pages
+		if ($service_key == 'facebook') {
+			$universal->pages->personal = $personal->pages->personal;
+			$universal->use_personal_pages = $personal->use_personal_pages;
+		}
+		return $universal;
+	}
+
+	/**
+	 * Adds messaging to the title.
+	 *
+	 * @static
+	 * @param  string  $title
+	 * @param  string  $key
+	 * @return string
+	 */
+	public static function social_item_output_title($title, $key) {
+		if ($key == 'facebook') {
+			$title = sprintf(__('%s liked this', 'social'), $title);
+		}
+
+		return $title;
+	}
+	
+	/**
+	 * Output the link to be sent to Facebook.
+	 *
+	 * @static
+	 * @param  object  $post
+	 * @param  object  $service
+	 * @param  object  $account
+	 * @return void
+	 */
+	public static function social_broadcast_form_item_content($post, $service, $account) {
+		if ($service->key() != 'facebook' || get_post_format($post) == 'status') {
+			return;
+		}
+		remove_filter('social_view_set_file', array('Social_Facebook', 'social_view_set_file'), 10, 2);
+		echo Social_View::factory(
+			'wp-admin/post/broadcast/facebook-link-preview',
+			compact('post', 'service', 'account')
+		)->render();
+		add_filter('social_view_set_file', array('Social_Facebook', 'social_view_set_file'), 10, 2);
+	}
+	
+	/**
+	 * Don't output URL in format since we're sending a link as well.
+	 *
+	 * @static
+	 * @param  string  $format
+	 * @param  object  $post
+	 * @param  object  $service
+	 * @return string
+	 */
+	public static function social_broadcast_format($format, $post, $service) {
+		if ($service->key() == 'facebook' && get_post_format($post) != 'status') {
+			$format = trim(str_replace('{url}', '', $format));
+		}
+		return $format;
+	}
+	
+
+} // End Social_Facebook
+
+define('SOCIAL_FACEBOOK_FILE', __FILE__);
+
+// Actions
+add_action('social_settings_save', array('Social_Facebook', 'social_settings_save'));
+add_action('social_broadcast_form_item_content', array('Social_Facebook', 'social_broadcast_form_item_content'), 10, 3);
+
+// Filters
+add_filter('social_register_service', array('Social_Facebook', 'register_service'));
+add_filter('social_authorize_url', array('Social_Facebook', 'social_authorize_url'), 10, 2);
+add_filter('get_avatar', array('Social_Facebook', 'get_avatar'), 10, 5);
+add_filter('get_avatar_comment_types', array('Social_Facebook', 'get_avatar_comment_types'));
+add_filter('social_comments_array', array('Social_Facebook', 'comments_array'), 10, 2);
+add_filter('social_comments_array_groups', array('Social_Facebook', 'comments_array_groups'), 10, 2);
+add_filter('social_service_button', array('Social_Facebook', 'social_service_button'), 10, 3);
+add_filter('social_proxy_url', array('Social_Facebook', 'social_proxy_url'));
+add_filter('social_get_broadcast_account', array('Social_Facebook', 'social_get_broadcast_account'), 10, 3);
+add_filter('social_save_broadcasted_ids_data', array('Social_Facebook', 'social_save_broadcasted_ids_data'), 10, 5);
+add_filter('social_view_set_file', array('Social_Facebook', 'social_view_set_file'), 10, 2);
+add_filter('social_view_data', array('Social_Facebook', 'social_view_data'), 10, 2);
+add_filter('social_merge_accounts', array('Social_Facebook', 'social_merge_accounts'), 10, 3);
+add_filter('social_item_output_title', array('Social_Facebook', 'social_item_output_title'), 10, 2);
+add_filter('social_broadcast_format', array('Social_Facebook', 'social_broadcast_format'), 11, 3);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/social-twitter.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,387 @@
+<?php
+/**
+ * Twitter implementation for Social.
+ *
+ * @package    Social
+ * @subpackage plugins
+ */
+if (class_exists('Social') and !class_exists('Social_Twitter')) {
+
+final class Social_Twitter {
+
+	/**
+	 * Registers Twitter to Social.
+	 *
+	 * @static
+	 * @wp-filter  social_register_service
+	 *
+	 * @param  array  $services
+	 *
+	 * @return array
+	 */
+	public static function register_service(array $services) {
+		$services[] = 'twitter';
+		return $services;
+	}
+
+	/**
+	 * Adds to the avatar comment types array.
+	 *
+	 * @static
+	 * @param  array  $types
+	 * @return array
+	 */
+	public static function get_avatar_comment_types(array $types) {
+		return array_merge($types, Social_Service_Twitter::comment_types());
+	}
+
+	/**
+	 * Pre-processor to the comments.
+	 *
+	 * @wp-filter social_comments_array
+	 * @static
+	 * @param  array  $comments
+	 * @param  int    $post_id
+	 * @return array
+	 */
+	public static function comments_array(array $comments, $post_id) {
+		// pre-load the hashes for broadcasted tweets
+		$broadcasted_ids = get_post_meta($post_id, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids)) {
+			$broadcasted_ids = array();
+		}
+		global $wpdb;
+
+		// we need comments to be keyed by ID, check for Tweet comments
+		$tweet_comments = $_comments = $comment_ids = array();
+		foreach ($comments as $key => $comment) {
+			if (is_object($comment)) {
+				$_comments['id_'.$comment->comment_ID] = $comment;
+				if (in_array($comment->comment_type, Social_Service_Twitter::comment_types())) {
+					$comment_ids[] = $comment->comment_ID;
+					$tweet_comments['id_'.$comment->comment_ID] = $comment;
+				}
+			}
+			else { // social items
+				$_comments[$key] = $comment;
+			}
+		}
+
+		// if no tweet comments, get out now
+		if (!count($tweet_comments)) {
+			return $comments;
+		}
+
+		// use our keyed array
+		$comments = $_comments;
+		unset($_comments);
+
+		$social_map = array(); // key = social id, value = comment_ID
+		$hash_map = array(); // key = hash, value = comment_ID
+		$broadcasted_social_ids = array();
+ 		$broadcast_retweets = array(); // array of comments
+
+		if (isset($broadcasted_ids['twitter'])) {
+			foreach ($broadcasted_ids['twitter'] as $account_id => $broadcasted) {
+				foreach ($broadcasted as $id => $data) {
+					$broadcasted_social_ids[] = $id;
+					// if we don't have a message saved for a tweet, try to get it so that we can use it next time
+					if (empty($data['message'])) {
+						$url = wp_nonce_url(home_url('index.php?social_controller=aggregation&social_action=retrieve_twitter_content&broadcasted_id='.$id.'&post_id='.$post_id), 'retrieve_twitter_content');
+						wp_remote_get(str_replace('&amp;', '&', $url), array(
+							'timeout' => 0.01,
+							'blocking' => false,
+						));
+					}
+					else {
+						// create a hash from the broadcast so we can match retweets to it
+						$hash = self::build_hash($data['message']);
+
+						// This is stored as broadcasted and not the ID so we can easily store broadcasted retweets
+						// instead of attaching retweets to non-existent comments.
+						$hash_map[$hash] = 'broadcasted';
+					}
+				}
+			}
+		}
+
+		// Load the comment meta
+		$results = $wpdb->get_results("
+			SELECT meta_key, meta_value, comment_id
+			  FROM $wpdb->commentmeta
+			 WHERE comment_id IN (".implode(',', $comment_ids).")
+			   AND (
+			       meta_key = 'social_in_reply_to_status_id'
+			    OR meta_key = 'social_status_id'
+			    OR meta_key = 'social_raw_data'
+			    OR meta_key = 'social_profile_image_url'
+			    OR meta_key = 'social_comment_type'
+			)
+		");
+
+		// Set up social data for twitter comments
+		foreach ($tweet_comments as $key => &$comment) {
+			$comment->social_items = array();
+
+			// Attach meta
+			foreach ($results as $result) {
+				if ($comment->comment_ID == $result->comment_id) {
+					switch ($result->meta_key) {
+						case 'social_raw_data':
+							$comment->social_raw_data = json_decode(base64_decode($result->meta_value));
+							break;
+						case 'social_status_id':
+							$social_map[$result->meta_value] = $result->comment_id;
+						default:
+							$comment->{$result->meta_key} = $result->meta_value;
+					}
+				}
+			}
+
+			// Attach hash
+			if (isset($comment->social_raw_data) and isset($comment->social_raw_data->text)) {
+				$text = trim($comment->social_raw_data->text);
+			}
+			else {
+				$text = trim($comment->comment_content);
+			}
+			$comment->social_hash = self::build_hash($text);
+
+			if (!isset($hash_map[$comment->social_hash])) {
+				$hash_map[$comment->social_hash] = $comment->comment_ID;
+			}
+		}
+
+		// merge data so that $comments has the data we've set up
+		$comments = array_merge($comments, $tweet_comments);
+
+		// set-up replies and retweets
+		foreach ($tweet_comments as $key => &$comment) {
+			if (is_object($comment)) {
+				// set reply/comment parent
+				if (!empty($comment->social_in_reply_to_status_id) and isset($social_map[$comment->social_in_reply_to_status_id])) {
+					$comments[$key]->comment_parent = $social_map[$comment->social_in_reply_to_status_id];
+				}
+
+				// set retweets
+				$rt_matched = false;
+				if (isset($comment->social_raw_data) and isset($comment->social_raw_data->retweeted_status)) {
+					// explicit match via API data
+					$rt_id = $comment->social_raw_data->retweeted_status->id_str;
+					if (in_array($rt_id, $broadcasted_social_ids)) {
+						$broadcast_retweets[] = $comment;
+						unset($comments[$key]);
+						$rt_matched = true;
+					}
+					else if (isset($social_map[$rt_id]) and isset($comments['id_'.$social_map[$rt_id]])) {
+						$comments['id_'.$social_map[$rt_id]]->social_items[$key] = $comment;
+						unset($comments[$key]);
+						$rt_matched = true;
+					}
+				}
+
+				if (!$rt_matched) {
+					// best guess via hashes
+					$hash_match = $hash_map[$comment->social_hash];
+					if ($hash_match != $comment->comment_ID) { // hash match to own tweet is expected, at minimum - set above
+						if ($hash_match == 'broadcasted') {
+							$broadcast_retweets[] = $comment;
+						}
+						else if (isset($comments['id_'.$hash_match])) {
+							$comments['id_'.$hash_match]->social_items[$key] = $comment;
+						}
+						else {
+							// Loop through the broadcasted retweets and see if this is a retweet of one of those.
+							foreach ($broadcast_retweets as $retweet) {
+								if ($retweet->comment_ID == $hash_match) {
+									$broadcast_retweets[] = $comment;
+									break;
+								}
+							}
+						}
+						unset($comments[$key]);
+					}
+				}
+			}
+		}
+
+		if (!isset($comments['social_items'])) {
+			$comments['social_items'] = array();
+		}
+
+		if (count($broadcast_retweets)) {
+			$comments['social_items']['twitter'] = $broadcast_retweets;
+		}
+
+		return $comments;
+	}
+
+
+	/**
+	 * Sets the raw data for the broadcasted post.
+	 *
+	 * @wp-filter social_broadcast_response
+	 * @static
+	 * @param  array                   $data
+	 * @param  Social_Service_Account  $account
+	 * @param  string                  $service_key
+	 * @param  int                     $post_id
+	 * @param  Social_Response         $response
+	 * @return array
+	 */
+	public static function social_save_broadcasted_ids_data(array $data, Social_Service_Account $account, $service_key, $post_id, Social_Response $response = null) {
+		if ($service_key == 'twitter') {
+			if (!empty($response)) {
+				$data['message'] = base64_encode(json_encode($response->body()->response));
+			}
+			$data['account'] = (object) array(
+				'user' => $account->as_object()->user
+			);
+		}
+
+		return $data;
+	}
+
+	/**
+	 * Strips extra retweet data before comparing.
+	 *
+	 * @static
+	 * @param  string  $text
+	 * @return string
+	 */
+	private static function build_hash($text) {
+		$text = explode(' ', $text);
+		$content = '';
+		foreach ($text as $_content) {
+			if (!empty($_content) and strpos($_content, 'http://') === false) {
+				if ($_content == 'RT' or preg_match('/@([\w_]+):/i', $_content)) {
+					continue;
+				}
+
+				$content .= $_content.' ';
+			}
+		}
+
+		return md5(trim($content));
+	}
+
+	/**
+	 * Checks for a retweet via twitter API data and user perception.
+	 *
+	 * @static
+	 * @param  stdClass  $comment
+	 * @return bool
+	 */
+	public static function is_retweet($comment = null, $tweet = null) {
+		$is_retweet = false;
+		if (!is_null($comment)) {
+			if (isset($comment->social_raw_data) and !empty($comment->social_raw_data->retweeted_status)) {
+				$is_retweet = true;
+			}
+			if (substr($comment->comment_content, 0, 4) == 'RT @') {
+				$is_retweet = true;
+			}
+		}
+		else if (!is_null($tweet)) {
+			if (!empty($tweet->retweeted_status)) {
+				$is_retweet = true;
+			}
+			if (substr($tweet->text, 0, 4) == 'RT @') {
+				$is_retweet = true;
+			}
+		}
+		return $is_retweet;
+	}
+
+	/**
+	 * Adds a retweet to the original broadcasted post social items stack.
+	 *
+	 * @static
+	 * @param  int    $comment_id
+	 * @param  array  $comments
+	 * @param  array  $social_items
+	 */
+	private static function add_to_social_items($comment_id, &$comments, &$social_items) {
+		$object = null;
+		$_comments = array();
+		foreach ($comments as $id => $comment) {
+			if (is_int($id)) {
+				if ($comment->comment_ID == $comment_id) {
+					$object = $comment;
+				}
+				else {
+					$_comments[] = $comment;
+				}
+			}
+			else {
+				if (isset($_comments[$id])) {
+					$_comments[$id] = array_merge($_comments[$id], $comment);
+				}
+				else {
+					$_comments[$id] = $comment;
+				}
+			}
+		}
+		$comments = $_comments;
+
+		if ($object !== null) {
+			if (!isset($social_items['twitter'])) {
+				$social_items['twitter'] = array();
+			}
+
+			$social_items['twitter'][$comment_id] = $object;
+		}
+	}
+
+	/**
+	 * Adds messaging to the title.
+	 *
+	 * @static
+	 * @param  string  $title
+	 * @param  string  $key
+	 * @return string
+	 */
+	public static function social_item_output_title($title, $key) {
+		if ($key == 'twitter') {
+			$title .= __(' retweeted this', 'social');
+		}
+
+		return $title;
+	}
+
+	/**
+	 * Add a "reply to" field to broadcast form.
+	 *
+	 * @static
+	 * @param  obj  $post
+	 * @param  obj  $service
+	 * @param  obj  $account
+	 * @return void
+	 */
+	public static function social_broadcast_form_item_edit($post, $service, $account) {
+		if ($service->key() != 'twitter') {
+			return;
+		}
+		$field_name = str_replace('_content', '_in_reply_to', $account['field_name_content']);
+?>
+<a href="#" class="tweet-reply-link"><?php _e('Send as a reply', 'social'); ?></a>
+<div class="tweet-reply-fields">
+	<label for="<?php echo esc_attr($field_name); ?>"><?php _e('URL of Tweet (to reply to)', 'social'); ?></label>
+	<input type="text" class="tweet-reply-field" name="<?php echo esc_attr($field_name); ?>" value="" id="<?php echo esc_attr($field_name); ?>" />
+</div>
+<?php
+	}
+
+} // End Social_Twitter
+
+define('SOCIAL_TWITTER_FILE', __FILE__);
+
+// Filters
+add_filter('social_register_service', array('Social_Twitter', 'register_service'));
+add_filter('get_avatar_comment_types', array('Social_Twitter', 'get_avatar_comment_types'));
+add_filter('social_comments_array', array('Social_Twitter', 'comments_array'), 10, 2);
+add_filter('social_save_broadcasted_ids_data', array('Social_Twitter', 'social_save_broadcasted_ids_data'), 10, 5);
+add_filter('social_item_output_title', array('Social_Twitter', 'social_item_output_title'), 10, 2);
+add_action('social_broadcast_form_item_edit', array('Social_Twitter', 'social_broadcast_form_item_edit'), 10, 3);
+
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/social.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,2253 @@
+<?php
+/*
+Plugin Name: Social
+Plugin URI: http://mailchimp.com/social-plugin-for-wordpress/
+Description: Broadcast newly published posts and pull in discussions using integrations with Twitter and Facebook. Brought to you by <a href="http://mailchimp.com">MailChimp</a>.
+Version: 2.6
+Author: Crowd Favorite
+Author URI: http://crowdfavorite.com/
+*/
+
+if (!class_exists('Social')) { // try to avoid double-loading...
+
+/**
+ * Social Core
+ *
+ * @package Social
+ */
+final class Social {
+
+	/**
+	 * @var  string  URL of the API
+	 */
+	public static $api_url = 'https://sopresto.mailchimp.com/';
+
+	/**
+	 * @var  string  version number
+	 */
+	public static $version = '2.6';
+
+	/**
+	 * @var  string  CRON lock directory.
+	 */
+	public static $cron_lock_dir = null;
+
+	/**
+	 * @var  string  plugins URL
+	 */
+	public static $plugins_url = '';
+
+	/**
+	 * @var  string  plugins file path
+	 */
+	public static $plugins_path = '';
+
+	/**
+	 * @var  bool  loaded by theme?
+	 */
+	public static $loaded_by_theme = false;
+
+	/**
+	 * @var  string  duplicate comment message
+	 */
+	public static $duplicate_comment_message = 'duplicate comment';
+
+	/**
+	 * @var  Social_Log  logger
+	 */
+	private static $log = null;
+
+	/**
+	 * @var  array  default options
+	 */
+	protected static $options = array(
+		'debug' => false,
+		'install_date' => 0,
+		'installed_version' => 0,
+		'broadcast_format' => '{title}: {content} {url}',
+		'comment_broadcast_format' => '{content} {url}',
+		'system_cron_api_key' => null,
+		'fetch_comments' => '1',
+		'broadcast_by_default' => '0',
+		'use_standard_comments' => '0',
+	);
+
+	/**
+	 * @var  Social  instance of Social
+	 */
+	public static $instance = null;
+
+	/**
+	 * Loads the instance of Social.
+	 *
+	 * @static
+	 * @return Social
+	 */
+	public static function instance() {
+		if (self::$instance === null) {
+			self::$instance = new self;
+		}
+
+		return self::$instance;
+	}
+
+	/**
+	 * Handles the auto loading of classes.
+	 *
+	 * @static
+	 *
+	 * @param  string  $class
+	 *
+	 * @return bool
+	 */
+	public static function auto_load($class) {
+		if (substr($class, 0, 7) == 'Social_' or substr($class, 0, 7) == 'Kohana_') {
+			try {
+				$file = Social::$plugins_path.'lib/'.str_replace('_', '/', strtolower($class)).'.php';
+				$file = apply_filters('social_auto_load_file', $file, $class);
+				if (file_exists($file)) {
+					require $file;
+
+					return true;
+				}
+
+				return false;
+			}
+			catch (Exception $e) {
+				Social::log(sprintf(__('Failed to auto load class %s.', 'social'), $class));
+			}
+		}
+
+		return true;
+	}
+
+	/**
+	 * Returns the broadcast format tokens.
+	 *
+	 * Format:
+	 *
+	 *     {key} => __('Description', 'social')
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function broadcast_tokens() {
+		$query = new WP_Query(array(
+			'posts_per_page' => 1
+		));
+		if (count($query->posts) and $post = $query->posts[0]) {
+			$url = wp_get_shortlink($post->ID);
+			$date = get_date_from_gmt($post->post_date_gmt);
+		}
+		else {
+			$url = home_url('?p=123');
+			$date = get_date_from_gmt(current_time('mysql', true));
+		}
+
+		$defaults = array(
+			'{url}' => sprintf(__('Example: %s', 'social'), $url),
+			'{title}' => '',
+			'{content}' => '',
+			'{date}' => sprintf(__('Example: %s', 'social'), $date),
+			'{author}' => '',
+		);
+
+		return apply_filters('social_broadcast_tokens', $defaults);
+	}
+
+	/**
+	 * Returns the comment broadcast format tokens.
+	 *
+	 * Format:
+	 *
+	 *     {key} => __('Description', 'social')
+	 *
+	 * @static
+	 * @return mixed
+	 */
+	public static function comment_broadcast_tokens() {
+		$defaults = array(
+			'{content}' => '',
+			'{url}' => '',
+		);
+		return apply_filters('social_comment_broadcast_tokens', $defaults);
+	}
+
+	/**
+	 * Sets or gets an option based on the key defined.
+	 *
+	 * Get Format:
+	 *
+	 *     Running Social::option('option_name') will load "social_option_name" using get_option()
+	 *
+	 * Set Format:
+	 *
+	 *     Running Social::option('option_name', 'new_value') will update "social_option_name" to "new_value"
+	 *     using update_option().
+	 *
+	 * @static
+	 * @param  string  $key     option key
+	 * @param  mixed   $value   option value
+	 * @return bool|mixed
+	 * @uses get_option()
+	 * @uses update_option()
+	 */
+	public static function option($key, $value = null) {
+		if ($value === null) {
+			$default = null;
+			if (isset(Social::$options[$key])) {
+				$default = Social::$options[$key];
+			}
+
+			return get_option('social_'.$key, $default);
+		}
+
+		update_option('social_'.$key, $value);
+		return false;
+	}
+
+	/**
+	 * Add a message to the log.
+	 *
+	 * @static
+	 * @param  string  $message    message to add to the log
+	 * @param  array   $args       arguments to pass to the writer
+	 * @param  string  $context    context of the log message
+	 * @param  bool    $backtrace  show the backtrace
+	 * @return void
+	 */
+	public static function log($message, array $args = null, $context = null, $backtrace = false) {
+		Social::$log->write($message, $args, $context, $backtrace);
+	}
+
+	/**
+	 * Sets the loaded by theme.
+	 *
+	 * @static
+	 * @return void
+	 */
+	public static function social_loaded_by_theme() {
+		self::$loaded_by_theme = true;
+	}
+
+	/**
+	 * Sets the customer die handler.
+	 *
+	 * @static
+	 * @param  string  $handler
+	 * @return array
+	 */
+	public static function wp_die_handler($handler) {
+		return array('Social', 'wp_comment_die_handler');
+	}
+
+	/**
+	 * Don't actually die for aggregation runs.
+	 *
+	 * @static
+	 * @param  string  $message
+	 * @param  string  $title
+	 * @param  array   $args
+	 * @return mixed
+	 */
+	public static function wp_comment_die_handler($message, $title, $args) {
+		if ($message == __('Duplicate comment detected; it looks as though you&#8217;ve already said that!')) {
+			// Keep going
+			throw new Exception(Social::$duplicate_comment_message);
+		}
+	}
+
+	/**
+	 * @var  bool  is Social enabled?
+	 */
+	private $_enabled = null;
+
+	/**
+	 * Returns an array of all of the services.
+	 *
+	 * Format of the data returned:
+	 *
+	 *     $services = array(
+	 *         'twitter' => Social_Service_Twitter,
+	 *         'facebook' => Social_Service_Facebook,
+	 *         // ... any other services registered
+	 *     )
+	 *
+	 * @return array
+	 */
+	public function services() {
+		return $this->load_services();
+	}
+
+	/**
+	 * Returns a service by access key.
+	 *
+	 * Loading a service:
+	 *
+	 *     $twitter = Social::instance()->service('twitter');
+	 *
+	 * @param  string  $key    service key
+	 * @return mixed Social_Service|Social_Service_Twitter|Social_Service_Facebook|false
+	 */
+	public function service($key) {
+		$services = $this->load_services();
+		if (!isset($services[$key])) {
+			return false;
+		}
+		return $services[$key];
+	}
+	
+	/**
+	 * Returns a service by comment type.
+	 *
+	 * Loading a service:
+	 *
+	 *     $twitter = Social::instance()->service_for_comment_type('social-twitter-rt');
+	 *
+	 * @param  string  $key    service key
+	 * @return mixed  Social_Service|Social_Service_Twitter|Social_Service_Facebook|false
+	 */
+	public function service_for_comment_type($comment_type) {
+		$services = $this->load_services();
+		foreach ($services as $service) {
+			if (in_array($comment_type, $service->comment_types())) {
+				return $service;
+			}
+		}
+		return false;
+	}
+
+	/**
+	 * Initializes Social.
+	 *
+	 * @wp-action  init
+	 * @return void
+	 */
+	public function init() {
+		// Load the language translations
+		if (Social::$loaded_by_theme) {
+			$path = trailingslashit(Social::$plugins_path).'lang';
+			load_theme_textdomain('social', $path);
+		}
+		else {
+			$plugin_dir = basename(dirname(SOCIAL_FILE)).'/lang';
+			load_plugin_textdomain('social', false, $plugin_dir);
+		}
+
+		if (version_compare(PHP_VERSION, '5.2.4', '<')) {
+			deactivate_plugins(basename(__FILE__)); // Deactivate ourself
+			wp_die(__("Sorry, Social requires PHP 5.2.4 or higher. Ask your host how to enable PHP 5 as the default on your servers.", 'social'));
+		}
+
+		// Just activated?
+		if (!Social::option('install_date')) {
+			Social::option('install_date', current_time('timestamp', 1));
+			Social::option('system_cron_api_key', wp_generate_password(16, false));
+		}
+
+		// Plugins URL
+		$url = plugins_url('', SOCIAL_FILE);
+		Social::$plugins_url = trailingslashit(apply_filters('social_plugins_url', $url));
+
+		Social::$plugins_path = trailingslashit(apply_filters('social_plugins_path', SOCIAL_PATH));
+
+		// Set the logger
+		Social::$log = Social_Log::factory();
+
+		// Require Facebook and Twitter by default.
+		require Social::$plugins_path.'social-twitter.php';
+		require Social::$plugins_path.'social-facebook.php';
+	}
+
+	/**
+	 * Auth Cookie expiration for API users.
+	 *
+	 * @return int
+	 */
+	public function auth_cookie_expiration() {
+		return 31536000; // 1 Year
+	}
+
+	/**
+	 * Enqueues the assets for Social.
+	 *
+	 * @wp-action  wp_enqueue_scripts
+	 * @wp-action  load-post-new.php
+	 * @wp-action  load-post.php
+	 * @wp-action  load-profile.php
+	 * @wp-action  load-settings_page_social
+	 * @return void
+	 */
+	public function enqueue_assets() {
+		if (Social::option('use_standard_comments') == '1') {
+			return;
+		}
+		// JS/CSS
+		if (!defined('SOCIAL_COMMENTS_JS')) {
+			define('SOCIAL_COMMENTS_JS', Social::$plugins_url.'assets/social.js');
+		}
+		if (SOCIAL_COMMENTS_JS !== false) {
+			wp_enqueue_script('jquery');
+			wp_enqueue_script('social_js', SOCIAL_COMMENTS_JS, array('jquery'), Social::$version, true);
+			wp_localize_script('social_js', 'Sociali18n', array(
+				'commentReplyTitle' => __('Post a Reply', 'social'),
+			));
+		}
+
+		if (!is_admin()) {
+			if (!defined('SOCIAL_COMMENTS_CSS')) {
+				define('SOCIAL_COMMENTS_CSS', Social::$plugins_url.'assets/comments.css');
+			}
+			if (SOCIAL_COMMENTS_CSS !== false) {
+				wp_enqueue_style('social_comments', SOCIAL_COMMENTS_CSS, array(), Social::$version, 'screen');
+			}
+		}
+
+	}
+
+	/**
+	 * Enqueues the assets for Social.
+	 *
+	 * @wp-action  admin_enqueue_scripts
+	 * @return void
+	 */
+	public function admin_enqueue_assets() {
+		if (!defined('SOCIAL_ADMIN_JS')) {
+			define('SOCIAL_ADMIN_JS', Social::$plugins_url.'assets/admin.js');
+		}
+
+		if (!defined('SOCIAL_ADMIN_CSS')) {
+			define('SOCIAL_ADMIN_CSS', Social::$plugins_url.'assets/admin.css');
+		}
+
+		if (SOCIAL_ADMIN_CSS !== false) {
+			wp_enqueue_style('social_admin', SOCIAL_ADMIN_CSS, array(), Social::$version, 'screen');
+		}
+
+		if (SOCIAL_ADMIN_JS !== false) {
+			wp_enqueue_script('social_admin', SOCIAL_ADMIN_JS, array(), Social::$version, true);
+			$data = apply_filters('social_admin_js_strings', array(
+				'protectedTweet' => __('Protected Tweet', 'social'),
+				'invalidUrl' => __('Invalid URL', 'social'),
+			));
+			wp_localize_script('social_admin', 'socialAdminL10n', $data);
+		}
+	}
+
+	/**
+	 * Loads the services on every page if the user is an admin.
+	 *
+	 * @wp-action  admin_init
+	 * @return void
+	 */
+	public function admin_init() {
+		if (current_user_can('manage_options') or current_user_can('publish_posts')) {
+			// Trigger upgrade?
+			if (isset($_GET['page']) and $_GET['page'] == basename(SOCIAL_FILE)) {
+				global $wpdb;
+
+				// First check for the semaphore options, they need to be added before the upgrade starts.
+				$results = $wpdb->get_results("
+					SELECT option_id
+					  FROM $wpdb->options
+					 WHERE option_name IN ('social_locked', 'social_unlocked')
+				");
+				if (!count($results)) {
+					update_option('social_unlocked', '1');
+					update_option('social_last_lock_time', current_time('mysql', 1));
+					update_option('social_semaphore', '0');
+				}
+
+				if (version_compare(Social::option('installed_version'), Social::$version, '<')) {
+					$this->_enabled = false;
+					$this->upgrade();
+				}
+			}
+
+			if ($this->_enabled === null) {
+				$this->load_services();
+			}
+		}
+
+		// Redirect to the home_url() if the user is a commenter.
+		if (!current_user_can('publish_posts')) {
+			$commenter = get_user_meta(get_current_user_id(), 'social_commenter', true);
+			if (!empty($commenter) and $commenter == 'true') {
+				wp_redirect(trailingslashit(home_url()));
+			}
+		}
+	}
+
+	/**
+	 * Checks to see if system crons are disabled.
+	 *
+	 * @wp-action  load-settings_page_social
+	 * @return void
+	 */
+	public function check_system_cron() {
+		Social::log('Checking system CRON');
+		// Schedule CRONs
+		if (Social::option('fetch_comments') == '1') {
+			if (wp_next_scheduled('social_cron_15_init') === false) {
+				Social::log('Adding Social 15 CRON schedule');
+				wp_schedule_event(time() + 900, 'every15min', 'social_cron_15_init');
+			}
+			wp_remote_get(
+				admin_url('options_general.php?'.http_build_query(array(
+					'social_controller' => 'cron',
+					'social_action' => 'check_crons',
+					'social_api_key' => Social::option('system_cron_api_key')
+				), null, '&')),
+				array(
+					'timeout' => 0.01,
+					'blocking' => false,
+					'sslverify' => apply_filters('https_local_ssl_verify', true),
+				)
+			);
+		}
+	}
+
+	/**
+	 * Handlers requests.
+	 *
+	 * @wp-action  init
+	 * @return void
+	 */
+	public function request_handler() {
+		if (isset($_GET['social_controller'])) {
+			Social_Request::factory()->execute();
+		}
+	}
+
+	/**
+	 * Adds a link to the "Settings" menu in WP-Admin.
+	 *
+	 * @wp-action  admin_menu
+	 * @return void
+	 */
+	public function admin_menu() {
+		add_options_page(
+			__('Social Options', 'social'),
+			__('Social', 'social'),
+			'manage_options',
+			basename(SOCIAL_FILE),
+			array(
+				$this,
+				'admin_options_form'
+			)
+		);
+	}
+
+	/**
+	 * Add Settings link to plugins - code from GD Star Ratings
+	 *
+	 * @wp-filter  plugin_action_links
+	 * @param  array   $links
+	 * @param  string  $file
+	 * @return array
+	 */
+	public function add_settings_link($links, $file) {
+		static $this_plugin;
+		if (!$this_plugin) {
+			$this_plugin = plugin_basename(__FILE__);
+		}
+
+		if ($file == $this_plugin) {
+			$settings_link = '<a href="'.esc_url(admin_url('options-general.php?page=social.php')).'">'.__('Settings', 'social').'</a>';
+			array_unshift($links, $settings_link);
+		}
+		return $links;
+	}
+
+	/**
+	 * Handles the display of different messages for admin notices.
+	 *
+	 * @wp-action  admin_notices
+	 * @action     admin_notices
+	 */
+	public function admin_notices() {
+		if (current_user_can('manage_options') or current_user_can('publish_posts')) {
+			// Upgrade notice
+			if (version_compare(Social::option('installed_version'), Social::$version, '<')) {
+				$message = sprintf(__('Social is shiny and new! Please <a href="%s">verify and save your settings</a> to complete the upgrade.', 'social'), esc_url(Social::settings_url()));
+				echo '<div class="error"><p>'.$message.'</p></div>';
+			}
+
+			$suppress_no_accounts_notice = get_user_meta(get_current_user_id(), 'social_suppress_no_accounts_notice', true);
+			if (!$this->_enabled and (!isset($_GET['page']) or $_GET['page'] != basename(SOCIAL_FILE)) and empty($suppress_no_accounts_notice)) {
+				$dismiss = sprintf(__('<a href="%s" class="social_dismiss">[Dismiss]</a>', 'social'), esc_url(admin_url('options-general.php?social_controller=settings&social_action=suppress_no_accounts_notice')));
+				$message = sprintf(__('To start using Social, please <a href="%s">add an account</a>.', 'social'), esc_url(Social::settings_url()));
+				echo '<div class="error"><p>'.$message.' '.$dismiss.'</p></div>';
+			}
+
+			if (isset($_GET['page']) and $_GET['page'] == basename(SOCIAL_FILE)) {
+				// CRON Lock
+				if (Social::option('cron_lock_error') !== null) {
+					$upload_dir = wp_upload_dir();
+					if (is_writeable(Social::$plugins_path) or (isset($upload_dir['basedir']) and is_writeable($upload_dir['basedir']))) {
+						delete_option('social_cron_lock_error');
+					}
+					else {
+						if (isset($upload_dir['basedir'])) {
+							$message = sprintf(__('Social requires that either %s or %s be writable for CRON jobs.', 'social'), esc_html(Social::$plugins_path), esc_html($upload_dir['basedir']));
+						}
+						else {
+							$message = sprintf(__('Social requires that %s is writable for CRON jobs.', 'social'), esc_html(Social::$plugins_path));
+						}
+
+						echo '<div class="error"><p>'.esc_html($message).'</p></div>';
+					}
+				}
+
+				// Enable notice?
+				$suppress_enable_notice = get_user_meta(get_current_user_id(), 'social_suppress_enable_notice', true);
+				if (empty($suppress_enable_notice)) {
+					$message = __('When you enable Social, users will be created when they log in with Facebook or Twitter to comment. These users are created without a role and will be prevented from accessing the admin side of WordPress until an administrator edits the user to give them a role.', 'social');
+					$dismiss = sprintf(__('<a href="%s" class="social_dismiss">[Dismiss]</a>', 'social'), esc_url(admin_url('options-general.php?social_controller=settings&social_action=suppress_enable_notice')));
+					echo '<div class="updated"><p>'.$message.' '.$dismiss.'</p></div>';
+				}
+			}
+
+			// Log write error
+			$error = Social::option('log_write_error');
+			if ($error == '1') {
+				echo '<div class="error"><p>'.
+					sprintf(__('%s needs to be writable for Social\'s logging. <a href="%" class="social_dismiss">[Dismiss]</a>', 'social'), esc_html(Social::$plugins_path), esc_url(admin_url('options-general.php?social_controller=settings&social_action=clear_log_write_error'))).
+					'</p></div>';
+			}
+		}
+
+		// Deauthed accounts
+		$deauthed = Social::option('deauthed');
+		if (!empty($deauthed)) {
+			foreach ($deauthed as $service => $data) {
+				foreach ($data as $id => $message) {
+					$dismiss = sprintf(__('<a href="%s" class="%s">[Dismiss]</a>', 'social'), esc_url(admin_url('options-general.php?social_controller=settings&social_action=clear_deauth&id='.$id.'&service='.$service)), 'social_dismiss');
+					echo '<div class="error"><p>'.esc_html($message).' '.$dismiss.'</p></div>';
+				}
+			}
+		}
+
+		// Errored broadcasting?
+		global $post;
+		if (isset($post->ID)) {
+			$error_accounts = get_post_meta($post->ID, '_social_broadcast_error', true);
+			if (!empty($error_accounts)) {
+				$message = Social_View::factory('wp-admin/post/broadcast/error/notice', array(
+					'social' => $this,
+					'accounts' => $error_accounts,
+					'post' => $post,
+				));
+				echo '<div class="error" id="social-broadcast-error">'.$message.'</div>';
+
+				delete_post_meta($post->ID, '_social_broadcast_error');
+			}
+		}
+
+		// 2.0 Upgrade?
+		$upgrade_2_0 = get_user_meta(get_current_user_id(), 'social_2.0_upgrade', true);
+		if (!empty($upgrade_2_0)) {
+			if (current_user_can('manage_options')) {
+				$output = __('Social needs to re-authorize your Facebook account(s). Please re-connect your <a href="%s">global</a> and <a href="%s">personal</a> accounts.', 'social');
+				$output = sprintf($output, esc_url(Social::settings_url()), esc_url(admin_url('profile.php#social-accounts')));
+			}
+			else {
+				$output = __('Social needs to re-authorize your Facebook account(s).. Please re-connect your <a href="%s">personal</a> accounts.', 'social');
+				$output = sprintf($output, esc_url(admin_url('profile.php#social-networks')));
+			}
+
+			$dismiss = sprintf(__('<a href="%s" class="%s">[Dismiss]</a>', 'social'), esc_url(admin_url('options-general.php?social_controller=settings&social_action=clear_2_0_upgrade')), 'social_dismiss');
+			echo '<div class="error"><p>'.$output.' '.$dismiss.'</p></div>';
+		}
+	}
+
+	/**
+	 * Displays the admin options form.
+	 *
+	 * @return void
+	 */
+	public function admin_options_form() {
+		Social_Request::factory('settings/index')->execute();
+	}
+
+	/**
+	 * Shows the user's social network accounts.
+	 *
+	 * @wp-action  show_user_profile
+	 * @param  object  $profileuser
+	 * @return void
+	 */
+	public function show_user_profile($profileuser) {
+		$default_accounts = get_user_meta($profileuser->ID, 'social_default_accounts', true);
+		if (empty($default_accounts)) {
+			$default_accounts = array();
+		}
+		$accounts = array();
+		foreach ($this->services() as $key => $service) {
+			if (!isset($accounts[$key])) {
+				$accounts[$key] = array();
+			}
+			foreach ($service->accounts() as $account) {
+				if ($account->personal()) {
+					$accounts[$key][] = $account->id();
+				}
+			}
+		}
+		echo Social_View::factory('wp-admin/profile', array(
+			'defaults' => $default_accounts,
+			'services' => $this->services(),
+			'accounts' => $accounts,
+		));
+	}
+
+	/**
+	 * Saves the default accounts for the user.
+	 *
+	 * @wp-action personal_options_update
+	 * @param  int  $user_id
+	 * @return void
+	 */
+	public function personal_options_update($user_id) {
+		// Store the default accounts
+		$accounts = array();
+		if (isset($_POST['social_default_accounts']) and is_array($_POST['social_default_accounts'])) {
+			foreach ($_POST['social_default_accounts'] as $account) {
+				$account = explode('|', $account);
+				$accounts[$account[0]][] = $account[1];
+			}
+		}
+
+		// TODO abstract this to the facebook plugin
+		if (isset($_POST['social_default_pages']) and is_array($_POST['social_default_pages'])) {
+			if (!isset($accounts['facebook'])) {
+				$accounts['facebook'] = array(
+					'pages' => array()
+				);
+			}
+			$accounts['facebook']['pages'] = $_POST['social_default_pages'];
+		}
+
+		if (count($accounts)) {
+			update_user_meta($user_id, 'social_default_accounts', $accounts);
+		}
+		else {
+			delete_user_meta($user_id, 'social_default_accounts');
+		}
+
+		// Save Enabled child accounts
+		$is_profile = true;
+		$enabled_child_accounts = is_array($_POST['social_enabled_child_accounts']) ? $_POST['social_enabled_child_accounts'] : array();
+		foreach ($this->services() as $service_key => $service) {
+			$updated_accounts = array();
+			foreach ($service->accounts() as $account) {
+				//default service to empty array in case it is not set
+				$enabled_child_accounts[$service_key] = isset($enabled_child_accounts[$service_key]) ? $enabled_child_accounts[$service_key] : array();
+
+				$account->update_enabled_child_accounts($enabled_child_accounts[$service_key]);
+				$updated_accounts[$account->id()] = $account->as_object();
+			}
+			$service->accounts($updated_accounts)->save($is_profile);
+		}
+	}
+
+	/**
+	 * Return array of enabled social broadcasting post types
+	 *
+	 * @static
+	 * @return array
+	 */
+	public static function broadcasting_enabled_post_types() {
+		return apply_filters('social_broadcasting_enabled_post_types', get_post_types(array(
+			'public' => true,
+			'hierarchical' => false
+		)));
+	}
+	
+	/**
+	 * Check if a post type has broadcasting enabled
+	 *
+	 * @static
+	 * @param  string  $post_type  post type to check for
+	 * @return bool
+	 */
+	public static function broadcasting_enabled_for_post_type($post_type = null) {
+		return (bool) in_array($post_type, self::broadcasting_enabled_post_types());
+	}
+
+	/**
+	 * Add Meta Boxes
+	 *
+	 * @wp-action  do_meta_boxes
+	 * @return void
+	 */
+	public function do_meta_boxes() {
+		global $post;
+
+		if ($post !== null && Social::option('disable_broadcasting') != 1) {
+			foreach (self::broadcasting_enabled_post_types() as $post_type) {
+				add_meta_box('social_meta_broadcast', __('Social Broadcasting', 'social'), array(
+					$this,
+					'add_meta_box_broadcast'
+				), $post_type, 'side', 'high');
+	
+				$fetch = Social::option('fetch_comments');
+				if ($this->_enabled and !empty($fetch)) {
+					if ($post->post_status == 'publish') {
+						add_meta_box('social_meta_aggregation_log', __('Social Comments', 'social'), array(
+							$this,
+							'add_meta_box_log'
+						), $post_type, 'normal', 'core');
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Adds the broadcasting meta box.
+	 *
+	 * @return void
+	 */
+	public function add_meta_box_broadcast() {
+		global $post;
+
+		$broadcasted = '';
+		$broadcasted_ids = get_post_meta($post->ID, '_social_broadcasted_ids', true);
+		if (!empty($broadcasted_ids)) {
+			$broadcasted = Social_View::factory('wp-admin/post/meta/broadcast/parts/broadcasted', array(
+				'services' => $this->services(),
+				'ids' => $broadcasted_ids,
+				'post' => $post,
+			));
+		}
+
+		$show_broadcast = false;
+		foreach ($this->services() as $service) {
+			if (count($service->accounts())) {
+				$show_broadcast = true;
+				break;
+			}
+		}
+
+		// Content
+		$button = '';
+		$content = '';
+		if ($show_broadcast) {
+			if ($post->post_status != 'private') {
+				switch ($post->post_status) {
+					case 'pending':
+						$button = 'Edit';
+						$accounts = get_post_meta($post->ID, '_social_broadcast_accounts', true);
+						$content = Social_View::factory('wp-admin/post/meta/broadcast/pending', array(
+							'accounts' => $accounts,
+							'services' => $this->services(),
+						));
+						break;
+					case 'future':
+						$button = 'Edit';
+						$accounts = get_post_meta($post->ID, '_social_broadcast_accounts', true);
+						$content = Social_View::factory('wp-admin/post/meta/broadcast/scheduled', array(
+							'services' => $this->services(),
+							'accounts' => $accounts,
+						));
+						break;
+					case 'publish':
+						$button = 'Broadcast';
+						break;
+					default:
+						if ($post->post_status == 'draft' and !empty($broadcasted_ids)) {
+							$content = '';
+						}
+						else {
+							$notify = false;
+							if (get_post_meta($post->ID, '_social_notify', true) == '1') {
+								$notify = true;
+							}
+							else if (Social::option('broadcast_by_default') == '1') {
+								$notify = true;
+							}
+
+							$content = Social_View::factory('wp-admin/post/meta/broadcast/default', array(
+								'post' => $post,
+								'notify' => $notify,
+							));
+						}
+						break;
+				}
+			}
+			else {
+				$content = Social_View::factory('wp-admin/post/meta/broadcast/private');
+			}
+
+			// Button
+			if (!empty($button)) {
+				$button = Social_View::factory('wp-admin/post/meta/broadcast/parts/button', array(
+					'broadcasted' => $broadcasted,
+					'button_text' => $button,
+				));
+			}
+		}
+
+		echo Social_View::factory('wp-admin/post/meta/broadcast/shell', array(
+			'post' => $post,
+			'content' => $content,
+			'broadcasted' => $broadcasted,
+			'button' => $button
+		));
+	}
+
+	/**
+	 * Adds the aggregation log meta box.
+	 *
+	 * @return void
+	 */
+	public function add_meta_box_log() {
+		global $post;
+
+		$next_run = get_post_meta($post->ID, '_social_aggregation_next_run', true);
+		if (empty($next_run)) {
+			$next_run = __('Not Scheduled', 'social');
+		}
+		else {
+			$next_run = Social_Aggregation_Queue::next_run($next_run);
+		}
+
+		echo Social_View::factory('wp-admin/post/meta/log/shell', array(
+			'post' => $post,
+			'next_run' => $next_run,
+		));
+	}
+
+	/**
+	 * Show the broadcast options if publishing.
+	 *
+	 * @wp-filter  redirect_post_location
+	 * @param  string  $location  default post-publish location
+	 * @param  int     $post_id   post ID
+	 * @return string|void
+	 */
+	public function redirect_post_location($location, $post_id) {
+		if ((isset($_POST['social_notify']) and $_POST['social_notify'] == '1') and
+			(isset($_POST['visibility']) and $_POST['visibility'] !== 'private')
+		) {
+			update_post_meta($post_id, '_social_notify', '1');
+			if (isset($_POST['publish']) or isset($_POST['social_broadcast'])) {
+				Social_Request::factory('broadcast/options')->post(array(
+					'post_ID' => $post_id,
+					'location' => $location,
+				))->execute();
+			}
+		}
+		else {
+			delete_post_meta($post_id, '_social_notify');
+		}
+		return $location;
+	}
+
+	/**
+	 * Removes post meta if the post is going to private.
+	 *
+	 * @wp-action  transition_post_status
+	 * @param  string  $new
+	 * @param  string  $old
+	 * @param  object  $post
+	 * @return void
+	 */
+	public function transition_post_status($new, $old, $post) {
+		if ($new == 'private') {
+			delete_post_meta($post->ID, '_social_notify');
+			delete_post_meta($post->ID, '_social_broadcast_accounts');
+
+			foreach ($this->services() as $key => $service) {
+				delete_post_meta($post->ID, '_social_'.$key.'_content');
+			}
+		}
+		else {
+			$xmlrpc = false;
+			if ($new == 'publish') {
+				if ( ( defined('XMLRPC_REQUEST') or defined('SOCIAL_MAIL_PUBLISH') ) and $old != 'publish') {
+					$xmlrpc = true;
+					$this->xmlrpc_publish_post($post);
+				}
+				if (self::broadcasting_enabled_for_post_type($post->post_type)) {
+					Social_Aggregation_Queue::factory()->add($post->ID)->save();
+				}
+			}
+
+			// Sends previously saved broadcast information
+			if ($xmlrpc or ($old == 'future' and !in_array($new, array('future', 'draft')))) {
+				Social_Request::factory('broadcast/run')->query(array(
+					'post_ID' => $post->ID
+				))->execute();
+			}
+		}
+	}
+
+	/**
+	 * Broadcasts the post on XML RPC requests.
+	 *
+	 * @param  object  $post
+	 * @return void
+	 */
+	public function xmlrpc_publish_post($post) {
+		if ($post and Social::option('broadcast_by_default') == '1') {
+			Social::log('Broadcasting triggered by XML-RPC.');
+
+			$broadcast_accounts = array();
+			$broadcast_content = array();
+			$broadcast_meta = array();
+
+			foreach ($this->default_accounts($post) as $service_key => $accounts) {
+				$service = $this->service($service_key);
+				if ($service !== false) {
+					$broadcast_content[$service_key] = array();
+					$broadcast_meta[$service_key] = array();
+					foreach ($accounts as $key => $id) {
+						// TODO abstract this to the Facebook plugin
+						if ($service_key == 'facebook' and $key === 'pages') {
+							foreach ($id as $account_id => $pages) {
+								$account = $service->account($account_id);
+
+								// TODO This could use some DRY love
+								$universal_pages = $account->pages();
+								$personal_pages = $account->pages(null, true);
+
+								foreach ($pages as $page_id) {
+									if (!isset($broadcast_accounts[$service_key])) {
+										$broadcast_accounts[$service_key] = array();
+									}
+
+									if (!isset($broadcast_accounts[$service_key][$page_id])) {
+										if (isset($universal_pages[$page_id])) {
+											$broadcast_accounts[$service_key][$page_id] = (object) array(
+												'id' => $page_id,
+												'name' => $universal_pages[$page_id]->name,
+												'universal' => true,
+												'page' => true,
+											);
+										}
+										else if (isset($personal_pages[$page_id])) {
+											$broadcast_accounts[$service_key][$page_id] = (object) array(
+												'id' => $page_id,
+												'name' => $personal_pages[$page_id]->name,
+												'universal' => false,
+												'page' => true,
+											);
+										}
+									}
+									$broadcast_content[$service_key][$page_id] = $service->format_content($post, Social::option('broadcast_format'));
+									$broadcast_meta[$service_key][$page_id] = $service->get_broadcast_extras($page_id, $post);
+								}
+							}
+						}
+						else {
+							$account = $service->account($id);
+							if ($account !== false) {
+								if (!isset($broadcast_accounts[$service_key])) {
+									$broadcast_accounts[$service_key] = array();
+								}
+
+								$broadcast_accounts[$service_key][$account->id()] = (object) array(
+									'id' => $account->id(),
+									'universal' => $account->universal()
+								);
+
+								$broadcast_content[$service_key][$account->id()] = $service->format_content($post, Social::option('broadcast_format'));
+								$broadcast_meta[$service_key][$account->id()] = $service->get_broadcast_extras($account->id(), $post);
+							}
+						}
+					}
+				}
+			}
+
+			update_post_meta($post->ID, '_social_broadcast_content', addslashes_deep($broadcast_content));
+			update_post_meta($post->ID, '_social_broadcast_meta', addslashes_deep($broadcast_meta));
+
+			if (count($broadcast_accounts)) {
+				Social::log('There are default accounts, running broadcast');
+				update_post_meta($post->ID, '_social_broadcast_accounts', addslashes_deep($broadcast_accounts));
+			}
+		}
+	}
+
+	/**
+	 * Loads the default accounts for the post.
+	 *
+	 * @param  object  $post
+	 * @return array
+	 */
+	public function default_accounts($post) {
+		$default_accounts = Social::option('default_accounts');
+		$author_default_accounts = get_user_meta($post->post_author, 'social_default_accounts', true);
+		if (is_array($author_default_accounts)) {
+			foreach ($author_default_accounts as $service_key => $accounts) {
+				if (!isset($default_accounts[$service_key])) {
+					$default_accounts[$service_key] = $accounts;
+				}
+				else {
+					foreach ($accounts as $key => $account) {
+						if ($key === 'pages') {
+							if (!isset($default_accounts[$key]['pages'])) {
+								$default_accounts[$key]['pages'] = $account;
+							}
+							else {
+								foreach ($account as $page_id) {
+									if (!in_array($page_id, $default_accounts[$key]['pages'])) {
+										$default_accounts[$key]['pages'][] = $page_id;
+									}
+								}
+							}
+						}
+						else {
+							$default_accounts[$service_key][] = $account;
+						}
+					}
+				}
+			}
+		}
+
+		return apply_filters('social_default_accounts', $default_accounts, $post);
+	}
+
+	/**
+	 * Sets the broadcasted IDs for the post.
+	 *
+	 * @param  int  $post_id  post id
+	 * @param  string  $service  service key
+	 * @param  string  $broadcasted_id  broadcasted id
+	 * @param  string  $message  broadcasted message
+	 * @param  Social_Service_Account  $account  account
+	 * @param  Social_Response  $response  response object
+	 * @return void
+	 */
+	public function add_broadcasted_id($post_id, $service, $broadcasted_id, $message, $account, Social_Response $response = null) {
+		$broadcasted_ids = get_post_meta($post_id, '_social_broadcasted_ids', true);
+		if (empty($broadcasted_ids)) {
+			$broadcasted_ids = array();
+		}
+
+		if (!isset($broadcasted_ids[$service])) {
+			$broadcasted_ids[$service] = array();
+		}
+
+		if (!isset($broadcasted_ids[$service][$account->id()])) {
+			$broadcasted_ids[$service][$account->id()] = array();
+		}
+
+		if (!isset($broadcasted_ids[$service][$account->id()][$broadcasted_id])) {
+			$urls = array(
+				get_permalink($post_id)
+			);
+
+			$shortlink = wp_get_shortlink($post_id);
+			if (!in_array($shortlink, $urls)) {
+				$urls[] = $shortlink;
+			}
+
+			$home_url = home_url('?p='.$post_id);
+			if (!in_array($home_url, $urls)) {
+				$urls[] = $home_url;
+			}
+
+			$data = array(
+				'message' => $message,
+				'urls' => $urls
+			);
+			$data = apply_filters('social_save_broadcasted_ids_data', $data, $account, $service, $post_id, $response);
+			$broadcasted_ids[$service][$account->id()][$broadcasted_id] = $data;
+			update_post_meta($post_id, '_social_broadcasted_ids', $broadcasted_ids);
+		}
+	}
+
+	/**
+	 * Adds the 15 minute interval.
+	 *
+	 * @wp-filter  cron_schedules
+	 * @param  array  $schedules
+	 * @return array
+	 */
+	public function cron_schedules($schedules) {
+		$schedules['every15min'] = array(
+			'interval' => 900,
+			'display' => 'Every 15 minutes'
+		);
+		return $schedules;
+	}
+
+	/**
+	 * Sends a request to initialize CRON 15.
+	 *
+	 * @wp-action  social_cron_15_init
+	 * @return void
+	 */
+	public function cron_15_init() {
+		Social::log('Running cron_15_init');
+		Social_Request::factory('cron/cron_15')->query('api_key', Social::option('system_cron_api_key'))->execute();
+	}
+
+	/**
+	 * Runs the aggregation loop.
+	 *
+	 * @wp-action  social_cron_15
+	 * @return void
+	 */
+	public function run_aggregation() {
+		$semaphore = Social_Semaphore::factory();
+		$queue = Social_Aggregation_Queue::factory();
+
+		foreach ($queue->runnable() as $timestamp => $posts) {
+			foreach ($posts as $id => $interval) {
+				$post = get_post($id);
+				if ($post !== null) {
+					$queue->add($id, $interval)->save();
+					$semaphore->increment();
+					$this->request(home_url('index.php?social_controller=aggregation&social_action=run&post_id='.$id), 'run');
+				}
+				else {
+					$queue->remove($id, $timestamp)->save();
+				}
+			}
+		}
+	}
+
+	/**
+	 * Removes the post from the aggregation queue.
+	 *
+	 * @wp-action  delete_post
+	 * @param  int  $post_id
+	 * @return void
+	 */
+	public function delete_post($post_id) {
+		Social_Aggregation_Queue::factory()->remove($post_id);
+	}
+
+	/**
+	 * Hides the Site Admin link for social-based users.
+	 *
+	 * @wp-filter register
+	 * @param  string  $link
+	 * @return string
+	 */
+	public function register($link) {
+		if (is_user_logged_in()) {
+			$commenter = get_user_meta(get_current_user_id(), 'social_commenter', true);
+			if (!empty($commenter)) {
+				return '';
+			}
+		}
+
+		return $link;
+	}
+
+	/**
+	 * Sets the user role.
+	 *
+	 * @wp-action set_user_role
+	 * @param  int     $user_id
+	 * @param  string  $role
+	 */
+	public function set_user_role($user_id, $role) {
+		if (!empty($role)) {
+			delete_user_meta($user_id, 'social_commenter');
+		}
+	}
+
+	/**
+	 * Show the disconnect link for social-based users.
+	 *
+	 * @wp-filter loginout
+	 * @param  string  $link
+	 * @return string
+	 */
+	public function loginout($link) {
+		if (is_user_logged_in()) {
+			$commenter = get_user_meta(get_current_user_id(), 'social_commenter', true);
+			if (!empty($commenter)) {
+				foreach ($this->services() as $key => $service) {
+					$account = reset($service->accounts());
+					if ($account) {
+						return $service->disconnect_link($account);
+					}
+				}
+			}
+		}
+		else {
+			$link = explode('>'.__('Log in'), $link);
+			$link = $link[0].' id="social_login">'.__('Log in').$link[1];
+		}
+
+		return $link;
+	}
+
+	/**
+	 * Increments the service comment counter.
+	 *
+	 * @static
+	 * @param  array  $items
+	 * @param  array  $groups
+	 */
+	public static function add_social_items_count($items, &$groups) {
+		foreach ($items as $group => $_items) {
+			if ($group == 'parent') {
+				self::add_social_items_count($_items, $groups);
+			}
+			else {
+				if (!isset($groups['social-'.$group])) {
+					$groups['social-'.$group] = 0;
+				}
+
+				$groups['social-'.$group] = $groups['social-'.$group] + count($_items);
+			}
+		}
+	}
+
+	/**
+	 * Overrides the default WordPress comments_template function.
+	 *
+	 * @wp-filter  comments_template
+	 * @return string
+	 */
+	public function comments_template($path) {
+		global $post;
+
+		if (!(
+			is_singular() and 
+			(have_comments() or $post->comment_status == 'open') and 
+			Social::option('use_standard_comments') != '1'
+		)) {
+			return $path;
+		}
+
+		if (!defined('SOCIAL_COMMENTS_FILE')) {
+			define('SOCIAL_COMMENTS_FILE', trailingslashit(dirname(SOCIAL_FILE)).'views/comments.php');
+		}
+
+		return SOCIAL_COMMENTS_FILE;
+	}
+
+	/**
+	 * Returns an array of comment types that display avatars.
+	 *
+	 * @wp-filter  get_avatar_comment_types
+	 * @param  array  $types  default WordPress types
+	 * @return array
+	 */
+	public function get_avatar_comment_types($types) {
+		$types[] = 'wordpress';
+		return $types;
+	}
+
+	/**
+	 * Gets the avatar based on the comment type.
+	 *
+	 * @wp-filter  get_avatar
+	 * @param  string  $avatar
+	 * @param  object  $comment
+	 * @param  int     $size
+	 * @param  string  $default
+	 * @param  string  $alt
+	 * @return string
+	 */
+	public function get_avatar($avatar, $comment, $size, $default, $alt) {
+		$image = null;
+		if (is_object($comment)) {
+			$image = get_comment_meta($comment->comment_ID, 'social_profile_image_url', true);
+			if (empty($image)) {
+				$image = null;
+			}
+		}
+		else {
+			// Commenter?
+			$social_avatar = get_user_meta($comment, 'social_avatar', true);
+			if (!empty($social_avatar)) {
+				$image = $social_avatar;
+			}
+		}
+
+		if ($image !== null) {
+			$image = esc_url($image);
+			$size = esc_attr($size);
+			$type = '';
+			if (is_object($comment)) {
+				$type = esc_attr($comment->comment_type);
+			}
+
+			$image = esc_url($image);
+			$image_format = apply_filters('social_get_avatar_image_format', '<img alt="%1$s" src="%2$s" class="avatar avatar-%3$s photo %4$s" height="%3$s" width="%3$s" />');
+			return sprintf($image_format, $alt, $image, $size, $type);
+		}
+
+		return $avatar;
+	}
+
+	/**
+	 * Sets the comment type upon being saved.
+	 *
+	 * @wp-action  comment_post
+	 * @param  int  $comment_ID
+	 */
+	public function comment_post($comment_ID) {
+		global $wpdb;
+
+		$comment = get_comment($comment_ID);
+		$services = $this->services();
+		if (!empty($services)) {
+			$account_id = $_POST['social_post_account'];
+			foreach ($services as $key => $service) {
+				$output = $service->format_comment_content($comment, Social::option('comment_broadcast_format'));
+				foreach ($service->accounts() as $account) {
+					if ($account_id == $account->id()) {
+						if (isset($_POST['post_to_service'])) {
+							$in_reply_to_status_id = get_comment_meta($_POST['comment_parent'], 'social_status_id', true);
+							if ($comment->comment_approved == '0') {
+								update_comment_meta($comment_ID, 'social_to_broadcast', $_POST['social_post_account']);
+								if (!empty($in_reply_to_status_id)) {
+									update_comment_meta($comment_ID, 'social_in_reply_to_status_id', addslashes_deep($in_reply_to_status_id));
+								}
+							}
+							else {
+								$args = array();
+								if (!empty($in_reply_to_status_id)) {
+									$args['in_reply_to_status_id'] = $in_reply_to_status_id;
+									delete_comment_meta($comment_ID, 'social_in_reply_to_status_id');
+								}
+								Social::log(sprintf(__('Broadcasting comment #%s to %s using account #%s.', 'social'), $comment_ID, $service->title(), $account->id()));
+								$response = $service->broadcast($account, $output, $args, null, $comment_ID);
+								if ($response === false or $response->id() === '0') {
+									wp_delete_comment($comment_ID);
+									Social::log(sprintf(__('Error: Broadcast comment #%s to %s using account #%s, please go back and try again.', 'social'), $comment_ID, esc_html($service->title()), esc_html($account->id())));
+									wp_die(sprintf(__('Error: Your comment could not be sent to %s, please go back and try again.', 'social'), esc_html($service->title())));
+								}
+
+								$wpdb->query($wpdb->prepare("
+									UPDATE $wpdb->comments
+									   SET comment_type = %s
+									 WHERE comment_ID = %s
+								", 'social-'.$service->key(), $comment_ID));
+
+								$this->set_comment_aggregated_id($comment_ID, $service->key(), $response->id());
+								update_comment_meta($comment_ID, 'social_status_id', addslashes_deep($response->id()));
+								update_comment_meta($comment_ID, 'social_raw_data', addslashes_deep(base64_encode(json_encode($response->body()->response))));
+								Social::log(sprintf(__('Broadcasting comment #%s to %s using account #%s COMPLETE.', 'social'), $comment_ID, $service->title(), $account->id()));
+							}
+						}
+
+						update_comment_meta($comment_ID, 'social_account_id', addslashes_deep($account_id));
+						update_comment_meta($comment_ID, 'social_profile_image_url', addslashes_deep($account->avatar()));
+						update_comment_meta($comment_ID, 'social_comment_type', addslashes_deep('social-'.$service->key()));
+
+						if ($comment->user_id != '0') {
+							$comment->comment_author = $account->name();
+							$comment->comment_author_url = $account->url();
+							wp_update_comment(get_object_vars($comment));
+						}
+						Social::log(sprintf(__('Comment #%s saved.', 'social'), $comment_ID));
+						break;
+					}
+				}
+			}
+		}
+	}
+
+	/**
+	 * Sets the comment to be approved.
+	 *
+	 * @wp-action  wp_set_comment_status
+	 * @param  int     $comment_id
+	 * @param  string  $comment_status
+	 * @return void
+	 */
+	public function wp_set_comment_status($comment_id, $comment_status) {
+		if ($comment_status == 'approve') {
+			global $wpdb;
+			$results = $wpdb->get_results($wpdb->prepare("
+				SELECT user_id, m.meta_value
+				  FROM $wpdb->commentmeta AS m
+				  JOIN $wpdb->comments AS c
+				    ON m.comment_id = c.comment_ID
+				 WHERE m.meta_key = %s
+				   AND m.comment_id = %s
+			", 'social_to_broadcast', $comment_id));
+			if (!empty($results)) {
+				$result = reset($results);
+				$accounts = get_user_meta($result->user_id, 'social_accounts', true);
+				if (!empty($accounts)) {
+					foreach ($accounts as $service => $accounts) {
+						$service = $this->service($service);
+						if ($service !== false) {
+							$account = null;
+							if (!$service->account_exists($result->meta_value)) {
+								foreach ($accounts as $id => $account) {
+									if ($id == $result->meta_value) {
+										$class = 'Social_Service_'.$service->key().'_Account';
+										$account = new $class($account);
+										break;
+									}
+								}
+							}
+							else {
+								$account = $service->account($result->meta_value);
+							}
+
+							if ($account !== null) {
+								Social::log(sprintf(__('Broadcasting comment #%s to %s using account #%s.', 'social'), $comment_id, $service->title(), $account->id()));
+								$comment = get_comment($comment_id);
+
+								$in_reply_to_status_id = get_comment_meta($comment_id, 'social_in_reply_to_status_id', true);
+								$args = array();
+								if (!empty($in_reply_to_status_id)) {
+									$args['in_reply_to_status_id'] = $in_reply_to_status_id;
+									delete_comment_meta($comment_id, 'social_in_reply_to_status_id');
+								}
+
+								$output = $service->format_comment_content($comment, Social::option('comment_broadcast_format'));
+								$response = $service->broadcast($account, $output, $args, null, $comment_id);
+								if ($response === false or $response->id() === false) {
+									wp_delete_comment($comment_id);
+									Social::log(sprintf(__('Error: Broadcast comment #%s to %s using account #%s, please go back and try again.', 'social'), $comment_id, $service->title(), $account->id()));
+								}
+
+								$wpdb->query($wpdb->prepare("
+									UPDATE $wpdb->comments
+									   SET comment_type = %s
+									 WHERE comment_ID = %s
+								", 'social-'.$service->key(), $comment_id));
+
+								$this->set_comment_aggregated_id($comment_id, $service->key(), $response->id());
+								update_comment_meta($comment_id, 'social_status_id', addslashes_deep($response->id()));
+								update_comment_meta($comment_id, 'social_raw_data', addslashes_deep(base64_encode(json_encode($response->body()->response))));
+								Social::log(sprintf(__('Broadcasting comment #%s to %s using account #%s COMPLETE.', 'social'), $comment_id, $service->title(), $account->id()));
+							}
+						}
+					}
+				}
+
+				delete_comment_meta($comment_id, 'social_to_broadcast');
+			}
+		}
+	}
+
+	/**
+	 * Sets the comment aggregation ID.
+	 *
+	 * Format of the stored data (serialized):
+	 *
+	 *     array(
+	 *         'twitter' => array(
+	 *             1234567890,
+	 *             0987654321,
+	 *             // ... Other aggregated IDs
+	 *         ),
+	 *         'facebook' => array(
+	 *             1234567890_1234567890,
+	 *             0987654321_0987654321,
+	 *             // ... Other aggregated IDs
+	 *         )
+	 *     )
+	 *
+	 * @param  int     $comment_id
+	 * @param  string  $service
+	 * @param  int     $broadcasted_id
+	 * @return void
+	 */
+	private function set_comment_aggregated_id($comment_id, $service, $broadcasted_id) {
+		$comment = get_comment($comment_id);
+		if (is_object($comment)) {
+			$aggregated_ids = get_post_meta($comment->comment_post_ID, '_social_aggregated_ids', true);
+			if (empty($aggregated_ids)) {
+				$aggregated_ids = array();
+			}
+
+			if (!isset($aggregated_ids[$service])) {
+				$aggregated_ids[$service] = array();
+			}
+
+			if (!in_array($broadcasted_id, $aggregated_ids[$service])) {
+				$aggregated_ids[$service][] = $broadcasted_id;
+			}
+
+			update_post_meta($comment->comment_post_ID, '_social_aggregated_ids', $aggregated_ids);
+		}
+	}
+
+	/**
+	 * Counts the different types of comments.
+	 *
+	 * @wp-filter social_comments_array
+	 * @static
+	 * @param  array  $comments
+	 * @param  int    $post_id
+	 * @return array
+	 */
+	public function comments_array(array $comments, $post_id) {
+		$groups = array();
+		if (isset($comments['social_groups'])) {
+			$groups = $comments['social_groups'];
+		}
+
+		// count the comment types for output in tab headers
+		foreach ($comments as $comment) {
+			if (is_object($comment)) {
+				if (empty($comment->comment_type)) {
+					$comment->comment_type = 'wordpress';
+				}
+
+				if (!isset($groups[$comment->comment_type])) {
+					$groups[$comment->comment_type] = 1;
+				}
+				else {
+					++$groups[$comment->comment_type];
+				}
+				if (isset($comment->social_items) and is_array($comment->social_items)) {
+					$groups[$comment->comment_type] += count($comment->social_items);
+				}
+			}
+		}
+
+		$comments['social_groups'] = apply_filters('social_comments_array_groups', $groups, $comments);
+
+		return $comments;
+	}
+
+	/**
+	 * Displays a comment.
+	 *
+	 * @param  object  $comment  comment object
+	 * @param  array   $args
+	 * @param  int     $depth
+	 */
+	public function comment($comment, array $args = array(), $depth = 0) {
+		$GLOBALS['comment'] = $comment;
+
+		$social_items = '';
+		$status_url = null;
+		$comment_type = $comment->comment_type;
+		$ignored_types = apply_filters('social_ignored_comment_types', array(
+			'wordpress',
+			'pingback'
+		));
+		// set the comment type to WordPress if we can't load the Social service (perhaps it was deactivated)
+		// and the type isn't an ignored type
+		if (!($service = $this->service_for_comment_type($comment->comment_type)) && !in_array($comment->comment_type, $ignored_types)) {
+			$comment_type = 'wordpress';
+		}
+		// set Social Items for Social comments
+		if (!in_array($comment->comment_type, $ignored_types)) {
+			$status_id = get_comment_meta($comment->comment_ID, 'social_status_id', true);
+			if (!empty($status_id)) {
+				$status_url = $service->status_url(get_comment_author(), $status_id);
+			}
+			// Social items?
+			if (!empty($comment->social_items)) {
+				if (is_object($service) && method_exists($service, 'key')) {
+					$avatar_size = apply_filters('social_items_comment_avatar_size', array(
+						'width' => 18,
+						'height' => 18,
+					));
+					$social_items = Social_View::factory('comment/social_item', array(
+						'items' => $comment->social_items,
+						'service' => $service,
+						'avatar_size' => $avatar_size
+					));
+				}
+				else {
+					Social::log('service not set for: '.print_r($comment, true));
+					ob_start();
+					var_dump($service);
+					Social::log('$service: '.ob_get_clean());
+				}
+			}
+		}
+
+		echo Social_View::factory('comment/comment', array(
+			'comment_type' => $comment_type,
+			'comment' => $comment,
+			'service' => $service,
+			'status_url' => $status_url,
+			'depth' => $depth,
+			'args' => $args,
+			'social_items' => $social_items,
+		));
+	}
+
+	/**
+	 * Adds the Aggregate Comments link to the post row actions.
+	 *
+	 * @param  array    $actions
+	 * @param  WP_Post  $post
+	 * @return array
+	 */
+	public function post_row_actions(array $actions, $post) {
+		if ($post->post_status == 'publish' && in_array(Social::option('fetch_comments'), array('1', '2'))) {
+			$actions['social_aggregation'] = sprintf(__('<a href="%s" rel="%s">Social Comments</a>', 'social'), esc_url(wp_nonce_url(admin_url('options-general.php?social_controller=aggregation&social_action=run&post_id='.$post->ID), 'run')), $post->ID).
+				'<img src="'.esc_url(admin_url('images/wpspin_light.gif')).'" class="social_run_aggregation_loader" />';
+		}
+		return $actions;
+	}
+
+	/**
+	 * Adds the aggregation functionality to the admin bar.
+	 *
+	 * @return void
+	 */
+	public function admin_bar_menu() {
+		global $wp_admin_bar;
+
+		$current_object = get_queried_object();
+
+		if (empty($current_object)) {
+			return;
+		}
+
+		if (!empty($current_object->post_type)
+			and ($post_type_object = get_post_type_object($current_object->post_type))
+				and current_user_can($post_type_object->cap->edit_post, $current_object->ID)
+					and ($post_type_object->show_ui or 'attachment' == $current_object->post_type)
+						and (in_array(Social::option('fetch_comments'), array('1', '2')))
+		) {
+			$wp_admin_bar->add_menu(array(
+				'parent' => 'comments',
+				'id' => 'social-find-comments',
+				'title' => __('Find Social Comments', 'social')
+					.'<span class="social-aggregation-spinner" style="display: none;">&nbsp;(
+						<span class="social-dot dot-active">.</span>
+						<span class="social-dot">.</span>
+						<span class="social-dot">.</span>
+					)</span>',
+				'href' => esc_url(wp_nonce_url(admin_url('options-general.php?social_controller=aggregation&social_action=run&post_id='.$current_object->ID), 'run')),
+			));
+			$wp_admin_bar->add_menu(array(
+				'parent' => 'comments',
+				'id' => 'social-add-tweet-by-url',
+				'title' => __('Add Tweet by URL', 'social')
+					.'<form class="social-add-tweet" style="display: none;" method="get" action="'.esc_url(wp_nonce_url(admin_url('options-general.php?social_controller=import&social_action=from_url&social_service=twitter&post_id='.$current_object->ID), 'from_url')).'">
+						<input type="text" size="20" name="url" value="" autocomplete="off" />
+						<input type="submit" name="social-add-tweet-button" name="social-add-tweet-button" value="'.__('Add Tweet by URL', 'social').'" />
+					</form>',
+				'href' => esc_url(get_edit_post_link($current_object->ID)),
+			));
+		}
+	}
+	
+	function admin_bar_footer_css() {
+?>
+<style class="text/css">
+#wpadminbar #wp-admin-bar-comments .social-aggregation-spinner {
+	background: transparent;
+	white-space: nowrap;
+}
+#wpadminbar .social-aggregation-spinner .dot-active {
+	font-weight: bold;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url form {
+	display: block;
+	line-height: 100%;
+	margin: 0;
+	padding: 5px;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url input {
+	color: #333;
+	font-size: 11px;
+	font-weight: normal;
+	line-height: 1;
+	margin-bottom: 3px;
+	padding: 3px;
+	text-shadow: none;
+	width: 90%;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url input[type="submit"] {
+	margin: 0;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url .loading {
+	background: url(<?php echo admin_url('images/wpspin_light.gif'); ?>) center center no-repeat;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url p.msg {
+	color: #333;
+	font-size: 12px;
+	font-weight: normal;
+	margin: 0;
+	padding: 0;
+	text-align: center;
+	text-shadow: none;
+}
+#wpadminbar #wp-admin-bar-social-add-tweet-by-url p.error {
+	color: #900;
+}
+</style>
+<?php
+	}
+
+	function admin_bar_footer_js() {
+?>
+<script type="text/javascript">
+var socialAdminBarMsgs = {
+	'protected': '<?php echo esc_js(__('Protected Tweet', 'social')); ?>',
+	'invalid': '<?php echo esc_js(__('Invalid URL', 'social')); ?>',
+	'success': '<?php echo esc_js(__('Tweet Imported!', 'social')); ?>'
+};
+</script>
+<?php
+	}
+
+	/**
+	 * Runs the upgrade only if the installed version is older than the current version.
+	 *
+	 * @return void
+	 */
+	private function upgrade() {
+		define('SOCIAL_UPGRADE', true);
+		global $wpdb; // Don't delete, this is used in upgrade files.
+
+		$upgrades = array(
+			Social::$plugins_path.'upgrades/2.0.php',
+		);
+		$upgrades = apply_filters('social_upgrade_files', $upgrades);
+		foreach ($upgrades as $file) {
+			if (file_exists($file)) {
+				include_once $file;
+			}
+		}
+
+		Social::option('installed_version', Social::$version);
+	}
+
+	/**
+	 * Are there accounts connected?
+	 *
+	 * @return bool
+	 */
+	public function have_accounts() {
+		foreach ($this->services() as $service) {
+			if (count($service->accounts())) {
+				return true;
+			}
+		}
+
+		return false;
+	}
+
+	/**
+	 * Removes an account from the default broadcast accounts.
+	 *
+	 * @param  string  $service
+	 * @param  int     $id
+	 * @return void
+	 */
+	public function remove_from_default_accounts($service, $id) {
+		Social::log('Removing from default accounts #:id', array('id' => $id));
+		if (defined('IS_PROFILE_PAGE')) {
+			$defaults = get_user_meta(get_current_user_id(), 'social_default_accounts', true);
+		}
+		else {
+			$defaults = Social::option('default_accounts');
+		}
+
+		if (!empty($defaults) and isset($defaults[$service])) {
+			Social::log('Old default accounts: :accounts', array('accounts' => print_r($defaults, true)));
+
+			$_ids = array();
+			foreach ($defaults[$service] as $key => $_id) {
+				if ($_id != $id) {
+					$_ids[$key] = $_id;
+				}
+			}
+
+			// TODO abstract this to the Facebook plugin
+			if ($service == 'facebook' and isset($_ids['pages'])) {
+				$pages = $_ids['pages'];
+				unset($_ids['pages']);
+				sort($_ids);
+				foreach ($pages as $account_id => $account_pages) {
+					if ($account_id != $id) {
+						$_ids['pages'][$account_id] = $account_pages;
+					}
+				}
+			}
+
+			$defaults[$service] = $_ids;
+			if (!count($defaults[$service])) {
+				unset($defaults[$service]);
+			}
+			Social::log('New default accounts: :accounts', array('accounts' => print_r($defaults, true)));
+			if (defined('IS_PROFILE_PAGE')) {
+				update_user_meta(get_current_user_id(), 'social_default_accounts', $defaults);
+			}
+			else {
+				Social::option('default_accounts', $defaults);
+			}
+		}
+	}
+
+	/**
+	 * Recursively applies wp_kses() to an array/stdClass.
+	 *
+	 * @param  mixed  $object
+	 * @return mixed
+	 */
+	public function kses($object) {
+		if (is_object($object)) {
+			$_object = new stdClass;
+		}
+		else {
+			$_object = array();
+		}
+
+		foreach ($object as $key => $val) {
+			if (is_object($val) or is_array($val)) {
+				if (is_object($_object)) {
+					$_object->$key = $this->kses($val);
+				}
+				else if (is_array($_object)) {
+					$_object[$key] = $this->kses($val);
+				}
+			}
+			else {
+				if (is_object($_object)) {
+					$_object->$key = wp_kses($val, array());
+				}
+				else {
+					$_object[$key] = wp_kses($val, array());
+				}
+			}
+		}
+
+		return $_object;
+	}
+
+	/**
+	 * Handles the remote timeout requests for Social.
+	 *
+	 * @param  string  $url        url to request
+	 * @param  string  $nonce_key  key to use when generating the nonce
+	 * @param  bool    $post       set to true to do a wp_remote_post
+	 * @return void
+	 */
+	private function request($url, $nonce_key = null, $post = false) {
+		if ($nonce_key !== null) {
+			$url = str_replace('&amp;', '&', wp_nonce_url($url, $nonce_key));
+		}
+
+		$data = array(
+			'timeout' => 0.01,
+			'blocking' => false,
+			'sslverify' => apply_filters('https_local_ssl_verify', true),
+		);
+
+		if ($post) {
+			Social::log('POST request to: :url', array(
+				'url' => $url
+			));
+			wp_remote_post($url, $data);
+		}
+		else {
+			Social::log('GET request to: :url', array(
+				'url' => $url
+			));
+			wp_remote_get($url, $data);
+		}
+	}
+
+	/**
+	 * Loads the services.
+	 *
+	 * @return array
+	 */
+	private function load_services() {
+		if ((isset($_GET['page']) and $_GET['page'] == basename(SOCIAL_FILE)) or defined('IS_PROFILE_PAGE')) {
+			$services = false;
+		}
+		else {
+			$services = wp_cache_get('services', 'social');
+		}
+
+		if ($services === false) {
+			$services = array();
+			// Register services
+			$registered_services = apply_filters('social_register_service', array());
+			if (is_array($registered_services) and count($registered_services)) {
+				$accounts = Social::option('accounts');
+				foreach ($registered_services as $service) {
+					if (!isset($services[$service])) {
+						$service_accounts = array();
+
+						if (isset($accounts[$service]) and count($accounts[$service])) {
+							// Flag social as enabled, we have at least one account.
+							if ($this->_enabled === null) {
+								$this->_enabled = true;
+							}
+
+							foreach ($accounts[$service] as $account_id => $account) {
+								// TODO Shouldn't have to do this. Fix later.
+								$account->personal = '0';
+								$service_accounts[$account_id] = $account;
+							}
+						}
+
+						$class = 'Social_Service_'.$service;
+						$services[$service] = new $class($service_accounts);
+					}
+				}
+				wp_cache_set('services', $services, 'social');
+			}
+		}
+		else if ($this->_enabled === null and is_array($services)) {
+			foreach ($services as $service) {
+				if (count($service->accounts())) {
+					$this->_enabled = true;
+					break;
+				}
+			}
+		}
+
+// don't return global services for commenters
+		$commenter = get_user_meta(get_current_user_id(), 'social_commenter', true);
+		if ($commenter == 'true' && !current_user_can('publish_posts')) {
+			foreach ($services as $key => $accounts) {
+				$services[$key]->clear_accounts();
+			}
+		}
+
+		$personal_accounts = get_user_meta(get_current_user_id(), 'social_accounts', true);
+		if (is_array($personal_accounts)) {
+			foreach ($personal_accounts as $key => $_accounts) {
+				if (count($_accounts) and isset($services[$key])) {
+					$class = 'Social_Service_'.$key.'_Account';
+					foreach ($_accounts as $account_id => $account) {
+						// TODO Shouldn't have to do this. Fix later.
+						$account->universal = '0';
+						if ($services[$key]->account_exists($account_id) and !defined('IS_PROFILE_PAGE')) {
+							$account = $this->merge_accounts($services[$key]->account($account_id)->as_object(), $account, $key);
+						}
+						$account = new $class((object) $account);
+						$services[$key]->account($account);
+						// Flag social as enabled, we have at least one account.
+						if ($this->_enabled === null) {
+							$this->_enabled = true;
+						}
+					}
+				}
+			}
+		}
+
+		return $services;
+	}
+
+	/**
+	 * Merges universal with personal account.
+	 *
+	 * @param  array   $arr1
+	 * @param  array   $arr2
+	 * @param  string  $service_key
+	 * @return object
+	 */
+	private function merge_accounts($arr1, $arr2, $service_key) {
+		$arr1->personal = true;
+		return apply_filters('social_merge_accounts', $arr1, $arr2, $service_key);
+	}
+
+	/**
+	 * Checks to see if the array is an associative array.
+	 *
+	 * @param  array  $arr
+	 * @return bool
+	 */
+	private function is_assoc($arr) {
+		$keys = array_keys($arr);
+		return array_keys($keys) !== $keys;
+	}
+
+	/**
+	 * Builds the settings URL for the plugin.
+	 *
+	 * @param  array  $params
+	 * @param  bool   $personal
+	 * @return string
+	 */
+	public static function settings_url(array $params = null, $personal = false) {
+		if ($params !== null) {
+			foreach ($params as $key => $value) {
+				$params[$key] = urlencode($value);
+			}
+		}
+
+		if (!current_user_can('manage_options') or $personal) {
+			$file = 'profile.php';
+		}
+		else {
+			$file = 'options-general.php';
+			$params['page'] = basename(SOCIAL_FILE);
+		}
+
+		$url = add_query_arg($params, admin_url($file));
+
+		if (!current_user_can('manage_options') or $personal) {
+			$url .= '#social-networks';
+		}
+
+		return $url;
+	}
+	
+	/**
+	 * Filter the where clause for pulling comments for feeds (to exclude meta comments).
+	 *
+	 * @param  string  $where
+	 * @return string
+	 */
+	public static function comments_feed_exclusions($where) {
+		global $wpdb;
+		$meta_types = array();
+// get services
+		$services = Social::instance()->services();
+// ask each service for it's "meta" comment types
+		foreach ($services as $service) {
+			$meta_types = array_merge($meta_types, $service->comment_types_meta());
+		}
+		$meta_types = array_unique($meta_types);
+		if (count($meta_types)) {
+			$where .= " AND comment_type NOT IN ('".implode("', '", array_map('social_wpdb_escape', $meta_types))."') ";
+		}
+		return $where;
+	}
+	
+	/**
+	 * Filter the image tag to implement lazy loading support for meta comments.
+	 *
+	 * @param  string  $image_format
+	 * @return string
+	 */
+	public static function social_item_output_image_format($image_format) {
+		if (class_exists('LazyLoad_Images')) {
+			// would be great if the plugin provided an API for this, until then we'll copy the code
+			$placeholder_image = apply_filters( 'lazyload_images_placeholder_image', LazyLoad_Images::get_url( 'images/1x1.trans.gif' ) );
+			$image_format = '<img src="'.esc_url($placeholder_image).'" data-lazy-src="%1$s" width="%2$s" height="%3$s" alt="%4$s" /><noscript>'.$image_format.'</noscript>';
+		}
+		return $image_format;
+	}
+
+	/**
+	 * Filter the image tag to implement lazy loading support for avatars.
+	 *
+	 * @param  string  $image_format
+	 * @return string
+	 */
+	public static function social_get_avatar_image_format($image_format) {
+		if (class_exists('LazyLoad_Images')) {
+			// would be great if the plugin provided an API for this, until then we'll copy the code
+			$placeholder_image = apply_filters( 'lazyload_images_placeholder_image', LazyLoad_Images::get_url( 'images/1x1.trans.gif' ) );
+			$image_format = '<img alt="%1$s" src="'.esc_url($placeholder_image).'" data-lazy-src="%2$s" class="avatar avatar-%3$s photo %4$s" height="%3$s" width="%3$s" /><noscript>'.$image_format.'</noscript>';
+		}
+		return $image_format;
+	}
+
+} // End Social
+
+if (!function_exists('addslashes_deep')) {
+/**
+ * Navigates through an array and adds slashes to the values.
+ *
+ * If an array is passed, the array_map() function causes a callback to pass the
+ * value back to the function. Slashes will be added to this value.
+ *
+ * @since 3.4.0?
+ *
+ * @param array|string $value The array or string to be slashed.
+ * @return array|string Slashed array (or string in the callback).
+ */
+function addslashes_deep($value) {
+	if ( is_array($value) ) {
+		$value = array_map('addslashes_deep', $value);
+	} elseif ( is_object($value) ) {
+		$vars = get_object_vars( $value );
+		foreach ($vars as $key=>$data) {
+			$value->{$key} = addslashes_deep( $data );
+		}
+	} else {
+		$value = addslashes($value);
+	}
+
+	return $value;
+}
+}
+
+function social_wpdb_escape($str) {
+	global $wpdb;
+	return $wpdb->escape($str);
+}
+
+function social_wp_mail_indicator() {
+	define('SOCIAL_MAIL_PUBLISH', true);
+}
+
+$social_file = __FILE__;
+if (isset($plugin)) {
+	$social_file = $plugin;
+}
+else if (isset($mu_plugin)) {
+	$social_file = $mu_plugin;
+}
+else if (isset($network_plugin)) {
+	$social_file = $network_plugin;
+}
+
+define('SOCIAL_FILE', $social_file);
+define('SOCIAL_PATH', WP_PLUGIN_DIR.'/'.basename(dirname($social_file)).'/');
+
+// Register Social's autoloading
+spl_autoload_register(array('Social', 'auto_load'));
+
+$social = Social::instance();
+
+// General Actions
+add_action('init', array($social, 'init'), 1);
+add_action('init', array($social, 'request_handler'), 2);
+add_action('admin_init', array($social, 'admin_init'), 1);
+add_action('load-settings_page_social', array($social, 'check_system_cron'));
+add_action('load-social.php', array($social, 'check_system_cron'));
+add_action('comment_post', array($social, 'comment_post'));
+add_action('wp_set_comment_status', array($social, 'wp_set_comment_status'), 10, 3);
+add_action('admin_notices', array($social, 'admin_notices'));
+add_action('transition_post_status', array($social, 'transition_post_status'), 10, 3);
+add_action('show_user_profile', array($social, 'show_user_profile'));
+add_action('do_meta_boxes', array($social, 'do_meta_boxes'));
+add_action('delete_post', array($social, 'delete_post'));
+add_action('wp_enqueue_scripts', array($social, 'enqueue_assets'));
+add_action('load-post-new.php', array($social, 'enqueue_assets'));
+add_action('load-post.php', array($social, 'enqueue_assets'));
+add_action('load-profile.php', array($social, 'enqueue_assets'));
+add_action('load-settings_page_social', array($social, 'enqueue_assets'));
+add_action('admin_enqueue_scripts', array($social, 'admin_enqueue_assets'));
+add_action('admin_bar_menu', array($social, 'admin_bar_menu'), 95);
+add_action('wp_after_admin_bar_render', array($social, 'admin_bar_footer_css'));
+add_action('wp_after_admin_bar_render', array($social, 'admin_bar_footer_js'));
+add_action('set_user_role', array($social, 'set_user_role'), 10, 2);
+add_action('wp-mail.php', 'social_wp_mail_indicator');
+add_action('social_settings_save', array('Social_Service_Facebook', 'social_settings_save'));
+
+// CRON Actions
+add_action('social_cron_15_init', array($social, 'cron_15_init'));
+add_action('social_cron_15', array($social, 'run_aggregation'));
+
+// Admin Actions
+add_action('admin_menu', array($social, 'admin_menu'));
+add_action('personal_options_update', array($social, 'personal_options_update'));
+
+// Filters
+add_filter('cron_schedules', array($social,'cron_schedules'));
+add_filter('plugin_action_links', array($social, 'add_settings_link'), 10, 2);
+add_filter('redirect_post_location', array($social, 'redirect_post_location'), 10, 2);
+add_filter('comments_template', array($social, 'comments_template'));
+add_filter('get_avatar_comment_types', array($social, 'get_avatar_comment_types'));
+add_filter('get_avatar', array($social, 'get_avatar'), 10, 5);
+add_filter('register', array($social, 'register'));
+add_filter('loginout', array($social, 'loginout'));
+add_filter('post_row_actions', array($social, 'post_row_actions'), 10, 2);
+add_filter('social_comments_array', array($social, 'comments_array'), 100, 2);
+add_filter('comment_feed_where', array($social, 'comments_feed_exclusions'));
+add_filter('social_settings_default_accounts', array('Social_Service_Facebook', 'social_settings_default_accounts'), 10, 2);
+add_filter('social_item_output_image_format', array($social, 'social_item_output_image_format'));
+add_filter('social_get_avatar_image_format', array($social, 'social_get_avatar_image_format'));
+
+// Service filters
+add_filter('social_auto_load_class', array($social, 'auto_load_class'));
+
+} // End class_exists check
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/upgrades/2.0.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,329 @@
+<?php if (!defined('SOCIAL_UPGRADE')) { die('Direct script access not allowed.'); }
+/**
+ * Upgrades Social to 2.0.
+ */
+
+// Force the lock
+$semaphore = Social_Semaphore::factory();
+$semaphore->lock();
+
+// Find old social_notify and update to _social_notify.
+$meta_keys = array(
+	'social_aggregated_replies',
+	'social_broadcast_error',
+	'social_broadcast_accounts',
+	'social_broadcasted_ids',
+	'social_aggregation_log',
+	'social_twitter_content',
+	'social_notify_twitter',
+	'social_facebook_content',
+	'social_notify_facebook',
+	'social_notify',
+	'social_broadcasted'
+);
+if (count($meta_keys)) {
+	foreach ($meta_keys as $key) {
+		$new = '_'.$key;
+		if ($key == 'social_aggregated_replies') {
+			$new = '_social_aggregated_ids';
+		}
+		$wpdb->query("
+			UPDATE $wpdb->postmeta
+			   SET meta_key = '$new'
+			 WHERE meta_key = '$key'
+		");
+	}
+}
+
+// Delete old useless meta
+$meta_keys = array(
+	'_social_broadcasted'
+);
+if (count($meta_keys)) {
+	foreach ($meta_keys as $key) {
+		$wpdb->query("
+			DELETE
+			  FROM $wpdb->postmeta
+			 WHERE meta_key = '$key'
+		");
+	}
+}
+
+// De-auth Facebook accounts for new permissions.
+if (version_compare(Social::option('installed_version'), '2.0', '<')) {
+	// Fix aggregated IDs
+	$results = $wpdb->get_results("
+		SELECT post_id, meta_value
+		  FROM $wpdb->postmeta
+		 WHERE meta_key = '_social_aggregated_ids'
+	");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$result->meta_value = maybe_unserialize($result->meta_value);
+			if (is_array($result->meta_value)) {
+				$meta_value = array();
+				foreach ($result->meta_value as $id) {
+					if (is_string($id)) {
+						if (strpos($id, '_') !== false) {
+							if (!isset($meta_value['facebook'])) {
+								$meta_value['facebook'] = array();
+							}
+
+							$meta_value['facebook'][] = $id;
+						}
+						else {
+							if (!isset($meta_value['twitter'])) {
+								$meta_value['twitter'] = array();
+							}
+
+							$meta_value['twitter'][] = $id;
+						}
+					}
+				}
+
+				if (!empty($meta_value)) {
+					update_post_meta($result->post_id, '_social_aggregated_ids', $meta_value);
+				}
+				else {
+					delete_post_meta($result->post_id, '_social_aggregated_ids');
+			    }
+			}
+		}
+	}
+
+	// Global accounts
+	$set_meta = false;
+	$accounts = get_option('social_accounts', array());
+	if (count($accounts)) {
+		if (isset($accounts['facebook'])) {
+			$set_meta = true;
+			$accounts['facebook'] = array();
+		}
+
+		if (isset($accounts['twitter'])) {
+			foreach ($accounts['twitter'] as $account_id => $account) {
+				if (!isset($account->universal)) {
+					$accounts['twitter'][$account_id]->universal = true;
+				}
+			}
+		}
+
+		update_option('social_accounts', $accounts);
+	}
+
+	$results = $wpdb->get_results("
+		SELECT user_id, meta_value
+		  FROM $wpdb->usermeta
+		 WHERE meta_key = 'social_accounts'
+	");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$accounts = maybe_unserialize($result->meta_value);
+			if (is_array($accounts)) {
+				if (isset($accounts['facebook'])) {
+					$set_meta = true;
+					$accounts['facebook'] = array();
+				}
+
+				if (isset($accounts['twitter'])) {
+					foreach ($accounts['twitter'] as $account_id => $account) {
+						if (!isset($account->personal)) {
+						    $accounts['twitter'][$account_id]->personal = true;
+						}
+					}
+				}
+
+				update_user_meta($result->user_id, 'social_accounts', $accounts);
+			}
+		}
+	}
+
+	if ($set_meta) {
+		$results = $wpdb->get_results("
+			SELECT ID
+			  FROM $wpdb->users
+		");
+		if (is_array($results)) {
+			foreach ($results as $result) {
+				update_user_meta($result->ID, 'social_2.0_upgrade', true);
+			}
+		}
+	}
+
+	// Upgrade system_cron to fetch_comments
+	$fetch = $wpdb->get_var("
+		SELECT option_value
+		  FROM $wpdb->options
+		 WHERE option_name = 'social_system_crons'
+	");
+
+	if (empty($fetch)) {
+		$fetch = '1';
+	}
+
+	$wpdb->query("
+		INSERT
+		  INTO $wpdb->options (option_name, option_value)
+		VALUES('social_fetch_comments', '$fetch')
+		    ON DUPLICATE KEY UPDATE option_id = option_id
+    ");
+
+	// Update all comment types
+	$keys = array();
+	foreach (Social::instance()->services() as $service) {
+		$keys[] = $service->key();
+		if ($service->key() == 'facebook') {
+			$keys[] = 'facebook-like';
+		}
+	}
+
+	foreach ($keys as $key) {
+		$query = $wpdb->query("
+			UPDATE $wpdb->comments
+			   SET comment_type = 'social-$key'
+			 WHERE comment_type = '$key'
+		");
+	}
+
+	// Make sure all commenter accounts have the commenter flag
+	$results = $wpdb->get_results("
+		SELECT m.user_id
+		  FROM $wpdb->users AS u
+		  JOIN $wpdb->usermeta AS m
+		    ON m.user_id = u.ID
+		 WHERE m.meta_key = 'social_accounts'
+		   AND u.user_email LIKE '%@example.com'
+    ");
+	if (count($results)) {
+		foreach ($results as $result) {
+			update_user_meta($result->user_id, 'social_commenter', 'true');
+		}
+	}
+
+	// Rename the XMLRPC option
+	$wpdb->query("
+		UPDATE $wpdb->options
+		   SET option_name = 'social_default_accounts'
+		 WHERE option_name = 'social_xmlrpc_accounts'
+    ");
+
+	// Fix the broadcasted IDs format
+	$results = $wpdb->get_results("
+		SELECT pm.meta_value, pm.post_id, p.post_content
+		  FROM $wpdb->postmeta AS pm
+		  JOIN $wpdb->posts AS p
+		    ON pm.post_id = p.ID
+		 WHERE meta_key = '_social_broadcasted_ids'
+    ");
+	if (is_array($results)) {
+		foreach ($results as $result) {
+			$meta_value = maybe_unserialize($result->meta_value);
+			if (is_array($meta_value)) {
+				Social::log('Old meta value for post #:post_id: :meta_value', array(
+					'post_id' => $result->post_id,
+					'meta_value' => print_r($meta_value, true)
+				));
+				$_meta_value = array();
+				foreach ($meta_value as $service_key => $accounts) {
+					if (!isset($_meta_value[$service_key])) {
+						$_meta_value[$service_key] = array();
+					}
+
+					foreach ($accounts as $account_id => $broadcasted) {
+						Social::log('Checking account #:account_id (:service).', array(
+							'account_id' => $account_id,
+							'service' => $service_key
+						));
+						if (!isset($_meta_value[$service_key][$account_id])) {
+							$_meta_value[$service_key][$account_id] = array();
+						}
+
+						if (is_array($broadcasted)) {
+							foreach ($broadcasted as $id => $data) {
+								Social::log('Current Meta Value: :meta_value', array(
+									'meta_value' => print_r($_meta_value, true)
+								));
+
+								if (is_scalar($data)) {
+									$_meta_value[$service_key][$account_id][$data] = array(
+										'message' => ''
+									);
+								}
+								else {
+									$_meta_value[$service_key][$account_id][$id] = $data;
+								}
+							}
+						}
+						else {
+							$_meta_value[$service_key][$account_id][$broadcasted] = array(
+								'message' => ''
+							);
+						}
+					}
+				}
+
+				if (!empty($_meta_value)) {
+					update_post_meta($result->post_id, '_social_broadcasted_ids', $_meta_value);
+				}
+
+				Social::log('New meta value for post #:post_id: :meta_value', array(
+					'post_id' => $result->post_id,
+					'meta_value' => print_r($_meta_value, true)
+				));
+			}
+		}
+	}
+
+	// Add broadcast by default
+	Social::option('broadcast_by_default', '0');
+
+	// Reschedule posts for aggregation
+	$results = $wpdb->get_results("
+		SELECT post_id
+		FROM $wpdb->postmeta
+		WHERE meta_key = '_social_broadcasted_ids'
+		ORDER BY post_id DESC
+		LIMIT 50
+	");
+	if ($results !== null) {
+		$queue = Social_Aggregation_Queue::factory();
+		foreach ($results as $result) {
+			if (!$queue->find($result->post_id)) {
+				$queue->add($result->post_id);
+			}
+		}
+		$queue->save();
+	}
+
+	// Fix comment author urls for Facebook comments...
+	$results = $wpdb->get_results("
+		SELECT comment_ID, comment_author_url
+		FROM $wpdb->comments
+		WHERE comment_type = 'social-facebook'
+		AND comment_author_url LIKE 'http://graph.facebook.com/%'
+	");
+	foreach ($results as $result) {
+		$url = explode('http://graph.facebook.com/', $result->comment_author_url);
+		$id = explode('/', $url[1]);
+
+		$wpdb->query($wpdb->prepare("
+			UPDATE $wpdb->comments
+			SET comment_author_url = %s
+			WHERE comment_ID = %s
+		", 'http://facebook.com/profile.php?id='.$id[1], $result->comment_ID));
+	}
+
+	// Remove old CRONs
+	if (($timestamp = wp_next_scheduled('social_cron_60_init')) !== false) {
+		wp_unschedule_event($timestamp, 'social_cron_60_init');
+	}
+	if (($timestamp = wp_next_scheduled('social_cron_60_core')) !== false) {
+		wp_unschedule_event($timestamp, 'social_cron_60_core');
+	}
+}
+
+// Flush the cache
+wp_cache_flush();
+
+// Decrement the semaphore and unlock
+$semaphore->unlock();
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/comment/comment.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,78 @@
+<?php
+// backward compat check
+if (strpos($comment_type, 'social-') === false) {
+	$comment_type = 'social-'.$comment_type;
+}
+
+// set up the comment meta class (used for icon indicator)
+switch ($comment_type) {
+	case 'social-twitter':
+	case 'social-facebook':
+	case 'social-pingback':
+	case 'social-wordpress':
+		$parts = explode('-', $comment_type);
+		$comment_meta_class = $parts[0].'-comment-meta-'.$parts[1];
+	break;
+	default:
+		$comment_meta_class = 'social-comment-meta-wordpress';
+}
+
+?>
+<li <?php comment_class('social-comment social-clearfix '.esc_attr($comment_type)); ?> id="li-comment-<?php comment_ID(); ?>">
+<div class="social-comment-inner social-clearfix" id="comment-<?php comment_ID(); ?>">
+	<div class="social-comment-header">
+		<div class="social-comment-author vcard">
+			<?php
+				switch ($comment_type) {
+					case 'pingback':
+						echo '<span class="social-comment-label">'.__('Pingback', 'social').'</span>';
+					break;
+					default:
+						echo get_avatar($comment, 40);
+					break;
+				}
+
+				if (!$service instanceof Social_Service or $service->show_full_comment($comment->comment_type)) {
+					printf('<cite class="social-fn fn">%s</cite>', get_comment_author_link());
+				}
+
+				if ($depth > 1) {
+					echo '<span class="social-replied social-imr">'.__('replied:', 'social').'</span>';
+				}
+			?>
+		</div>
+		<!-- .comment-author .vcard -->
+		<div class="social-comment-meta <?php echo esc_attr($comment_meta_class); ?>">
+			<span class="social-posted-from">
+				<?php if ($status_url !== null): ?>
+				<a href="<?php echo esc_url($status_url); ?>" title="<?php _e(sprintf('View on %s', $service->title()), 'social'); ?>" target="_blank">
+				<?php endif; ?>
+				<span><?php _e('View', 'social'); ?></span>
+				<?php if ($status_url !== null): ?>
+				</a>
+				<?php endif; ?>
+			</span>
+			<a href="<?php echo esc_url(get_comment_link(get_comment_ID())); ?>" class="social-posted-when" target="_blank"><?php echo esc_html(Social_Date::span_comment(strtotime($comment->comment_date_gmt))); ?></a>
+		</div>
+	</div>
+	<div class="social-comment-body">
+		<?php if ($comment->comment_approved == '0'): ?>
+		<em class="comment-awaiting-moderation"><?php _e('Your comment is awaiting moderation.', 'social'); ?></em><br />
+		<?php endif; ?>
+		<?php comment_text(); ?>
+	</div>
+	<?php if (!$service instanceof Social_Service or $service->show_full_comment($comment->comment_type)): ?>
+	<?php
+		if (!empty($social_items)) {
+	        echo '<div class="social-items-comment">'.$social_items.'</div>';
+	    }
+	?>
+	<div class="social-actions entry-meta">
+		<?php
+            comment_reply_link(array_merge($args, array('depth' => $depth, 'max_depth' => $args['max_depth'])));
+            edit_comment_link(__('Edit', 'social'), '<span class="comment-edit-link"> &middot; ', '</span>');
+        ?>
+	</div>
+	<?php endif; ?>
+	<!-- .reply -->
+</div><!-- #comment-<?php echo comment_ID(); ?> -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/comment/logged_in_as.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,57 @@
+<div class="social-identity">
+	<?php
+		if (current_user_can('manage_options')) {
+			echo get_avatar($current_user->ID, 40);
+	?>
+	<p class="social-input-row">
+		<?php if (count($accounts)) { ?>
+		<select class="social-select" id="post_accounts" name="social_post_account">
+			<option value=""><?php _e('WordPress Account', 'social'); ?></option>
+			<?php
+				foreach ($accounts as $key => $_accounts) {
+					$service = $services[$key];
+					if (count($_accounts)) {
+						echo '<optgroup label="'.esc_attr(__(ucfirst($key), 'social')).'">';
+						foreach ($_accounts as $account) {
+							echo '<option value="'.esc_attr($account->id()).'" rel="'.esc_attr($account->avatar()).'" data-type="'.$key.'">'.esc_html($account->name()).'</option>';
+						}
+						echo '</optgroup>';
+					}
+				}
+			?>
+		</select>
+		<?php
+			}
+			else {
+				echo '<input type="hidden" name="social_post_account" value="" />';
+				printf(__('Logged in as <a href="%1$s">%2$s</a>.', 'social'), esc_url(admin_url('profile.php')), esc_html($current_user->display_name));
+			}
+		?>
+		<small class="social-psst">(<?php echo wp_loginout(null, false); ?>)</small>
+	</p>
+	<?php
+		}
+		else {
+			echo get_avatar($current_user->ID, 40);
+			
+			foreach ($services as $key => $service) {
+				if (count($service->accounts())) {
+					foreach ($service->accounts() as $account) {
+						if ($account->personal()) {
+	?>
+	<p class="social-input-row">
+		<span class="social-<?php echo esc_attr($key); ?>-icon">
+			<?php echo esc_html($account->name()); ?>
+			<small class="social-psst"><?php echo $service->disconnect_link($account); ?></small>
+		</span>
+	</p>
+	<input type="hidden" name="social_post_account" value="<?php echo esc_attr($account->id()); ?>" />
+	<?php
+							break;
+						}
+					}
+				}
+			}
+		}
+	?>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/comment/social_item.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,16 @@
+<div class="social-items social-<?php echo $service->key(); ?>">
+	<div class="social-items-icon"></div>
+	<div class="social-items-comments">
+		<?php
+			$i = 0;
+			foreach ($items as $item) {
+				echo $service->social_item_output($item, $i, (isset($avatar_size) ? $avatar_size : array()));
+				++$i;
+			}
+
+			if ($i > 10) {
+				printf(__('<a href="%s" class="social-items-and-more">... and %s more</a>', 'social'), '#', ($i - 10));
+			}
+		?>
+	</div>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/comment/top.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,8 @@
+<div class="social-sign-in-links social-clearfix">
+	<?php foreach ($services as $key => $service): ?>
+	<a class="social-<?php echo esc_attr($key); ?> social-imr social-login comments" href="<?php echo esc_url($service->authorize_url()); ?>" id="<?php echo esc_attr($key); ?>_signin" target="_blank"><?php printf(__('Sign in with %s', 'social'), esc_html($service->title())); ?></a>
+	<?php endforeach; ?>
+</div>
+<div class="social-divider">
+	<span><?php _e('or', 'social'); ?></span>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/comments.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,159 @@
+<div id="social">
+<?php
+ob_start();
+?>
+	<?php if (post_password_required()): ?>
+	<p class="nopassword"><?php _e('This post is password protected. Enter the password to view any comments.', 'social'); ?></p>
+	<?php else: ?>
+	<div class="social-post">
+		<div id="loading" style="display:none">
+			<input type="hidden" id="reload_url" value="<?php echo esc_url(home_url('index.php?social_controller=auth&social_action=reload_form&redirect_to='.get_permalink(get_the_ID()).'&post_id='.get_the_ID())); ?>" />
+			<?php _e('Logging In...', 'social'); ?>
+		</div>
+		<?php
+			if (comments_open()) {
+				if (get_option('comment_registration') and !is_user_logged_in()) {
+		?>
+		<p class="must-log-in"><?php printf(__('You must be <a href="%s">logged in</a> to post a comment.', 'social'), wp_login_url(apply_filters('the_permalink', get_permalink(get_the_ID())))); ?></p>
+		<?php
+					do_action('comment_form_must_log_in_after');
+				}
+
+				echo Social_Comment_Form::instance(get_the_ID());
+			}
+			else {
+				do_action('comment_form_comments_closed');
+		?>
+		<p class="nocomments"><?php _e('Comments are closed.', 'social'); ?></p>
+		<?php
+			}
+		?>
+	</div>
+<?php
+$form = ob_get_clean();
+
+ob_start();
+?>
+	<div id="social-tabs-comments">
+		<?php 
+		if (have_comments()): 
+			$groups = array();
+			$social_items = array();
+			if (get_comments_number()) {
+				$comments = apply_filters('social_comments_array', $comments, $post->ID);
+
+				if (isset($comments['social_items'])) {
+					$social_items = $comments['social_items'];
+					unset($comments['social_items']);
+				}
+
+				if (isset($comments['social_groups'])) {
+					$groups = $comments['social_groups'];
+					unset($comments['social_groups']);
+				}
+			}
+
+			$last_reply_time = 0;
+			if (count($comments)) {
+				foreach ($comments as $key => $comment) {
+					$time = strtotime($comment->comment_date_gmt);
+					if ($time > $last_reply_time) {
+						$last_reply_time = $time;
+					}
+				}
+			}
+
+			if (count($social_items)) {
+				$latest_item = 0;
+				foreach ($social_items as $service => $items) {
+					foreach ($items as $comment) {
+						if ($latest_item === 0) {
+							$latest_item = strtotime($comment->comment_date_gmt);
+						}
+						else {
+							$time = strtotime($comment->comment_date_gmt);
+							if ($time > $latest_item) {
+								$latest_item = $time;
+							}
+						}
+					}
+				}
+
+				if ($latest_item > $last_reply_time) {
+					$last_reply_time = $latest_item;
+				}
+			}
+
+			Social::add_social_items_count($social_items, $groups);
+		?>
+		<ul class="social-nav social-clearfix">
+			<li class="social-all social-tab-main<?php echo (!isset($_GET['social_tab']) ? ' social-current-tab' : ''); ?>"><a href="#" rel="social-all"><span><?php comments_number(__('0 Replies', 'social'), __('1 Reply', 'social'), __('% Replies', 'social')); ?></span></a></li>
+			<li class="social-wordpress<?php echo ((isset($_GET['social_tab']) and $_GET['social_tab'] == 'wordpress') ? ' social-current-tab' : ''); ?>"><a href="#" rel="wordpress"><span><?php printf(_n('1 Comment', '%1$s Comments', (isset($groups['wordpress']) ? $groups['wordpress'] : 0), 'social'), (isset($groups['wordpress']) ? $groups['wordpress'] : 0)); ?></span></a></li>
+			<li class="social-twitter<?php echo ((isset($_GET['social_tab']) and $_GET['social_tab'] == 'social-twitter') ? ' social-current-tab' : ''); ?>"><a href="#" rel="social-twitter"><span><?php printf(_n('1 Tweet', '%1$s Tweets', (isset($groups['social-twitter']) ? $groups['social-twitter'] : 0), 'social'), (isset($groups['social-twitter']) ? $groups['social-twitter'] : 0)); ?></span></a></li>
+			<li class="social-facebook<?php echo ((isset($_GET['social_tab']) and $_GET['social_tab'] == 'social-facebook') ? ' social-current-tab' : ''); ?>"><a href="#" rel="social-facebook"><span><?php printf(_n('1 Facebook', '%1$s Facebook', (isset($groups['social-facebook']) ? $groups['social-facebook'] : 0), 'social'), (isset($groups['social-facebook']) ? $groups['social-facebook'] : 0)); ?></span></a></li>
+			<li class="social-pingback<?php echo ((isset($_GET['social_tab']) and $_GET['social_tab'] == 'social-pingback') ? ' social-current-tab' : ''); ?>"><a href="#" rel="social-pingback"><span><?php printf(_n('1 Pingback', '%1$s Pingbacks', (isset($groups['pingback']) ? $groups['pingback'] : 0), 'social'), (isset($groups['pingback']) ? $groups['pingback'] : 0)); ?></span></a></li>
+		</ul>
+
+		<!-- panel items -->
+		<div id="social-comments-tab-all" class="social-tabs-panel social-tabs-first-panel">
+			<div id="comments" class="social-comments">
+				<?php
+				if ($last_reply_time) {
+					echo '<div class="social-last-reply-when">'.sprintf(__('Last reply was %s', 'social'), Social_Date::span_comment($last_reply_time)).'</div>';
+				}
+				if (count($social_items)) {
+					echo '<div id="social-items-wrapper">';
+					foreach ($social_items as $group => $items) {
+						$service = Social::instance()->service($group);
+						if ($service !== false and count($items)) {
+							$avatar_size = apply_filters('social_items_avatar_size', array(
+								'width' => 24,
+								'height' => 24,
+							));
+							echo Social_View::factory('comment/social_item', compact('items', 'service', 'avatar_size'));
+						}
+					}
+					echo '</div>';
+				}
+
+				if ($last_reply_time or count($social_items)) {
+					echo '<div class="cf-clearfix"></div>';
+				}
+				if (count($comments)) {
+				?>
+				<ol class="social-commentlist">
+				<?php
+						wp_list_comments(array(
+							'callback' => array(Social::instance(), 'comment'),
+							'walker' => new Social_Walker_Comment,
+						), $comments);
+				?>
+				</ol>
+				<?php
+				}
+				if (get_comment_pages_count() > 1 and get_option('page_comments')): 
+				?>
+				<nav id="comment-nav-below">
+					<h1 class="assistive-text"><?php _e('Comment navigation', 'social'); ?></h1>
+					<div class="nav-previous"><?php previous_comments_link(__('&larr; Older Comments', 'social')); ?></div>
+					<div class="nav-next"><?php next_comments_link(__('Newer Comments &rarr;', 'social')); ?></div>
+				</nav>
+				<?php endif; ?>
+			</div>
+		</div>
+		<?php endif; ?>
+	</div>
+	<!-- #Comments Tabs -->
+	<?php endif; ?>
+<?php
+$comments = ob_get_clean();
+
+$order = apply_filters('social_comment_block_order', array('form', 'comments'));
+
+foreach ($order as $block) {
+	if (isset($$block)) {
+		echo $$block;
+	}
+}
+?>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/options.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,227 @@
+<form id="setup" method="post" action="<?php echo esc_url(admin_url('options-general.php?social_controller=settings&social_action=index')); ?>">
+<?php wp_nonce_field(); ?>
+<input type="hidden" name="social_action" value="settings" />
+<?php if (isset($_GET['saved'])): ?>
+<div id="message" class="updated">
+	<p><strong><?php _e('Social settings have been updated.', 'social'); ?></strong></p>
+</div>
+<?php endif; ?>
+<div class="wrap" id="social_options_page">
+	<div class="social-view-header cf-clearfix">
+		<h2><?php _e('Social', 'social'); ?></h2>
+		<div class="social-view-subtitle"><?php printf(__('Compliments of <a class="social-mailchimp-link" href="%s">MailChimp</a>', 'social'), 'http://mailchimp.com/'); ?></div>
+	</div>
+	<div class="social-view">
+		<table class="form-table">
+			<tr id="social-accounts">
+				<th>
+					<?php _e('Accounts', 'social'); ?>
+					<p class="description" style="padding-top: 40px;"><?php printf(__('Available to all blog authors. Add accounts that only you can use in <a href="%s">your profile</a>.', 'social'), esc_url(admin_url('profile.php#social-accounts'))); ?></p>
+				</th>
+				<td>
+<?php
+echo Social_View::factory(
+	'wp-admin/parts/accounts',
+	compact('services', 'accounts', 'defaults')
+);
+?>
+				</td>
+			</tr>
+			<tr>
+				<th><?php _e('Broadcasting is on by default', 'social'); ?></th>
+				<td>
+					<input type="radio" name="social_broadcast_by_default" id="social-broadcast-by-default-yes" value="1"<?php checked('1', Social::option('broadcast_by_default'), true); ?>
+					<label for="social-broadcast-by-default-yes"><?php _e('Yes', 'social'); ?></label>
+
+					<input type="radio" name="social_broadcast_by_default" id="social-broadcast-by-default-no" value="0"<?php checked('0', Social::option('broadcast_by_default'), true); ?>
+					<label for="social-broadcast-by-default-no"><?php _e('No', 'social'); ?></label>
+				</td>
+			</tr>
+			<tr>
+				<th>
+					<label for="social_broadcast_format"><?php _e('Post broadcast format', 'social'); ?></label>
+				</th>
+				<td>
+					<input type="text" class="regular-text" name="social_broadcast_format" id="social_broadcast_format" value="<?php echo esc_attr(Social::option('broadcast_format')); ?>" />
+					<p class="description"><?php _e('How you would like posts to be formatted when broadcasting to Twitter or Facebook?', 'social'); ?></p>
+
+					<div class="description">
+						<?php _e('Tokens:', 'social'); ?>
+						<ul>
+<?php 
+foreach (Social::broadcast_tokens() as $token => $description) {
+	if (!empty($description)) {
+		$description = ' - '.$description;
+	}
+?>
+							<li><b><?php echo esc_html($token); ?></b><?php echo esc_html($description); ?></li>
+<?php
+}
+?>
+						</ul>
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<th>
+					<label for="social_comment_broadcast_format"><?php _e('Comment broadcast format', 'social'); ?></label>
+				</th>
+				<td>
+					<input type="text" class="regular-text" name="social_comment_broadcast_format" id="social_comment_broadcast_format" value="<?php echo esc_attr(Social::option('comment_broadcast_format')); ?>" />
+					<p class="description"><?php _e('How you would like comments to be formatted when broadcasting to Twitter or Facebook.', 'social'); ?></p>
+
+					<div class="description">
+						<?php _e('Tokens:', 'social'); ?>
+						<ul>
+<?php 
+foreach (Social::comment_broadcast_tokens() as $token => $description) {
+	if (!empty($description)) {
+		$description = ' - '.$description;
+	}
+?>
+							<li><b><?php echo esc_html($token); ?></b><?php echo esc_html($description); ?></li>
+<?php
+}
+?>
+						</ul>
+					</div>
+				</td>
+			</tr>
+			<tr>
+				<th><?php _e('Twitter @anywhere', 'social'); ?></th>
+				<td>
+					<p>Social Version 2.6 has removed @anywhere support to comply with <a href="https://dev.twitter.com/blog/sunsetting-anywhere">Twitter's decision to sunset the service</a>.</p>
+					<p>If you would like to continue to use @anywhere, <a href="https://www.google.com/search?q=WordPress+@anywhere+plugin" target="_blank">there are many plugins available to accomodate</a>.</p>
+				</td>
+			</tr>
+		</table>
+<?php
+$fetch = Social::option('fetch_comments');
+$toggle = (
+	(!empty($fetch) and $fetch != '1') or
+	Social::option('debug') == '1' or
+	Social::option('use_standard_comments') == 1 or
+	Social::option('disable_broadcasting') == 1
+) ? ' social-open' : '';
+?>
+		<div class="social-collapsible<?php echo $toggle; ?>">
+			<h3 class="social-title"><a href="#social-advanced"><?php _e('Advanced Options', 'social'); ?></a></h3>
+			<div class="social-content">
+				<table id="social-advanced" class="form-table">
+					<tr>
+						<th>
+							<?php _e('Misc.', 'social'); ?>
+						</th>
+						<td>
+							<ul>
+								<li>
+									<label for="social_use_standard_comments">
+										<input type="checkbox" name="social_use_standard_comments" id="social_use_standard_comments" value="1" <?php checked(Social::option('use_standard_comments'), '1'); ?> />
+										<?php _e("Disable Social's comment display (use standard theme output instead).", 'social'); ?>
+									</label>
+								</li>
+								<li>
+									<label for="social_disable_broadcasting">
+										<input type="checkbox" name="social_disable_broadcasting" id="social_disable_broadcasting" value="1" <?php checked(Social::option('disable_broadcasting'), '1'); ?> />
+										<?php _e("Disable Social's broadcasting feature.", 'social'); ?>
+									</label>
+								</li>
+								<li>&nbsp;</li>
+								<li>
+									<?php
+										$twitter_accounts = Social::instance()->service('twitter')->accounts();
+										$social_api_accounts = Social::option('social_api_accounts');
+										$selected_id = $social_api_accounts['twitter'];
+									?>
+									<div class="twitter-api-account">
+										<label>Twitter Default API Account</label>
+										<select id="social_api_accounts-twitter" name="social_api_accounts[twitter]">
+											<?php foreach ($twitter_accounts as $account): $acct_id = $account->id() ?>
+												<?php if ($account->personal()) { continue; } ?>
+												<option value="<?php echo $acct_id ?>" <?php selected($acct_id, $selected_id) ?>><?php echo esc_html($account->name()) ?></option>
+											<?php endforeach; ?>
+										</select>
+									</div>
+									<p class="description" style="max-width: 450px;"><?php _e('Account for general (non account specific) Twitter API interaction.', 'social'); ?></p>
+								</li>
+							</ul>
+						</td>
+					</tr>
+					<tr>
+						<th><?php _e('Fetch new comments', 'social'); ?></th>
+						<td>
+							<ul>
+								<li>
+									<label for="fetch_comments_auto">
+										<input type="radio" name="social_fetch_comments" value="1" id="fetch_comments_auto" style="position:relative;top:-1px"<?php echo Social::option('fetch_comments') == '1' ? ' checked="checked"' : ''; ?> />
+										<?php _e('Automatically', 'social'); ?>
+										<span class="description"><?php _e('(easiest)', 'social'); ?></span>
+									</label>
+								</li>
+								<li>
+									<label for="fetch_comments_never">
+										<input type="radio" name="social_fetch_comments" value="0" id="fetch_comments_never" style="position:relative;top:-1px"<?php echo !in_array(Social::option('fetch_comments'), array('1', '2')) ? ' checked="checked"' : ''; ?> />
+										<?php _e('Never', 'social'); ?>
+										<span class="description"><?php _e('(disables fetching of comments)', 'social'); ?></span>
+									</label>
+								</li>
+								<li>
+									<label for="fetch_comments_cron">
+										<input type="radio" name="social_fetch_comments" value="2" id="fetch_comments_cron" style="position:relative;top:-1px"<?php echo Social::option('fetch_comments') == '2' ? ' checked="checked"' : ''; ?> />
+										<?php _e('Using a custom CRON job <span class="description">(advanced)</span>', 'social'); ?>
+									</label>
+									<p class="description"><?php _e('If you select this option, new tweets and Facebook posts will not be fetched unless you set up a system CRON job or fetch new items manually from the post edit screen. More help is also available in&nbsp;<code>README.txt</code>.', 'social'); ?></p>
+									<?php if (Social::option('fetch_comments') == '2'): ?>
+									<div class="social-callout">
+										<h3 class="social-title"><?php _e('CRON Setup', 'social'); ?></h3>
+										<dl class="social-kv">
+											<dt><?php _e('CRON API Key', 'social'); ?> <small>(<a href="<?php echo esc_url(wp_nonce_url(admin_url('options-general.php?page=social.php&social_controller=settings&social_action=regenerate_api_key'), 'regenerate_api_key')); ?>" rel="social_api_key" id="social_regenerate_api_key"><?php _e('regenerate', 'social'); ?></a>)</small></dt>
+											<dd>
+												<code class="social_api_key"><?php echo esc_html(Social::option('system_cron_api_key')); ?></code>
+											</dd>
+										</dl>
+										<p><?php _e('For your system CRON to run correctly, make sure it is pointing towards a URL that looks something like the following:', 'social'); ?></p>
+										<code><?php echo esc_url(home_url('index.php?social_controller=cron&social_action=cron_15&api_key='.Social::option('system_cron_api_key'))); ?></code>
+										<?php endif; ?>
+									</div>
+								</li>
+							</ul>
+						</td>
+					</tr>
+					<tr>
+						<th>
+							<?php _e('Debug Mode', 'social'); ?>
+							<span class="description"><?php _e('(nerds only)', 'social'); ?></span>
+						</th>
+						<td>
+							<p style="margin-top:0"><?php _e('If you turn debug on, Social will save additional information in <code>debug_log.txt</code> file. Not recommended for production environments.', 'social'); ?></p>
+							<ul>
+								<li>
+									<label for="debug_mode_no">
+										<input type="radio" name="social_debug" id="debug_mode_no" value="0"<?php echo Social::option('debug') != '1' ? ' checked="checked"' : ''; ?> />
+										<?php _e('Off <span class="description">(recommended)</span>', 'social'); ?>
+									</label>
+								</li>
+								<li>
+									<label for="debug_mode_yes">
+										<input type="radio" name="social_debug" id="debug_mode_yes" value="1"<?php echo Social::option('debug') == '1' ? ' checked="checked"' : ''; ?> />
+										<?php _e('On <span class="description">(for troubleshooting)</span>', 'social'); ?>
+									</label>
+								</li>
+							</ul>
+
+							<strong><?php _e('Debug log location:', 'social'); ?></strong> <code><?php echo Social::$plugins_path.'debug_log.txt'; ?></code>
+						</td>
+					</tr>
+				</table>
+			</div>
+<?php
+do_action('social_advanced_options');
+?>
+		</div>
+		<p class="submit" style="clear:both">
+			<input type="submit" name="submit" value="Save Settings" class="button-primary" />
+		</p>
+	</div>
+</div>
+</form>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/parts/accounts.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,97 @@
+<?php
+
+// expects the following variables to be passed in:
+// $services (full list of services)
+// $accounts (list of accounts to show for this screen)
+// $defaults (accounts that are checked for default broadcast)
+
+foreach ($services as $key => $service) {
+?>
+<div class="social-accounts">
+<?php
+	$button = '<div class="social-connect-button cf-clearfix"><a href="'.esc_url($service->authorize_url()).'" id="'.esc_attr($key).'_signin" class="social-login" target="_blank"><span>'.sprintf(__('Sign in with %s.', 'social'), esc_html($service->title())).'</span></a></div>';
+	echo apply_filters('social_service_button', $button, $service);
+?>
+	<ul>
+<?php
+	$i = 0;
+	foreach ($service->accounts() as $account) {
+		if (in_array($account->id(), $accounts[$key])) {
+			$profile_url = esc_url($account->url());
+			$profile_name = esc_html($account->name());
+			$disconnect = $service->disconnect_link($account, true);
+			$name = sprintf('<a href="%s">%s</a>', $profile_url, $profile_name);
+?>
+		<li class="social-accounts-item">
+			<img src="<?php echo esc_url($account->avatar()); ?>" width="32" height="32" />
+			<span class="name"><?php echo $name; ?></span>
+			<label class="default" for="<?php echo esc_attr($key.$account->id()); ?>">
+				<input type="checkbox" name="social_default_accounts[]" id="<?php echo esc_attr($key.$account->id()); ?>" value="<?php echo esc_attr($key.'|'.$account->id()); ?>"<?php echo ((isset($defaults[$key]) and in_array($account->id(), array_values($defaults[$key]))) ? ' checked="checked"' : ''); ?> />
+				<?php _e('Default', 'social'); ?>
+			</label>
+			<span class="disconnect"><?php echo $disconnect; ?></span>
+<?php
+			// this makes a live API call to get updated accounts
+			$child_accounts = $account->fetch_child_accounts();
+			if (count($child_accounts)) {
+?>
+			<ul>
+<?php
+				foreach ($child_accounts as $child_account) {
+					if (isset($defaults[$service->key()]) and
+						isset($defaults[$service->key()][$account->child_account_key()]) and
+						isset($defaults[$service->key()][$account->child_account_key()][$account->id()]) and
+						in_array($child_account->id, $defaults[$service->key()][$account->child_account_key()][$account->id()])
+					) {
+						$default_checked = ' checked="checked"';
+					}
+					else {
+						$default_checked = '';
+					}
+					$is_profile = defined('IS_PROFILE_PAGE');
+					if ($account->page($child_account->id, $is_profile) !== false) {
+						$enabled_checked = ' checked="checked"';
+					}
+					else {
+						$enabled_checked = '';
+					}
+?>
+				<li class="social-accounts-item">
+					<img src="<?php echo esc_url($account->child_account_avatar($child_account)); ?>" width="32" height="32" />
+					<span class="name"><?php echo esc_html($child_account->name); ?></span>
+					<label class="default" for="<?php echo esc_attr($key.$child_account->id); ?>">
+						<input type="checkbox" name="social_default_pages[<?php echo esc_attr($account->id()); ?>][]" id="<?php echo esc_attr($key.$child_account->id); ?>" value="<?php echo esc_attr($child_account->id); ?>"<?php echo $default_checked; ?> />
+						<?php _e('Default', 'social'); ?>
+					</label>
+					<label class="enabled" for="social_enabled_child_accounts-<?php echo esc_attr($key.$child_account->id); ?>">
+						<input type="checkbox" name="social_enabled_child_accounts[<?php echo esc_attr($service->key()); ?>][]" id="social_enabled_child_accounts-<?php echo esc_attr($key.$child_account->id); ?>" value="<?php echo esc_attr($child_account->id); ?>"<?php echo $enabled_checked; ?> />
+						<?php _e('Enabled', 'social'); ?>
+					</label>
+				</li>
+<?php
+				}
+?>
+			</ul>
+<?php
+			}
+			$i++;
+?>
+		</li><!-- /li.social-accounts-item -->
+<?php
+		}
+	}
+	if ($i == 0) {
+?>
+		<li class="social-accounts-item none">
+			<img src="http://www.gravatar.com/avatar/a06082e4f876182b547f635d945e744e?s=32&d=mm" width="32" height="32" />
+			<span class="name"><?php _e('No Accounts', 'social'); ?></span>
+		</li>
+<?php
+	}
+?>
+	</ul>
+</div>
+<?php
+}
+?>
+<p class="description" style="max-width: 450px;"><?php _e('Default accounts will auto-broadcast when you publish via XML-RPC or email.', 'social'); ?></p>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/broadcast/error/email.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,64 @@
+<?php
+$types = array();
+$deauthed = false;
+echo __('Hello', 'social').','."\n\n";
+echo wordwrap(sprintf(__('Social failed to broadcast the blog post "%s" to one or more of your Social accounts.', 'social'), $post->post_title), 60)."\n\n";
+foreach ($accounts as $key => $items) {
+	foreach ($items as $item) {
+		if (isset($item->deauthed)) {
+			$deauthed[$key.'-'.$item->account->id()] = $item;
+		}
+		else {
+			if (!isset($types[$item->type])) {
+				$types[$item->type] = 0;
+			}
+			++$types[$item->type];
+		}
+		echo $social->service($key)->title().': '.$item->account->name().' ('.$item->reason.')'."\n";
+	}
+	echo "\n";
+}
+
+$total_deauthed = count($deauthed);
+if ($total_deauthed or count($types)) {
+	echo __('Possible fixes:', 'social')."\n\n";
+}
+
+if ($total_deauthed) {
+	if ($total_deauthed == 1) {
+		$key = array_keys($deauthed);
+		$key = explode('-', $key[0]);
+		$service = $social->service($key[0])->title();
+
+		$message = __('To reauthorize the deauthorized %s account above, please login and edit your accounts.', 'social');
+	}
+	else {
+		$message = __('To reauthorize the deauthorized accounts above, please login and edit your accounts.', 'social');
+	}
+
+	$message .= "\n    ".__('Personal accounts:', 'social').' '.admin_url('profile.php#social-accounts');
+	if (current_user_can('manage_options')) {
+		$message .= "\n    ".__('Global accounts:', 'social').' '.Social::settings_url();
+	}
+
+	echo '- '.$message."\n";
+}
+
+if (count($types)) {
+	foreach ($types as $type => $total) {
+		switch ($type) {
+			case 'limit_reached':
+				$message = __('It is possible you have reached your broadcast limit, please try to broadcast again in an hour.', 'social');
+			break;
+			case 'duplicate_status':
+				$message = __('It is possible you have broadcasted a duplicate message, please tweak your content a little and try again.', 'social');
+			break;
+			default:
+				$message = __('Social was not successful in broadcasting this post (perhaps the service is down?), please try broadcasting again. If you receive this message repeatedly, you can try the support forums.', 'social')
+				         . '    '.__('Support forums:', 'social').' http://wordpress.org/tags/social?forum_id=10';
+			break;
+		}
+
+		echo '- '.$message;
+	}
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/broadcast/error/notice.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,71 @@
+<?php
+$types = array();
+$deauthed = array();
+echo '<p>'.sprintf(__('Social failed to broadcast the blog post "%s" to one or more of your Social accounts.', 'social'), esc_html($post->post_title)).'</p>';
+foreach ($accounts as $key => $items) {
+	echo '<ul class="social-posting-errors">';
+	foreach ($items as $item) {
+		if (isset($item->deauthed)) {
+			$deauthed[$key.'-'.$item->account->id()] = $item;
+		}
+		else {
+			if (!isset($types[$item->type])) {
+				$types[$item->type] = 0;
+			}
+			++$types[$item->type];
+		}
+
+		echo '<li>'.esc_html($social->service($key)->title()).': '.esc_html($item->account->name()).' ('.esc_html($item->reason).')</li>';
+	}
+	echo '</ul>';
+}
+
+$total_deauthed = count($deauthed);
+if ($total_deauthed or count($types)) {
+	echo '<h4>'.__('Possible fixes:', 'social').'</h4><ul class="social-posting-errors">';
+}
+
+if ($total_deauthed) {
+	echo '<li>';
+	if ($total_deauthed == 1) {
+		$key = array_keys($deauthed);
+		$key = explode('-', $key[0]);
+		$service = $social->service($key[0])->title();
+
+		if (current_user_can('manage_options')) {
+			echo sprintf(__('To reauthorize the deauthorized %s account above, please edit your <a href="%s">global accounts</a> or your <a href="%s">personal accounts</a>.', 'social'), esc_html($service), esc_url(Social::settings_url()), esc_url(admin_url('profile.php#social-accounts')));
+		}
+		else {
+			echo sprintf(__('To reauthorize the deauthorized %s account above, please edit your <a href="%s">personal accounts</a>.', 'social'), esc_html($service), esc_url(admin_url('profile.php#social-accounts')));
+		}
+	}
+	else {
+		if (current_user_can('manage_options')) {
+			echo sprintf(__('To reauthorize the deauthorized accounts above, please edit your <a href="%s">global accounts</a> or your <a href="%s">personal accounts</a>.', 'social'), esc_url(Social::settings_url()), esc_url(admin_url('profile.php#social-accounts')));
+		}
+		else {
+			echo sprintf(__('To reauthorize the deauthorized account above, please edit your <a href="%s">personal accounts</a>.', 'social'), esc_url(admin_url('profile.php#social-accounts')));
+		}
+	}
+	echo '</li>';
+}
+
+if (count($types)) {
+	foreach ($types as $type => $total) {
+		switch ($type) {
+			case 'limit_reached':
+				echo '<li>'.__('It is possible you have reached your broadcast limit, please try to broadcast again in an hour.', 'social').'</li>';
+			break;
+			case 'duplicate_status':
+				echo '<li>'.__('It is possible you have broadcasted a duplicate message, please tweak your content a little and try again.', 'social').'</li>';
+			break;
+			default:
+				echo '<li>'.sprintf(__('Social was not successful in broadcasting this post (perhaps the service is down?), please try broadcasting again. If you receive this message repeatedly, you can try the <a href="%s">support forums</a>.', 'social'), 'http://wordpress.org/tags/social?forum_id=10').'</li>';
+			break;
+		}
+	}
+}
+
+if ($total_deauthed or count($types)) {
+	echo '</ul>';
+}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/broadcast/facebook-link-preview.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,26 @@
+<?php
+
+// expects the following variables to be passed in:
+// $service (current service)
+// $account (account this will be broadcast to)
+// $post (the WordPress post object)
+
+setup_postdata($post);
+$url_parts = parse_url(home_url());
+
+$thumbnail = $thumbnail_class = '';
+if (function_exists('has_post_thumbnail') and has_post_thumbnail($post->ID)) {
+	$image = wp_get_attachment_image_src(get_post_thumbnail_id($post->ID), 'thumbnail');
+	$thumbnail = '<img src="'.$image[0].'" alt="'.__('Thumbnail image', 'social').'" />';
+	$thumbnail_class = 'has-img';
+}
+
+?>
+<div class="facebook-link-preview <?php echo esc_attr($thumbnail_class); ?>">
+<?php
+echo $thumbnail; 
+?>
+	<h4><a href="<?php the_permalink(); ?>"><?php the_title(); ?></a></h4>
+	<h5><?php echo esc_html($url_parts['host']); ?></h5>
+	<?php the_excerpt(); ?>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/broadcast/options.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,99 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
+<html xmlns="http://www.w3.org/1999/xhtml" <?php language_attributes(); ?>>
+<head>
+	<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
+	<title><?php _e('Social Broadcasts', 'social'); ?></title>
+<?php
+wp_admin_css('install', true);
+$social = Social::instance();
+$social->admin_enqueue_assets();
+?>
+	<link rel="stylesheet" id="social-css" href="<?php echo esc_url(SOCIAL_ADMIN_CSS); ?>" type="text/css" media="all" />
+</head>
+<body class="<?php echo esc_attr($clean); ?>">
+<h1 id="logo"><?php _e('Social Broadcasts', 'social'); ?></h1>
+<form id="setup" method="post" class="broadcast-interstitial" action="<?php echo esc_url(admin_url('post.php?social_controller=broadcast&social_action=options')); ?>">
+<?php wp_nonce_field(); ?>
+<input type="hidden" name="post_ID" value="<?php echo $post->ID; ?>" />
+<input type="hidden" name="location" value="<?php echo $location; ?>" />
+<div class="form-table social-broadcast-options">
+<?php
+foreach ($_services as $key => $accounts) {
+	$service = $services[$key];
+	if (count($accounts)) {
+?>
+<section>
+	<header>
+		<h2><?php _e($service->title(), 'social'); ?></h2>
+	</header>
+	<ul class="accounts">
+<?php
+		$i = 0;
+		foreach ($accounts as $account) {
+			$classes = array($service->key());
+			if ($i == 0) {
+				$classes[] = 'proto';
+			}
+			if (!empty($account['error'])) {
+				$classes[] = 'error';
+			}
+?>
+		<li class="account <?php echo implode(' ', $classes); ?>">
+			<label for="<?php echo esc_attr($account['field_name_checked'].$account['field_value_checked']); ?>">
+				<img src="<?php echo esc_attr($account['avatar']); ?>" width="32" height="32" />
+				<span class="name"><?php echo esc_html($account['name']); ?></span>
+			</label>
+			<div class="broadcast-content">
+<?php
+			if (count($account['broadcasts'])) {
+?>
+				<h3><?php _e('Previous Broadcasts', 'social'); ?></h3>
+				<ul class="broadcasts">
+<?php
+				foreach ($account['broadcasts'] as $broadcast) {
+					// already escaped in controller
+?>
+					<li><?php echo $broadcast; ?></li>
+<?php
+				}
+?>
+				</ul>
+<?php
+			}
+			if (!empty($account['error'])) {
+				echo '<p class="error">'.esc_html($account['error']).'</p>';
+			}
+?>
+				<div class="broadcast-edit<?php echo ($account['edit'] ? ' edit' : ''); echo ($account['checked'] ? ' checked' : ''); ?>">
+					<input type="checkbox" name="<?php echo esc_attr($account['field_name_checked']); ?>" id="<?php echo esc_attr($account['field_name_checked'].$account['field_value_checked']); ?>" value="<?php echo esc_attr($account['field_value_checked']); ?>"<?php checked($account['checked'], true); ?> />
+					<textarea name="<?php echo esc_attr($account['field_name_content']); ?>" cols="40" rows="2" maxlength="<?php echo esc_attr($account['maxlength']); ?>"><?php echo esc_textarea($account['content']); ?></textarea>
+					<p class="readonly"><?php echo esc_textarea($account['content']); ?></p>
+					<a href="#" class="edit"><?php _e('Edit', 'social'); ?></a>
+					<span class="counter"></span>
+<?php do_action('social_broadcast_form_item_edit', $post, $service, $account); ?>
+				</div>
+<?php do_action('social_broadcast_form_item_content', $post, $service, $account); ?>
+			</div>
+<?php do_action('social_broadcast_form_item', $post, $service, $account); ?>
+		</li>
+<?php
+			$i++;
+		}
+?>
+	</ul>
+</section>
+<?php
+	}
+}
+?>
+</div>
+<p class="step">
+	<input type="hidden" name="social_action" value="<?php echo esc_attr($step); ?>" />
+	<input type="submit" name="social_submit" value="<?php echo $step_text; // already localized in controller ?>" class="button" />
+	<a href="<?php echo esc_url(get_edit_post_link($post->ID, 'url')); ?>"><?php _e('Cancel', 'social'); ?></a>
+</p>
+</form>
+<script type="text/javascript" src="<?php echo esc_url(includes_url('/js/jquery/jquery.js')); ?>"></script>
+<script type="text/javascript" src="<?php echo esc_url(SOCIAL_ADMIN_JS); ?>"></script>
+</body>
+</html>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/default.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,10 @@
+<div class="misc-pub-section">
+	<h4 class="mar-top-none"><?php _e('Broadcast Post', 'social'); ?></h4>
+	<p>
+		<input type="radio" name="social_notify" id="social_notify_yes" value="1"<?php checked(true, (bool) ($notify and $post->post_status != 'private'), true); disabled('private', $post->post_status, true); ?> />
+		<label for="social_notify_yes" class="social-toggle-label"><?php _e('Yes', 'social'); ?></label>
+	
+		<input type="radio" name="social_notify" id="social_notify_no" value="0"<?php checked(true, (bool) (!$notify or $post->post_status == 'private'), true); disabled('private', $post->post_status, true); ?> />
+		<label for="social_notify_no" class="social-toggle-label"><?php _e('No', 'social'); ?></label>
+	</p>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/account.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,14 @@
+<li>
+	<img src="<?php echo esc_url($account->avatar()); ?>" width="24" height="24" />
+	<span>
+		<?php
+			$broadcasted = $service->title();
+			if (isset($broadcasted_id)) {
+				if ($account->has_user() or $service->key() != 'twitter') {
+					$broadcasted = '<a href="'.esc_url($service->status_url($account->username(), $broadcasted_id)).'" target="_blank">'.$service->title().'</a>';
+				}
+			}
+			echo esc_html($account->name()).' &middot; '.$broadcasted;
+		?>
+	</span>
+</li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/broadcasted.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,51 @@
+<div class="misc-pub-section">
+<?php
+$header_shown = false;
+if (is_array($ids) and count($ids)) {
+	foreach ($services as $key => $service) {
+		if (isset($ids[$key]) and count($ids[$key])) {
+			$broadcasted = true;
+			if (!$header_shown) {
+				$header_shown = true;
+				echo '<h4>'.__('Sent to:', 'social').'</h4>';
+			}
+
+			$broadcasts = array();
+			foreach ($ids[$key] as $user_id => $broadcasted) {
+				$account = $service->account($user_id);
+				if (empty($output)) {
+					$accounts_output = '<ul class="social-broadcasted">';
+				}
+
+				foreach ($broadcasted as $broadcasted_id => $data) {
+					if ($account === false) {
+						$class = 'Social_Service_'.$key.'_Account';
+						$account = new $class($data['account']);
+
+						if (!$account->has_user() and $key == 'twitter') {
+							$recovered = $service->recover_broadcasted_tweet_data($broadcasted_id, $post->ID);
+
+							if (isset($recovered->user)) {
+								$data['account']->user = $recovered->user;
+								$account = new $class($data['account']);
+							}
+						}
+					}
+
+					$broadcasts[] = Social_View::factory('wp-admin/post/meta/broadcast/parts/account', array(
+						'account' => $account,
+						'service' => $service,
+						'broadcasted_id' => $broadcasted_id,
+						'data' => $data
+					));
+				}
+			}
+
+			if (count($broadcasts)) {
+				echo '<ul class="social-broadcasted">'.implode("\n", $broadcasts).'</ul>';
+			}
+		}
+	}
+}
+?>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/button.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,7 @@
+<div class="misc-pub-section broadcast-button">
+	<p class="submit cf-clearfix social-meta-broadcast-button <?php echo ($broadcasted ? 'broadcasted' : ''); ?>">
+		<input type="submit" name="social_broadcast" value="<?php _e($button_text, 'social'); ?>" />
+		<input type="hidden" name="social_notify" value="1" />
+		<a href="<?php echo esc_url(admin_url('profile.php#social-accounts')); ?>"><?php _e('My Accounts', 'social'); ?></a>
+	</p>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/parts/facebook/page.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,9 @@
+<li>
+	<img src="<?php echo esc_url($service->page_image_url($account)); ?>" width="24" height="24" />
+	<span>
+		<?php
+			$service = (isset($broadcasted_id) ? '<a href="'.esc_url($service->status_url($account->name, $broadcasted_id)).'" target="_blank">'.$service->title().'</a>' : $service->title());
+			echo esc_html($account->name).' &middot; '.$service;
+		?>
+	</span>
+</li>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/pending.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,31 @@
+<?php
+echo '<div class="misc-pub-section">';
+if (empty($accounts)) {
+	_e('This post will not be broadcasted to any of your social accounts.', 'social');
+}
+else {
+	echo '<p class="mar-top-none">'
+	   . __('This post will be broadcasted to the following accounts.', 'social')
+	   . '</p>';
+
+	foreach ($accounts as $service => $_accounts) {
+		if (isset($services[$service])) {
+			$service = $services[$service];
+
+			$output = '';
+			foreach ($_accounts as $account) {
+				if (($account = $service->account($account->id)) !== false) {
+					$output .= Social_View::factory('wp-admin/post/meta/broadcast/parts/account', array(
+						'account' => $account,
+						'service' => $service
+					));
+				}
+			}
+
+			if (!empty($output)) {
+				echo '<ul class="social-broadcasted">'.$output.'</ul>';
+			}
+		}
+	}
+}
+echo '</div>';
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/private.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,3 @@
+<div id="social-broadcast-meta-private" class="misc-pub-section">
+	<p><?php _e('Broadcasting is disabled for private posts.', 'social'); ?></p>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/scheduled.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,34 @@
+<div class="misc-pub-section">
+<?php
+if (empty($accounts)) {
+	echo '<p class=="mar-top-none">'
+	   . __('This post is scheduled to be published at a later date. However, it is not scheduled to be broadcasted to any of your social accounts.', 'social')
+	   . '</p>';
+}
+else {
+	echo '<h4>'. __('Scheduled for:', 'social').'</h4>';
+	foreach ($accounts as $service => $_accounts) {
+		if (isset($services[$service])) {
+			$service = $services[$service];
+
+			$output = '';
+			foreach ($_accounts as $account) {
+				$_account = $service->account($account->id);
+				if ($_account !== false) {
+					$account = $_account;
+				}
+				
+				$output .= Social_View::factory('wp-admin/post/meta/broadcast/parts/account', array(
+					'account' => $account,
+					'service' => $service
+				));
+			}
+
+			if (!empty($output)) {
+				echo '<ul class="social-broadcasted">'.$output.'</ul>';
+			}
+		}
+	}
+}
+?>
+</div>
\ No newline at end of file
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/broadcast/shell.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,4 @@
+<div class="social-meta-box">
+	<?php echo $content.$broadcasted.$button; ?>
+	<div class="clear"></div>
+</div>
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/log/output.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,93 @@
+<?php
+	if (empty($log)) {
+		echo '<p>'.__('Aggregation has not been run for this post yet.', 'social').'</p>';
+	}
+	else {
+		$i = 0;
+		$output = '';
+		$log = array_reverse($log, 1);
+		foreach ($log as $timestamp => $_log) {
+			++$i;
+
+			$output .= '<h5 id="log-'.$i.'">'.date(get_option('date_format').' '.get_option('time_format'), ($timestamp + (get_option('gmt_offset') * 3600))).' (';
+			if (isset($_log->manual) and $_log->manual) { // isset() check for legacy support
+				$output .= __('Manual Aggregation', 'social');
+			}
+			else {
+				$output .= __('Automatic Aggregation', 'social');
+			}
+			$output .= ')</h5><ul id="log-'.$i.'-output" class="parent">';
+
+			if (isset($_log->items) and count($_log->items)) {
+				foreach ($_log->items as $service => $items) {
+					if (isset($services[$service])) {
+						$service = $services[$service];
+
+						$output .= '<li>'.esc_html($service->title()).':<ul>';
+
+						if (count($items)) {
+							$_items = array();
+							foreach ($items as $item) {
+								if (!isset($_items[$item->type])) {
+									$_items[$item->type] = array();
+								}
+
+								$_items[$item->type][] = $item;
+							}
+
+							foreach ($_items as $type => $items) {
+								foreach ($items as $item) {
+									$username = '';
+									if (isset($item->data['username'])) {
+										$username = $item->data['username'];
+									}
+
+									$id = $item->id;
+									if (isset($item->data['parent_id'])) {
+										$id = $item->data['parent_id'];
+										$ids = explode('_', $item->data['parent_id']);
+										$item->id = $id.'#'.$ids[1];
+									}
+
+									$output .= '<li>';
+									$content = $service->aggregation_row($type, $item, $username, $id);
+									if (empty($content)) {
+										$link = $service->status_url($username, $id);
+										$output .= '<a href="'.esc_url($link).'" target="_blank">#'.$item->id.'</a>';
+										switch ($type) {
+											case 'reply':
+												$output .= ' ('.__('Reply Search', 'social').')';
+											break;
+											case 'url':
+												$output .= ' ('.__('URL Search', 'social').')';
+											break;
+											default:
+												$output .= ' ('.__(esc_html($type), 'social').')';
+											break;
+										}
+
+										if ($item->ignored) {
+											$output .= ' ('.__('Existing Comment', 'social').')';
+										}
+									}
+									else {
+										$output .= $content;
+									}
+
+									$output .= '</li>';
+								}
+							}
+						}
+
+						$output .= '</ul></li>';
+					}
+				}
+			}
+			else {
+				$output .= '<li style="list-style:none"><p>'.__('No results found.', 'social').'</p></li>';
+			}
+			$output .= '</ul>';
+		}
+
+		echo $output;
+	}
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/post/meta/log/shell.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,35 @@
+<div class="social-meta-box-block">
+	<h4><?php _e('Add Tweet by URL', 'social'); ?></h4>
+	<p><?php _e('Enter the URL of the tweet to add it as a comment.', 'social'); ?></p>
+	
+	<p>
+		<input type="text" id="social-source-url" name="source_url" style="width:350px" />
+		<span class="submit" style="float:none">
+			<a href="<?php echo esc_url(wp_nonce_url(admin_url('options-general.php?social_controller=import&social_action=from_url&social_service=twitter&post_id='.$post->ID), 'from_url')); ?>" id="import_from_url" class="button"><?php _e('Import Tweet', 'social'); ?></a>
+		</span>
+		<img src="<?php echo esc_url(admin_url('images/wpspin_light.gif')); ?>" style="position:relative;top:4px;left:0;display:none" id="import_from_url_loader" />
+		<span id="social-import-error"></span>
+	</p>
+</div><!-- .social-meta-box-block -->
+
+<?php if (in_array(Social::option('fetch_comments'), array('1', '2'))) { ?>
+<div class="social-meta-box-block cf-clearfix">
+	<h4>
+		<?php _e('Manual Refresh', 'social'); ?>
+		<span id="social-next-run">(<?php echo sprintf(__('Next automatic run <span>%s</span>', 'social'), $next_run); ?>)</span>
+	</h4>
+
+	<p class="submit" style="clear:both;float:none;padding:0;">
+		<a href="<?php echo esc_url(wp_nonce_url(admin_url('options-general.php?social_controller=aggregation&social_action=run&post_id='.$post->ID), 'run')); ?>" id="run_aggregation" class="button" style="float:left;margin-bottom:10px;"><?php _e('Find Social Comments', 'social'); ?></a>
+		<img src="<?php echo esc_url(admin_url('images/wpspin_light.gif')); ?>" style="float:left;position:relative;top:4px;left:5px;display:none;" id="run_aggregation_loader" />
+	</p>
+</div><!-- .social-meta-box-block -->
+<?php } ?>
+
+<div class="social-meta-box-block">
+	<h4><?php _e('Log', 'social'); ?></h4>
+
+	<div id="aggregation_log">
+		<?php echo Social_Aggregation_Log::instance($post->ID); ?>
+	</div>
+</div><!-- .social-meta-box-block -->
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/web/wp-content/plugins/social/views/wp-admin/profile.php	Tue Dec 04 18:43:10 2012 -0800
@@ -0,0 +1,18 @@
+<h3 id="social-accounts"><?php _e('Social Accounts', 'social'); ?></h3>
+<table class="form-table">
+	<tr id="social-accounts">
+		<th>
+			<?php _e('Accounts', 'social'); ?>
+			<p class="description" style="padding-top: 40px;"><?php _e('Only I can broadcast to these accounts.', 'social'); ?></p>
+		</th>
+		<td>
+<?php
+echo Social_View::factory(
+	'wp-admin/parts/accounts',
+	compact('services', 'accounts', 'defaults')
+);
+?>
+		</td>
+	</tr>
+</table>
+<input type="hidden" name="social_profile" value="true" />