Merge "Convert last usages of wfMsg*() to wfMessage()."
authorSiebrand <siebrand@wikimedia.org>
Thu, 13 Sep 2012 01:49:41 +0000 (01:49 +0000)
committerGerrit Code Review <gerrit@wikimedia.org>
Thu, 13 Sep 2012 01:49:41 +0000 (01:49 +0000)
66 files changed:
RELEASE-NOTES-1.20
docs/doxygen_first_page.php
docs/hooks.txt
includes/BacklinkCache.php
includes/ChangesList.php
includes/EditPage.php
includes/Exception.php
includes/Revision.php
includes/Title.php
includes/actions/HistoryAction.php
includes/api/ApiQueryLogEvents.php
includes/filebackend/FileBackendMultiWrite.php
includes/filebackend/FileBackendStore.php
includes/filebackend/SwiftFileBackend.php
includes/filerepo/file/File.php
includes/specials/SpecialContributions.php
includes/specials/SpecialDeletedContributions.php
languages/messages/MessagesArc.php
languages/messages/MessagesBr.php
languages/messages/MessagesCkb.php
languages/messages/MessagesDa.php
languages/messages/MessagesDe.php
languages/messages/MessagesDiq.php
languages/messages/MessagesEn.php
languages/messages/MessagesFi.php
languages/messages/MessagesFr.php
languages/messages/MessagesGu.php
languages/messages/MessagesHil.php
languages/messages/MessagesHr.php
languages/messages/MessagesJa.php
languages/messages/MessagesKa.php
languages/messages/MessagesKo.php
languages/messages/MessagesMs.php
languages/messages/MessagesNn.php
languages/messages/MessagesPa.php
languages/messages/MessagesPl.php
languages/messages/MessagesPms.php
languages/messages/MessagesPs.php
languages/messages/MessagesPt.php
languages/messages/MessagesPt_br.php
languages/messages/MessagesQqq.php
languages/messages/MessagesRo.php
languages/messages/MessagesRoa_tara.php
languages/messages/MessagesRu.php
languages/messages/MessagesSk.php
languages/messages/MessagesSl.php
languages/messages/MessagesTl.php
languages/messages/MessagesTr.php
maintenance/benchmarks/bench_delete_truncate.php
maintenance/benchmarks/benchmarkHooks.php
maintenance/syncFileBackend.php
resources/jquery/images/spinner-large.gif [new file with mode: 0644]
resources/jquery/images/spinner.gif
resources/jquery/jquery.js
resources/jquery/jquery.makeCollapsible.js
resources/jquery/jquery.placeholder.js
resources/jquery/jquery.spinner.css
resources/jquery/jquery.spinner.js
resources/mediawiki.action/mediawiki.action.view.rightClickEdit.js
resources/mediawiki/mediawiki.htmlform.js
skins/common/commonPrint.css
skins/common/config.js
skins/common/shared.css
tests/jasmine/spec_makers/makeJqueryMsgSpec.php
tests/phpunit/includes/RevisionStorageTest.php
thumb.php

index ce40066..bd65108 100644 (file)
@@ -65,7 +65,7 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
 * (bug 35685) api.php URL and other entry point URLs are now listed on
   Special:Version
 * Edit notices can now be translated.
-* jQuery upgraded to 1.7.2
+* jQuery upgraded to 1.8.1
 * jQuery UI upgraded to 1.8.23.
 * QUnit upgraded from v1.2.0 to v1.10.0.
 * (bug 37604) jquery.cookie upgraded to 2011 version.
@@ -143,7 +143,8 @@ upgrade PHP if you have not done so prior to upgrading MediaWiki.
   with auto-hide, multi-message support, and message replacement tags.
 * jquery.messageBox which appears to be unused by both core and extensions has
   been removed.
-* (bug 34939) made link parsking insensitive ([HttP://])
+* (bug 34939) Made link parsing insensitive ([HttP://])
+* (bug 40072) Add CSS classes to items in output of ChangesList pages.
 
 === Bug fixes in 1.20 ===
 * (bug 30245) Use the correct way to construct a log page title.
index 11db1f5..9949d13 100644 (file)
@@ -13,7 +13,7 @@ die("Not a valid entry point\n");
  * Welcome on MediaWiki autogenerated documentation system.
  *
  * If you are looking to use, install or configure your wiki, you probably
- * want to look at the main site: http://www.mediawiki.org/
+ * want to look at the main site: https://www.mediawiki.org/
  *
  * @note this page is generated from docs/doxygen_first_page.php
  */
index 6105367..5207730 100644 (file)
@@ -320,12 +320,13 @@ $body: Body of the message
 Use this to extend core API modules.
 &$module: Module object
 
-'APICheckCanExecute': Called during ApiMain::checkCanExecute. Use to
+'ApiCheckCanExecute': Called during ApiMain::checkCanExecute. Use to
 further authenticate and authorize API clients before executing the
 module. Return false and set a message to cancel the request.
 $module: Module object
 $user: Current user
-&$message: API usage message to die with
+&$message: API usage message to die with, as a message key or array
+as accepted by ApiBase::dieUsageMsg.
 
 'APIEditBeforeSave': before saving a page with api.php?action=edit,
 after processing request parameters. Return false to let the request
index 2aba29f..05bf318 100644 (file)
@@ -41,6 +41,8 @@
  * @internal documentation reviewed on 18 Mar 2011 by hashar
  */
 class BacklinkCache {
+       /** @var ProcessCacheLRU */
+       protected static $cache;
 
        /**
         * Multi dimensions array representing batches. Keys are:
@@ -81,12 +83,32 @@ class BacklinkCache {
 
        /**
         * Create a new BacklinkCache
-        * @param Title $title : Title object to create a backlink cache for.
+        *
+        * @param Title $title : Title object to create a backlink cache for
         */
-       function __construct( $title ) {
+       public function __construct( Title $title ) {
                $this->title = $title;
        }
 
+       /**
+        * Create a new BacklinkCache or reuse any existing one.
+        * Currently, only one cache instance can exist; callers that
+        * need multiple backlink cache objects should keep them in scope.
+        *
+        * @param Title $title : Title object to get a backlink cache for
+        * @return BacklinkCache
+        */
+       public static function get( Title $title ) {
+               if ( !self::$cache ) { // init cache
+                       self::$cache = new ProcessCacheLRU( 1 );
+               }
+               $dbKey = $title->getPrefixedDBkey();
+               if ( !self::$cache->has( $dbKey, 'obj' ) ) {
+                       self::$cache->set( $dbKey, 'obj', new self( $title ) );
+               }
+               return self::$cache->get( $dbKey, 'obj' );
+       }
+
        /**
         * Serialization handler, diasallows to serialize the database to prevent
         * failures after this class is deserialized from cache with dead DB
@@ -303,7 +325,7 @@ class BacklinkCache {
         */
        public function partition( $table, $batchSize ) {
 
-               // 1) try partition cache ... 
+               // 1) try partition cache ...
 
                if ( isset( $this->partitionCache[$table][$batchSize] ) ) {
                        wfDebug( __METHOD__ . ": got from partition cache\n" );
@@ -358,7 +380,7 @@ class BacklinkCache {
         * Partition a DB result with backlinks in it into batches
         * @param $res ResultWrapper database result
         * @param $batchSize integer
-        * @return array @see 
+        * @return array @see
         */
        protected function partitionResult( $res, $batchSize ) {
                $batches = array();
index 8cca4bb..8467712 100644 (file)
@@ -345,7 +345,7 @@ class ChangesList extends ContextSource {
                                'action' => 'history'
                        )
                );
-               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' . . ';
+               $s .= $this->msg( 'parentheses' )->rawParams( $diffhist )->escaped() . ' <span class="mw-changeslist-separator">. .</span> ';
        }
 
        /**
@@ -366,7 +366,7 @@ class ChangesList extends ContextSource {
                $articlelink = Linker::linkKnown(
                        $rc->getTitle(),
                        null,
-                       array(),
+                       array( 'class' => 'mw-changeslist-title' ),
                        $params
                );
                if( $this->isDeleted($rc,Revision::DELETED_TEXT) ) {
@@ -388,8 +388,8 @@ class ChangesList extends ContextSource {
         * @param $rc RecentChange
         */
        public function insertTimestamp( &$s, $rc ) {
-               $s .= $this->message['semicolon-separator'] .
-                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . ' . . ';
+               $s .= $this->message['semicolon-separator'] . '<span class="mw-changeslist-date">' .
+                       $this->getLanguage()->userTime( $rc->mAttribs['rc_timestamp'], $this->getUser() ) . '</span> <span class="mw-changeslist-separator">. .</span> ';
        }
 
        /**
@@ -628,7 +628,7 @@ class OldChangesList extends ChangesList {
                if ( $wgRCShowChangedSize ) {
                        $cd = $this->formatCharacterDifference( $rc );
                        if ( $cd !== '' ) {
-                               $s .= "$cd  . . ";
+                               $s .= $cd . '  <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
@@ -994,7 +994,7 @@ class EnhancedChangesList extends ChangesList {
                        $r .= $this->msg( 'parentheses' )->rawParams( $logtext )->escaped();
                }
 
-               $r .= ' . . ';
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                # Character difference (does not apply if only log items)
                if( $wgRCShowChangedSize && !$allLogs ) {
@@ -1013,7 +1013,7 @@ class EnhancedChangesList extends ChangesList {
                        if( $chardiff == '' ) {
                                $r .= ' ';
                        } else {
-                               $r .= ' ' . $chardiff. ' . . ';
+                               $r .= ' ' . $chardiff. ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
@@ -1066,13 +1066,13 @@ class EnhancedChangesList extends ChangesList {
                        if ( !$type == RC_LOG || $type == RC_NEW ) {
                                $r .= ' ' . $this->msg( 'parentheses' )->rawParams( $rcObj->curlink . $this->message['pipe-separator'] . $rcObj->lastlink )->escaped();
                        }
-                       $r .= ' . . ';
+                       $r .= ' <span class="mw-changeslist-separator">. .</span> ';
 
                        # Character diff
                        if ( $wgRCShowChangedSize ) {
                                $cd = $this->formatCharacterDifference( $rcObj );
                                if ( $cd !== '' ) {
-                                       $r .= "$cd . . ";
+                                       $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
                                }
                        }
 
@@ -1202,12 +1202,12 @@ class EnhancedChangesList extends ChangesList {
                                $query
                        ) )->escaped();
                }
-               $r .= ' . . ';
+               $r .= ' <span class="mw-changeslist-separator">. .</span> ';
                # Character diff
                if ( $wgRCShowChangedSize ) {
                        $cd = $this->formatCharacterDifference( $rcObj );
                        if ( $cd !== '' ) {
-                               $r .= "$cd . . ";
+                               $r .= $cd . ' <span class="mw-changeslist-separator">. .</span> ';
                        }
                }
 
index 55c65f6..291e3fe 100644 (file)
@@ -1295,7 +1295,7 @@ class EditPage {
                                                $this->isConflict = false;
                                                wfDebug( __METHOD__ . ": conflict suppressed; new section\n" );
                                        }
-                               } elseif ( $this->section == '' && $this->userWasLastToEdit( $wgUser->getId(), $this->edittime ) ) {
+                               } elseif ( $this->section == '' && Revision::userWasLastToEdit( DB_MASTER,  $this->mTitle->getArticleID(), $wgUser->getId(), $this->edittime ) ) {
                                        # Suppress edit conflict with self, except for section edits where merging is required.
                                        wfDebug( __METHOD__ . ": Suppressing edit conflict, same user.\n" );
                                        $this->isConflict = false;
@@ -1489,35 +1489,6 @@ class EditPage {
                }
        }
 
-       /**
-        * Check if no edits were made by other users since
-        * the time a user started editing the page. Limit to
-        * 50 revisions for the sake of performance.
-        *
-        * @param $id int
-        * @param $edittime string
-        *
-        * @return bool
-        */
-       protected function userWasLastToEdit( $id, $edittime ) {
-               if ( !$id ) return false;
-               $dbw = wfGetDB( DB_MASTER );
-               $res = $dbw->select( 'revision',
-                       'rev_user',
-                       array(
-                               'rev_page' => $this->mTitle->getArticleID(),
-                               'rev_timestamp > ' . $dbw->addQuotes( $dbw->timestamp( $edittime ) )
-                       ),
-                       __METHOD__,
-                       array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 50 ) );
-               foreach ( $res as $row ) {
-                       if ( $row->rev_user != $id ) {
-                               return false;
-                       }
-               }
-               return true;
-       }
-
        /**
         * @private
         * @todo document
index a131cca..714f73e 100644 (file)
@@ -240,7 +240,6 @@ class MWException extends Exception {
                        }
 
                        echo "</body></html>\n";
-                       die( 1 );
                }
        }
 
@@ -639,7 +638,7 @@ class MWExceptionHandler {
                                if ( $cmdLine ) {
                                        self::printError( $message );
                                } else {
-                                       self::escapeEchoAndDie( $message );
+                                       echo nl2br( htmlspecialchars( $message ) ) . "\n";
                                }
                        }
                } else {
@@ -653,7 +652,7 @@ class MWExceptionHandler {
                        if ( $cmdLine ) {
                                self::printError( $message );
                        } else {
-                               self::escapeEchoAndDie( $message );
+                               echo nl2br( htmlspecialchars( $message ) ) . "\n";
                        }
                }
        }
@@ -674,17 +673,6 @@ class MWExceptionHandler {
                }
        }
 
-       /**
-        * Print a message after escaping it and converting newlines to <br>
-        * Use this for non-command line failures.
-        *
-        * @param $message string Failure text
-        */
-       private static function escapeEchoAndDie( $message ) {
-               echo nl2br( htmlspecialchars( $message ) ) . "\n";
-               die(1);
-       }
-
        /**
         * Exception handler which simulates the appropriate catch() handling:
         *
index 9da031e..20cc8f5 100644 (file)
@@ -1290,4 +1290,42 @@ class Revision implements IDBAccessObject {
                }
                return 0;
        }
-}
+
+       /**
+        * Check if no edits were made by other users since
+        * the time a user started editing the page. Limit to
+        * 50 revisions for the sake of performance.
+        *
+        * @since 1.20
+        *
+        * @param DatabaseBase|int $db the Database to perform the check on. May be given as a Database object or
+        *        a database identifier usable with wfGetDB.
+        * @param int $pageId the ID of the page in question
+        * @param int $userId the ID of the user in question
+        * @param string $since look at edits since this time
+        *
+        * @return bool True if the given user was the only one to edit since the given timestamp
+        */
+       public static function userWasLastToEdit( $db, $pageId, $userId, $since ) {
+               if ( !$userId ) return false;
+
+               if ( is_int( $db ) ) {
+                       $db = wfGetDB( $db );
+               }
+
+               $res = $db->select( 'revision',
+                       'rev_user',
+                       array(
+                               'rev_page' => $pageId,
+                               'rev_timestamp > ' . $db->addQuotes( $db->timestamp( $since ) )
+                       ),
+                       __METHOD__,
+                       array( 'ORDER BY' => 'rev_timestamp ASC', 'LIMIT' => 50 ) );
+               foreach ( $res as $row ) {
+                       if ( $row->rev_user != $userId ) {
+                               return false;
+                       }
+               }
+               return true;
+       }
+}
\ No newline at end of file
index cd9eb94..1b5e21d 100644 (file)
@@ -84,7 +84,6 @@ class Title {
        var $mLength = -1;                // /< The page length, 0 for special pages
        var $mRedirect = null;            // /< Is the article at this title a redirect?
        var $mNotificationTimestamp = array(); // /< Associative array of user ID -> timestamp/false
-       var $mBacklinkCache = null;       // /< Cache of links to this title
        var $mHasSubpage;                 // /< Whether a page has any subpages
        // @}
 
@@ -4482,11 +4481,8 @@ class Title {
         *
         * @return BacklinkCache
         */
-       function getBacklinkCache() {
-               if ( is_null( $this->mBacklinkCache ) ) {
-                       $this->mBacklinkCache = new BacklinkCache( $this );
-               }
-               return $this->mBacklinkCache;
+       public function getBacklinkCache() {
+               return BacklinkCache::get( $this );
        }
 
        /**
index 1c57f25..dcd6fe5 100644 (file)
@@ -604,7 +604,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        : 0;
                $sDiff = ChangesList::showCharacterDifference( $prevSize, $rev->getSize() );
                $fSize = Linker::formatRevisionSize($rev->getSize());
-               $s .= " . . $fSize $sDiff";
+               $s .= ' <span class="mw-changeslist-separator">. .</span> ' . "$fSize $sDiff";
 
                # Text following the character difference is added just before running hooks
                $s2 = Linker::revComment( $rev, false, true );
@@ -658,7 +658,7 @@ class HistoryPager extends ReverseChronologicalPager {
 
                # Include separator between character difference and following text
                if ( $s2 !== '' ) {
-                       $s .= " . . $s2";
+                       $s .= ' <span class="mw-changeslist-separator">. .</span> ' . $s2;
                }
 
                wfRunHooks( 'PageHistoryLineEnding', array( $this, &$row , &$s, &$classes ) );
@@ -684,7 +684,7 @@ class HistoryPager extends ReverseChronologicalPager {
                        $link = Linker::linkKnown(
                                $this->getTitle(),
                                $date,
-                               array(),
+                               array( 'class' => 'mw-changeslist-date' ),
                                array( 'oldid' => $rev->getId() )
                        );
                } else {
index f2fd425..5d85c22 100644 (file)
@@ -263,6 +263,7 @@ class ApiQueryLogEvents extends ApiQueryBase {
                }
                if ( !is_null( $params ) ) {
                        $result->setIndexedTagName( $params, 'param' );
+                       $result->setIndexedTagName_recursive( $params, 'param' );
                        $vals = array_merge( $vals, $params );
                }
                return $vals;
index 9efa0db..4be0323 100644 (file)
@@ -44,6 +44,8 @@ class FileBackendMultiWrite extends FileBackend {
        protected $backends = array(); // array of (backend index => backends)
        protected $masterIndex = -1; // integer; index of master backend
        protected $syncChecks = 0; // integer; bitfield
+       protected $autoResync = false; // boolean
+
        /** @var Array */
        protected $noPushDirConts = array();
        protected $noPushQuickOps = false; // boolean
@@ -70,6 +72,9 @@ class FileBackendMultiWrite extends FileBackend {
         *                      Possible bits include the FileBackendMultiWrite::CHECK_* constants.
         *                      There are constants for SIZE, TIME, and SHA1.
         *                      The checks are done before allowing any file operations.
+        *   - autoResync     : Automatically resync the clone backends to the master backend
+        *                      when pre-operation sync checks fail. This should only be used
+        *                      if the master backend is stable and not missing any files.
         *   - noPushQuickOps : (hack) Only apply doQuickOperations() to the master backend.
         *   - noPushDirConts : (hack) Only apply directory functions to the master backend.
         *
@@ -81,6 +86,7 @@ class FileBackendMultiWrite extends FileBackend {
                $this->syncChecks = isset( $config['syncChecks'] )
                        ? $config['syncChecks']
                        : self::CHECK_SIZE;
+               $this->autoResync = !empty( $config['autoResync'] );
                $this->noPushQuickOps = isset( $config['noPushQuickOps'] )
                        ? $config['noPushQuickOps']
                        : false;
@@ -152,16 +158,30 @@ class FileBackendMultiWrite extends FileBackend {
                // Clear any cache entries (after locks acquired)
                $this->clearCache();
                $opts['preserveCache'] = true; // only locked files are cached
-               // Do a consistency check to see if the backends agree
-               $status->merge( $this->consistencyCheck( $this->fileStoragePathsForOps( $ops ) ) );
+               // Get the list of paths to read/write...
+               $relevantPaths = $this->fileStoragePathsForOps( $ops );
+               // Check if the paths are valid and accessible on all backends...
+               $status->merge( $this->accessibilityCheck( $relevantPaths ) );
                if ( !$status->isOK() ) {
                        return $status; // abort
                }
+               // Do a consistency check to see if the backends are consistent...
+               $syncStatus = $this->consistencyCheck( $relevantPaths );
+               if ( !$syncStatus->isOK() ) {
+                       wfDebugLog( 'FileOperation', get_class( $this ) .
+                               " failed sync check: " . FormatJson::encode( $relevantPaths ) );
+                       // Try to resync the clone backends to the master on the spot...
+                       if ( !$this->autoResync || !$this->resyncFiles( $relevantPaths )->isOK() ) {
+                               $status->merge( $syncStatus );
+                               return $status; // abort
+                       }
+               }
                // Actually attempt the operation batch on the master backend...
                $masterStatus = $mbe->doOperations( $realOps, $opts );
                $status->merge( $masterStatus );
                // Propagate the operations to the clone backends if there were no fatal errors.
                // If $ops only had one operation, this might avoid backend inconsistencies.
+               // This also avoids inconsistency for expected errors (like "file already exists").
                if ( !count( $masterStatus->getErrorsArray() ) ) {
                        foreach ( $this->backends as $index => $backend ) {
                                if ( $index !== $this->masterIndex ) { // not done already
@@ -193,7 +213,7 @@ class FileBackendMultiWrite extends FileBackend {
                }
 
                $mBackend = $this->backends[$this->masterIndex];
-               foreach ( array_unique( $paths ) as $path ) {
+               foreach ( $paths as $path ) {
                        $params = array( 'src' => $path, 'latest' => true );
                        $mParams = $this->substOpPaths( $params, $mBackend );
                        // Stat the file on the 'master' backend
@@ -203,8 +223,7 @@ class FileBackendMultiWrite extends FileBackend {
                        } else {
                                $mSha1 = false;
                        }
-                       $mUsable = $mBackend->isPathUsableInternal( $mParams['src'] );
-                       // Check of all clone backends agree with the master...
+                       // Check if all clone backends agree with the master...
                        foreach ( $this->backends as $index => $cBackend ) {
                                if ( $index === $this->masterIndex ) {
                                        continue; // master
@@ -241,8 +260,29 @@ class FileBackendMultiWrite extends FileBackend {
                                                $status->fatal( 'backend-fail-synced', $path );
                                        }
                                }
-                               if ( $mUsable !== $cBackend->isPathUsableInternal( $cParams['src'] ) ) {
-                                       $status->fatal( 'backend-fail-synced', $path );
+                       }
+               }
+
+               return $status;
+       }
+
+       /**
+        * Check that a set of file paths are usable across all internal backends
+        *
+        * @param $paths Array List of storage paths
+        * @return Status
+        */
+       public function accessibilityCheck( array $paths ) {
+               $status = Status::newGood();
+               if ( count( $this->backends ) <= 1 ) {
+                       return $status; // skip checks
+               }
+
+               foreach ( $paths as $path ) {
+                       foreach ( $this->backends as $backend ) {
+                               $realPath = $this->substPaths( $path, $backend );
+                               if ( !$backend->isPathUsableInternal( $realPath ) ) {
+                                       $status->fatal( 'backend-fail-usable', $path );
                                }
                        }
                }
@@ -265,6 +305,10 @@ class FileBackendMultiWrite extends FileBackend {
                        $mPath  = $this->substPaths( $path, $mBackend );
                        $mSha1  = $mBackend->getFileSha1Base36( array( 'src' => $mPath ) );
                        $mExist = $mBackend->fileExists( array( 'src' => $mPath ) );
+                       // Check if the master backend is available...
+                       if ( $mExist === null ) {
+                               $status->fatal( 'backend-fail-internal', $this->name );
+                       }
                        // Check of all clone backends agree with the master...
                        foreach ( $this->backends as $index => $cBackend ) {
                                if ( $index === $this->masterIndex ) {
@@ -307,7 +351,7 @@ class FileBackendMultiWrite extends FileBackend {
                                $paths[] = $op['dst'];
                        }
                }
-               return array_unique( $paths );
+               return array_unique( array_filter( $paths, 'FileBackend::isStoragePath' ) );
        }
 
        /**
index 5771560..083dfea 100644 (file)
@@ -292,8 +292,14 @@ abstract class FileBackendStore extends FileBackend {
                // Try to lock the source files for the scope of this function
                $scopeLockS = $this->getScopedFileLocks( $params['srcs'], LockManager::LOCK_UW, $status );
                if ( $status->isOK() ) {
-                       // Actually do the concatenation
+                       // Actually do the file concatenation...
+                       $start_time = microtime( true );
                        $status->merge( $this->doConcatenate( $params ) );
+                       $sec = microtime( true ) - $start_time;
+                       if ( !$status->isOK() ) {
+                               wfDebugLog( 'FileOperation', get_class( $this ) . " failed to concatenate " .
+                                       count( $params['srcs'] ) . " file(s) [$sec sec]" );
+                       }
                }
 
                wfProfileOut( __METHOD__ . '-' . $this->name );
index ab86107..2cedb62 100644 (file)
@@ -1023,6 +1023,8 @@ class SwiftFileBackend extends FileBackendStore {
                        $output = fopen( 'php://output', 'wb' );
                        $obj = new CF_Object( $cont, $srcRel, false, false ); // skip HEAD
                        $obj->stream( $output, $this->headersFromParams( $params ) );
+               } catch ( NoSuchObjectException $e ) {
+                       $status->fatal( 'backend-fail-stream', $params['src'] );
                } catch ( CloudFilesException $e ) { // some other exception?
                        $this->handleException( $e, $status, __METHOD__, $params );
                }
index 3b0ea14..557609d 100644 (file)
@@ -68,6 +68,9 @@ abstract class File {
        const FOR_THIS_USER = 2;
        const RAW = 3;
 
+       // Options for File::thumbName()
+       const THUMB_FULL_NAME = 1;
+
        /**
         * Some member variables can be lazy-initialised using __get(). The
         * initialisation function for these variables is always a function named
@@ -759,15 +762,18 @@ abstract class File {
        }
 
        /**
-        * Return the file name of a thumbnail with the specified parameters
+        * Return the file name of a thumbnail with the specified parameters.
+        * Use File::THUMB_FULL_NAME to always get a name like "<params>-<source>".
+        * Otherwise, the format may be "<params>-<source>" or "<params>-thumbnail.<ext>".
         *
         * @param $params Array: handler-specific parameters
-        * @private -ish
-        *
+        * @param $flags integer Bitfield that supports THUMB_* constants
         * @return string
         */
-       function thumbName( $params ) {
-               $name = $this->repo ? $this->repo->nameForThumb( $this->getName() ) : $this->getName();
+       public function thumbName( $params, $flags = 0 ) {
+               $name = ( $this->repo && !( $flags & self::THUMB_FULL_NAME ) )
+                       ? $this->repo->nameForThumb( $this->getName() )
+                       : $this->getName();
                return $this->generateThumbName( $name, $params );
        }
 
@@ -779,7 +785,7 @@ abstract class File {
         *
         * @return string
         */
-       function generateThumbName( $name, $params ) {
+       public function generateThumbName( $name, $params ) {
                if ( !$this->getHandler() ) {
                        return null;
                }
index fb94ff7..54f8e26 100644 (file)
@@ -841,7 +841,7 @@ class ContribsPager extends ReverseChronologicalPager {
                        $link = Linker::link(
                                $page,
                                htmlspecialchars( $page->getPrefixedText() ),
-                               array(),
+                               array( 'class' => 'mw-contributions-title' ),
                                $page->isRedirect() ? array( 'redirect' => 'no' ) : array()
                        );
                        # Mark current revisions
@@ -882,11 +882,11 @@ class ContribsPager extends ReverseChronologicalPager {
                                // For some reason rev_parent_id isn't populated for this row.
                                // Its rumoured this is true on wikipedia for some revisions (bug 34922).
                                // Next best thing is to have the total number of bytes.
-                               $chardiff = ' . . ' . Linker::formatRevisionSize( $row->rev_len ) . ' . . ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . Linker::formatRevisionSize( $row->rev_len ) . ' <span class="mw-changeslist-separator">. .</span> ';
                        } else {
                                $parentLen = isset( $this->mParentLens[$row->rev_parent_id] ) ? $this->mParentLens[$row->rev_parent_id] : 0;
-                               $chardiff = ' . . ' . ChangesList::showCharacterDifference(
-                                               $parentLen, $row->rev_len, $this->getContext() ) . ' . . ';
+                               $chardiff = ' <span class="mw-changeslist-separator">. .</span> ' . ChangesList::showCharacterDifference(
+                                               $parentLen, $row->rev_len, $this->getContext() ) . ' <span class="mw-changeslist-separator">. .</span> ';
                        }
 
                        $lang = $this->getLanguage();
@@ -896,7 +896,7 @@ class ContribsPager extends ReverseChronologicalPager {
                                $d = Linker::linkKnown(
                                        $page,
                                        htmlspecialchars( $date ),
-                                       array(),
+                                       array( 'class' => 'mw-changeslist-date' ),
                                        array( 'oldid' => intval( $row->rev_id ) )
                                );
                        } else {
index 991e7a2..c880b61 100644 (file)
@@ -191,7 +191,7 @@ class DeletedContribsPager extends IndexPager {
                        $link = Linker::linkKnown(
                                $undelete,
                                $date,
-                               array(),
+                               array( 'class' => 'mw-changeslist-date' ),
                                array(
                                        'target' => $page->getPrefixedText(),
                                        'timestamp' => $rev->getTimestamp()
@@ -203,7 +203,11 @@ class DeletedContribsPager extends IndexPager {
                        $link = '<span class="history-deleted">' . $link . '</span>';
                }
 
-               $pagelink = Linker::link( $page );
+               $pagelink = Linker::link(
+                       $page,
+                       null,
+                       array( 'class' => 'mw-changeslist-title' )
+               );
 
                if( $rev->isMinor() ) {
                        $mflag = ChangesList::flag( 'minor' );
@@ -222,7 +226,8 @@ class DeletedContribsPager extends IndexPager {
                                array( $last, $dellog, $reviewlink ) ) )->escaped()
                );
 
-               $ret = "{$del}{$link} {$tools} . . {$mflag} {$pagelink} {$comment}";
+               $separator = '<span class="mw-changeslist-separator">. .</span>';
+               $ret = "{$del}{$link} {$tools} {$separator} {$mflag} {$pagelink} {$comment}";
 
                # Denote if username is redacted for this edit
                if( $rev->isDeleted( Revision::DELETED_USER ) ) {
index 147d19a..4e64c74 100644 (file)
@@ -663,6 +663,7 @@ $1',
 'prefs-watchlist-days-max' => 'ܠܡܬܚܐ ܥܠܝܐ ܕ $1 {{PLURAL:$1|ܝܘܡܐ|ܝܘܡܬ̈ܐ}}',
 'prefs-misc' => 'ܦܪ̈ܝܫܬܐ',
 'prefs-resetpass' => 'ܫܚܠܦ ܡܠܬܐ ܕܥܠܠܐ',
+'prefs-changeemail' => 'ܫܚܠܦ ܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-email' => 'ܓܒܝܬ̈ܐ ܕܒܝܠܕܪܐ ܐܠܩܛܪܘܢܝܐ',
 'prefs-rendering' => 'ܐܣܟܝܡܐ',
 'saveprefs' => 'ܠܒܘܟ',
index 8f3ccf6..6a47be7 100644 (file)
@@ -837,7 +837,9 @@ Gallout a rit [[Special:Search/{{PAGENAME}}|klask an titl anezhi]] e pajennoù a
 'noarticletext-nopermission' => 'N\'eus, evit ar mare, tamm testenn ebet war ar bajenn-mañ.
 Gallout a rit [[Special:Search/{{PAGENAME}}|klask titl ar bajenn-mañ]] war pajennoù all,
 pe <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} klask er marilhoù kar]</span>.',
-'missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
+'missing-revision' => "N'eus ket eus adwel niv. $1 eus ar bajenn anvet « {{PAGENAME}} ».
+
+C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm istorel dispredet war-zu ur bajenn zo bet dilamet.
 Gallout a reot kavout muioc'h a vunudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 'userpage-userdoesnotexist' => 'N\'eo ket enrollet ar gont "<nowiki>$1</nowiki>". Merkit ma fell deoc\'h krouiñ/kemmañ ar bajenn-mañ.',
 'userpage-userdoesnotexist-view' => 'N\'eo ket enrollet ar gont implijer "$1".',
@@ -1091,9 +1093,10 @@ N\'oc\'h ket aotreet da vont outi.',
 'revdelete-no-change' => "'''Evezh :''' emañ an arventennoù gweluster goulennet gant an elfenn deiziataet eus an $1 da $2 dija",
 'revdelete-concurrent-change' => "Fazi p'eo bet kemmet an elfenn deiziataet eus an $1 da $2 : cheñchet eo bet e statud gant unan bennak all dres pa oac'h-chwi o kemmañ anezhi. Gwiriit ar marilhoù.",
 'revdelete-only-restricted' => "Ur fazi zo bet en ur guzhat an elfenn deiziadet eus an $1 da $2 : n'hallit ket kuzhat an elfennoù-mañ ouzh ar verourien hep dibab ivez unan eus an dibarzhioù gweluster all.",
-'revdelete-reason-dropdown' => '*Abegoù diverkañ boutin
+'revdelete-reason-dropdown' => "*Abegoù diverkañ boutin
 **Gaou ouzh ar gwirioù implijout
-** Titouroù personel dizereat',
+**Titouroù personel dizereat
+** Titouroù a c'hall bezañ gwallvrudus",
 'revdelete-otherreason' => 'Abeg all/ouzhpenn :',
 'revdelete-reasonotherlist' => 'Abeg all',
 'revdelete-edit-reasonlist' => 'Kemmañ abegoù an diverkañ',
@@ -1144,7 +1147,9 @@ Gwiriit ne vo ket torret red istor ar bajenn gant ar c'hemm-mañ.",
 'editundo' => 'dizober',
 'diff-multi' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant {{PLURAL:$2|un implijer|$2 implijer}} kuzhet.)",
 'diff-multi-manyusers' => "({{PLURAL:$1|Ur reizhadenn da c'hortoz|$1 reizhadenn da c'hortoz}} gant muioc'h eget $2 {{PLURAL:$2|implijer|implijer}} kuzhet.)",
-'difference-missing-revision' => "C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.
+'difference-missing-revision' => "!!{{PLURAL:$2|Un adweladur|$2 adweladurioù}} eus an disheñvelder ($1) {{PLURAL:$2|n'eo ket bet kavet|n'int ket bet adkavet}}.
+
+C'hoarvezout a ra peurliesañ pa vez heuliet ul liamm disheñvel dispredet war-zu ur bajenn zo bet dilamet.
 Gallout a reot kavout munudoù e [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} renabl an dilamadurioù].",
 
 # Search results
@@ -1979,6 +1984,7 @@ $1 {{PLURAL:$1|rummad|rummad}}',
 'mostlinkedtemplates' => 'Patromoù implijet ar muiañ',
 'mostcategories' => 'Pennadoù rummatet ar muiañ',
 'mostimages' => 'Skeudennoù implijet ar muiañ',
+'mostinterwikis' => 'Pajennoù gant an niver brasañ a etrewikioù',
 'mostrevisions' => 'Pennadoù bet kemmet ar muiañ',
 'prefixindex' => 'An holl bajennoù a grog gant...',
 'prefixindex-namespace' => 'An holl bajennoù enno ur rakger (esaouenn anv $1)',
@@ -2276,6 +2282,8 @@ taolit evezh bras.",
 'rollback' => "disteuler ar c'hemmoù",
 'rollback_short' => 'Disteuler',
 'rollbacklink' => 'disteuler',
+'rollbacklinkcount' => 'terriñ $1 {{PLURAL:$1|kemm|kemmañ}}',
+'rollbacklinkcount-morethan' => 'terriñ ouzhpenn $1 {{PLURAL:$1|kemm|kemmoù}}',
 'rollbackfailed' => "C'hwitet eo bet an distaoladenn",
 'cantrollback' => 'Dibosupl da zisteuler: an aozer diwezhañ eo an hini nemetañ da vezañ kemmet ar pennad-mañ',
 'alreadyrolled' => "Dibosupl eo disteuler ar c'hemm diwezhañ graet d'ar bajenn [[:$1]] gant [[User:$2|$2]] ([[User talk:$2|Kaozeal]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2756,6 +2764,7 @@ Miret eo an holl enporzhiadennoù etrewiki e-barzh [[Special:Log/import|log an e
 'import-interwiki-templates' => 'Lakaat e-barzh an holl batromoù',
 'import-interwiki-submit' => 'Enporzhiañ',
 'import-interwiki-namespace' => 'Esaouenn anv ar pal :',
+'import-interwiki-rootpage' => 'Pennpajenn kas (war zibab)',
 'import-upload-filename' => 'Anv ar restr :',
 'import-comment' => 'Notenn :',
 'importtext' => "Ezporzhiit ar restr adal ar wiki orin en ur ober gant an arc'hwel [[Special:Export|ezporzhiañ]].
@@ -2789,6 +2798,8 @@ Enrollit ar bajenn war hoc'h urzhiataer ha kargit anezhi amañ.",
 'import-error-special' => 'Ne vez ket enporzhiet ar bajenn "$1" rak stag eo ouzh un esaouenn anv dibar na aotre ket pajennoù.',
 'import-error-invalid' => 'Ne vez ket enporzhiet ar bajenn "$1" rak direizh eo hec\'h anv.',
 'import-options-wrong' => '{{PLURAL:$2|Dibab fall|Dibaboù fall}}: <nowiki>$1</nowiki>',
+'import-rootpage-invalid' => "Pourchas a ra ar bennbajenn un titl n'eo ket reizh.",
+'import-rootpage-nosubpage' => 'Esaouenn anvioù "$1" eus ar bennpajenn ne aotre ket an ispajennoù.',
 
 # Import log
 'importlogpage' => 'Log an enporzhiadennoù',
index 8c02b3f..f7e74ac 100644 (file)
@@ -1432,7 +1432,7 @@ $1",
 'nchanges' => '$1 {{PLURAL:$1|گۆڕانکاری|گۆڕانکاری}}',
 'recentchanges' => 'دوایین گۆڕانکارییەکان',
 'recentchanges-legend' => 'ھەڵبژاردەکانی دوایین گۆڕانکارییەکان',
-'recentchanges-summary' => 'لەم پەڕەدا بە دوای دوایین گۆڕانکارییەکان لەم ویکیەدا بکەوە.',
+'recentchanges-summary' => 'دوایین گۆڕانکارییەکانیی ویکی لەم پەڕەیەدا ببینە.',
 'recentchanges-feed-description' => 'دوای دوایین گۆڕانکارییەکانی ئەم ویکیە بکەوە لەم «فید»ەوە.',
 'recentchanges-label-newpage' => 'ئەم دەستکارییە لاپەڕەیەکی نوێی دروستکرد',
 'recentchanges-label-minor' => 'ئەمە دەستکاریەکی بچووکە',
index ac3ed2b..c551ac2 100644 (file)
@@ -436,7 +436,7 @@ $1',
 'portal' => 'Forside for skribenter',
 'portal-url' => 'Project:Forside',
 'privacy' => 'Behandling af personlige oplysninger',
-'privacypage' => 'Project:Behandling_af_personlige_oplysninger',
+'privacypage' => 'Project:Behandling af personlige oplysninger',
 
 'badaccess' => 'Manglende rettigheder',
 'badaccess-group0' => 'Du har ikke de nødvendige rettigheder til denne handling.',
@@ -531,15 +531,15 @@ Gør venligst en [[Special:ListUsers/sysop|administrator]] opmærksom på det, o
 'missingarticle-diff' => '(Forskel: $1, $2)',
 'readonly_lag' => 'Databasen er automatisk blevet låst mens slave database serverne synkronisere med master databasen',
 'internalerror' => 'Intern fejl',
-'internalerror_info' => 'Internal fejl: $1',
-'fileappenderrorread' => 'Kunne ikke læse "$1" under tilføjelsen.',
+'internalerror_info' => 'Intern fejl: $1',
+'fileappenderrorread' => 'Kunne ikke læse "$1" mens der blev tilføjet data.',
 'fileappenderror' => 'Kunne ikke tilføje "$1" til "$2".',
 'filecopyerror' => 'Kunne ikke kopiere filen "$1" til "$2".',
 'filerenameerror' => 'Kunne ikke omdøbe filen "$1" til "$2".',
 'filedeleteerror' => 'Kunne ikke slette filen "$1".',
-'directorycreateerror' => 'Kunne ikke oprette kataloget "$1".',
+'directorycreateerror' => 'Kunne ikke oprette mappen "$1".',
 'filenotfound' => 'Kunne ikke finde filen "$1".',
-'fileexistserror' => 'Kunne ikke oprette "$1": filen findes allerede',
+'fileexistserror' => 'Kunne ikke oprette "$1": filen findes allerede.',
 'unexpected' => 'Uventet værdi: "$1"="$2".',
 'formerror' => 'Fejl: Kunne ikke afsende formular',
 'badarticleerror' => 'Denne funktion kan ikke udføres på denne side.',
@@ -599,9 +599,9 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'yourname' => 'Dit brugernavn:',
 'yourpassword' => 'Din adgangskode:',
 'yourpasswordagain' => 'Gentag adgangskode',
-'remembermypassword' => 'Husk mit brugernavn på denne computer (højst $1 {{PLURAL:$1|dag|dage}})',
+'remembermypassword' => 'Husk mit brugernavn i denne browser (højst $1 {{PLURAL:$1|dag|dage}})',
 'securelogin-stick-https' => 'Behold forbindelsen til HTTPS efter login',
-'yourdomainname' => 'Dit domænenavn',
+'yourdomainname' => 'Dit domænenavn:',
 'password-change-forbidden' => 'Du kan ikke ændre adgangskoder på denne wiki.',
 'externaldberror' => 'Der er opstået en fejl i en ekstern adgangsdatabase, eller du har ikke rettigheder til at opdatere denne.',
 'login' => 'Log på',
@@ -612,10 +612,10 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'logout' => 'Log af',
 'userlogout' => 'Log af',
 'notloggedin' => 'Ikke logget på',
-'nologin' => "Du har ingen brugerkonto? '''$1'''.",
-'nologinlink' => 'Opret ny brugerkonto',
-'createaccount' => 'Opret en ny konto',
-'gotaccount' => "Du har allerede en brugerkonto? '''$1'''.",
+'nologin' => 'Har du ingen konto? $1.',
+'nologinlink' => 'Opret en ny brugerkonto',
+'createaccount' => 'Opret en ny brugerkonto',
+'gotaccount' => 'Har du allerede en konto? $1.',
 'gotaccountlink' => 'Log på',
 'userlogin-resetlink' => 'Har du glemt dine login oplysninger?',
 'createaccountmail' => 'via e-mail',
@@ -624,14 +624,14 @@ Din konto er blevet oprettet. Glem ikke at personliggøre dine [[Special:Prefere
 'userexists' => 'Det brugernavn, du har valgt, er allerede i brug.
 Vælg venligst et andet brugernavn.',
 'loginerror' => 'Logon mislykket',
-'createaccounterror' => 'Kunne ikke oprette konto: $1',
+'createaccounterror' => 'Kunne ikke oprette brugerkonto: $1',
 'nocookiesnew' => 'Din brugerkonto er nu oprettet, men du er ikke logget på. {{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Vær venlig at slå cookies til, og derefter kan du logge på med dit nye brugernavn og kodeord.',
 'nocookieslogin' => '{{SITENAME}} bruger cookies til at logge brugere på. Du har slået cookies fra. Slå dem venligst til og prøv igen.',
 'nocookiesfornew' => 'Denne brugerkonto er ikke oprettet, da vi ikke kunne bekræfte dens kilde.
 Sørg for, at du har aktivereret cookies, genindlæs siden og prøv igen.',
 'noname' => 'Du har ikke angivet et gyldigt brugernavn.',
 'loginsuccesstitle' => 'Du er nu logget på',
-'loginsuccess' => 'Du er nu logget på {{SITENAME}} som "$1".',
+'loginsuccess' => "'''Du er nu logget på {{SITENAME}} som \"\$1\".'''",
 'nosuchuser' => 'Der er ingen bruger med navnet "$1".
 Der skelnes mellem store og bogstaver i brugernavne.
 Kontrollér stavemåden, eller [[Special:UserLogin/signup|opret en ny konto]].',
index 0814d4e..e9e63a9 100644 (file)
@@ -931,7 +931,7 @@ Möglicherweise hast du dein Passwort bereits erfolgreich geändert oder ein neu
 'passwordreset-text' => 'Bitte dieses Formular ausfüllen, um per E-Mail eine Erinnerung zu den Anmeldeinformationen deines Benutzerkontos zu erhalten.',
 'passwordreset-legend' => 'Passwort zurücksetzen',
 'passwordreset-disabled' => 'Das Zurücksetzen von Passwörtern wurde in diesem Wiki deaktiviert.',
-'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein}}',
+'passwordreset-pretext' => '{{PLURAL:$1||Gib eines der folgenden Daten ein.}}',
 'passwordreset-username' => 'Benutzername:',
 'passwordreset-domain' => 'Domain:',
 'passwordreset-capture' => 'Die E-Mail-Nachricht ansehen?',
index 6b14116..98951a7 100644 (file)
@@ -341,7 +341,7 @@ $messages = array(
 'tog-uselivepreview' => 'Verqayto cınde bıxebetne (JavaScript lazımo) (hewna cerrebnayış dero)',
 'tog-forceeditsummary' => 'Mı ke xulasa kerde cı vira, hay be mı ser de',
 'tog-watchlisthideown' => 'Vurnayışanê mı lista mına seyrkerdışi de bınımne',
-'tog-watchlisthidebots' => 'Vurnayışanê boti lista mına seyrkerdışi de bınımne',
+'tog-watchlisthidebots' => 'Vurnayışanê bota liste da seyrkerdışi de bınımne',
 'tog-watchlisthideminor' => 'Vurnayışanê qıckekan lista mına seyrkerdışi de bınımne',
 'tog-watchlisthideliu' => 'Lista seyrkerdışi ra vurnayışanê karberanê cıkewteyan bınımne',
 'tog-watchlisthideanons' => 'Lista seyrkerdışi ra vurnayışanê karberanê anoniman bınımne',
@@ -1579,7 +1579,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'right-editusercss' => 'Dosyanê CSSiê karberanê binan sero bıgureye',
 'right-edituserjs' => 'Dosyanê JSiê karberanê binan sero bıgureye',
 'right-rollback' => 'Lez/herbi vurnayışanê karberê peyêni tekrar bıke, oyo ke yew be yew pelê sero gureyao',
-'right-markbotedits' => 'Vurnayışanê tekraran zey vurnayışanê boti nışan bıde',
+'right-markbotedits' => 'Vurnayışanê peyd ameyan, vurnayışê boti deye nışan kerê',
 'right-noratelimit' => 'Sinoranê xızi (rate limit) ra tesir nêbi',
 'right-import' => 'Pelan wikiyanê binan ra bia',
 'right-importupload' => 'Pelî dosya bar kerdişî ra import bike',
@@ -1647,7 +1647,7 @@ Kaberê bini ke şıma de kewti irtıbat, adresa e-postey şıma eşkera nêbena
 'recentchanges-feed-description' => 'Ena feed dı vurnayişanê tewr peniyan teqip bık.',
 'recentchanges-label-newpage' => 'Enê vurnayışi pelaya newi vıraşt',
 'recentchanges-label-minor' => 'Eno vurnayışo do qickek o',
-'recentchanges-label-bot' => 'Eno vurnayış terefê yew boti ra vıraziyo',
+'recentchanges-label-bot' => 'Yew boti xo het ra no vurnayış vıraşto',
 'recentchanges-label-unpatrolled' => 'Eno edît patrol nibiyo',
 'rcnote' => "Bıni dı {{PLURAL:$1|is '''1''' vurnayış|peni '''$1''' vurnayışan estê}} {{PLURAL:$2|roc|'''$2''' roci}}, hetani $5, $4.",
 'rcnotefrom' => "Cêr de vurnayîşê esto ke '''$2''' ra raver  (heta '''$1''' mucnayiyo).",
@@ -2095,7 +2095,7 @@ gıreyê her satıri de gıreyi; raş motışê yewın u dıyıni esto.
 'ninterwikis' => '$1 {{PLURAL:$1|interwiki|interwikiy}}',
 'nlinks' => '$1 {{PLURAL:$1|link|linkî}}',
 'nmembers' => '$1 {{PLURAL:$1|eza|ezayan}}',
-'nrevisions' => '$1 {{PLURAL:$1|revizyon|revizyonî}}',
+'nrevisions' => '$1 {{PLURAL:$1|vurnayış|vurnayışi}}',
 'nviews' => '$1 {{PLURAL:$1|vînayîş|vînayîşî}}',
 'nimagelinks' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
 'ntransclusions' => '$1 {{PLURAL:$1|pelayan de|pelayan de}} gurweyêno',
index fc8b319..6a1cdf0 100644 (file)
@@ -2322,7 +2322,7 @@ If the problem persists, contact an [[Special:ListUsers/sysop|administrator]].',
 'backend-fail-internal'      => 'An unknown error occurred in storage backend "$1".',
 'backend-fail-contenttype'   => 'Could not determine the content type of the file to store at "$1".',
 'backend-fail-batchsize'     => 'The storage backend was given a batch of $1 file {{PLURAL:$1|operation|operations}}; the limit is $2 {{PLURAL:$2|operation|operations}}.',
-'backend-fail-usable'        => 'Could not write file "$1" due to insufficient permissions or missing directories/containers.',
+'backend-fail-usable'        => 'Could not read or write file "$1" due to insufficient permissions or missing directories/containers.',
 
 # File journal errors
 'filejournal-fail-dbconnect' => 'Could not connect to the journal database for storage backend "$1".',
index b9d63d7..d2f5e76 100644 (file)
@@ -1118,7 +1118,7 @@ Kokeile [[Special:Search|hakua]] löytääksesi asiaan liittyviä sivuja.',
 'rev-deleted-comment' => '(muokkausyhteenveto poistettu)',
 'rev-deleted-user' => '(käyttäjänimi poistettu)',
 'rev-deleted-event' => '(lokitapahtuma poistettu)',
-'rev-deleted-user-contribs' => '[käyttäjänimi tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]',
+'rev-deleted-user-contribs' => '[käyttäjätunnus tai IP-osoite poistettu – muokkaus on piilotettu muokkausluettelosta]',
 'rev-deleted-text-permission' => "Tämä versio sivusta on '''poistettu'''.
 Lisätietoja löytyy [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} poistolokista].",
 'rev-deleted-text-unhide' => "Tämä versio sivusta on '''poistettu'''.
@@ -1520,7 +1520,7 @@ Tässä satunnaisesti tuotettu arvo, jota voit käyttää: $1',
 'right-writeapi' => 'Käyttää kirjoitus-APIa',
 'right-delete' => 'Poistaa sivuja',
 'right-bigdelete' => 'Poistaa sivuja, joilla on pitkä historia',
-'right-deletelogentry' => 'Poista ja palauta tiettyjä lokimerkintöjä',
+'right-deletelogentry' => 'Poistaa ja palauttaa tiettyjä lokimerkintöjä',
 'right-deleterevision' => 'Poistaa ja palauttaa sivujen versioita',
 'right-deletedhistory' => 'Tarkastella poistettuja versiotietoja ilman niihin liittyvää sisältöä',
 'right-deletedtext' => 'Tarkastella poistettujen sivujen tekstiä ja muutoksia poistettujen versioiden välillä',
index 59df7ce..532fa71 100644 (file)
@@ -3957,7 +3957,7 @@ Vous devriez avoir reçu [{{SERVER}}{{SCRIPTPATH}}/COPYING une copie de la Licen
 'version-software' => 'Logiciels installés',
 'version-software-product' => 'Produit',
 'version-software-version' => 'Version',
-'version-entrypoints' => 'URL de point d’entrée',
+'version-entrypoints' => 'URL des points d’entrée',
 'version-entrypoints-header-entrypoint' => "Point d'entrée",
 'version-entrypoints-header-url' => 'URL',
 'version-entrypoints-articlepath' => '[https://www.mediawiki.org/wiki/Manual:$wgArticlePath Chemin d\'article]',
index 473f0c6..17fe32d 100644 (file)
@@ -1360,7 +1360,7 @@ HTML નાકું ચકાસો',
 # Groups
 'group' => 'સમુહ',
 'group-user' => 'સભ્ય',
-'group-autoconfirmed' => 'સ્વયં ચલિત પરવાનગી મેળવેલ સભ્યો',
+'group-autoconfirmed' => 'સ્વયંચલિત માન્ય સભ્યો',
 'group-bot' => 'બૉટો',
 'group-sysop' => 'સાઇસૉપ/પ્રબંધકો',
 'group-bureaucrat' => 'રાજનૈતિકો',
@@ -1375,7 +1375,7 @@ HTML નાકું ચકાસો',
 'group-suppress-member' => '{{GENDER:$1|દુર્લક્ષ}}',
 
 'grouppage-user' => '{{ns:project}}:સભ્યો',
-'grouppage-autoconfirmed' => '{{ns:project}}:સà«\8dવà«\8dયàª\82àª\9aલિત àª¬àª¹àª¾àª²  સભ્યો',
+'grouppage-autoconfirmed' => '{{ns:project}}:સà«\8dવયàª\82àª\9aલિત àª®àª¾àª¨à«\8dય સભ્યો',
 'grouppage-bot' => '{{ns:project}}:બૉટો',
 'grouppage-sysop' => '{{ns:project}}:પ્રબંધકો',
 'grouppage-bureaucrat' => '{{ns:project}}: રાજનૈતિક',
@@ -2082,8 +2082,8 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization. જુઓ',
 
 # Special:ListGroupRights
 'listgrouprights' => 'સભ્ય જૂથ ના હક્કો',
-'listgrouprights-summary' => 'નà«\80àª\9aà«\87 àª\86 àªµàª¿àª\95િ àªªàª° àªªàª°àª¿àª­àª¾àª·àª¿àª¤ àª¸àª­à«\8dય àª\9cà«\82થનà«\80 àª¯àª¾àª¦àª¿ àª\86પà«\80 àª\9bà«\87 àª\85નà«\87 àª¤à«\87મના àª¹àª\95à«\8dàª\95à«\8b àªªàª£ àª\86પà«\87લા છે.
-નà«\80àª\9cà«\80 àª¹àª\95à«\8dàª\95à«\8b àª®àª¾àª\9fà«\87 [[{{MediaWiki:Listgrouprights-helppage}}|additional information]] àª®àª¾àª¹àª¿àª¤à«\80.',
+'listgrouprights-summary' => 'નà«\80àª\9aà«\87 àª\86 àªµàª¿àª\95િ àªªàª° àªµà«\8dયાàª\96à«\8dયાયિત àª¸àª­à«\8dય àª\9cà«\82થà«\8bનà«\80 àª¯àª¾àª¦à«\80, àª¤à«\87મનà«\80 àª¸àª¾àª¥à«\87 àª¸àª\82àª\95ળાયà«\87લા àª¹àª\95à«\8dàª\95à«\8b àª¸àª¾àª¥à«\87 àª\86પà«\80 છે.
+વà«\8dયàª\95à«\8dતિàª\97ત àª¹àª\95à«\8dàª\95à«\8b àª®àª¾àª\9fà«\87 [[{{MediaWiki:Listgrouprights-helppage}}|વધારાનà«\80 àª®àª¾àª¹àª¿àª¤à«\80]].',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">અધિકાર અપાયા</span>
 * <span class="listgrouprights-revoked">અધિકાર હટાવાયા</span>',
 'listgrouprights-group' => 'જૂથ',
index 9da7764..e34ebfd 100644 (file)
@@ -24,7 +24,7 @@ $messages = array(
 'tog-hidepatrolled' => 'Taguon ang mga nabantayan nga na islan na nga bag-o lang gin obra',
 'tog-newpageshidepatrolled' => 'Taguon ang mga nabantayan  nga pahina sa bag-ong lista sang mga pahina',
 'tog-extendwatchlist' => 'Palaparon ang watchlist para makita ang tanan nga mga na-islan, indi lang man sa pinaka bag-o',
-'tog-usenewrc' => 'Gamiton ang ginpanami nga bag-o lang gid nga na-islan (nagakilanlan JavaScript)',
+'tog-usenewrc' => 'Grupohon ang mga pagbag-o kada panid sa bag-o lang gid na ilisan kag sa ginabantayan (nagakilanlan sang JavaScript)',
 'tog-numberheadings' => 'Auto-numero heading',
 'tog-showtoolbar' => 'Ipakita ang edit toolbar (nagakilanlan JavaScript)',
 'tog-editondblclick' => 'Islan ang pahina kung i-doble klik mo (nagakilanlan JavaScript)',
@@ -32,17 +32,17 @@ $messages = array(
 'tog-editsectiononrightclick' => 'Sugtan ang pag-ilis sang seksyon paagi sa pagtum-ok sang natoo sa mouse sa titulo sang seksyon (nagakinahanglan sang JavaScript)',
 'tog-showtoc' => 'Ipakita ang sinulatan sang nagabug-os (para sang mga panid nga may yara sang masobra sa 3 nga pangolohan)',
 'tog-rememberpassword' => 'Dumdumon ang akon password sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
-'tog-watchcreations' => 'Idugang ang mga panid nga akon pagahimoon sa akon ginabantayan',
-'tog-watchdefault' => 'Idugang ang mga panid nga akon gina-ilisan sa akon ginabantayan',
-'tog-watchmoves' => 'Idugang ang mga panid nga akon pagasaylohon sa akon ginabantayan',
-'tog-watchdeletion' => 'Idugang ang mga panid nga akon pagadulaon sa akon ginabantayan',
+'tog-watchcreations' => 'Magdugang sang mga panid nga akon buhaton kag mga hilera nga akon igapasaka sa akon mga ginabantayan',
+'tog-watchdefault' => 'Idugang ang mga panid kag hilera nga akon ginbag-o sa akon mga ginabantayan',
+'tog-watchmoves' => 'Idugang ang mga panid kag hilera nga akon ginsaylo sa akon mga ginabantayan',
+'tog-watchdeletion' => 'Idugang ang mga panid kag hilera nga akon dulaon sa akon mga ginabantayan',
 'tog-minordefault' => 'Markahan dayon ang tanan nga diyutay nga pag-ilis',
 'tog-previewontop' => 'Ipakita ang preview bag-o ang kahon sang pag-ilis',
 'tog-previewonfirst' => 'Ipakita ang preview sa pinaka-una nga pag-ilis',
 'tog-nocache' => 'Untaton ang kina-iya sang brawser nga magtago sang panid',
-'tog-enotifwatchlistpages' => 'Padal-i ako sang e-mail kon ang panid nga akon ginabantayan paga-ilisan',
+'tog-enotifwatchlistpages' => 'Padal-i ako sang e-mail kon ang panid kag hilera nga akon ginabantayan paga-ilisan',
 'tog-enotifusertalkpages' => 'Padal-i ako sang e-mail kon paga-ilisan ang akon panid sang pag-hisayranay',
-'tog-enotifminoredits' => 'Padal-i man ako sang e-mail kon may diyutay nga pag-ilis sa akon mga panid',
+'tog-enotifminoredits' => 'Padal-i man ako sang e-mail kon may diyutay nga pag-ilis sa akon mga panid kag hilera',
 'tog-enotifrevealaddr' => 'Ipakita ang akon e-mail adres sa mga e-mail nga nagapahibalo',
 'tog-shownumberswatching' => 'Ipakita ang numero sang mga nagalantaw nga manug-gamit',
 'tog-oldsig' => 'Nagapabilin nga pirma:',
@@ -281,6 +281,10 @@ Lantawa ang [[Special:Version|panid sang mga bersiyon]].',
 'youhavenewmessages' => 'Ikaw may $1 ($2).',
 'newmessageslink' => 'mga bag-ong mensahe',
 'newmessagesdifflink' => 'nagligad nga ginbag-o',
+'youhavenewmessagesfromusers' => 'May yara ka sang $1 halin sa {{PLURAL:$3|lain nga manuggamit|$3 mga manuggamit}} ($2).',
+'youhavenewmessagesmanyusers' => 'May yara ka sang $1 halin sa madamo nga manuggamit ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|isa ka bag-o nga mensahe|bag-o nga mga mensahe}}',
+'newmessagesdifflinkplural' => 'pinaka-ulihi nga {{PLURAL:$1|pagbag-o|mga pagbag-o}}',
 'youhavenewmessagesmulti' => 'May mga bag-ong mensahe ka sa $1',
 'editsection' => 'ilisan',
 'editold' => 'ilisan',
@@ -333,11 +337,11 @@ May lista sang mga nagaka-igo nga mga espesyal nga mga panid sa [[Special:Specia
 'error' => 'Sala/Eror',
 'databaseerror' => 'May sala sa database',
 'dberrortext' => 'May sala sa syntax sang pagpangita sa database.
-Ini nagakahulogan nga basi may sapat-sapat sa software.
-Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
-<blockquote><tt>$1</tt></blockquote>
-nga halin sa buluhaton nga "<tt>$2</tt>".
-Ang database nagbalik sang sala/eror nga "<tt>$3: $4</tt>".',
+Ini nagakahulogan nga basi may sapat-sapat/bug sa software.
+Ang pinaka-ulihe nga pagtilaw sa pagpangita sa database amo ang:
+<blockquote><code>$1</code></blockquote>
+nga halin sa buluhaton nga "<code>$2</code>".
+Ang database nagbalik sang sala/eror nga "<samp>$3: $4</samp>".',
 'dberrortextcl' => 'May sala sa syntax sang pagpangita sa database.
 Ang pinaka-ulihe nga pamilit sa pagpangita sa database amo ang:
 "$1"
@@ -373,22 +377,27 @@ Palihog isugid sa [[Special:ListUsers/sysop|administrador]], kag i-lista ang iya
 'badarticleerror' => 'Ang ini nga hulag indi pwede mabuhat sa sini nga panid.',
 'cannotdelete' => 'Ang panid ukon hilera nga "$1" indi mahimo nga pagapanason.
 Mahimo nga napanas na ini sang iban.',
+'cannotdelete-title' => 'Indi mahimo nga dulaon ang panid nga "$1"',
+'delete-hook-aborted' => 'Ang pag-ilis gin-untat sang taga.
+Wala ini naghatag sang ano man nga eksplenasyon.',
 'badtitle' => 'Malain nga titulo',
 'badtitletext' => 'Ang ginapangayo mo nga titulo ka pahina ay sala, blangko, ukon indi ensakto ang pagtabid sang inter-lengwahe o inter-wiki na titulo.
 Siguro may-ara ini sang isa ukon madamo nga karakter nga indi ginabaton kag ginagamit sa titulo.',
-'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o. A maximum of {{PLURAL:$1|one result is|$1 results are}} available in the cache.',
-'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1. A maximum of {{PLURAL:$4|one result is|$4 results are}} available in the cache.',
+'perfcached' => 'Ang masunod nga datos nakatago lamang kag mahimo nga indi bag-o. May maksimum nga {{PLURAL:$1|isa ka resulta nga|$1 mga resulta nga}} ara sa nakatago nga datos.',
+'perfcachedts' => 'Ang masunod nga datos nakatago lamang, kag pinaka-ulihe nga ginbag-o sang $1. May maksimum nga {{PLURAL:$4|isa ka resulta nga|$4 mga resulta nga}} ara sa nakatago nga datos.',
 'querypage-no-updates' => 'Ang mga pagbag-o sa sini nga panid karon ginpa-untat.
 Ang datos nga yari diri indi pagliwaton.',
 'wrong_wfQuery_params' => 'Indi insakto nga mga parametro sa wfQuery()<br />
 Kapuslanan: $1<br />
 Pagpamangkot: $2',
 'viewsource' => 'Lantawon ang ginhalinan',
+'viewsource-title' => 'Lantawon ang ginhalinan sang $1',
 'actionthrottled' => 'Ang paghulag ginpunggan',
 'actionthrottledtext' => 'Bilang pagpangontra sa span, ginalimitahan ka sa pagbuhat sang sini nga paghulag sa tuman ka damo nga beses sa malip-ot nga tinion, kag naglapaw ka na sa sini nga patakaran.
 Palihog tilawan mo liwat pagkatapos sang malip-ot nga tinion.',
 'protectedpagetext' => 'Ang ini nga panid ginpangapinan agod to mapunggan ang pag-ilis sini.',
 'viewsourcetext' => 'Mahimo mo nga makita kag makopya ang ginhalinan sang sini nga panid:',
+'viewyourtext' => "Mahimo mo nga makita kag makopya ang ginhalinan sang '''imo mga pagbag-o''' sa sini nga panid:",
 'protectedinterface' => 'Ang ini nga panid nagahatag sang mga teksto sang interface para sa software, kag ginapangapinan agod indi maabuso.',
 'editinginterface' => "'''Pahibalo:''' Naga-ilis ka sang panid nga ginagamit sa paghatag sang mga teksto sang interface para sa software.
 Ang mga pagbag-o sang sini nga panid maga-apekto sa hitsura sang interface sang panid sang manug-gamit sang iban.
@@ -402,6 +411,13 @@ $2',
 'ns-specialprotected' => 'Ang mga espesyal nga panid indi mahimo nga paga-ilisan.',
 'titleprotected' => 'Ang ini nga titulo ginpangapinan batok sa pagbuhat ni [[User:$1|$1]].
 Ang iya rason amo ang "\'\'$2\'\'".',
+'filereadonlyerror' => 'Indi mahimo nga ma-ilisan ang hilera nga "$1" tungod kay ang gintaguan sang mga hilera nga "$2" ara sa estado nga mahimo lang mabasa.
+
+Ang administrador nga nag-kandado sini naghatag sang paathag nga: "$3".',
+'invalidtitle-knownnamespace' => 'Sala ang titulo sang may ngalanligwa nga "$2" kag taksto nga "$3"',
+'invalidtitle-unknownnamespace' => 'Sala nga titulo nga may wala mahibaluan nga ngalanligwa nga numero nga $1 kag teksto nga "$2"',
+'exception-nologin' => 'Wala naka-sulod',
+'exception-nologin-text' => 'Ang ini nga panid ukon tikang nagakinahanglan nga ikaw nakasulod/log-in sa sini nga wiki.',
 
 # Virus scanner
 'virus-badscanner' => "Malain nga konpigurasyon: wala makilal-an nga manuglantaw sang virus: ''$1''",
@@ -422,6 +438,7 @@ Indi pagkalimti ang pag-ilis sang imo mga [[Special:Preferences|{{SITENAME}} pag
 'remembermypassword' => 'Dumdumon ang akon pagsulod sa sini nga brawser (para sa indi magsobra $1 {{PLURAL:$1|nga adlaw|nga mga adlaw}})',
 'securelogin-stick-https' => 'Magpabilin nga nakatakod sa HTTPS pagkatapos magsulod',
 'yourdomainname' => 'Imo dominyo',
+'password-change-forbidden' => 'Indi ka mahimo nga makailis sang pasword sa sini nga wiki.',
 'externaldberror' => 'Mahimo nga may ara sang sala sa pagpamatood sang database ukon wala ka sa lugar nga magbag-o sang imo pang-guha nga akawnt.',
 'login' => 'Mag sulod',
 'nav-login-createaccount' => 'Magsulod / maghimo account',
@@ -501,6 +518,7 @@ Wala pa sang e-mail nga ipadala diri para sa bisan ano sa masunod nga mga katung
 'invalidemailaddress' => 'Ang e-mail adres indi mabaton tungod kay nagagwa nga sala ang iya plastar.
 Palihog butang sang ginplastar sing maayo nga adres ukon panason nal lang ang lugar.',
 'cannotchangeemail' => 'Ang mga e-mail adres indi mahimo nga ilisan sa sini nga wiki.',
+'emaildisabled' => 'Ang ini nga lugar indi makapadala sang mga e-mail.',
 'accountcreated' => 'Nahimo na ang akawnt',
 'accountcreatedtext' => 'Ang akawnt sang manug-gamit nga $1 nahimo na.',
 'createaccount-title' => 'Pagbuhat sang akawnt para sa {{SITENAME}}',
@@ -682,17 +700,20 @@ o [{{fullurl:{{FULLPAGENAME}}|action=edit}} islan ini nga pahina]</span>.',
 'noarticletext-nopermission' => 'Wala subong sang teksto ang ini nga panid.
 Pwede ka [[Special:Search/{{PAGENAME}}|mangita para sa titulo sang ini nga panid]] sa iban man nga panid,
 ukon <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} mangita ka sang kaparehas nga logs]</span>.',
+'missing-revision' => 'Ang ini nga pag-ilis nga #$1 sang panid nga ginhinanglan nga "{{PAGENAME}}" wala naga-eksister.
+
+Ini kalabanan ginabuhat sang nagasunod nga wala na mabag-o nga link sang hisayranay sa isa ka panid nga gindula na.
+Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 'userpage-userdoesnotexist' => 'Ang akawnt sang manuggamit nga "<nowiki>$1</nowiki>" wala pa marehistro.
 Palihog tsek kon luyag mo nga himuon/ilisan ang ini nga panid.',
 'userpage-userdoesnotexist-view' => 'Ang akawnt sang manuggamit nga "$1" wala pa marehistro.',
 'blocked-notice-logextract' => 'Ang ini nga manuggamit ginapunggan karon.
 Ang pinaka-ulihi nga log sa pagpuggong yara sa idalom para mahibaluan nimo:',
 'clearyourcache' => "'''Tandaan:''' Pagkatapos nga tiponon, mahimo nga kinahanglan mo pa nga i-baipas ang cache sang imo brawser agod makita ang mga pagbag-o.
-* '''Firefox / Safari:''' pinduton sing madugay ang ''Shift'' samtang ginapitik ang ''Reload'', ukon pinduton ang ''Ctrl-F5'' ukon ''Ctrl-R'' (''Command-R'' sa Mac)
-* '''Google Chrome:''' pinduton ang ''Ctrl-Shift-R'' (''Command-Shift-R'' sa Mac)
+* '''Firefox / Safari:''' pinduton sing madugay ang ''Shift'' samtang ginapitik ang ''Reload'', ukon pinduton ang ''Ctrl-F5'' ukon ''Ctrl-R'' (''-R'' sa Mac)
+* '''Google Chrome:''' pinduton ang ''Ctrl-Shift-R'' (''-Shift-R'' sa Mac)
 * '''Internet Explorer:''' pinduton sing madugay ang ''Ctrl'' samtang ginapitik ''Refresh'', ukon pinduton ang ''Ctrl-F5''
-* '''Konqueror:''' pitikon ang ''Reload'' ukon pinduton ang ''F5''
-* '''Opera:''' hawanon ang  cache sa ''Tools → Preferences''",
+* '''Opera:''' Tan-awon ang  cache sa ''Tools → Preferences''",
 'usercssyoucanpreview' => "'''Pagbulig:''' Gamiton ang \"{{int:showpreview}}\" nga tulom-ukon agod matilawan ang imo bag-o nga CSS bag-o magtipon.",
 'userjsyoucanpreview' => "'''Pagbulig:''' Gamiton ang \"{{int:showpreview}}\" nga tulom-ukon agod matilawan ang imo bag-o nga JavaScript bag-o magtipon.",
 'usercsspreview' => "'''Tandai nga ginalantaw mo pa lang ang imo CSS sang manuggamit.'''
@@ -709,6 +730,7 @@ Sa mga pahungod nga mga panid nga .css and .js magamit sang titulo nga may gagma
 'note' => "'''Pansinon:'''",
 'previewnote' => "'''Tandaan nga prebyu lamang ini.'''
 Wala pa nabutang ang imo nga ginbag-o!",
+'continue-editing' => 'Padayunon ang pagbag-o',
 'previewconflict' => 'Ang ini nga paglantaw nagapakita sang mga teksto nga yara sa may ibabaw ayon nga amo man ang magagwa kon luyag mo na ini nga pagatiponon.',
 'session_fail_preview' => "'''Nagapangayo kami sang pasaylo! Indi namon ma-proseso ang imo pag-ilis tungod sa pagkadula sang datos sang sesyon.'''
 Palihog tilawi liwat.
@@ -724,6 +746,7 @@ Ang pag-ilis wala ginbaton agod to nga malikawan ang kalainan sang mga teksto sa
 Ini nagakatabo kon kaisa kon nagagamit ka sang nakabase sa web nga serbisyo proxy nga madamo sing lusot.",
 'edit_form_incomplete' => "'''Ang iban nga bahin sang formas sa pag-ilis wala nakalab-ot sa serber; palihog verificar kon ang imo pag-ilis santo man sa gihapon kag tilawi liwat.'''",
 'editing' => 'Gina-islan $1',
+'creating' => 'Ginabuhat ang $1',
 'editingsection' => 'Gina-Islan $1 (seksiyon)',
 'editingcomment' => 'Gina-islan ang $1 (bag-o nga bahin)',
 'editconflict' => 'May pagpamatok sa pag-ilis: $1',
@@ -747,7 +770,7 @@ Naga promisa ka man sa amon nga ikaw mismo ang nagsulat sina, o ginkopya mo ini
 Kon indi mo luyag nga ang imo sinulatan paga-ilisan nga wala sin kaluoy, ginapangabay nga indi mo ina diri pag-ipasa.<br />
 Ikam man nagasumpa sa amon karon nga ikaw mismo ang nagsulat sini, ukon ginkopya mo ini sa pampubliko nga domain ukon kaparehas nga libre nga ginkuhaan (palihog lantaw sang $1 sa mga detalye).
 '''Indi magpadala sang mga na kapirayt nga mga inubrahan nga wala sing lisensya!'''",
-'longpageerror' => "'''Eror: Ang teksto nga imo ginpasa may kalabaon nga $1, nga mas malaba pa sang ginpasugtan nga labing malaba nga $2.'''
+'longpageerror' => "'''Eror: Ang teksto nga imo ginpasa may kalabaon nga {{PLURAL:$1|isa ka kilobayt|$1 ka mga kilobayt}}, nga mas malaba pa sang ginpasugtan nga labing malaba nga {{PLURAL:$2|isa ka kilobayt|$2 ka mga kilobayt}}.'''
 Indi ini matipon.",
 'readonlywarning' => "'''Phibalo: Ang database ginkandaduhan para sa pagpabilin, gani indi ka mahimo nga magtipon sang imo mga pag-ilis subong.'''
 Mahimo nga maluyagon ikaw nga mag-utod-kag-tapik sang teksto sa isa kag hilera sang teksto kag ini pagatipon mo sa lain nga tinion.
@@ -790,6 +813,7 @@ Ini nagapakita nga gindula na.',
 'edit-no-change' => 'Ang imo pag-ilis ginpabayaan lamang, kay wala sang pagbag-o nga natabo sa teksto.',
 'edit-already-exists' => 'Indi mahimo ang bag-o nga panid.
 Naga-eksister na ini.',
+'defaultmessagetext' => 'Teksto sang mensahe nga wala pa ma-ilisan',
 
 # Parser/template warnings
 'expensive-parserfunction-warning' => "'''Pahibalo:''' Ang ini nga panid may yara sang madamo nga mahal nga pagtawag sang kapusalanan parser.
@@ -805,6 +829,13 @@ Ang ini nga pagbinaisay wala na gin-upod pa.",
 'parser-template-loop-warning' => 'Ang natiktikan nga pagpukot: [[$1]]',
 'parser-template-recursion-depth-warning' => 'Ang ginalimitahan nga rekursyon sang templeyt nalab-ot na ($1)',
 'language-converter-depth-warning' => 'Ang ginalimitahan nga kadalumon sa pag-ilis sang hambalanon nalab-ot na ($1)',
+'node-count-exceeded-category' => 'Mga panid kon diin ang pag-isip sang node nagsobra',
+'node-count-exceeded-warning' => 'Ang panid nagsobra na sa pag-isip sang node',
+'expansion-depth-exceeded-category' => 'Mga panid kon diin ang kadalumon sang pagpalapad nagsobra na',
+'expansion-depth-exceeded-warning' => 'Ang panid nagsobra na sa kadalumon sang pagpalapad',
+'parser-unstrip-loop-warning' => 'May loop nga unstrip nga nakita',
+'parser-unstrip-recursion-limit' => 'Naglapaw ka na sa ginapasugtan nga pagliwat-liwat ($1)',
+'converter-manual-rule-error' => 'May sala nga nakita sa mano-mano nga pagsulunsan sa pagbadbad sang lenggwahe',
 
 # "Undo" feature
 'undo-success' => 'Ang pag-ilis indi mahuman.
@@ -943,6 +974,7 @@ Palihog sekyar sang mga logs.',
 'revdelete-reason-dropdown' => '*Masami nga rason sang pagdula
 ** Paglapas sang kinamatarong-kontra-pagkopya
 ** Indi nagakadapat nga impormasyon pangkaugalingon
+** Indi nagakadapat nga gamit-pangalan
 ** Mahimo nagapangguba-kinamatarong nga impormasyon',
 'revdelete-otherreason' => 'Iban/dugang nga rason:',
 'revdelete-reasonotherlist' => 'Iban nga rason',
@@ -952,7 +984,7 @@ Palihog sekyar sang mga logs.',
 # Suppression log
 'suppressionlog' => 'Log sang pagkakas',
 'suppressionlogtext' => 'Sa idalom isa ka lista sang mga gindula kag pagpugong nga naga-dala sang mga unod nga gintago halin sa mga administrador.
-Lantawa ang [[Special:BlockList|lista sang mga ginpunggan nga IP]] para sa lista sang mga naga-eksister nga pagdula kag pagpugong.',
+Lantawa ang [[Special:BlockList|lista sang mga ginpunggan]] para sa lista sang mga naga-eksister nga pagdula kag pagpugong.',
 
 # History merging
 'mergehistory' => 'Isugpon ang mga kasaysayan sang panid',
@@ -986,7 +1018,9 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 'mergelogpagetext' => 'Sa dalom isa ka lista sang mga pinaka-ulihe nga pagsugpon sang isa ka kasaysayan sang panid sa isa pa gid.',
 
 # Diffs
-'history-title' => 'Rebisyon sang historya sa "$1"',
+'history-title' => 'Rebisyon sang hisayranay sa "$1"',
+'difference-title' => 'Kinalain sang mga pagbag-o sa "$1"',
+'difference-title-multipage' => 'Kinalain sang mga panid nga "$1" kag "$2"',
 'difference-multipage' => '(Kinala-in sang mga panid)',
 'lineno' => 'Linya $1:',
 'compareselectedversions' => 'I-kompara ang pinilian nga mga rebisyon',
@@ -994,6 +1028,10 @@ Tandai nga ang paggamit sang mga link sa pagnabigar magaliwat sining hilera.',
 'editundo' => 'bawi-on ang pag ilis',
 'diff-multi' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang {{PLURAL:$2|isa ka manuggamit|$2 ka mga manuggamit}} nga wala ginpakita)',
 'diff-multi-manyusers' => '({{PLURAL:$1|Isa ka tunga-tunga nga pagbag-o|$1 ka tunga-tunga nga mga pagbag-o}} sang masobra $2 ka {{PLURAL:$2|manuggamit|mga manuggamit}} nga wala ginpakita)',
+'difference-missing-revision' => 'May {{PLURAL:$2|isa ka pagbag-o|$2 ka mga pagbag-o}} san sini nga kinalain ($1) ang wala makita.
+
+Ini kalabanan ginabuhat sang nagasunod nga wala na mabag-o nga link sang isa ka panid nga gindula na.
+Ang mga detalye mahimo nga makita sa [{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} deletion log].',
 
 # Search results
 'searchresults' => 'Resulta sang Pagpangita',
@@ -1084,11 +1122,12 @@ Tandai nga ang ila nga palasulundan sang mga unod sang {{SITENAME}} mahimo nga m
 'prefs-beta' => 'Mga kaupod sang Beta',
 'prefs-datetime' => 'Petsa kag oras',
 'prefs-labs' => 'Mga kaupod sang Labs',
+'prefs-user-pages' => 'Mga panid sang manuggamit',
 'prefs-personal' => 'Profayl sang manuggamit',
 'prefs-rc' => 'Mga Bag-o nga Inislan',
 'prefs-watchlist' => 'Lista sang mga ginabantayan',
 'prefs-watchlist-days' => 'Mga adlaw nga ipakita sa lista sang ginabantayan:',
-'prefs-watchlist-days-max' => 'Maximum $1 {{PLURAL:$1|day|days}}',
+'prefs-watchlist-days-max' => 'Indi magtaas sa $1 {{PLURAL:$1|ka adlaw|ka mga adlaw}}',
 'prefs-watchlist-edits' => 'Ang pinakataas nga beses sang pag-ilis nga ipakita sa ginpalawig nga lista sang ginabantayan:',
 'prefs-watchlist-edits-max' => 'Pinakataas nga numero: 1000',
 'prefs-watchlist-token' => 'Token sang lista sang ginabantayan:',
@@ -1168,6 +1207,11 @@ Ini indi dapat nga magsobra sa $1 {{PLURAL:$1|ka karakter|ka mga karakter}} ang
 'gender-female' => 'Babayi',
 'prefs-help-gender' => '',
 'email' => 'E-mail',
+'prefs-help-realname' => 'Ang matood-tood nga pangalan mahimo nga indi gamiton.
+Kon imo ini luyag nga ihatag, ini gamiton sa paghatag sing pagkilala sa imo nga gin-ubra.',
+'prefs-help-email' => 'Ang adres sang e-mail mahimo nga indi ihatag, apang kinahanglan ini sa pagliwat sang paswod, kon matabo nga imo ini malipatan.',
+'prefs-help-email-others' => 'Mahimo mo man pilion nga ma-kontak ka sang iban paagi sa e-mail paagi sa isa ka link sa imo manuggamit ukon gina-hisayranay nga panid.
+Ang imo adres sang e-mail wala ginapakita kon kontakon ka sang iban.',
 'prefs-help-email-required' => 'Kinahanglan ang imo e-mail',
 'prefs-signature' => 'pirma',
 
index f58fa4f..6f4477b 100644 (file)
@@ -2089,6 +2089,7 @@ Molimo obratite pozornost da druge web stranice mogu povezivati sliku izravnim U
 Možete suziti prikaz odabirući tip evidencije, suradničko ime ili stranicu u upitu.',
 'logempty' => 'Nema pronađenih stavki.',
 'log-title-wildcard' => 'Traži stranice koje počinju s navedenim izrazom',
+'showhideselectedlogentries' => 'Otkrij/sakrij odabrane evidencije',
 
 # Special:AllPages
 'allpages' => 'Sve stranice',
index e6c6ffe..3edb6c7 100644 (file)
@@ -578,7 +578,7 @@ $messages = array(
 'categorypage' => 'カテゴリのページを表示',
 'viewtalkpage' => '議論を表示',
 'otherlanguages' => '他言語版',
-'redirectedfrom' => '($1から転送)',
+'redirectedfrom' => '($1から転送)',
 'redirectpagesub' => 'リダイレクトページ',
 'lastmodifiedat' => 'このページが最後に更新されたのは $1 $2 です。',
 'viewcount' => 'このページは {{PLURAL:$1|$1 回}}アクセスされました。',
@@ -625,7 +625,7 @@ $1',
 
 'ok' => 'OK',
 'retrievedfrom' => '「$1」から取得',
-'youhavenewmessages' => '$1があります($2)。',
+'youhavenewmessages' => '$1があります ($2)。',
 'newmessageslink' => '新着メッセージ',
 'newmessagesdifflink' => '最終更新の差分',
 'youhavenewmessagesfromusers' => '{{PLURAL:$3|他の利用者|$3 人の利用者}}からの$1があります ($2)。',
@@ -835,7 +835,7 @@ Cookieを有効にしていることを確認して、このページを再読
 'password-login-forbidden' => 'この利用者名とパスワードの使用は禁止されています。',
 'mailmypassword' => '新しいパスワードをメールで送信',
 'passwordremindertitle' => '{{SITENAME}}の仮パスワード通知',
-'passwordremindertext' => '誰か(おそらくあなた)がIPアドレス$1から{{SITENAME}}($4)のログイン用パスワードの再発行を申請しました。
+'passwordremindertext' => '誰か(おそらくあなた)がIPアドレス$1から{{SITENAME}} ($4) のログイン用パスワードの再発行を申請しました。
 利用者「$2」の仮パスワードが作成され「$3」に設定されました。
 もしあなたがこの申請をしたのであれば、ログインして新しいパスワードを決めてください。
 この仮パスワードは {{PLURAL:$5|$5 日間}}で有効期限が切れます。
@@ -1049,7 +1049,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 <span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連する記録を検索]するか、
 [{{fullurl:{{FULLPAGENAME}}|action=edit}} このページを編集]</span>することができます。',
 'noarticletext-nopermission' => '現在このページには内容がありません。他のページに含まれる[[Special:Search/{{PAGENAME}}|このページ名を検索]]するか、もしくは<span class="plainlinks">[{{fullurl:{{#Special:Log}}|page={{FULLPAGENAMEE}}}} 関連記録を検索]</span>することができます。',
-'missing-revision' => '「{{PAGENAME}}」というページの #$1 という版は存在しません。
+'missing-revision' => '「{{PAGENAME}}」というページの版番号 $1 の版は存在しません。
 
 通常、削除されたページの版への古い差分表示や固定リンクをたどった際に、このようなことが起きます。 
 詳細は[{{fullurl:{{#Special:Log}}/delete|page={{FULLPAGENAMEE}}}} 削除記録]を参照してください。',
@@ -1192,7 +1192,7 @@ IP アドレスは複数の利用者で共有されている場合がありま
 下記の差分を確認して、本当に取り消していいか検証してください。よろしければ変更を保存して取り消しを完了してください。',
 'undo-failure' => '中間の版での編集と競合したため、取り消せませんでした。',
 'undo-norev' => '取り消そうとした編集が存在しないか削除済みのため取り消せませんでした。',
-'undo-summary' => '[[Special:Contributions/$2|$2]]([[User talk:$2|トーク]])による第$1版を取り消し',
+'undo-summary' => '[[Special:Contributions/$2|$2]] ([[User talk:$2|トーク]]) による版 $1 を取り消し',
 
 # Account creation failure
 'cantcreateaccounttitle' => 'アカウントを作成できません',
@@ -1416,8 +1416,8 @@ $1",
 'search-result-size' => '$1({{PLURAL:$2|$2単語}})',
 'search-result-category-size' => '{{PLURAL:$1|$1件}}({{PLURAL:$2|$2下位カテゴリ}}、{{PLURAL:$3|$3ファイル}})',
 'search-result-score' => '関連度:$1%',
-'search-redirect' => '($1からのリダイレクト)',
-'search-section' => '($1の節)',
+'search-redirect' => '($1からのリダイレクト)',
+'search-section' => '($1の節)',
 'search-suggest' => 'もしかして:$1',
 'search-interwiki-caption' => '姉妹プロジェクト',
 'search-interwiki-default' => '$1の結果:',
@@ -1429,9 +1429,9 @@ $1",
 'searcheverything-enable' => 'すべての名前空間を検索',
 'searchrelated' => '関連',
 'searchall' => 'すべて',
-'showingresults' => "'''$2'''件目以降の{{PLURAL:$1|'''$1'''件の結果}}を表示しています。",
-'showingresultsnum' => "'''$2'''件目以降の{{PLURAL:$3|'''$3'''件の結果}}を表示しています。",
-'showingresultsheader' => "ã\80\8c'''$4'''ã\80\8dã\81«å¯¾ã\81\99ã\82\8b{{PLURAL:$5|'''$3'''件中ã\81®'''$1'''件ã\81®çµ\90æ\9e\9c|'''$3'''件中ã\81®'''$1'''件ç\9b®ã\81\8bã\82\89'''$2'''件ç\9b®ã\81®çµ\90æ\9e\9c}}",
+'showingresults' => "'''$2''' 件目以降の {{PLURAL:$1|'''$1''' 件の結果}}を表示しています。",
+'showingresultsnum' => "'''$2''' 件目以降の {{PLURAL:$3|'''$3''' 件の結果}}を表示しています。",
+'showingresultsheader' => "ã\80\8c'''$4'''ã\80\8dã\81®æ¤\9cç´¢çµ\90æ\9e\9c {{PLURAL:$5|'''$3''' ä»¶ä¸­ã\81® '''$1''' ä»¶ç\9b®|'''$3''' ä»¶ä¸­ã\81® '''$1''' ä»¶ç\9b®ã\81\8bã\82\89 '''$2''' ä»¶ç\9b®}}",
 'nonefound' => "'''注意''':既定では一部の名前空間のみを検索します。
 ''all:''を前に付けると、すべて(トークページやテンプレートなどを含む)を対象にできます。検索する名前空間を前に付けることもできます。",
 'search-nonefound' => '問い合わせに合致する検索結果はありませんでした。',
@@ -1508,7 +1508,7 @@ $1",
 'localtime' => 'ローカルの時刻:',
 'timezoneuseserverdefault' => 'ウィキの既定を使用 ($1)',
 'timezoneuseoffset' => 'その他(時差を指定)',
-'timezoneoffset' => '時差¹',
+'timezoneoffset' => '時差¹:',
 'servertime' => 'サーバーの時刻:',
 'guesstimezone' => 'ブラウザーの設定から入力',
 'timezoneregion-africa' => 'アフリカ',
@@ -2215,7 +2215,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 'nviews' => '$1回の閲覧',
 'nimagelinks' => '$1ページで使用',
 'ntransclusions' => '$1ページで使用',
-'specialpage-empty' => '合致するものがありません。',
+'specialpage-empty' => '該当するものはありません。',
 'lonelypages' => '孤立しているページ',
 'lonelypagestext' => '以下のページは、{{SITENAME}}の他のページからリンクも参照読み込みもされていません。',
 'uncategorizedpages' => 'カテゴリ分類されていないページ',
@@ -2285,7 +2285,7 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 
 # Special:Log
 'specialloguserlabel' => '実行者:',
-'speciallogtitlelabel' => '対象(ページまたは利用者):',
+'speciallogtitlelabel' => '対象 (ページまたは利用者):',
 'log' => '記録',
 'all-logs-page' => 'すべての公開記録',
 'alllogstext' => '{{SITENAME}}の取得できる記録をまとめて表示しています。
@@ -2297,13 +2297,13 @@ contenttype/subtypeの形式で入力してください(例:<code>image/jpeg
 # Special:AllPages
 'allpages' => '全ページ',
 'alphaindexline' => '$1から$2まで',
-'nextpage' => '次のページ($1)',
-'prevpage' => '前のページ($1)',
+'nextpage' => '次のページ ($1)',
+'prevpage' => '前のページ ($1)',
 'allpagesfrom' => '最初に表示するページ:',
 'allpagesto' => '最後に表示するページ:',
 'allarticles' => '全ページ',
-'allinnamespace' => '全ページ($1名前空間)',
-'allnotinnamespace' => '全ページ($1名前空間を除く)',
+'allinnamespace' => '全ページ ($1名前空間)',
+'allnotinnamespace' => '全ページ ($1名前空間以外)',
 'allpagesprev' => '前へ',
 'allpagesnext' => '次へ',
 'allpagessubmit' => '表示',
@@ -2689,9 +2689,9 @@ $1',
 'contributions' => '利用者の投稿記録',
 'contributions-title' => '$1の投稿記録',
 'mycontris' => '自分の投稿記録',
-'contribsub2' => '利用者:$1($2)',
+'contribsub2' => '利用者: $1 ($2)',
 'nocontribs' => 'これらの条件に一致する変更は見つかりませんでした。',
-'uctop' => '(最新)',
+'uctop' => '(最新)',
 'month' => 'これ以前の月:',
 'year' => 'これ以前の年:',
 
@@ -2937,8 +2937,8 @@ hideuser権限を持っていないため、この利用者のブロックを閲
 手動で統合してください。'''",
 'movedto' => '移動先:',
 'movetalk' => '付随するトークページも移動',
-'move-subpages' => '下位ページも移動($1 件まで)',
-'move-talk-subpages' => 'トークページの下位ページも移動($1 件まで)',
+'move-subpages' => '下位ページも移動 ($1 件まで)',
+'move-talk-subpages' => 'トークページの下位ページも移動 ($1 件まで)',
 'movepage-page-exists' => 'ページ「$1」は既に存在するため、自動的な上書きはできませんでした。',
 'movepage-page-moved' => 'ページ「$1」は「$2」に移動しました。',
 'movepage-page-unmoved' => 'ページ「$1」は「$2」に移動できませんでした。',
@@ -3069,7 +3069,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'import-parse-failure' => 'XMLの取り込み構文解析に失敗しました',
 'import-noarticle' => '取り込むページがありません!',
 'import-nonewrevisions' => 'すべての版は以前に取り込み済みです。',
-'xml-error-string' => '$1、$2行の$3文字目($4バイト目):$5',
+'xml-error-string' => '$1、$2 行の $3 文字目 ($4バイト目): $5',
 'import-upload' => 'XMLデータをアップロード',
 'import-token-mismatch' => 'セッションデータを損失しました。
 もう一度試してください。',
@@ -3290,7 +3290,7 @@ MediaWiki 全般のローカライズ(地域化)に貢献したい場合は
 'log-show-hide-patrol' => '巡回記録を$1',
 
 # Image deletion
-'deletedrevision' => '古い版$1を削除しました',
+'deletedrevision' => '古い版 $1 を削除しました',
 'filedeleteerror-short' => 'ファイル削除エラー:$1',
 'filedeleteerror-long' => 'ファイルの削除中にエラーが発生しました:
 
@@ -3335,7 +3335,7 @@ $1',
 'newimages-summary' => 'この特別ページでは、最近アップロードされたファイルを表示します。',
 'newimages-legend' => '絞り込み',
 'newimages-label' => 'ファイル名(またはその一部):',
-'showhidebots' => '(ボットを$1)',
+'showhidebots' => '(ボットを$1)',
 'noimages' => '表示できるものがありません。',
 'ilsubmit' => '検索',
 'bydate' => '日付順',
@@ -4198,9 +4198,9 @@ MediaWikiは、有用であることを期待して配布されていますが
 'htmlform-select-badoption' => '指定した値は有効な選択肢ではありません。',
 'htmlform-int-invalid' => '指定した値は整数ではありません。',
 'htmlform-float-invalid' => '指定した値は数値ではありません。',
-'htmlform-int-toolow' => '指定した値は$1の最小値未満です',
-'htmlform-int-toohigh' => '指定した値は$1の最大値を超えています',
-'htmlform-required' => 'この値は必です',
+'htmlform-int-toolow' => '指定した値は、最小値 $1 より小さい値です',
+'htmlform-int-toohigh' => '指定した値は、最大値 $1 を超えています',
+'htmlform-required' => 'この値は必です',
 'htmlform-submit' => '送信',
 'htmlform-reset' => '変更を取り消す',
 'htmlform-selectorother-other' => 'その他',
index 0fa0bbb..d70c2a7 100644 (file)
@@ -937,7 +937,7 @@ $2
 'sectioneditnotsupported-text' => 'სექციის რედაქტირება გათიშულია ამ გვერდისთვის',
 'permissionserrors' => 'ნებართვის შეცდომა',
 'permissionserrorstext' => 'თქვენ არ გაქვთ ამის გაკეთების უფლება, შემდეგი {{PLURAL:$1|მიზეზის|მიზეზების}} გამო:',
-'permissionserrorstext-withaction' => 'თქვენ არ გაქვთ ამ მოქმედების - $2 განხორციელების ნებართვა შემდეგი $1 მიზეზის გამო:',
+'permissionserrorstext-withaction' => 'თქვენ არ გაქვთ ამ მოქმედების - „$2“ განხორციელების ნებართვა შემდეგი {{PLURAL:$1|მიზეზის|მიზეზის}} გამო:',
 'recreate-moveddeleted-warn' => "'''გაფრთხილება: თქვენ ხელახლა ქმნით გვერდს, რომელიც ადრე წაიშალა.'''
 
 გთხოვთ დაფიქრდეთ, მისაღები არის თუ არა ამ გვერდის რედაქტირების გაგრძელება.
index 6aea992..e68e3b4 100644 (file)
@@ -373,8 +373,8 @@ $messages = array(
 'tog-shownumberswatching' => '주시 사용자 수 보기',
 'tog-oldsig' => '현재 서명:',
 'tog-fancysig' => '서명을 위키텍스트로 취급 (자동으로 링크를 걸지 않음)',
-'tog-externaleditor' => '외부 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
-'tog-externaldiff' => '외부 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
+'tog-externaleditor' => '바깥 편집기를 기본 편집기로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 정보 보기])',
+'tog-externaldiff' => '바깥 비교 도구를 기본 도구로 사용 (숙련자용. 컴퓨터에 특별한 설정이 필요. [//www.mediawiki.org/wiki/Manual:External_editors 자세한 설명 보기])',
 'tog-showjumplinks' => '접근성을 위한 "이동" 링크 쓰기 (일부 스킨에서만 작동)',
 'tog-uselivepreview' => '실시간 미리 보기 사용하기 (자바스크립트 필요) (시험 기능)',
 'tog-forceeditsummary' => '편집 요약을 쓰지 않았을 때 알려주기',
@@ -765,7 +765,7 @@ $2',
 'securelogin-stick-https' => '로그인 후에도 HTTPS 연결 상태를 유지합니다',
 'yourdomainname' => '도메인 이름:',
 'password-change-forbidden' => '이 위키에서 비밀번호를 바꿀 수 없습니다.',
-'externaldberror' => '외부 인증 데이터베이스에 오류가 있거나 외부 계정을 새로 고칠 권한이 없습니다.',
+'externaldberror' => '바깥 인증 데이터베이스에 오류가 있거나 바깥 계정을 새로 고칠 권한이 없습니다.',
 'login' => '로그인',
 'nav-login-createaccount' => '로그인 / 계정 만들기',
 'loginprompt' => '{{SITENAME}}에 로그인하려면 쿠키를 사용할 수 있어야 합니다.',
@@ -1191,8 +1191,8 @@ $2개 보다 적게 써야 하지만 지금은 $1개를 쓰고 있습니다.",
 설명: '''({{int:cur}})''' = 최신 판과 비교, '''({{int:last}})''' = 이전 판과 비교, '''{{int:minoreditletter}}'''= 사소한 편집",
 'history-fieldset-title' => '문서의 바뀜 내역 찾기',
 'history-show-deleted' => '삭제된 것만',
-'histfirst' => 'ì´\88기',
-'histlast' => '최신',
+'histfirst' => 'ì²\98ì\9d\8c',
+'histlast' => '마지막',
 'historysize' => '($1 바이트)',
 'historyempty' => '(비었음)',
 
@@ -1414,7 +1414,7 @@ $1",
 'powersearch-togglelabel' => '확인:',
 'powersearch-toggleall' => '모두 선택',
 'powersearch-togglenone' => '모두 선택하지 않음',
-'search-external' => '외부 찾기',
+'search-external' => '바깥 찾기',
 'searchdisabled' => '{{SITENAME}} 찾기 기능이 비활성화되어 있습니다.
 기능이 작동하지 않는 동안에는 구글(Google)을 이용해 찾을 수 있습니다.
 검색 엔진의 내용은 최신이 아닐 수 있다는 점을 주의해주세요.',
@@ -1964,7 +1964,7 @@ URL이 올바르고 접근 가능한지를 확인하고 다시 시도해주세
 'uploadstash-nofiles' => '임시 저장한 파일이 없습니다.',
 'uploadstash-badtoken' => '이 동작을 수행하는 데 실패했습니다. 편집 토큰이 만료되었을 가능성이 있습니다. 다시 시도하세요.',
 'uploadstash-errclear' => '파일을 제거하는 데 실패했습니다.',
-'uploadstash-refresh' => '파일 목록을 새로고침',
+'uploadstash-refresh' => '파일 목록을 새로 고침',
 'invalid-chunk-offset' => '청크 오프셋이 잘못되었습니다.',
 
 # img_auth script messages
@@ -1980,7 +1980,7 @@ https://www.mediawiki.org/wiki/Manual:Image_Authorization 을 참고하십시오
 'img-auth-isdir' => '"$1" 디렉토리에 접근을 시도했습니다.
 파일에만 접근할 수 있습니다.',
 'img-auth-streaming' => '"$1" 파일을 전송하는 중입니다.',
-'img-auth-public' => 'img_auth.php는 개인 위키 파일을 외부 사이트로 전송하는 기능입니다.
+'img-auth-public' => 'img_auth.php는 개인 위키 파일을 바깥 사이트로 전송하는 기능입니다.
 이 기능은 기본적으로 공개적인 위키에서 사용하도록 설계되어 있습니다.
 보안적인 문제로 기본적으로 img_auth.php 기능은 비활성화되어 있습니다.',
 'img-auth-noread' => '"$1" 파일을 볼 권한이 없습니다.',
@@ -2008,7 +2008,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'license' => '라이선스:',
 'license-header' => '라이선스',
 'nolicense' => '선택하지 않음',
-'license-nopreview' => '(미리보기 불가능)',
+'license-nopreview' => '(미리 보기 불가능)',
 'upload_source_url' => ' (유효하고, 모든 사람이 접근 가능한 URL)',
 'upload_source_file' => ' (당신의 컴퓨터에 있는 파일)',
 
@@ -2199,8 +2199,8 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'wantedpages' => '필요한 문서 목록',
 'wantedpages-badtitle' => '문서 제목이 잘못되었습니다: $1',
 'wantedfiles' => '필요한 파일 목록',
-'wantedfiletext-cat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 외부 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.',
-'wantedfiletext-nocat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 외부 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다.',
+'wantedfiletext-cat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다. 또한 없는 파일을 포함하고 있는 문서는 [[:$1]]에 올라 있습니다.',
+'wantedfiletext-nocat' => '다음 파일은 쓰이고는 있지만 없는 파일입니다. 바깥 저장소에 있는 파일은 실제로는 있지만 여기 올라 있을 수 있습니다. 그런 오류는 <del>삭제선</del>이 그어질 것입니다.',
 'wantedtemplates' => '필요한 틀 목록',
 'mostlinked' => '가장 많이 연결된 문서 목록',
 'mostlinkedcategories' => '가장 많이 연결된 분류 목록',
@@ -2249,7 +2249,7 @@ URL이 맞고 해당 웹사이트가 작동하는지 확인해주세요.',
 'booksources' => '책 찾기',
 'booksources-search-legend' => '책 찾기',
 'booksources-go' => '찾기',
-'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 외부 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
+'booksources-text' => '아래의 목록은 새 책이나 중고 책을 판매하는 바깥 사이트로, 원하는 책의 정보를 얻을 수 있습니다:',
 'booksources-invalid-isbn' => '입력한 ISBN이 잘못된 것으로 보입니다. 원본과 대조해 보세요.',
 
 # Special:Log
@@ -2709,7 +2709,7 @@ $1',
 차단은 문서 훼손을 막기 위해, [[{{MediaWiki:Policy-url}}|정책]]에 의해서만 이루어져야 합니다.
 차단 이유를 같이 적어주세요(예: 특정 문서 훼손).',
 'ipadressorusername' => 'IP 주소 또는 사용자 이름:',
-'ipbexpiry' => '기:',
+'ipbexpiry' => '기:',
 'ipbreason' => '이유:',
 'ipbreasonotherlist' => '다른 이유',
 'ipbreason-dropdown' => '*일반적인 차단 이유
@@ -3082,7 +3082,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-pt-anonlogin' => '꼭 필요한 것은 아니지만, 로그인을 하면 편리한 점이 많습니다.',
 'tooltip-pt-logout' => '로그아웃',
 'tooltip-ca-talk' => '문서의 내용에 대한 토론 문서',
-'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리보기를 해 주세요.',
+'tooltip-ca-edit' => '문서를 편집할 수 있습니다. 저장하기 전에 미리 보기를 해 주세요.',
 'tooltip-ca-addsection' => '문단 추가하기',
 'tooltip-ca-viewsource' => '문서가 잠겨 있습니다.
 문서의 내용만 볼 수 있습니다.',
@@ -3136,7 +3136,7 @@ $1 사용자가 차단된 이유는 다음과 같습니다: "$2"',
 'tooltip-recreate' => '문서를 편집하는 중 삭제되어도 새로 만들기',
 'tooltip-upload' => '파일 올리기 시작',
 'tooltip-rollback' => '"되돌리기" 기능을 사용하면 이 문서에 대한 마지막 기여자의 편집을 모두 되돌릴 수 있습니다.',
-'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고, 차이보기 기능이 미리보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
+'tooltip-undo' => '"편집 취소" 기능을 사용하면 이 편집이 되돌려지고 차이 보기 기능이 미리 보기 형식으로 나타납니다. 편집 요약에 이 편집을 왜 되돌리는지에 대한 이유를 쓸 수 있습니다.',
 'tooltip-preferences-save' => '환경 설정 저장하기',
 'tooltip-summary' => '짧은 편집 요약을 적어주세요',
 
@@ -3368,7 +3368,7 @@ Variants for Chinese language
 'exif-ycbcrpositioning' => 'Y와 C 위치',
 'exif-xresolution' => '수평 해상도',
 'exif-yresolution' => '수직 해상도',
-'exif-stripoffsets' => '이미지 데이터 위치',
+'exif-stripoffsets' => '그림 데이터 위치',
 'exif-rowsperstrip' => '스트립당 줄의 수',
 'exif-stripbytecounts' => '압축된 스트립당 바이트 수',
 'exif-jpeginterchangeformat' => 'JPEG SOI와의 차이',
@@ -3388,7 +3388,7 @@ Variants for Chinese language
 'exif-flashpixversion' => '지원하는 플래시픽스 버전',
 'exif-colorspace' => '색 공간',
 'exif-componentsconfiguration' => '각 구성 요소의 의미',
-'exif-compressedbitsperpixel' => '이미지 압축 방식',
+'exif-compressedbitsperpixel' => '그림 압축 방식',
 'exif-pixelydimension' => '그림 너비',
 'exif-pixelxdimension' => '그림 높이',
 'exif-usercomment' => '사용자 주',
@@ -3424,7 +3424,7 @@ Variants for Chinese language
 'exif-sensingmethod' => '감지 방식',
 'exif-filesource' => '파일 출처',
 'exif-scenetype' => '촬영 모드',
-'exif-customrendered' => '이미지 처리 방식',
+'exif-customrendered' => '그림 처리 방식',
 'exif-exposuremode' => '노출 방식',
 'exif-whitebalance' => '화이트 밸런스',
 'exif-digitalzoomratio' => '디지털 줌 비율',
@@ -3436,7 +3436,7 @@ Variants for Chinese language
 'exif-sharpness' => '선명도',
 'exif-devicesettingdescription' => '장치 설정에 대한 설명',
 'exif-subjectdistancerange' => '대상과의 거리 범위',
-'exif-imageuniqueid' => '이미지 고유 ID',
+'exif-imageuniqueid' => '그림 고유 ID',
 'exif-gpsversionid' => 'GPS 태그 버전',
 'exif-gpslatituderef' => '북위 또는 남위',
 'exif-gpslatitude' => '위도',
@@ -3453,8 +3453,8 @@ Variants for Chinese language
 'exif-gpsspeed' => 'GPS 수신기 속도',
 'exif-gpstrackref' => '이동 방향에 대한 정보',
 'exif-gpstrack' => '이동 방향',
-'exif-gpsimgdirectionref' => '이미지 방향에 대한 정보',
-'exif-gpsimgdirection' => '이미지 방향',
+'exif-gpsimgdirectionref' => '그림 방향에 대한 정보',
+'exif-gpsimgdirection' => '그림 방향',
 'exif-gpsmapdatum' => '측지 조사 데이처 사용',
 'exif-gpsdestlatituderef' => '목적지의 위도 정보',
 'exif-gpsdestlatitude' => '목적지의 위도',
@@ -3508,7 +3508,7 @@ Variants for Chinese language
 'exif-cameraownername' => '카메라 소유자',
 'exif-label' => '라벨',
 'exif-datetimemetadata' => '메타데이터 최종 수정일',
-'exif-nickname' => '이미지의 비공식적 이름',
+'exif-nickname' => '그림의 비공식적 이름',
 'exif-rating' => '평가 (5점 만점)',
 'exif-rightscertificate' => '권리 관리 인증서',
 'exif-copyrighted' => '저작권 정보',
@@ -3530,8 +3530,8 @@ Variants for Chinese language
 'exif-event' => '묘사된 사건',
 'exif-organisationinimage' => '묘사된 기관',
 'exif-personinimage' => '묘사된 사람',
-'exif-originalimageheight' => '자르기 전 이미지의 세로 길이',
-'exif-originalimagewidth' => '자르기 전 이미지의 가로 길이',
+'exif-originalimageheight' => '자르기 전 그림의 세로 길이',
+'exif-originalimagewidth' => '자르기 전 그림의 가로 길이',
 
 # EXIF attributes
 'exif-compression-1' => '압축되지 않음',
@@ -3625,9 +3625,9 @@ Variants for Chinese language
 'exif-sensingmethod-7' => '3선 센서',
 'exif-sensingmethod-8' => '순차적 색 공간 선형 센서',
 
-'exif-filesource-3' => 'ë\94\94ì§\80í\84¸ ì\8a¤í\8b¸ 카메라',
+'exif-filesource-3' => 'ë\94\94ì§\80í\84¸ ì \95ì§\80 카메라',
 
-'exif-scenetype-1' => '직접 촬영된 이미지',
+'exif-scenetype-1' => '직접 촬영한 그림',
 
 'exif-customrendered-0' => '일반',
 'exif-customrendered-1' => '사용자 정의',
@@ -3749,7 +3749,7 @@ Variants for Chinese language
 'exif-urgency-other' => '사용자 정의 ($1)',
 
 # External editor support
-'edit-externally' => '이 파일을 외부 프로그램을 사용해서 편집하기',
+'edit-externally' => '이 파일을 바깥 프로그램을 사용해서 편집하기',
 'edit-externally-help' => '(자세한 정보는 [//www.mediawiki.org/wiki/Manual:External_editors 설치 방법]을 참고하세요)',
 
 # 'all' in various places, this might be different for inflected languages
@@ -3999,7 +3999,7 @@ $5
 # External image whitelist
 'external_image_whitelist' => ' #이 줄은 그대로 두십시오<pre>
 #정규 표현식(// 사이에 있는 부분)을 아래에 입력하세요.
-#이 목록은 외부 이미지의 URL과 대조할 것입니다.
+#이 목록은 바깥 그림의 URL과 대조할 것입니다.
 #이 목록과 일치하는 것은 그림이 직접 보여지지만, 그렇지 않은 경우 그림을 가리키는 링크만 보이게 될 것입니다.
 # "#"으로 시작하는 줄은 주석으로 간주됩니다.
 #이 목록은 대소문자를 구별하지 않습니다.
index 8535f62..01a8967 100644 (file)
@@ -1105,10 +1105,11 @@ Anda tidak memiliki capaian padanya.',
 'revdelete-concurrent-change' => 'Ralat ketika mengubahsuai item bertarikh $2, $1: kelihatan statusnya telah diubah oleh orang lain ketika anda cuba untuk mengubahsuainya.
 Mohon semak log.',
 'revdelete-only-restricted' => 'Ralat menyembunyikan item bertarikh $2, $1: anda tidak boleh menyekat item-item dari pandangan pentadbir-pentadbir tanpa memilih juga salah satu pilihan pandangan lain.',
-'revdelete-reason-dropdown' => '*Sebab penghapusan biasa
+'revdelete-reason-dropdown' => '*Sebab penghapusan yang biasa
 ** Pencabulan hak cipta
-** Maklumat peribadi tidak sesuai
-** Maklumat berpotensi fitnah',
+** Ulasan atau maklumat peribadi tidak sesuai
+** Nama pengguna tidak sesuai
+** Maklumat berkemungkinan fitnah',
 'revdelete-otherreason' => 'Sebab lain/tambahan:',
 'revdelete-reasonotherlist' => 'Sebab lain',
 'revdelete-edit-reasonlist' => 'Ubah sebab-sebab hapus',
index b337715..9f40f19 100644 (file)
@@ -1804,7 +1804,7 @@ For best tryggleik, er img_auth.php sett ut av funksjon.',
 'listfiles_name' => 'Namn',
 'listfiles_user' => 'Brukar',
 'listfiles_size' => 'Storleik',
-'listfiles_description' => 'Beskriving',
+'listfiles_description' => 'Skildring',
 'listfiles_count' => 'Versjonar',
 
 # File description page
index 3936a76..b6e4228 100644 (file)
@@ -98,7 +98,7 @@ $messages = array(
 'tog-watchcreations' => 'ਮੇਰੇ ਵਲੋਂ ਬਣਾਏ ਗਏ ਨਵੇਂ ਸਫ਼ੇ ਅਤੇ ਅੱਪਲੋਡ ਕੀਤੀਆਂ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchdefault' => 'ਮੇਰੇ ਵੱਲੋਂ ਸੋਧੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-watchmoves' => 'ਮੇਰੇ ਵੱਲੋਂ ਬਦਲੇ ਸਿਰਲੇਖਾਂ ਵਾਲ਼ੇ ਸਫ਼ੇ ਅਤੇ ਫ਼ਾਈਲਾਂ ਮੇਰੀ ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
-'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨¹à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨®à©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
+'tog-watchdeletion' => 'ਮà©\87ਰà©\87 à¨µà¨²à©\8bà¨\82 à¨®à¨¿à¨\9fਾà¨\8f à¨\97à¨\8f à¨¸à¨«à¨¼à©\87 à¨\85ਤà©\87 à¨«à¨¼à¨¾à¨\88ਲਾà¨\82 à¨®à©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸਟ ਵਿੱਚ ਪਾਓ',
 'tog-minordefault' => 'ਸਾਰੇ ਫੇਰ-ਬਦਲਾਂ ’ਤੇ ਮੂਲ ਰੂਪ ਵਿਚ ਛੋਟੀਆਂ ਹੋਣ ਦਾ ਨਿਸ਼ਾਨ ਲਾਓ',
 'tog-previewontop' => 'ਐਡਿਟ ਬਕਸੇ ਤੋਂ ਪਹਿਲਾਂ ਝਲਕ ਵੇਖਾਓ',
 'tog-previewonfirst' => 'ਪਹਿਲੇ ਐਡਿਟ ਉੱਤੇ ਝਲਕ ਵੇਖਾਓ',
@@ -122,8 +122,8 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'tog-showjumplinks' => '"ਇਸ ਤੇ ਜਾਓ" ਦੇ ਲਿੰਕ ਦਿਖਾਣਾ ਸਮਰੱਥ ਕਰੋ',
 'tog-uselivepreview' => 'ਸਿੱਧੀ ਝਲਕ ਵਰਤੋ (ਜਾਵਾਸਕ੍ਰਿਪਟ ਲੋੜੀਂਦੀ ਹੈ) (ਤਜਰਬੇਕਾਰੀ)',
 'tog-forceeditsummary' => 'ਜਦੋਂ ਮੈਂ ਖ਼ਾਲੀ ਸੋਧ ਸਾਰ ਦਾਖ਼ਲ ਕਰਾਂ ਤਾਂ ਮੈਨੂੰ ਖ਼ਬਰਦਾਰ ਕਰੋ',
-'tog-watchlisthideown' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨®à©\87ਰà©\80à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¹à¨\9fਾਓ',
-'tog-watchlisthidebots' => 'ਮà©\87ਰà©\80 à¨µà¨¾à¨\9a-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨°à©\8bਬਾà¨\9f à¨¦à¨¿à¨\86à¨\82 à¨¸à©\8bਧਾà¨\82 à¨¹à¨\9fਾਓ',
+'tog-watchlisthideown' => 'ਨਿà¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à©±à¨\9aà©\8bà¨\82 à¨®à©\87ਰà©\87 à¨«à©\87ਰ-ਬਦਲ à¨²à©\81à¨\95ਾਓ',
+'tog-watchlisthidebots' => 'ਮà©\87ਰà©\80 à¨¨à¨¿à¨\97ਰਾਨà©\80-ਲਿਸà¨\9f à¨µà¨¿à¨\9aà©\8bà¨\82 à¨°à©\8bਬà©\8bà¨\9fਾà¨\82 à¨¦à©\87 à¨«à©\87ਰ-ਬਦਲ à¨²à©\81à¨\95ਾਓ',
 'tog-watchlisthideminor' => 'ਛੋਟੇ ਸੋਧ ਵਾਚ-ਲਿਸਟ ਤੋਂ ਓਹਲੇ ਰੱਖੋ',
 'tog-watchlisthideliu' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਲਾਗ ਇਨ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
 'tog-watchlisthideanons' => 'ਨਿਗਰਾਨੀ-ਲਿਸਟ ਵਿਚੋਂ ਗੁਮਨਾਮ ਮੈਂਬਰਾਂ ਦੇ ਕੀਤੇ ਫੇਰ-ਬਦਲ ਲੁਕਾਓ',
@@ -294,7 +294,7 @@ Manual:External_editors ਹੋਰ ਜਾਣਕਾਰੀ।])',
 'toolbox' => 'ਸੰਦ ਬਕਸਾ',
 'userpage' => 'ਯੂਜ਼ਰ ਪੇਜ ਵੇਖੋ',
 'projectpage' => 'ਪਰੋਜੈਕਟ ਪੇਜ ਵੇਖੋ',
-'imagepage' => 'ਫਾà¨\87ਲ à¨ªà©\87à¨\9c ਵੇਖੋ',
+'imagepage' => 'ਫ਼ਾà¨\88ਲ à¨¸à¨«à¨¼à¨¾ ਵੇਖੋ',
 'mediawikipage' => 'ਸੁਨੇਹਾ ਪੇਜ ਵੇਖੋ',
 'templatepage' => 'ਟੈਪਲੇਟ ਪੇਜ ਵੇਖੋ',
 'viewhelppage' => 'ਮੱਦਦ ਪੇਜ ਵੇਖੋ',
@@ -1202,7 +1202,7 @@ to upload files.',
 'sourcefilename' => 'ਸੋਰਸ ਫਾਇਲ ਨਾਂ:',
 'upload-maxfilesize' => 'ਫ਼ਾਈਲ ਦਾ ਵੱਧ ਤੋਂ ਵੱਧ ਅਕਾਰ: $1',
 'upload-description' => 'ਫ਼ਾਈਲ ਦਾ ਵੇਰਵਾ',
-'watchthisupload' => 'à¨\87ਸ à¨«à¨¾à¨\87ਲ à¨¨à©\82à©° à¨µà¨¾à¨\9a à¨\95ਰੋ',
+'watchthisupload' => 'à¨\87ਸ à¨«à¨¼à¨¾à¨\88ਲ â\80\99ਤà©\87 à¨¨à¨\9c਼ਰ à¨°à©±à¨\96ੋ',
 'upload-success-subj' => 'ਠੀਕ ਤਰ੍ਹਾਂ ਅੱਪਲੋਡ',
 'upload-warning-subj' => 'ਅੱਪਲੋਡ ਚੇਤਾਵਨੀ',
 
@@ -1760,7 +1760,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'move-page-legend' => 'ਪੇਜ ਮੂਵ ਕਰੋ',
 'movearticle' => 'ਸਫ਼ਾ ਭੇਜੋ:',
 'movenologin' => 'ਲਾਗਇਨ ਨਹੀਂ ਹੋ',
-'movenologintext' => 'à¨\87ੱà¨\95 à¨ªà©\87à¨\9c à¨®à©\82ਵ à¨\95ਰਨ à¨²à¨\88 à¨¤à©\81ਸà©\80à¨\82 à¨°à¨\9cਿਸà¨\9fਰਡ à¨®à©\88à¨\82ਬਰ à¨¹à©\8bਣà©\87 à¨\9aਾਹà©\80ਦà©\87 à¨¹à©\8b à¨\85ਤà©\87 [[Special:UserLogin|ਲਾà¨\97ਡ ਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
+'movenologintext' => 'à¨\87à¨\95 à¨¸à¨«à¨¼à©\87 à¨¦à¨¾ à¨¸à¨¿à¨°à¨²à©\87à¨\96 à¨¬à¨¦à¨²à¨£ à¨²à¨\88 à¨¤à©\81ਸà©\80à¨\82 à¨°à¨\9cਿਸà¨\9fਰਡ à¨®à©\88à¨\82ਬਰ à¨¹à©\8bਣà©\87 à¨\9aਾਹà©\80ਦà©\87 à¨¹à©\8b à¨\85ਤà©\87 [[Special:UserLogin|ਲਾà¨\97ਇਨ]] ਕੀਤਾ ਹੋਣਾ ਚਾਹੀਦਾ ਹੈ।',
 'newtitle' => 'ਨਵੇਂ ਟਾਈਟਲ ਲਈ:',
 'move-watch' => 'ਸਰੋਤ ਤੇ ਟਾਰਗੇਟ ਸਫ਼ੇ ਉੱਤੇ ਨਿਗਰਾਨੀ ਰੱਖੋ',
 'movepagebtn' => 'ਸਫ਼ਾ ਭੇਜੋ',
@@ -1819,7 +1819,7 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 
 # Tooltip help for the actions
 'tooltip-pt-userpage' => 'ਤੁਹਾਡਾ ਮੈਂਬਰ ਸਫ਼ਾ',
-'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਗੱਲਬਾਤ ਸਫ਼ਾ',
+'tooltip-pt-mytalk' => 'ਤੁਹਾਡਾ ਗੱਲ-ਬਾਤ ਸਫ਼ਾ',
 'tooltip-pt-preferences' => 'ਤੁਹਾਡੀਆਂ ਪਸੰਦਾਂ',
 'tooltip-pt-watchlist' => 'ਓਹਨਾਂ ਸਫ਼ਿਆਂ ਦੀ ਲਿਸਟ ਜੋ ਤੁਸੀਂ ਤਬਦੀਲੀਆਂ ਲਈ ਵੇਖ ਰਹੇ ਹੋ',
 'tooltip-pt-mycontris' => 'ਤੁਹਾਡੇ ਯੋਗਦਾਨਾਂ ਦੀ ਲਿਸਟ',
@@ -2016,8 +2016,8 @@ delete|ਮਿਟਾਉਣਾਂ ਦਾ ਚਿੱਠਾ]] ਵੇਖੋ।',
 'table_pager_empty' => 'ਕੋਈ ਨਤੀਜਾ ਨਹੀਂ',
 
 # Auto-summaries
-'autosumm-blank' => 'ਪà©\87à¨\9c à¨¨à©\82à©° à¨\96ਾਲà©\80 à¨\95ਰ à¨¦à¨¿à©±ਤਾ',
-'autosumm-new' => '$1 ਨਾਲ ਪੇਜ ਬਣਾਇਆ',
+'autosumm-blank' => 'ਸਫ਼à©\87 à¨¨à©\82à©° à¨\96਼ਾਲà©\80 à¨\95à©\80ਤਾ',
+'autosumm-new' => '"$1" ਨਾਲ਼ ਸਫ਼ਾ ਬਣਾਇਆ',
 
 # Live preview
 'livepreview-loading' => 'ਲੋਡ ਕੀਤਾ ਜਾ ਰਿਹਾ ਹੈ…',
index 10f3892..306e001 100644 (file)
@@ -1226,7 +1226,9 @@ Proszę sprawdzić rejestr operacji.',
 'revdelete-only-restricted' => 'Nie można ukryć elementu z $2, $1 przed administratorami bez określenia jednej z pozostałych opcji ukrywania.',
 'revdelete-reason-dropdown' => '* Najczęstsze powody usunięcia
 ** Naruszenie praw autorskich
-** Informacja naruszająca prywatność',
+** Niestosowny komentarz lub informacja naruszająca prywatność
+** Niestosowna nazwa użytkownika
+** Potencjalnie oszczercza informacja',
 'revdelete-otherreason' => 'Inny lub dodatkowy powód:',
 'revdelete-reasonotherlist' => 'Inny powód',
 'revdelete-edit-reasonlist' => 'Edycja listy powodów usunięcia pliku',
index b38acba..3ba274a 100644 (file)
@@ -959,7 +959,9 @@ It peule pa vëddlo.',
 'revdelete-only-restricted' => "Eror an stërmand l'element datà $2, $1: it peule pa vieté la vista d'element a j'aministrator sensa ëdcò selessioné un-a dj'àutre opsion ëd visibilità.",
 'revdelete-reason-dropdown' => "*Rason sòlite dë scancelassion
 ** Violassion dël drit d'autor
-** Anformassion përsonaj pa aproprià",
+** Coment o anformassion përsonaj pa aproprià
+** Nòm utent pa aproprià
+** Anformassion potensialment difamatòria",
 'revdelete-otherreason' => 'Àutra rason o adissional:',
 'revdelete-reasonotherlist' => 'Àutra rason',
 'revdelete-edit-reasonlist' => 'Modifiché la rason ëd lë scancelament',
@@ -2851,26 +2853,26 @@ Sòn a l'é motobin belfé che a sia rivà përchè a-i era n'anliura a un sit e
 'rcpatroldisabledtext' => "La possibilità ëd verifichè j'ùltime modìfiche a l'é disabilità.",
 'markedaspatrollederror' => 'As peul pa marché coma verificà',
 'markedaspatrollederrortext' => 'A venta che a spessìfica che version che a veul marchè coma verificà.',
-'markedaspatrollederror-noautopatrol' => 'A l\'ha nen ël përmess dë marchesse soe modìfiche coma "controlà".',
+'markedaspatrollederror-noautopatrol' => "A l'ha nen ël përmess dë marchesse soe modìfiche coma «controlà».",
 
 # Patrol log
 'patrol-log-page' => 'Registr dij contròj',
-'patrol-log-header' => "Sto sì a l'é un registr ëd le revision verificà.",
+'patrol-log-header' => "Cost-sì a l'é un registr ëd le revision controlà.",
 'log-show-hide-patrol' => '$1 registr verificà',
 
 # Image deletion
 'deletedrevision' => 'Veja version scancelà $1',
 'filedeleteerror-short' => "Eror ën scanceland l'archivi: $1",
-'filedeleteerror-long' => "A son ësta-ie dj'eror ën scanceland l'archivi:
+'filedeleteerror-long' => "A-i son ësta-ie dj'eror ën scanceland l'archivi:
 
 $1",
-'filedelete-missing' => 'L\'archivi "$1" as peul pa dëscancelesse, për via ch\'a-i é nen.',
-'filedelete-old-unregistered' => 'La revision d\'archivi specificà "$1" ant la base dat a-i é nen.',
-'filedelete-current-unregistered' => 'Ant la base dat l\'archivi "$1" ch\'a l\'é specificasse a-i é pa.',
-'filedelete-archive-read-only' => 'Ël servent dla Ragnà a peul pa scriv-ie ant ël dossié dj\'archivi "$1".',
+'filedelete-missing' => "L'archivi «$1» as peul pa dëscancelesse, për via ch'a-i é nen.",
+'filedelete-old-unregistered' => "La revision d'archivi specificà «$1» ant la base dij dat a-i é nen.",
+'filedelete-current-unregistered' => "Ant la base dij dat l'archivi «$1» ch'a l'é specificasse a-i é pa.",
+'filedelete-archive-read-only' => "Ël servent dla Ragnà a peul pa scriv-ie ant ël dossié d'archiviassion «$1».",
 
 # Browsing diffs
-'previousdiff' => '← Diferensa pì veja',
+'previousdiff' => '← Modìfica precedenta',
 'nextdiff' => 'Modìfica pì neuva →',
 
 # Media information
index 09be3a9..9c0307d 100644 (file)
@@ -715,7 +715,7 @@ $1',
 ستاسې IP پته $3 ده او ستاسې د بنديز پېژند #$5 دی.
 د بنديز اړونده د اړيکو نيولو په وخت کې لطفاً د پورتني مالوماتو يادونه وکړۍ.',
 'blockednoreason' => 'هېڅ سبب نه دی ورکړ شوی',
-'whitelistedittext' => 'ددې لپاره چې سمادول ترسره کړی تاسو بايد $1.',
+'whitelistedittext' => 'د مخونو د سمون لپاره بايد $1 کېښکاږۍ.',
 'nosuchsectiontitle' => 'برخه و نه موندل شوه',
 'nosuchsectiontext' => 'تاسې د يوې داسې برخې د سمون هڅه کړې چې تر اوسه پورې نشته.
 کېدای هغه مهال چې تاسې د دې مخ نه کتنه کوله، همدا برخه کوم بل ځای ته لېږدل شوې او يا هم ړنګه شوې وي.',
@@ -1225,7 +1225,7 @@ $1',
 'upload' => 'دوتنه پورته کول',
 'uploadbtn' => 'دوتنه پورته کول',
 'uploadnologin' => 'غونډال کې نه ياست ننوتي',
-'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، تاسو ته پکار ده چې لومړی غونډال کې [[Special:UserLogin|ننوتنه]] ترسره کړی.',
+'uploadnologintext' => 'ددې لپاره چې دوتنې پورته کړای شۍ، نو پکار ده چې تاسې لومړی غونډال کې [[Special:Userlogin|ننوځۍ]].',
 'uploaderror' => 'د پورته کولو ستونزه',
 'uploadtext' => "د دوتنې د پورته کېدو لپاره لاندينی چوکاټ وکاروۍ.
 که چېرته د پخونيو پورته شويو دوتنو کتل او پلټل غواړۍ نو [[Special:FileList|د پورته شويو دوتنو لړليک]] ته ورشۍ، [[Special:Log/upload|د (بيا) پورته شويو دوتنو يادښتونه]] او [[Special:Log/delete|د ړنګېدو يادښتونه]] هم کتلای شی.
@@ -1275,6 +1275,7 @@ $1',
 'savefile' => 'دوتنه خوندي کړه',
 'uploadedimage' => '"[[$1]]" پورته شوه',
 'uploaddisabled' => 'پورته کول ناچارن شوي',
+'uploaddisabledtext' => 'د دوتنې پورته کولو آسانتياوې ناچارن شوي.',
 'uploadvirus' => 'دا دوتنه ويروس لري! تفصيل: $1',
 'upload-source' => 'سرچينيزه دوتنه',
 'sourcefilename' => 'د سرچينيزې دوتنې نوم:',
@@ -1417,6 +1418,7 @@ $1',
 'statistics-views-total' => 'ټولټال کتنې',
 'statistics-users' => 'ثبت شوي [[Special:ListUsers|کارنان]]',
 'statistics-users-active' => 'فعاله کارنان',
+'statistics-users-active-desc' => 'هغه کارنان چې په {{PLURAL:$1|وروستۍ ورځ|وروستيو $1 ورځو}} کې فعاله ونډه لرلې',
 'statistics-mostpopular' => 'تر ټولو ډېر کتل شوي مخونه',
 
 'disambiguations' => 'د مبهمو مخونو سره تړلي مخونه',
@@ -1461,6 +1463,7 @@ $1',
 'mostlinkedtemplates' => 'د ډېرو تړنو کينډۍ',
 'mostcategories' => 'د ګڼو وېشنيزو مخونه',
 'mostimages' => 'د ډېرو تړنو انځورونه',
+'mostinterwikis' => 'د ډېرو خپلمنځي تړنو مخونه',
 'mostrevisions' => 'ډېر کتلي مخونه',
 'prefixindex' => 'د مختاړيو ټول مخونه',
 'prefixindex-namespace' => 'د مختاړي ټول مخونه ($1 نومتشيال)',
@@ -1611,7 +1614,7 @@ $1',
 'nowatchlist' => 'ستاسو په کتلي لړليک کې هېڅ نه شته.',
 'watchlistanontext' => 'د خپل کتنلړ د توکو د سمولو او کتلو لپاره $1 ترسره کړۍ.',
 'watchnologin' => 'غونډال کې نه ياست ننوتي.',
-'watchnologintext' => 'ددÛ\90 Ù\84پارÙ\87 Ú\86Û\90 Ø®Ù¾Ù\84 Ú©ØªÙ\84 Ø´Ù\88Ù\8a Ù\84Ú\93Ù\84Ù\8aÚ© Ú©Û\90 Ø¨Ø¯Ù\84Ù\88Ù\86 Ø±Ø§Ù\88Ù\84Û\8c Ù\86Ù\88 ØªØ§Ø³Ù\88 ØªÙ\87 Ù¾Ú©Ø§Ø± Ø¯Ù\87 Ú\86Û\90 Ù\84Ù\88Ù\85Ú\93Û\8c ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 [[Special:UserLogin|Ù\86Ù\86Ù\88تÙ\86Ù\87]] ØªØ±Ø³Ø±Ù\87 Ú©Ú\93Û\8c.',
+'watchnologintext' => 'ددÛ\90 Ù\84پارÙ\87 Ú\86Û\90 Ø®Ù¾Ù\84 Ú©ØªÙ\86Ù\84Ú\93 Ú©Û\90 Ø¨Ø¯Ù\84Ù\88Ù\86 Ø±Ø§Ù\88Ù\84Û\8c Ù\86Ù\88 ØªØ§Ø³Ù\88 ØªÙ\87 Ù¾Ú©Ø§Ø± Ø¯Ù\87 Ú\86Û\90 Ù\84Ù\88Ù\85Ú\93Û\8c ØºÙ\88Ù\86Ú\89اÙ\84 Ú©Û\90 [[Special:UserLogin|Ù\88رÙ\86Ù\86Ù\88Ú\81Û\8d]].',
 'addwatch' => 'کتنلړ کې ورګډول',
 'addedwatchtext' => "د \"[[:\$1]]\" په نوم يو مخ ستاسې [[Special:Watchlist|کتنلړ]] کې ورګډ شو.
 په راتلونکې کې چې په دغه مخ او د ده د خبرواترو مخ کې کوم بدلونونه راځي نو هغه به ستاسې کتنلړ کې ښکاره شي،
@@ -1887,7 +1890,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'contribslink' => 'ونډې',
 'emaillink' => 'برېښليک لېږل',
 'autoblocker' => 'په اتوماتيک ډول ستاسو مخنيوی شوی دا ځکه چې ستاسو IP پته وروستی ځل د "[[User:$1|$1]]" له خوا کارېدلې. او د $1 د مخنيوي سبب دا دی: "$2"',
-'blocklogpage' => 'د مخنيوي يادښت',
+'blocklogpage' => 'د بنديز يادښت',
 'blocklogentry' => 'په [[$1]] بنديز لګېدلی چې د بنديز د پای وخت يې $2 $3 دی',
 'unblocklogentry' => 'بنديز ليرې شو $1',
 'block-log-flags-anononly' => 'يواځې ورکنومي کارنان',
@@ -2068,6 +2071,9 @@ $UNWATCHURL  نه ليدنه وکړۍ
 'tooltip-preferences-save' => 'غوره توبونه خوندي کول',
 'tooltip-summary' => 'يو لنډ لنډيز کښل',
 
+# Scripts
+'vector.js' => '/* د جاوا هر يو سکرېپټ چې دلته ځای پر ځای کېږي هغه به د وېکټور د پوښ ټولو کارنانو لپاره کار کوي */',
+
 # Attribution
 'anonymous' => 'د {{SITENAME}} {{PLURAL:$1|ورکنومی کارن|ورکنومي کارنان}}',
 'siteuser' => 'د {{SITENAME}} کارن $1',
@@ -2345,7 +2351,7 @@ $UNWATCHURL  نه ليدنه وکړۍ
 
 # E-mail address confirmation
 'confirmemail' => 'د برېښليک پتې پخلی وکړی',
-'confirmemail_noemail' => 'تاسو يوه سمه برېښناليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارونکي غوره توبونه]] کې مو بدلون راولی.',
+'confirmemail_noemail' => 'تاسې يوه سمه برېښليک پته نه ده ثبته کړې مهرباني وکړی [[Special:Preferences|د کارن غوره توبونه]] مو بدل کړۍ.',
 'confirmemail_send' => 'يو تاييدي کوډ لېږل',
 'confirmemail_sent' => 'تاييدي برېښليک ولېږل شو.',
 'confirmemail_oncreate' => 'ستاسو د برېښناليک پتې ته يو تاييدي کوډ درولېږل شو.
index 8417e8c..e893489 100644 (file)
@@ -3127,11 +3127,32 @@ Este bloqueio foi provavelmente causado por um link para um site externo que con
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
-'pageinfo-header-edits' => 'Edições',
+'pageinfo-header-basic' => 'Informação básica',
+'pageinfo-header-edits' => 'Histórico de edições',
+'pageinfo-header-restrictions' => 'Proteção da página',
+'pageinfo-header-properties' => 'Propriedades da página',
+'pageinfo-display-title' => 'Exibir título',
+'pageinfo-length' => 'Tamanho da página (em bytes)',
+'pageinfo-article-id' => 'ID da página',
+'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-index' => 'Indexável',
+'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
-'pageinfo-watchers' => 'Número de vigilantes',
-'pageinfo-edits' => 'Número de edições',
-'pageinfo-authors' => 'Número de autores individuais',
+'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-redirects-name' => 'Redireciona para esta página',
+'pageinfo-subpages-name' => 'Subpáginas desta página',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não-redirecionamento|não-redirecionamentos}})',
+'pageinfo-firstuser' => 'Criador da página',
+'pageinfo-firsttime' => 'Data de criação da página',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Data da última edição',
+'pageinfo-edits' => 'Número total de edições',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
+'pageinfo-recent-authors' => 'Número recente de autores distintos',
+'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
+'pageinfo-magic-words' => '{{PLURAL:$1|Palavra mágica|Palavras mágicas}} ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categoria oculta|Categorias ocultas}} ($1)',
 
 # Skin names
 'skinname-standard' => 'Clássico',
index 4b52538..63482bf 100644 (file)
@@ -329,16 +329,16 @@ $messages = array(
 'tog-showtoc' => 'Mostrar Tabela de Conteúdos (para páginas com mais de três cabeçalhos)',
 'tog-rememberpassword' => 'Recordar os meus dados neste navegador (por no máximo $1 {{PLURAL:$1|dia|dias}})',
 'tog-watchcreations' => 'Adicionar as páginas e arquivos que eu criar às minhas páginas vigiadas',
-'tog-watchdefault' => 'Adicionar páginas editadas por mim à minha lista de páginas vigiadas',
-'tog-watchmoves' => 'Adicionar páginas movidas por mim à minha lista de páginas vigiadas',
-'tog-watchdeletion' => 'Adicionar páginas eliminadas por mim à minha lista de páginas vigiadas',
+'tog-watchdefault' => 'Adicionar as páginas e arquivos que eu editar às minhas páginas vigiadas',
+'tog-watchmoves' => 'Adicionar as páginas e arquivos que eu mover às minhas páginas vigiadas',
+'tog-watchdeletion' => 'Adicionar as páginas e arquivos que eu eliminar às minhas páginas vigiadas',
 'tog-minordefault' => 'Marcar todas as edições como secundárias, por padrão',
 'tog-previewontop' => 'Mostrar previsão antes da caixa de edição',
 'tog-previewonfirst' => 'Mostrar previsão na primeira edição',
 'tog-nocache' => 'Desativar o cache de páginas do navegador',
-'tog-enotifwatchlistpages' => 'Receber e-mail quando uma página da minha lista de páginas vigiadas for alterada',
+'tog-enotifwatchlistpages' => 'Notificar-me por e-mail quando uma página ou arquivo vigiado for alterado',
 'tog-enotifusertalkpages' => 'Receber e-mail quando a minha página de discussão for editada',
-'tog-enotifminoredits' => 'Enviar-me um email também quando forem edições menores',
+'tog-enotifminoredits' => 'Notificar-me por e-mail também sobre edições menores de páginas ou arquivos',
 'tog-enotifrevealaddr' => 'Revelar o meu endereço de email nas notificações',
 'tog-shownumberswatching' => 'Mostrar o número de usuários que estão vigiando',
 'tog-oldsig' => 'Assinatura existente:',
@@ -1235,9 +1235,10 @@ Você não tem acesso a ele.',
 'revdelete-concurrent-change' => 'Erro ao modificar o item datado de $2, $1: o seu estado parece ter sido alterado por outra pessoa enquanto você tentava modificá-lo.
 Por favor, verifique os registros.',
 'revdelete-only-restricted' => 'Erro ao ocultar o item de $2 às $1: você não pode impedir que itens sejam visualizados por administradores sem também selecionar uma das outras opções de visibilidade.',
-'revdelete-reason-dropdown' => '*Motivos comuns para eliminação
-** Violação de direitos autorais
-** Informação pessoal inapropriada
+'revdelete-reason-dropdown' => '*Razões comuns para eliminação
+** Violação de direitos de autor
+** Comentário ou informação pessoal inapropriada
+** Nome de usuário impróprio
 ** Informação potencialmente difamatória',
 'revdelete-otherreason' => 'Outro motivo/motivo adicional:',
 'revdelete-reasonotherlist' => 'Outro motivo',
@@ -2112,6 +2113,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|byte|bytes}}',
 'ncategories' => '$1 {{PLURAL:$1|categoria|categorias}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki|Interwikis}}',
 'nlinks' => '$1 {{PLURAL:$1|link|links}}',
 'nmembers' => '$1 {{PLURAL:$1|membro|membros}}',
 'nrevisions' => '$1 {{PLURAL:$1|revisão|revisões}}',
@@ -2140,6 +2142,7 @@ Entradas <del>riscadas</del> foram resolvidas.',
 'mostlinkedtemplates' => 'Predefinições com mais afluentes',
 'mostcategories' => 'Páginas de conteúdo com mais categorias',
 'mostimages' => 'Imagens com mais afluentes',
+'mostinterwikis' => 'Páginas com mais interwikis',
 'mostrevisions' => 'Páginas de conteúdo com mais revisões',
 'prefixindex' => 'Todas as páginas com prefixo',
 'prefixindex-namespace' => 'Todas as páginas com prefixo (espaço nominal $1)',
@@ -2431,6 +2434,8 @@ prossiga com cuidado.',
 'rollback' => 'Reverter edições',
 'rollback_short' => 'Reverter',
 'rollbacklink' => 'reverter',
+'rollbacklinkcount' => 'reverter $1 {{PLURAL:$1|edição|edições}}',
+'rollbacklinkcount-morethan' => 'reverter mais de $1 {{PLURAL:$1|edição|edições}}',
 'rollbackfailed' => 'A reversão falhou',
 'cantrollback' => 'Não foi possível reverter a edição; o último contribuidor é o único autor desta página',
 'alreadyrolled' => 'Não foi possível reverter a última edição de [[:$1]] por [[User:$2|$2]] ([[User talk:$2|discussão]]{{int:pipe-separator}}[[Special:Contributions/$2|{{int:contribslink}}]]);
@@ -2914,6 +2919,7 @@ Todas as ações de importação transwiki são registradas no [[Special:Log/imp
 'import-interwiki-templates' => 'Incluir todas as predefinições',
 'import-interwiki-submit' => 'Importar',
 'import-interwiki-namespace' => 'Domínio de destino:',
+'import-interwiki-rootpage' => 'Página raiz de destino (opcional):',
 'import-upload-filename' => 'Nome do arquivo:',
 'import-comment' => 'Comentário:',
 'importtext' => 'Por favor, exporte o arquivo do wiki de origem utilizando a página especial [[Special:Export|exportação de páginas]].
@@ -2946,6 +2952,7 @@ Salve o arquivo no seu computador e importe-o aqui.',
 'import-error-interwiki' => 'A página "$1" não pôde ser importada pois seu nome está reservado para um link interwik.',
 'import-error-special' => 'A página "$1" não pôde ser importada porque ela pertence a um espaço nominal especial que não suporta páginas.',
 'import-error-invalid' => 'A página "$1" não pôde ser importada por seu nome ser inválido.',
+'import-rootpage-invalid' => 'A página raiz dada é um título inválido.',
 
 # Import log
 'importlogpage' => 'Registro de importações',
@@ -3080,11 +3087,30 @@ Tal bloqueio foi provavelmente causado por uma ligação para um ''website'' ext
 
 # Info page
 'pageinfo-title' => 'Informações sobre "$1"',
+'pageinfo-header-basic' => 'Informação básica',
 'pageinfo-header-edits' => 'Histórico de edições',
+'pageinfo-header-restrictions' => 'Proteção da página',
+'pageinfo-header-properties' => 'Propriedades da página',
+'pageinfo-display-title' => 'Exibir título',
+'pageinfo-length' => 'Tamanho da página (em bytes)',
+'pageinfo-article-id' => 'ID da página',
+'pageinfo-robot-policy' => 'Status do mecanismo de pesquisa',
+'pageinfo-robot-index' => 'Indexável',
+'pageinfo-robot-noindex' => 'Não indexável',
 'pageinfo-views' => 'Número de visitas',
-'pageinfo-watchers' => 'Número de pessoas vigiando',
-'pageinfo-edits' => 'Número de edições',
-'pageinfo-authors' => 'Número de autores individuais',
+'pageinfo-watchers' => 'Número de vigilantes da página',
+'pageinfo-redirects-name' => 'Redireciona para esta página',
+'pageinfo-subpages-name' => 'Subpáginas desta página',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|redirecionamento|redirecionamentos}}; $3 {{PLURAL:$3|não-redirecionamento|não-redirecionamentos}})',
+'pageinfo-firstuser' => 'Criador da página',
+'pageinfo-firsttime' => 'Data de criação da página',
+'pageinfo-lastuser' => 'Último editor',
+'pageinfo-lasttime' => 'Data da última edição',
+'pageinfo-edits' => 'Número total de edições',
+'pageinfo-authors' => 'Número total de autores distintos',
+'pageinfo-recent-edits' => 'Número de edições recentes (nos últimos $1)',
+'pageinfo-recent-authors' => 'Número recente de autores distintos',
+'pageinfo-restriction' => 'Proteção da página ({{lcfirst:$1}})',
 
 # Skin names
 'skinname-standard' => 'Clássico',
index 4e4f9e6..e0ca433 100644 (file)
@@ -463,7 +463,8 @@ Also used as title of [[Special:Search]] page in [[Special:SpecialPages]].
 'toolbox' => 'The title of the toolbox below the search menu.',
 'otherlanguages' => 'This message is shown under the toolbox. It is used if there are interwiki links added to the page, like <tt><nowiki>[[</nowiki>en:Interwiki article]]</tt>.
 {{Identical|Otherlanguages}}',
-'redirectedfrom' => 'The text displayed when a certain page is redirected to another page. Variable <tt>$1</tt> contains the name of the page user came from.',
+'redirectedfrom' => 'The text displayed when a certain page is redirected to another page.
+*<tt>$1</tt> contains the name of the page user came from.',
 'redirectpagesub' => 'Displayed under the page title of a page which is a redirect to another page, see [{{fullurl:Project:Translators|redirect=no}} Project:Translators] for example.
 
 {{Identical|Redirect page}}',
@@ -1404,8 +1405,11 @@ This is a search result (and I guess search engine) dependent messages. I do not
 
 This is a search result (and I guess search engine) dependent messages. I do not know how to trigger the feature. The message is displayed if the search result contains information that related pages can also be provided from the search engine. I assume this is "More Like This" functionality. Microsoft glossary defines MLT as "A way to refine search by identifying the right set of documents and then locating similar documents. This allows the searcher to control the direction of the search and focus on the most fruitful lines of inquiry."[http://www.microsoft.com/enterprisesearch/en/us/search-glossary.aspx]',
 'searchall' => '{{Identical|All}}',
-'showingresults' => "This message is used on some special pages such as 'Wanted categories'. $1 is the total number of results in the batch shown and $2 is the number of the first item listed.",
-'showingresultsnum' => '$3 is the number of results on the page and $2 is the first number in the batch of results.',
+'showingresults' => "This message is used on some special pages such as 'Wanted categories'.
+*$1 is the total number of results in the batch shown.
+*$2 is the number of the first item listed.",
+'showingresultsnum' => '*$3 is the number of results on the page.
+*$2 is the first number in the batch of results.',
 'showingresultsheader' => 'Used in search results of [[Special:Search]].',
 'nonefound' => 'This message appears on the search results page if no results are found.
 {{doc-important|Do not translate "all:".}}',
index f501dea..4a1b986 100644 (file)
@@ -2253,7 +2253,7 @@ Protocoale suportate: <code>$1</code> (nu adăugați niciunul dintre acestea în
 
 # Special:ListGroupRights
 'listgrouprights' => 'Permisiuni grupuri de utilizatori',
-'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definită în aceast wiki, împreună cu permisiunile de acces asociate.
+'listgrouprights-summary' => 'Mai jos se află o listă a grupurilor de utilizatori definite în acest wiki, împreună cu permisiunile de acces asociate.
 Pot exista [[{{MediaWiki:Listgrouprights-helppage}}|informații suplimentare]] despre permisiuni individuale.',
 'listgrouprights-key' => '* <span class="listgrouprights-granted">Drept acordat</span>
 * <span class="listgrouprights-revoked">Drept revocat</span>',
index 638b8a6..9534c91 100644 (file)
@@ -2714,6 +2714,7 @@ Tutte le aziune de 'mbortaziune 'mbrà le Uicchi sonde reggistrate jndr'à l'[[S
 'import-interwiki-templates' => 'Inglude tutte le template',
 'import-interwiki-submit' => "'Mborte",
 'import-interwiki-namespace' => 'Namespace de destinazione:',
+'import-interwiki-rootpage' => 'Pàgena prengepàale de destinazione (opzionale):',
 'import-upload-filename' => "Nome d'u file:",
 'import-comment' => 'Commende:',
 'importtext' => "Pe piacere esporte 'u file da 'a Uicchi sorgende ausanne l'[[Special:Export|utilità de esportazione]].
@@ -2751,6 +2752,7 @@ Reggistrele sus a 'u combiuter tune e carechele aqquà.",
 'import-error-invalid' => "'A pàgene \"\$1\" non g'ha state 'mbortate purcé 'u nome jè invalide.",
 'import-options-wrong' => '{{PLURAL:$2|opzione|opziune}} sbagliate: <nowiki>$1</nowiki>',
 'import-rootpage-invalid' => "'A pàgene radice date tène 'nu titole invalide.",
+'import-rootpage-nosubpage' => 'Namespace "$1" d\'a pàgene prengepàle non ge permette le sottopàggene.',
 
 # Import log
 'importlogpage' => "Archivie de le 'mbortaziune",
@@ -2920,6 +2922,7 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-redirects-name' => 'Redirezionaminde a sta pàgene',
 'pageinfo-redirects-value' => '$1',
 'pageinfo-subpages-name' => 'Sottopàggene de sta pàgene',
+'pageinfo-subpages-value' => '$1 ($2 {{PLURAL:$2|ridirezionate|ridirezionate}}; $3 {{PLURAL:$3|none ridirezionate|none ridirezionate}})',
 'pageinfo-firstuser' => "Ccrejatore d'a pàgene",
 'pageinfo-firsttime' => "Date d'a ccrejazione d'a pàgene",
 'pageinfo-lastuser' => 'Urteme cangiatore',
@@ -2928,7 +2931,9 @@ Stu fatte ha state causate da 'nu collegamende a 'nu site esterne ca appartene a
 'pageinfo-authors' => 'Numere Totale de autore diverse',
 'pageinfo-recent-edits' => "Numere de le urteme cangiaminde ('mbonde a $1)",
 'pageinfo-recent-authors' => 'Numere de le urteme autore diverse',
+'pageinfo-restriction' => "Protezione d'a pàgene ({{lcfirst:$1}})",
 'pageinfo-magic-words' => '{{PLURAL:$1|Parole|Parole}} maggiche ($1)',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Categorije|Categorije}} scunnute ($1)',
 
 # Skin names
 'skinname-standard' => 'Classeche',
index 39ede3e..66f85f9 100644 (file)
@@ -1333,9 +1333,10 @@ $1",
 'revdelete-concurrent-change' => 'Ошибка изменения записи от $2, $1: её статус был изменён кем-то другим, пока вы пытались изменить его.
 Пожалуйста, проверьте журналы.',
 'revdelete-only-restricted' => 'Ошибка сокрытия записи от $2 $1: вы не можете скрыть запись от просмотра администраторами без выбора одной из других настроек сокрытия.',
-'revdelete-reason-dropdown' => 'Стандартные причины удаления
+'revdelete-reason-dropdown' => 'Стандартные причины удаления
 ** Нарушение авторских прав
-** Неуместные личные сведения',
+** Неуместные личные сведения
+** Потенциально клеветнические сведения',
 'revdelete-otherreason' => 'Другая/дополнительная причина:',
 'revdelete-reasonotherlist' => 'Другая причина',
 'revdelete-edit-reasonlist' => 'Править список причин',
index 50e5730..5c03e45 100644 (file)
@@ -545,6 +545,10 @@ $1',
 'youhavenewmessages' => 'Máte $1 ($2).',
 'newmessageslink' => 'nové správy',
 'newmessagesdifflink' => 'posledná zmena',
+'youhavenewmessagesfromusers' => 'Máte $1 od {{PLURAL:$3|iného používateľa|$3 iných používateľov}} ($2).',
+'youhavenewmessagesmanyusers' => 'Máte $1 od viacerých ďalších používateľov ($2).',
+'newmessageslinkplural' => '{{PLURAL:$1|novú správu|nové správy|nových správ}}',
+'newmessagesdifflinkplural' => '{{PLURAL:$1|posledná zmena|posledné zmeny}}',
 'youhavenewmessagesmulti' => 'Máte nové správy na $1',
 'editsection' => 'upraviť',
 'editold' => 'upraviť',
@@ -596,9 +600,9 @@ Zoznam platných špeciálnych stránok nájdete na [[Special:SpecialPages|{{int
 # General errors
 'error' => 'Chyba',
 'databaseerror' => 'Chyba v databáze',
-'dberrortext' => 'Nastala syntaktická chyba v príkaze na prehľadávanie databázy.
-To môže značiť chybu v softvéri.
-Posledná požiadavka na databázu bola:
+'dberrortext' => 'V databázovom dopyte sa vyskytla syntaktická chyba.
+Príčinou môže byť chyba v softvéri.
+Posledný dopyt bol:
 <blockquote><tt>$1</tt></blockquote>
 z funkcie „<tt>$2</tt>“.
 Databáza vrátila chybu „<tt>$3: $4</tt>“.',
@@ -1208,9 +1212,11 @@ Nemáte k nej prístup.',
 'revdelete-concurrent-change' => 'Chyba pri zmene položky s dátumom $2, $1: zdá sa, že kým ste ju menili vykonal zmenu niekto iný.
 Pozrite sa prosím do záznamov.',
 'revdelete-only-restricted' => 'Chyba pri skrývaní položky s dátumom $2, $1: nemôžete skryť položku pred správcami bez toho, aby ste vybrali aj jednu z ďalších možností viditeľnosti.',
-'revdelete-reason-dropdown' => '*Bežné dôvody zmazania
+'revdelete-reason-dropdown' => '*Obvyklé dôvody zmazania
 ** Porušenie autorských práv
-** Nevhodné osobné informácie',
+** Nevhodné komentáre alebo osobné informácie
+** Nevhodné meno používateľa
+** Potenciálne hanlivé alebo ohováračské údaje',
 'revdelete-otherreason' => 'Ďalšie dôvody:',
 'revdelete-reasonotherlist' => 'Iný dôvod',
 'revdelete-edit-reasonlist' => 'Upraviť dôvody zmazania',
@@ -1956,6 +1962,7 @@ Možno chcete upraviť popis na jeho [$2 popisnej stránke súboru] tam.',
 'uploadnewversion-linktext' => 'Nahrať novú verziu tohto súboru',
 'shared-repo-from' => 'z $1',
 'shared-repo' => 'zdieľané úložisko',
+'upload-disallowed-here' => 'Ľutujeme, tento súbor nie je možné prepísať.',
 
 # File reversion
 'filerevert' => 'Obnoviť $1',
@@ -2062,6 +2069,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 # Miscellaneous special pages
 'nbytes' => '$1 {{PLURAL:$1|bajt|bajty|bajtov}}',
 'ncategories' => '$1 {{PLURAL:$1|kategória|kategórie|kategórií}}',
+'ninterwikis' => '$1 {{PLURAL:$1|interwiki odkaz|interwiki odkazy|interwiki odkazov}}',
 'nlinks' => '$1 {{PLURAL:$1|odkaz|odkazy|odkazov}}',
 'nmembers' => '$1 {{PLURAL:$1|člen|členovia|členov}}',
 'nrevisions' => '$1 {{PLURAL:$1|revízia|revízie|revízií}}',
@@ -2090,6 +2098,7 @@ Každý riadok obsahuje odkaz na prvé a druhé presmerovanie a tiež prvý riad
 'mostlinkedtemplates' => 'Najčastejšie odkazované šablóny',
 'mostcategories' => 'Stránky s najväčším počtom kategórií',
 'mostimages' => 'Najčastejšie odkazované súbory',
+'mostinterwikis' => 'Stránky s najväčším počtom interwiki odkazov',
 'mostrevisions' => 'Stránky s najväčším počtom úprav',
 'prefixindex' => 'Všetky stránky s predponou',
 'prefixindex-namespace' => 'Všetky stránky s predponou (menný priestor $1)',
@@ -2236,6 +2245,8 @@ Môžete si prečítať [[{{MediaWiki:Listgrouprights-helppage}}|ďalšie inform
 'mailnologin' => 'Žiadna adresa na zaslanie',
 'mailnologintext' => 'Musíte byť [[Special:UserLogin|prihlásený]] a mať platnú e-mailovú adresu vo vašich [[Special:Preferences|nastaveniach]], aby ste mohli iným používateľom posielať e-maily.',
 'emailuser' => 'E-mail tomuto používateľovi',
+'emailuser-title-target' => 'E-mail {{GENDER:$1|tomuto používateľovi|tejto používateľke}}',
+'emailuser-title-notarget' => 'E-mail používateľovi',
 'emailpage' => 'E-mail používateľovi',
 'emailpagetext' => 'Ak tento používateľ zadal platnú emailovú adresu vo svojich nastaveniach,
 môžete mu pomocou nasledovného formulára poslať email.
@@ -3063,7 +3074,8 @@ Pravdepodobne to spôsobil odkaz na externú internetovú lokalitu, ktorá sa na
 
 # Info page
 'pageinfo-title' => 'Informácie o „$1“',
-'pageinfo-header-edits' => 'Úpravy',
+'pageinfo-header-basic' => 'Základné údaje',
+'pageinfo-header-edits' => 'História úprav',
 'pageinfo-views' => 'Počet zobrazení',
 'pageinfo-watchers' => 'Počet sledovateľov',
 'pageinfo-edits' => 'Počet úprav',
index af67c4a..c2c4237 100644 (file)
@@ -2024,6 +2024,7 @@ Sedaj je preusmeritev na [[$2]].',
 'mostlinkedtemplates' => 'Najbolj uporabljane predloge',
 'mostcategories' => 'Članki z največ kategorijami',
 'mostimages' => 'Najbolj uporabljane datoteke',
+'mostinterwikis' => 'Strani z največ medjezikovnimi povezavami',
 'mostrevisions' => 'Največkrat urejane strani',
 'prefixindex' => 'Vse strani s predpono',
 'prefixindex-namespace' => 'Vse strani s predpono (imenski prostor $1)',
@@ -2169,6 +2170,7 @@ Na voljo so morda [[{{MediaWiki:Listgrouprights-helppage}}|dodatne informacije]]
 'mailnologin' => 'Manjka naslov pošiljatelja',
 'mailnologintext' => 'Za pošiljanje e-pošte drugim uporabnikom se [[Special:UserLogin|prijavite]] in v [[Special:Preferences|nastavitvah]] vpišite veljaven e-poštni naslov.',
 'emailuser' => 'Pošlji uporabniku e-pismo',
+'emailuser-title-notarget' => 'Pošlji uporabniku e-pismo',
 'emailpage' => 'Pošlji uporabniku e-pismo',
 'emailpagetext' => 'S spodnjim obrazcem lahko uporabniku pošljete e-poštno sporočilo.
 E-poštni naslov, ki ste ga vpisali v [[Special:Preferences|uporabniških nastavitvah]], bo v e-sporočilu naveden kot naslov »Od:«, tako da bo prejemnik lahko odgovoril neposredno vam.',
@@ -2978,6 +2980,8 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-header-properties' => 'Lastnosti strani',
 'pageinfo-display-title' => 'Naslov za prikaz',
 'pageinfo-default-sort' => 'Privzeti ključ za razvrščanje',
+'pageinfo-length' => 'Dolžina strani (v bajtih)',
+'pageinfo-robot-policy' => 'Status iskalnega pogona',
 'pageinfo-views' => 'Število ogledov',
 'pageinfo-watchers' => 'Število spremljevalcev strani',
 'pageinfo-redirects-name' => 'Preusmeritve na stran',
@@ -2988,6 +2992,8 @@ Omogoča vnos pojasnila v povzetku urejanja.',
 'pageinfo-lasttime' => 'Datum zadnjega urejanja',
 'pageinfo-edits' => 'Skupno število urejanj',
 'pageinfo-authors' => 'Skupno število različnih avtorjev',
+'pageinfo-restriction' => 'Zaščita strani ({{lcfirst:$1}})',
+'pageinfo-hidden-categories' => '{{PLURAL:$1|Skrita kategorija|Skriti kategoriji|Skrite kategorije}} ($1)',
 
 # Patrolling
 'markaspatrolleddiff' => 'Označite kot nadzorovano',
index ebab217..b17151c 100644 (file)
@@ -213,7 +213,7 @@ $messages = array(
 'thursday' => 'Huwebes',
 'friday' => 'Biyernes',
 'saturday' => 'Sabado',
-'sun' => 'Lin',
+'sun' => 'Ling',
 'mon' => 'Lun',
 'tue' => 'Mar',
 'wed' => 'Miy',
@@ -360,7 +360,7 @@ $messages = array(
 'projectpage' => 'Tingnan ang pahina ng proyekto',
 'imagepage' => 'Tingnan ang pahina ng talaksan',
 'mediawikipage' => 'Tingnan ang pahina ng mensahe',
-'templatepage' => 'Tingnan ang pahina ng suleras',
+'templatepage' => 'Tingnan ang pahina ng padron',
 'viewhelppage' => 'Tingnan ang pahina ng tulong',
 'categorypage' => 'Tingnan ang pahina ng kategorya',
 'viewtalkpage' => 'Tingnan ang usapan',
@@ -426,9 +426,9 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'editsection' => 'baguhin',
 'editsection-brackets' => '[$1]',
 'editold' => 'baguhin',
-'viewsourceold' => 'tingnan ang pinagmulan',
+'viewsourceold' => 'tingnan ang batayan',
 'editlink' => 'baguhin',
-'viewsourcelink' => 'tingnan ang pinagmulan',
+'viewsourcelink' => 'tingnan ang batayan',
 'editsectionhint' => 'Baguhin ang seksiyon: $1',
 'toc' => 'Mga nilalaman',
 'showtoc' => 'ipakita',
@@ -438,13 +438,13 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'thisisdeleted' => 'Tingnan o ibalik ang $1?',
 'viewdeleted' => 'Tingnan ang $1?',
 'restorelink' => '{{PLURAL:$1|isang binurang pagbabago|$1 binurang pagbabago}}',
-'feedlinks' => 'Subo/Karga:',
+'feedlinks' => 'Karga:',
 'feed-invalid' => 'Hindi tanggap na uri ng serbisyo ng pagpaparating.',
 'feed-unavailable' => 'Walang serbisyo mula sa sindikasyong pangpaglalathala',
-'site-rss-feed' => '$1 kargang RSS',
-'site-atom-feed' => '$1 kargang Atom',
-'page-rss-feed' => '"$1" kargang RSS',
-'page-atom-feed' => '"$1" kargang Atom',
+'site-rss-feed' => 'Kargang RSS ng $1',
+'site-atom-feed' => 'Kargang Atom ng $1',
+'page-rss-feed' => 'Kargang RSS ng "$1"',
+'page-atom-feed' => 'Kargang Atom ng "$1"',
 'feed-atom' => 'Atom',
 'feed-rss' => 'RSS',
 'red-link-title' => '$1 (hindi umiiral ang pahina)',
@@ -459,7 +459,7 @@ Tingnan ang [[Special:Version|pahina ng bersiyon]].',
 'nstab-project' => 'Pahina ng proyekto',
 'nstab-image' => 'Talaksan',
 'nstab-mediawiki' => 'Mensahe',
-'nstab-template' => 'Suleras',
+'nstab-template' => 'Padron',
 'nstab-help' => 'Pahina ng tulong',
 'nstab-category' => 'Kategorya',
 
@@ -608,8 +608,8 @@ Paki-andar mo po ang mga ito, pagkatapos ay lumagda na gamit ang bago mong panga
 'nocookieslogin' => "Gumagamit ang {{SITENAME}} ng mga kuki (''cookies'') para mailagda ang mga tagagamit.
 Hindi mo pinagagana ang mga kuki.
 Paki-andar mo ang mga ito at sumubok uli.",
-'nocookiesfornew' => 'Hindi nalikha ang akawnt ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito.
-Tiyaking mayroon kang pinagaganang mga otap, ikargang muli ang pahinang ito at subuking muli.',
+'nocookiesfornew' => 'Hindi nalikha ang kuwenta ng tagagamit, dahil hindi namin matiyak ang pinagmulan nito.
+Tiyaking mayroon kang pinagaganang mga kuki, ikarga muli ang pahinang ito at subukan muli.',
 'nocookiesforlogin' => '{{int:nocookieslogin}}',
 'noname' => 'Hindi mo tinukoy ang isang tanggap na pangalan ng tagagamit.',
 'loginsuccesstitle' => 'Matagumpay ang paglagda',
@@ -640,19 +640,19 @@ Kung ibang tao ang humiling nito, o kung naalala mo na ang iyong hudyat,
 at hindi mo na ibig pang baguhin ito, maaari mong huwag pansinin ang mensaheng ito at
 magpatuloy sa paggamit ng iyong lumang hudyat.',
 'noemail' => 'Walang nakatalang adres ng e-liham para sa tagagamit na "$1".',
-'noemailcreate' => 'Kailangan mong magbigay ng may-bisang adres ng e-liham',
+'noemailcreate' => 'Kailangan mong magbigay ng may-bisang direksiyong e-liham',
 'passwordsent' => 'Isang bagong hudyat ang ipinadala sa adres ng e-liham na nakatala para kay "$1".
 Lumagda/Tumala lang po muli pagkaraan mong matanggap ito.',
 'blocked-mailpassword' => 'Hinarangan sa paggawa ng mga pagbabago ang iyong adres ng IP, at kaya hindi rin pinapahintulutang gumamit ng tungkuling makabawi ng hudyat para maiwasan ang pangaabuso.',
-'eauthentsent' => 'Nagpadala ng isang e-liham na pangkompirmasyon doon sa iniharap na adres ng e-liham.
+'eauthentsent' => 'Nagpadala ng isang e-liham na pangkompirmasyon doon sa iniharap na direksiyong e-liham.
 Bago magpadala ng iba pang e-liham sa kuwenta, kailangan mong sundin ang mga tagubiling nasa loob ng e-liham, para mapatunayang iyo talaga ang kuwenta.',
 'throttled-mailpassword' => 'Nagpadala na ng isang paalalang panghudyat, nitong huling {{PLURAL:$1|oras|$1 oras}}.
 Para maiwasin ang pangaabuso, isang paalalang panghudyat lang ang ipapadala bawat {{PLURAL:$1|oras|$1 oras}}.',
 'mailerror' => 'Kamalian sa pagpapadala ng liham: $1',
-'acct_creation_throttle_hit' => 'Ang mga panauhin sa wiking ito na gumagamit ng adres ng IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.
-Bilang kinalabasan, ang mga panauhing gumagamit ng ganitong adres ng IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.',
+'acct_creation_throttle_hit' => 'Ang mga panauhin sa wiking ito na gumagamit ng direksiyong IP mo ay nakalikha na ng {{PLURAL:$1|1 kuwenta|$1 kuwenta}} sa loob ng huling araw, na siyang pinakamataas na pinapahintulutan sa loob ng sakop ng panahong ito.
+Bilang kinalabasan, ang mga panauhing gumagamit ng ganitong direksiyong IP ay hindi na muna makakalikha ng anumang karagdagang kuwenta sa ngayon.',
 'emailauthenticated' => 'Napatunayan na ang iyong direksiyong e-liham sa $2 noong $3.',
-'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong adres ng e-liham.
+'emailnotauthenticated' => 'Hindi pa napapatunayan ang iyong direksiyong e-liham.
 Walang e-liham na ipapadala para sa anumang sumusunod na tampok na kasangkapang-katangian.',
 'noemailprefs' => 'Tumukoy ng isang direksiyong e-liham sa loob ng mga nais mo upang gumana ang mga kasangkapang-katangiang ito.',
 'emailconfirmlink' => 'Pakikompirma ang iyong direksiyong e-liham.',
@@ -793,7 +793,7 @@ Maaari kang makipag-ugnayan kay $1 o sa ibang [[{{MediaWiki:Grouppage-sysop}}|ta
 Hindi mo magagamit ang kasangkapang-katangiang 'magpadala ng e-liham sa tagagamit' hangga't hindi tinutukoy ang isang tanggap na direksiyong e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka pa hinaharangan/hinahadlangan sa paggamit nito.
 Ang kasalukuyan mong direksiyong IP ay $3, at ang ID ng pagharang/paghadlang ay #$5.
 Pakisama ang lahat ng mga detalye sa anumang mga pagtatanong na ginagawa/gagawin mo.",
-'autoblockedtext' => 'Kusang hinadlangan/hinarang ang adres ng IP mo dahil ginamit ito ng ibang tagagamit, na hinadlangan/hinarang ni $1.
+'autoblockedtext' => 'Kusang hinadlangan/hinarang ang direksiyong IP mo dahil ginamit ito ng ibang tagagamit, na hinadlangan/hinarang ni $1.
 Ang ibinigay na dahilan ay:
 
 :\'\'$2\'\'
@@ -804,9 +804,9 @@ Ang ibinigay na dahilan ay:
 
 Maaari kang makipagugnayan kay $1 o sa isa sa iba pang [[{{MediaWiki:Grouppage-sysop}}|mga tagapangasiwa]] para pagusapan ang paghadlang/pagharang.
 
-Pakitandaang hindi mo maaaring gamitin ang kasangkapang-katangiang "padalhan ng e-liham ang tagagamit na ito" maliban na lamang kung mayroon kang nakatalang tanggap na adres ng e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka hinadlangan sa paggamit nito.
+Pakitandaang hindi mo maaaring gamitin ang kasangkapang-katangiang "padalhan ng e-liham ang tagagamit na ito" maliban na lamang kung mayroon kang nakatalang tanggap na direksiyong e-liham sa iyong [[Special:Preferences|mga kagustuhan]] at hindi ka hinadlangan sa paggamit nito.
 
-Ang pangkasalukuyang adres mo ng IP ay $3, at ang ID ng pagharang ay #$5.
+Ang kasalukuyan mong direksiyong IP ay $3, at ang ID ng pagharang ay #$5.
 Pakisama ang lahat ng mga detalyeng nasa itaas sa anumang pagtatanong na gagawin mo.',
 'blockednoreason' => 'walang binigay na dahilan',
 'whitelistedittext' => 'Kailangan mong $1 para makapagbago ng mga pahina.',
index eb0155c..212dbe3 100644 (file)
@@ -1294,7 +1294,7 @@ Gezinti bağlantılarının bu sütunu sıfırlayacağını unutmayın.',
 'prevn-title' => 'Önceki $1 {{PLURAL:$1|sonuç|sonuç}}',
 'nextn-title' => 'Sonraki $1 {{PLURAL:$1|sonuç|sonuç}}',
 'shown-title' => 'Sayfa başına $1 {{PLURAL:$1|sonuç|sonuç}} göster',
-'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3)',
+'viewprevnext' => '($1 {{int:pipe-separator}} $2) ($3) gör',
 'searchmenu-legend' => 'Arama seçenekleri',
 'searchmenu-exists' => "'''Bu vikide \"[[:\$1]]\" adında bir sayfa mevcut'''",
 'searchmenu-new' => "'''Bu vikide \"[[:\$1]]\" sayfasını oluştur!'''",
index 31d517f..d974149 100644 (file)
@@ -52,7 +52,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 
                $end = microtime( true );
 
-               echo "Delete: " . $end - $start;
+               echo "Delete: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
                echo "\r\n";
 
                $this->insertData( $dbw );
@@ -63,7 +63,7 @@ class BenchmarkDeleteTruncate extends Benchmarker {
 
                $end = microtime( true );
 
-               echo "Truncate: " . $end - $start;
+               echo "Truncate: " . sprintf( "%6.3fms", ( $end - $start ) * 1000 );
                echo "\r\n";
 
                $dbw->dropTable( 'test' );
index 9de7610..fdb016f 100644 (file)
@@ -71,8 +71,8 @@ class BenchmarkHooks extends Benchmarker {
                }
                $delta = microtime( true ) - $start;
                $pertrial = $delta / $trials;
-               return sprintf( "Took %6.2fs",
-                       $pertrial );
+               return sprintf( "Took %6.3fms",
+                       $pertrial * 1000 );
        }
 
        /**
index 2e1d1c3..a29647b 100644 (file)
@@ -209,7 +209,11 @@ class SyncFileBackend extends Maintenance {
                }
 
                $t_start = microtime( true );
-               $status->merge( $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) ) );
+               $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               if ( !$status->isOK() ) {
+                       sleep( 10 ); // wait and retry copy again
+                       $status = $dst->doQuickOperations( $ops, array( 'bypassReadOnly' => 1 ) );
+               }
                $ellapsed_ms = floor( ( microtime( true ) - $t_start ) * 1000 );
                if ( $status->isOK() && $this->getOption( 'verbose' ) ) {
                        $this->output( "Synchronized these file(s) [{$ellapsed_ms}ms]:\n" .
diff --git a/resources/jquery/images/spinner-large.gif b/resources/jquery/images/spinner-large.gif
new file mode 100644 (file)
index 0000000..72203fd
Binary files /dev/null and b/resources/jquery/images/spinner-large.gif differ
index 37d3a43..6146be4 100644 (file)
Binary files a/resources/jquery/images/spinner.gif and b/resources/jquery/images/spinner.gif differ
index b7dd119..973ef3d 100644 (file)
 /*!
- * jQuery JavaScript Library v1.7.2
+ * jQuery JavaScript Library v1.8.1
  * http://jquery.com/
  *
- * Copyright 2011, John Resig
- * Dual licensed under the MIT or GPL Version 2 licenses.
- * http://jquery.org/license
- *
  * Includes Sizzle.js
  * http://sizzlejs.com/
- * Copyright 2011, The Dojo Foundation
- * Released under the MIT, BSD, and GPL Licenses.
  *
- * Date: Wed Mar 21 12:46:34 2012 -0700
+ * Copyright 2012 jQuery Foundation and other contributors
+ * Released under the MIT license
+ * http://jquery.org/license
+ *
+ * Date: Thu Aug 30 2012 17:17:22 GMT-0400 (Eastern Daylight Time)
  */
 (function( window, undefined ) {
+var
+       // A central reference to the root jQuery(document)
+       rootjQuery,
+
+       // The deferred used on DOM ready
+       readyList,
+
+       // Use the correct document accordingly with window argument (sandbox)
+       document = window.document,
+       location = window.location,
+       navigator = window.navigator,
+
+       // Map over jQuery in case of overwrite
+       _jQuery = window.jQuery,
+
+       // Map over the $ in case of overwrite
+       _$ = window.$,
+
+       // Save a reference to some core methods
+       core_push = Array.prototype.push,
+       core_slice = Array.prototype.slice,
+       core_indexOf = Array.prototype.indexOf,
+       core_toString = Object.prototype.toString,
+       core_hasOwn = Object.prototype.hasOwnProperty,
+       core_trim = String.prototype.trim,
+
+       // Define a local copy of jQuery
+       jQuery = function( selector, context ) {
+               // The jQuery object is actually just the init constructor 'enhanced'
+               return new jQuery.fn.init( selector, context, rootjQuery );
+       },
+
+       // Used for matching numbers
+       core_pnum = /[\-+]?(?:\d*\.|)\d+(?:[eE][\-+]?\d+|)/.source,
+
+       // Used for detecting and trimming whitespace
+       core_rnotwhite = /\S/,
+       core_rspace = /\s+/,
+
+       // Make sure we trim BOM and NBSP (here's looking at you, Safari 5.0 and IE)
+       rtrim = /^[\s\uFEFF\xA0]+|[\s\uFEFF\xA0]+$/g,
+
+       // A simple way to check for HTML strings
+       // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
+       rquickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
+
+       // Match a standalone tag
+       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>|)$/,
+
+       // JSON RegExp
+       rvalidchars = /^[\],:{}\s]*$/,
+       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
+       rvalidescape = /\\(?:["\\\/bfnrt]|u[\da-fA-F]{4})/g,
+       rvalidtokens = /"[^"\\\r\n]*"|true|false|null|-?(?:\d\d*\.|)\d+(?:[eE][\-+]?\d+|)/g,
+
+       // Matches dashed string for camelizing
+       rmsPrefix = /^-ms-/,
+       rdashAlpha = /-([\da-z])/gi,
+
+       // Used by jQuery.camelCase as callback to replace()
+       fcamelCase = function( all, letter ) {
+               return ( letter + "" ).toUpperCase();
+       },
+
+       // The ready event handler and self cleanup method
+       DOMContentLoaded = function() {
+               if ( document.addEventListener ) {
+                       document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+                       jQuery.ready();
+               } else if ( document.readyState === "complete" ) {
+                       // we're here because readyState === "complete" in oldIE
+                       // which is good enough for us to call the dom ready!
+                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
+                       jQuery.ready();
+               }
+       },
 
-// Use the correct document accordingly with window argument (sandbox)
-       var document = window.document,
-               navigator = window.navigator,
-               location = window.location;
-       var jQuery = (function() {
-
-// Define a local copy of jQuery
-               var jQuery = function( selector, context ) {
-                               // The jQuery object is actually just the init constructor 'enhanced'
-                               return new jQuery.fn.init( selector, context, rootjQuery );
-                       },
-
-               // Map over jQuery in case of overwrite
-                       _jQuery = window.jQuery,
-
-               // Map over the $ in case of overwrite
-                       _$ = window.$,
-
-               // A central reference to the root jQuery(document)
-                       rootjQuery,
-
-               // A simple way to check for HTML strings or ID strings
-               // Prioritize #id over <tag> to avoid XSS via location.hash (#9521)
-                       quickExpr = /^(?:[^#<]*(<[\w\W]+>)[^>]*$|#([\w\-]*)$)/,
-
-               // Check if a string has a non-whitespace character in it
-                       rnotwhite = /\S/,
-
-               // Used for trimming whitespace
-                       trimLeft = /^\s+/,
-                       trimRight = /\s+$/,
-
-               // Match a standalone tag
-                       rsingleTag = /^<(\w+)\s*\/?>(?:<\/\1>)?$/,
-
-               // JSON RegExp
-                       rvalidchars = /^[\],:{}\s]*$/,
-                       rvalidescape = /\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,
-                       rvalidtokens = /"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,
-                       rvalidbraces = /(?:^|:|,)(?:\s*\[)+/g,
-
-               // Useragent RegExp
-                       rwebkit = /(webkit)[ \/]([\w.]+)/,
-                       ropera = /(opera)(?:.*version)?[ \/]([\w.]+)/,
-                       rmsie = /(msie) ([\w.]+)/,
-                       rmozilla = /(mozilla)(?:.*? rv:([\w.]+))?/,
+       // [[Class]] -> type pairs
+       class2type = {};
 
-               // Matches dashed string for camelizing
-                       rdashAlpha = /-([a-z]|[0-9])/ig,
-                       rmsPrefix = /^-ms-/,
+jQuery.fn = jQuery.prototype = {
+       constructor: jQuery,
+       init: function( selector, context, rootjQuery ) {
+               var match, elem, ret, doc;
 
-               // Used by jQuery.camelCase as callback to replace()
-                       fcamelCase = function( all, letter ) {
-                               return ( letter + "" ).toUpperCase();
-                       },
+               // Handle $(""), $(null), $(undefined), $(false)
+               if ( !selector ) {
+                       return this;
+               }
 
-               // Keep a UserAgent string for use with jQuery.browser
-                       userAgent = navigator.userAgent,
+               // Handle $(DOMElement)
+               if ( selector.nodeType ) {
+                       this.context = this[0] = selector;
+                       this.length = 1;
+                       return this;
+               }
 
-               // For matching the engine and version of the browser
-                       browserMatch,
+               // Handle HTML strings
+               if ( typeof selector === "string" ) {
+                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
+                               // Assume that strings that start and end with <> are HTML and skip the regex check
+                               match = [ null, selector, null ];
 
-               // The deferred used on DOM ready
-                       readyList,
+                       } else {
+                               match = rquickExpr.exec( selector );
+                       }
 
-               // The ready event handler
-                       DOMContentLoaded,
+                       // Match html or make sure no context is specified for #id
+                       if ( match && (match[1] || !context) ) {
 
-               // Save a reference to some core methods
-                       toString = Object.prototype.toString,
-                       hasOwn = Object.prototype.hasOwnProperty,
-                       push = Array.prototype.push,
-                       slice = Array.prototype.slice,
-                       trim = String.prototype.trim,
-                       indexOf = Array.prototype.indexOf,
+                               // HANDLE: $(html) -> $(array)
+                               if ( match[1] ) {
+                                       context = context instanceof jQuery ? context[0] : context;
+                                       doc = ( context && context.nodeType ? context.ownerDocument || context : document );
 
-               // [[Class]] -> type pairs
-                       class2type = {};
+                                       // scripts is true for back-compat
+                                       selector = jQuery.parseHTML( match[1], doc, true );
+                                       if ( rsingleTag.test( match[1] ) && jQuery.isPlainObject( context ) ) {
+                                               this.attr.call( selector, context, true );
+                                       }
 
-               jQuery.fn = jQuery.prototype = {
-                       constructor: jQuery,
-                       init: function( selector, context, rootjQuery ) {
-                               var match, elem, ret, doc;
+                                       return jQuery.merge( this, selector );
 
-                               // Handle $(""), $(null), or $(undefined)
-                               if ( !selector ) {
-                                       return this;
-                               }
+                               // HANDLE: $(#id)
+                               } else {
+                                       elem = document.getElementById( match[2] );
+
+                                       // Check parentNode to catch when Blackberry 4.6 returns
+                                       // nodes that are no longer in the document #6963
+                                       if ( elem && elem.parentNode ) {
+                                               // Handle the case where IE and Opera return items
+                                               // by name instead of ID
+                                               if ( elem.id !== match[2] ) {
+                                                       return rootjQuery.find( selector );
+                                               }
 
-                               // Handle $(DOMElement)
-                               if ( selector.nodeType ) {
-                                       this.context = this[0] = selector;
-                                       this.length = 1;
-                                       return this;
-                               }
+                                               // Otherwise, we inject the element directly into the jQuery object
+                                               this.length = 1;
+                                               this[0] = elem;
+                                       }
 
-                               // The body element only exists once, optimize finding it
-                               if ( selector === "body" && !context && document.body ) {
                                        this.context = document;
-                                       this[0] = document.body;
                                        this.selector = selector;
-                                       this.length = 1;
                                        return this;
                                }
 
-                               // Handle HTML strings
-                               if ( typeof selector === "string" ) {
-                                       // Are we dealing with HTML string or an ID?
-                                       if ( selector.charAt(0) === "<" && selector.charAt( selector.length - 1 ) === ">" && selector.length >= 3 ) {
-                                               // Assume that strings that start and end with <> are HTML and skip the regex check
-                                               match = [ null, selector, null ];
+                       // HANDLE: $(expr, $(...))
+                       } else if ( !context || context.jquery ) {
+                               return ( context || rootjQuery ).find( selector );
 
-                                       } else {
-                                               match = quickExpr.exec( selector );
-                                       }
+                       // HANDLE: $(expr, context)
+                       // (which is just equivalent to: $(context).find(expr)
+                       } else {
+                               return this.constructor( context ).find( selector );
+                       }
 
-                                       // Verify a match, and that no context was specified for #id
-                                       if ( match && (match[1] || !context) ) {
+               // HANDLE: $(function)
+               // Shortcut for document ready
+               } else if ( jQuery.isFunction( selector ) ) {
+                       return rootjQuery.ready( selector );
+               }
 
-                                               // HANDLE: $(html) -> $(array)
-                                               if ( match[1] ) {
-                                                       context = context instanceof jQuery ? context[0] : context;
-                                                       doc = ( context ? context.ownerDocument || context : document );
+               if ( selector.selector !== undefined ) {
+                       this.selector = selector.selector;
+                       this.context = selector.context;
+               }
 
-                                                       // If a single string is passed in and it's a single tag
-                                                       // just do a createElement and skip the rest
-                                                       ret = rsingleTag.exec( selector );
+               return jQuery.makeArray( selector, this );
+       },
 
-                                                       if ( ret ) {
-                                                               if ( jQuery.isPlainObject( context ) ) {
-                                                                       selector = [ document.createElement( ret[1] ) ];
-                                                                       jQuery.fn.attr.call( selector, context, true );
+       // Start with an empty selector
+       selector: "",
 
-                                                               } else {
-                                                                       selector = [ doc.createElement( ret[1] ) ];
-                                                               }
+       // The current version of jQuery being used
+       jquery: "1.8.1",
 
-                                                       } else {
-                                                               ret = jQuery.buildFragment( [ match[1] ], [ doc ] );
-                                                               selector = ( ret.cacheable ? jQuery.clone(ret.fragment) : ret.fragment ).childNodes;
-                                                       }
+       // The default length of a jQuery object is 0
+       length: 0,
 
-                                                       return jQuery.merge( this, selector );
+       // The number of elements contained in the matched element set
+       size: function() {
+               return this.length;
+       },
 
-                                                       // HANDLE: $("#id")
-                                               } else {
-                                                       elem = document.getElementById( match[2] );
-
-                                                       // Check parentNode to catch when Blackberry 4.6 returns
-                                                       // nodes that are no longer in the document #6963
-                                                       if ( elem && elem.parentNode ) {
-                                                               // Handle the case where IE and Opera return items
-                                                               // by name instead of ID
-                                                               if ( elem.id !== match[2] ) {
-                                                                       return rootjQuery.find( selector );
-                                                               }
+       toArray: function() {
+               return core_slice.call( this );
+       },
 
-                                                               // Otherwise, we inject the element directly into the jQuery object
-                                                               this.length = 1;
-                                                               this[0] = elem;
-                                                       }
+       // Get the Nth element in the matched element set OR
+       // Get the whole matched element set as a clean array
+       get: function( num ) {
+               return num == null ?
 
-                                                       this.context = document;
-                                                       this.selector = selector;
-                                                       return this;
-                                               }
+                       // Return a 'clean' array
+                       this.toArray() :
 
-                                               // HANDLE: $(expr, $(...))
-                                       } else if ( !context || context.jquery ) {
-                                               return ( context || rootjQuery ).find( selector );
+                       // Return just the object
+                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
+       },
 
-                                               // HANDLE: $(expr, context)
-                                               // (which is just equivalent to: $(context).find(expr)
-                                       } else {
-                                               return this.constructor( context ).find( selector );
-                                       }
+       // Take an array of elements and push it onto the stack
+       // (returning the new matched element set)
+       pushStack: function( elems, name, selector ) {
 
-                                       // HANDLE: $(function)
-                                       // Shortcut for document ready
-                               } else if ( jQuery.isFunction( selector ) ) {
-                                       return rootjQuery.ready( selector );
-                               }
+               // Build a new jQuery matched element set
+               var ret = jQuery.merge( this.constructor(), elems );
 
-                               if ( selector.selector !== undefined ) {
-                                       this.selector = selector.selector;
-                                       this.context = selector.context;
-                               }
+               // Add the old object onto the stack (as a reference)
+               ret.prevObject = this;
 
-                               return jQuery.makeArray( selector, this );
-                       },
+               ret.context = this.context;
 
-                       // Start with an empty selector
-                       selector: "",
+               if ( name === "find" ) {
+                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
+               } else if ( name ) {
+                       ret.selector = this.selector + "." + name + "(" + selector + ")";
+               }
 
-                       // The current version of jQuery being used
-                       jquery: "1.7.2",
+               // Return the newly-formed element set
+               return ret;
+       },
+
+       // Execute a callback for every element in the matched set.
+       // (You can seed the arguments with an array of args, but this is
+       // only used internally.)
+       each: function( callback, args ) {
+               return jQuery.each( this, callback, args );
+       },
+
+       ready: function( fn ) {
+               // Add the callback
+               jQuery.ready.promise().done( fn );
+
+               return this;
+       },
+
+       eq: function( i ) {
+               i = +i;
+               return i === -1 ?
+                       this.slice( i ) :
+                       this.slice( i, i + 1 );
+       },
+
+       first: function() {
+               return this.eq( 0 );
+       },
+
+       last: function() {
+               return this.eq( -1 );
+       },
+
+       slice: function() {
+               return this.pushStack( core_slice.apply( this, arguments ),
+                       "slice", core_slice.call(arguments).join(",") );
+       },
+
+       map: function( callback ) {
+               return this.pushStack( jQuery.map(this, function( elem, i ) {
+                       return callback.call( elem, i, elem );
+               }));
+       },
+
+       end: function() {
+               return this.prevObject || this.constructor(null);
+       },
+
+       // For internal use only.
+       // Behaves like an Array's method, not like a jQuery method.
+       push: core_push,
+       sort: [].sort,
+       splice: [].splice
+};
 
-                       // The default length of a jQuery object is 0
-                       length: 0,
+// Give the init function the jQuery prototype for later instantiation
+jQuery.fn.init.prototype = jQuery.fn;
+
+jQuery.extend = jQuery.fn.extend = function() {
+       var options, name, src, copy, copyIsArray, clone,
+               target = arguments[0] || {},
+               i = 1,
+               length = arguments.length,
+               deep = false;
+
+       // Handle a deep copy situation
+       if ( typeof target === "boolean" ) {
+               deep = target;
+               target = arguments[1] || {};
+               // skip the boolean and the target
+               i = 2;
+       }
 
-                       // The number of elements contained in the matched element set
-                       size: function() {
-                               return this.length;
-                       },
+       // Handle case when target is a string or something (possible in deep copy)
+       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
+               target = {};
+       }
 
-                       toArray: function() {
-                               return slice.call( this, 0 );
-                       },
+       // extend jQuery itself if only one argument is passed
+       if ( length === i ) {
+               target = this;
+               --i;
+       }
 
-                       // Get the Nth element in the matched element set OR
-                       // Get the whole matched element set as a clean array
-                       get: function( num ) {
-                               return num == null ?
+       for ( ; i < length; i++ ) {
+               // Only deal with non-null/undefined values
+               if ( (options = arguments[ i ]) != null ) {
+                       // Extend the base object
+                       for ( name in options ) {
+                               src = target[ name ];
+                               copy = options[ name ];
 
-                                       // Return a 'clean' array
-                                       this.toArray() :
+                               // Prevent never-ending loop
+                               if ( target === copy ) {
+                                       continue;
+                               }
 
-                                       // Return just the object
-                                       ( num < 0 ? this[ this.length + num ] : this[ num ] );
-                       },
+                               // Recurse if we're merging plain objects or arrays
+                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
+                                       if ( copyIsArray ) {
+                                               copyIsArray = false;
+                                               clone = src && jQuery.isArray(src) ? src : [];
 
-                       // Take an array of elements and push it onto the stack
-                       // (returning the new matched element set)
-                       pushStack: function( elems, name, selector ) {
-                               // Build a new jQuery matched element set
-                               var ret = this.constructor();
+                                       } else {
+                                               clone = src && jQuery.isPlainObject(src) ? src : {};
+                                       }
 
-                               if ( jQuery.isArray( elems ) ) {
-                                       push.apply( ret, elems );
+                                       // Never move original objects, clone them
+                                       target[ name ] = jQuery.extend( deep, clone, copy );
 
-                               } else {
-                                       jQuery.merge( ret, elems );
+                               // Don't bring in undefined values
+                               } else if ( copy !== undefined ) {
+                                       target[ name ] = copy;
                                }
+                       }
+               }
+       }
 
-                               // Add the old object onto the stack (as a reference)
-                               ret.prevObject = this;
+       // Return the modified object
+       return target;
+};
 
-                               ret.context = this.context;
+jQuery.extend({
+       noConflict: function( deep ) {
+               if ( window.$ === jQuery ) {
+                       window.$ = _$;
+               }
 
-                               if ( name === "find" ) {
-                                       ret.selector = this.selector + ( this.selector ? " " : "" ) + selector;
-                               } else if ( name ) {
-                                       ret.selector = this.selector + "." + name + "(" + selector + ")";
-                               }
+               if ( deep && window.jQuery === jQuery ) {
+                       window.jQuery = _jQuery;
+               }
 
-                               // Return the newly-formed element set
-                               return ret;
-                       },
+               return jQuery;
+       },
 
-                       // Execute a callback for every element in the matched set.
-                       // (You can seed the arguments with an array of args, but this is
-                       // only used internally.)
-                       each: function( callback, args ) {
-                               return jQuery.each( this, callback, args );
-                       },
+       // Is the DOM ready to be used? Set to true once it occurs.
+       isReady: false,
 
-                       ready: function( fn ) {
-                               // Attach the listeners
-                               jQuery.bindReady();
+       // A counter to track how many items to wait for before
+       // the ready event fires. See #6781
+       readyWait: 1,
 
-                               // Add the callback
-                               readyList.add( fn );
+       // Hold (or release) the ready event
+       holdReady: function( hold ) {
+               if ( hold ) {
+                       jQuery.readyWait++;
+               } else {
+                       jQuery.ready( true );
+               }
+       },
 
-                               return this;
-                       },
+       // Handle when the DOM is ready
+       ready: function( wait ) {
 
-                       eq: function( i ) {
-                               i = +i;
-                               return i === -1 ?
-                                       this.slice( i ) :
-                                       this.slice( i, i + 1 );
-                       },
+               // Abort if there are pending holds or we're already ready
+               if ( wait === true ? --jQuery.readyWait : jQuery.isReady ) {
+                       return;
+               }
 
-                       first: function() {
-                               return this.eq( 0 );
-                       },
+               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
+               if ( !document.body ) {
+                       return setTimeout( jQuery.ready, 1 );
+               }
 
-                       last: function() {
-                               return this.eq( -1 );
-                       },
+               // Remember that the DOM is ready
+               jQuery.isReady = true;
 
-                       slice: function() {
-                               return this.pushStack( slice.apply( this, arguments ),
-                                       "slice", slice.call(arguments).join(",") );
-                       },
+               // If a normal DOM Ready event fired, decrement, and wait if need be
+               if ( wait !== true && --jQuery.readyWait > 0 ) {
+                       return;
+               }
 
-                       map: function( callback ) {
-                               return this.pushStack( jQuery.map(this, function( elem, i ) {
-                                       return callback.call( elem, i, elem );
-                               }));
-                       },
+               // If there are functions bound, to execute
+               readyList.resolveWith( document, [ jQuery ] );
 
-                       end: function() {
-                               return this.prevObject || this.constructor(null);
-                       },
+               // Trigger any bound ready events
+               if ( jQuery.fn.trigger ) {
+                       jQuery( document ).trigger("ready").off("ready");
+               }
+       },
+
+       // See test/unit/core.js for details concerning isFunction.
+       // Since version 1.3, DOM methods and functions like alert
+       // aren't supported. They return false on IE (#2968).
+       isFunction: function( obj ) {
+               return jQuery.type(obj) === "function";
+       },
+
+       isArray: Array.isArray || function( obj ) {
+               return jQuery.type(obj) === "array";
+       },
+
+       isWindow: function( obj ) {
+               return obj != null && obj == obj.window;
+       },
+
+       isNumeric: function( obj ) {
+               return !isNaN( parseFloat(obj) ) && isFinite( obj );
+       },
+
+       type: function( obj ) {
+               return obj == null ?
+                       String( obj ) :
+                       class2type[ core_toString.call(obj) ] || "object";
+       },
+
+       isPlainObject: function( obj ) {
+               // Must be an Object.
+               // Because of IE, we also have to check the presence of the constructor property.
+               // Make sure that DOM nodes and window objects don't pass through, as well
+               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
+                       return false;
+               }
 
-                       // For internal use only.
-                       // Behaves like an Array's method, not like a jQuery method.
-                       push: push,
-                       sort: [].sort,
-                       splice: [].splice
-               };
+               try {
+                       // Not own constructor property must be Object
+                       if ( obj.constructor &&
+                               !core_hasOwn.call(obj, "constructor") &&
+                               !core_hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
+                               return false;
+                       }
+               } catch ( e ) {
+                       // IE8,9 Will throw exceptions on certain host objects #9897
+                       return false;
+               }
 
-// Give the init function the jQuery prototype for later instantiation
-               jQuery.fn.init.prototype = jQuery.fn;
+               // Own properties are enumerated firstly, so to speed up,
+               // if last one is own, then all properties are own.
 
-               jQuery.extend = jQuery.fn.extend = function() {
-                       var options, name, src, copy, copyIsArray, clone,
-                               target = arguments[0] || {},
-                               i = 1,
-                               length = arguments.length,
-                               deep = false;
+               var key;
+               for ( key in obj ) {}
 
-                       // Handle a deep copy situation
-                       if ( typeof target === "boolean" ) {
-                               deep = target;
-                               target = arguments[1] || {};
-                               // skip the boolean and the target
-                               i = 2;
-                       }
+               return key === undefined || core_hasOwn.call( obj, key );
+       },
 
-                       // Handle case when target is a string or something (possible in deep copy)
-                       if ( typeof target !== "object" && !jQuery.isFunction(target) ) {
-                               target = {};
-                       }
+       isEmptyObject: function( obj ) {
+               var name;
+               for ( name in obj ) {
+                       return false;
+               }
+               return true;
+       },
+
+       error: function( msg ) {
+               throw new Error( msg );
+       },
+
+       // data: string of html
+       // context (optional): If specified, the fragment will be created in this context, defaults to document
+       // scripts (optional): If true, will include scripts passed in the html string
+       parseHTML: function( data, context, scripts ) {
+               var parsed;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               if ( typeof context === "boolean" ) {
+                       scripts = context;
+                       context = 0;
+               }
+               context = context || document;
 
-                       // extend jQuery itself if only one argument is passed
-                       if ( length === i ) {
-                               target = this;
-                               --i;
-                       }
+               // Single tag
+               if ( (parsed = rsingleTag.exec( data )) ) {
+                       return [ context.createElement( parsed[1] ) ];
+               }
 
-                       for ( ; i < length; i++ ) {
-                               // Only deal with non-null/undefined values
-                               if ( (options = arguments[ i ]) != null ) {
-                                       // Extend the base object
-                                       for ( name in options ) {
-                                               src = target[ name ];
-                                               copy = options[ name ];
-
-                                               // Prevent never-ending loop
-                                               if ( target === copy ) {
-                                                       continue;
-                                               }
+               parsed = jQuery.buildFragment( [ data ], context, scripts ? null : [] );
+               return jQuery.merge( [],
+                       (parsed.cacheable ? jQuery.clone( parsed.fragment ) : parsed.fragment).childNodes );
+       },
 
-                                               // Recurse if we're merging plain objects or arrays
-                                               if ( deep && copy && ( jQuery.isPlainObject(copy) || (copyIsArray = jQuery.isArray(copy)) ) ) {
-                                                       if ( copyIsArray ) {
-                                                               copyIsArray = false;
-                                                               clone = src && jQuery.isArray(src) ? src : [];
+       parseJSON: function( data ) {
+               if ( !data || typeof data !== "string") {
+                       return null;
+               }
 
-                                                       } else {
-                                                               clone = src && jQuery.isPlainObject(src) ? src : {};
-                                                       }
+               // Make sure leading/trailing whitespace is removed (IE can't handle it)
+               data = jQuery.trim( data );
 
-                                                       // Never move original objects, clone them
-                                                       target[ name ] = jQuery.extend( deep, clone, copy );
+               // Attempt to parse using the native JSON parser first
+               if ( window.JSON && window.JSON.parse ) {
+                       return window.JSON.parse( data );
+               }
 
-                                                       // Don't bring in undefined values
-                                               } else if ( copy !== undefined ) {
-                                                       target[ name ] = copy;
-                                               }
-                                       }
-                               }
-                       }
+               // Make sure the incoming data is actual JSON
+               // Logic borrowed from http://json.org/json2.js
+               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
+                       .replace( rvalidtokens, "]" )
+                       .replace( rvalidbraces, "")) ) {
 
-                       // Return the modified object
-                       return target;
-               };
+                       return ( new Function( "return " + data ) )();
 
-               jQuery.extend({
-                       noConflict: function( deep ) {
-                               if ( window.$ === jQuery ) {
-                                       window.$ = _$;
-                               }
+               }
+               jQuery.error( "Invalid JSON: " + data );
+       },
 
-                               if ( deep && window.jQuery === jQuery ) {
-                                       window.jQuery = _jQuery;
-                               }
+       // Cross-browser xml parsing
+       parseXML: function( data ) {
+               var xml, tmp;
+               if ( !data || typeof data !== "string" ) {
+                       return null;
+               }
+               try {
+                       if ( window.DOMParser ) { // Standard
+                               tmp = new DOMParser();
+                               xml = tmp.parseFromString( data , "text/xml" );
+                       } else { // IE
+                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
+                               xml.async = "false";
+                               xml.loadXML( data );
+                       }
+               } catch( e ) {
+                       xml = undefined;
+               }
+               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
+                       jQuery.error( "Invalid XML: " + data );
+               }
+               return xml;
+       },
+
+       noop: function() {},
+
+       // Evaluates a script in a global context
+       // Workarounds based on findings by Jim Driscoll
+       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
+       globalEval: function( data ) {
+               if ( data && core_rnotwhite.test( data ) ) {
+                       // We use execScript on Internet Explorer
+                       // We use an anonymous function so that context is window
+                       // rather than jQuery in Firefox
+                       ( window.execScript || function( data ) {
+                               window[ "eval" ].call( window, data );
+                       } )( data );
+               }
+       },
 
-                               return jQuery;
-                       },
+       // Convert dashed to camelCase; used by the css and data modules
+       // Microsoft forgot to hump their vendor prefix (#9572)
+       camelCase: function( string ) {
+               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
+       },
 
-                       // Is the DOM ready to be used? Set to true once it occurs.
-                       isReady: false,
+       nodeName: function( elem, name ) {
+               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
+       },
 
-                       // A counter to track how many items to wait for before
-                       // the ready event fires. See #6781
-                       readyWait: 1,
+       // args is for internal usage only
+       each: function( obj, callback, args ) {
+               var name,
+                       i = 0,
+                       length = obj.length,
+                       isObj = length === undefined || jQuery.isFunction( obj );
 
-                       // Hold (or release) the ready event
-                       holdReady: function( hold ) {
-                               if ( hold ) {
-                                       jQuery.readyWait++;
-                               } else {
-                                       jQuery.ready( true );
+               if ( args ) {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.apply( obj[ name ], args ) === false ) {
+                                               break;
+                                       }
                                }
-                       },
-
-                       // Handle when the DOM is ready
-                       ready: function( wait ) {
-                               // Either a released hold or an DOMready/load event and not yet ready
-                               if ( (wait === true && !--jQuery.readyWait) || (wait !== true && !jQuery.isReady) ) {
-                                       // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                                       if ( !document.body ) {
-                                               return setTimeout( jQuery.ready, 1 );
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.apply( obj[ i++ ], args ) === false ) {
+                                               break;
                                        }
+                               }
+                       }
 
-                                       // Remember that the DOM is ready
-                                       jQuery.isReady = true;
-
-                                       // If a normal DOM Ready event fired, decrement, and wait if need be
-                                       if ( wait !== true && --jQuery.readyWait > 0 ) {
-                                               return;
+               // A special, fast, case for the most common use of each
+               } else {
+                       if ( isObj ) {
+                               for ( name in obj ) {
+                                       if ( callback.call( obj[ name ], name, obj[ name ] ) === false ) {
+                                               break;
                                        }
-
-                                       // If there are functions bound, to execute
-                                       readyList.fireWith( document, [ jQuery ] );
-
-                                       // Trigger any bound ready events
-                                       if ( jQuery.fn.trigger ) {
-                                               jQuery( document ).trigger( "ready" ).off( "ready" );
+                               }
+                       } else {
+                               for ( ; i < length; ) {
+                                       if ( callback.call( obj[ i ], i, obj[ i++ ] ) === false ) {
+                                               break;
                                        }
                                }
-                       },
+                       }
+               }
 
-                       bindReady: function() {
-                               if ( readyList ) {
-                                       return;
-                               }
+               return obj;
+       },
+
+       // Use native String.trim function wherever possible
+       trim: core_trim && !core_trim.call("\uFEFF\xA0") ?
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               core_trim.call( text );
+               } :
 
-                               readyList = jQuery.Callbacks( "once memory" );
+               // Otherwise use our own trimming functionality
+               function( text ) {
+                       return text == null ?
+                               "" :
+                               text.toString().replace( rtrim, "" );
+               },
 
-                               // Catch cases where $(document).ready() is called after the
-                               // browser event has already occurred.
-                               if ( document.readyState === "complete" ) {
-                                       // Handle it asynchronously to allow scripts the opportunity to delay ready
-                                       return setTimeout( jQuery.ready, 1 );
-                               }
+       // results is for internal usage only
+       makeArray: function( arr, results ) {
+               var type,
+                       ret = results || [];
 
-                               // Mozilla, Opera and webkit nightlies currently support this event
-                               if ( document.addEventListener ) {
-                                       // Use the handy event callback
-                                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
+               if ( arr != null ) {
+                       // The window, strings (and functions) also have 'length'
+                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
+                       type = jQuery.type( arr );
 
-                                       // A fallback to window.onload, that will always work
-                                       window.addEventListener( "load", jQuery.ready, false );
+                       if ( arr.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( arr ) ) {
+                               core_push.call( ret, arr );
+                       } else {
+                               jQuery.merge( ret, arr );
+                       }
+               }
 
-                                       // If IE event model is used
-                               } else if ( document.attachEvent ) {
-                                       // ensure firing before onload,
-                                       // maybe late but safe also for iframes
-                                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
+               return ret;
+       },
 
-                                       // A fallback to window.onload, that will always work
-                                       window.attachEvent( "onload", jQuery.ready );
+       inArray: function( elem, arr, i ) {
+               var len;
 
-                                       // If IE and not a frame
-                                       // continually check to see if the document is ready
-                                       var toplevel = false;
+               if ( arr ) {
+                       if ( core_indexOf ) {
+                               return core_indexOf.call( arr, elem, i );
+                       }
 
-                                       try {
-                                               toplevel = window.frameElement == null;
-                                       } catch(e) {}
+                       len = arr.length;
+                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
 
-                                       if ( document.documentElement.doScroll && toplevel ) {
-                                               doScrollCheck();
-                                       }
+                       for ( ; i < len; i++ ) {
+                               // Skip accessing in sparse arrays
+                               if ( i in arr && arr[ i ] === elem ) {
+                                       return i;
                                }
-                       },
-
-                       // See test/unit/core.js for details concerning isFunction.
-                       // Since version 1.3, DOM methods and functions like alert
-                       // aren't supported. They return false on IE (#2968).
-                       isFunction: function( obj ) {
-                               return jQuery.type(obj) === "function";
-                       },
+                       }
+               }
 
-                       isArray: Array.isArray || function( obj ) {
-                               return jQuery.type(obj) === "array";
-                       },
+               return -1;
+       },
 
-                       isWindow: function( obj ) {
-                               return obj != null && obj == obj.window;
-                       },
+       merge: function( first, second ) {
+               var l = second.length,
+                       i = first.length,
+                       j = 0;
 
-                       isNumeric: function( obj ) {
-                               return !isNaN( parseFloat(obj) ) && isFinite( obj );
-                       },
+               if ( typeof l === "number" ) {
+                       for ( ; j < l; j++ ) {
+                               first[ i++ ] = second[ j ];
+                       }
 
-                       type: function( obj ) {
-                               return obj == null ?
-                                       String( obj ) :
-                                       class2type[ toString.call(obj) ] || "object";
-                       },
+               } else {
+                       while ( second[j] !== undefined ) {
+                               first[ i++ ] = second[ j++ ];
+                       }
+               }
 
-                       isPlainObject: function( obj ) {
-                               // Must be an Object.
-                               // Because of IE, we also have to check the presence of the constructor property.
-                               // Make sure that DOM nodes and window objects don't pass through, as well
-                               if ( !obj || jQuery.type(obj) !== "object" || obj.nodeType || jQuery.isWindow( obj ) ) {
-                                       return false;
-                               }
+               first.length = i;
 
-                               try {
-                                       // Not own constructor property must be Object
-                                       if ( obj.constructor &&
-                                               !hasOwn.call(obj, "constructor") &&
-                                               !hasOwn.call(obj.constructor.prototype, "isPrototypeOf") ) {
-                                               return false;
-                                       }
-                               } catch ( e ) {
-                                       // IE8,9 Will throw exceptions on certain host objects #9897
-                                       return false;
-                               }
+               return first;
+       },
 
-                               // Own properties are enumerated firstly, so to speed up,
-                               // if last one is own, then all properties are own.
+       grep: function( elems, callback, inv ) {
+               var retVal,
+                       ret = [],
+                       i = 0,
+                       length = elems.length;
+               inv = !!inv;
 
-                               var key;
-                               for ( key in obj ) {}
+               // Go through the array, only saving the items
+               // that pass the validator function
+               for ( ; i < length; i++ ) {
+                       retVal = !!callback( elems[ i ], i );
+                       if ( inv !== retVal ) {
+                               ret.push( elems[ i ] );
+                       }
+               }
 
-                               return key === undefined || hasOwn.call( obj, key );
-                       },
+               return ret;
+       },
 
-                       isEmptyObject: function( obj ) {
-                               for ( var name in obj ) {
-                                       return false;
-                               }
-                               return true;
-                       },
+       // arg is for internal usage only
+       map: function( elems, callback, arg ) {
+               var value, key,
+                       ret = [],
+                       i = 0,
+                       length = elems.length,
+                       // jquery objects are treated as arrays
+                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
 
-                       error: function( msg ) {
-                               throw new Error( msg );
-                       },
+               // Go through the array, translating each of the items to their
+               if ( isArray ) {
+                       for ( ; i < length; i++ ) {
+                               value = callback( elems[ i ], i, arg );
 
-                       parseJSON: function( data ) {
-                               if ( typeof data !== "string" || !data ) {
-                                       return null;
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
                                }
+                       }
 
-                               // Make sure leading/trailing whitespace is removed (IE can't handle it)
-                               data = jQuery.trim( data );
+               // Go through every key on the object,
+               } else {
+                       for ( key in elems ) {
+                               value = callback( elems[ key ], key, arg );
 
-                               // Attempt to parse using the native JSON parser first
-                               if ( window.JSON && window.JSON.parse ) {
-                                       return window.JSON.parse( data );
+                               if ( value != null ) {
+                                       ret[ ret.length ] = value;
                                }
+                       }
+               }
 
-                               // Make sure the incoming data is actual JSON
-                               // Logic borrowed from http://json.org/json2.js
-                               if ( rvalidchars.test( data.replace( rvalidescape, "@" )
-                                       .replace( rvalidtokens, "]" )
-                                       .replace( rvalidbraces, "")) ) {
+               // Flatten any nested arrays
+               return ret.concat.apply( [], ret );
+       },
 
-                                       return ( new Function( "return " + data ) )();
+       // A global GUID counter for objects
+       guid: 1,
 
-                               }
-                               jQuery.error( "Invalid JSON: " + data );
-                       },
+       // Bind a function to a context, optionally partially applying any
+       // arguments.
+       proxy: function( fn, context ) {
+               var tmp, args, proxy;
 
-                       // Cross-browser xml parsing
-                       parseXML: function( data ) {
-                               if ( typeof data !== "string" || !data ) {
-                                       return null;
-                               }
-                               var xml, tmp;
-                               try {
-                                       if ( window.DOMParser ) { // Standard
-                                               tmp = new DOMParser();
-                                               xml = tmp.parseFromString( data , "text/xml" );
-                                       } else { // IE
-                                               xml = new ActiveXObject( "Microsoft.XMLDOM" );
-                                               xml.async = "false";
-                                               xml.loadXML( data );
-                                       }
-                               } catch( e ) {
-                                       xml = undefined;
-                               }
-                               if ( !xml || !xml.documentElement || xml.getElementsByTagName( "parsererror" ).length ) {
-                                       jQuery.error( "Invalid XML: " + data );
-                               }
-                               return xml;
-                       },
+               if ( typeof context === "string" ) {
+                       tmp = fn[ context ];
+                       context = fn;
+                       fn = tmp;
+               }
 
-                       noop: function() {},
-
-                       // Evaluates a script in a global context
-                       // Workarounds based on findings by Jim Driscoll
-                       // http://weblogs.java.net/blog/driscoll/archive/2009/09/08/eval-javascript-global-context
-                       globalEval: function( data ) {
-                               if ( data && rnotwhite.test( data ) ) {
-                                       // We use execScript on Internet Explorer
-                                       // We use an anonymous function so that context is window
-                                       // rather than jQuery in Firefox
-                                       ( window.execScript || function( data ) {
-                                               window[ "eval" ].call( window, data );
-                                       } )( data );
-                               }
-                       },
+               // Quick check to determine if target is callable, in the spec
+               // this throws a TypeError, but we will just return undefined.
+               if ( !jQuery.isFunction( fn ) ) {
+                       return undefined;
+               }
 
-                       // Convert dashed to camelCase; used by the css and data modules
-                       // Microsoft forgot to hump their vendor prefix (#9572)
-                       camelCase: function( string ) {
-                               return string.replace( rmsPrefix, "ms-" ).replace( rdashAlpha, fcamelCase );
-                       },
+               // Simulated bind
+               args = core_slice.call( arguments, 2 );
+               proxy = function() {
+                       return fn.apply( context, args.concat( core_slice.call( arguments ) ) );
+               };
 
-                       nodeName: function( elem, name ) {
-                               return elem.nodeName && elem.nodeName.toUpperCase() === name.toUpperCase();
-                       },
+               // Set the guid of unique handler to the same of original handler, so it can be removed
+               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
 
-                       // args is for internal usage only
-                       each: function( object, callback, args ) {
-                               var name, i = 0,
-                                       length = object.length,
-                                       isObj = length === undefined || jQuery.isFunction( object );
+               return proxy;
+       },
 
-                               if ( args ) {
-                                       if ( isObj ) {
-                                               for ( name in object ) {
-                                                       if ( callback.apply( object[ name ], args ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       } else {
-                                               for ( ; i < length; ) {
-                                                       if ( callback.apply( object[ i++ ], args ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       }
+       // Multifunctional method to get and set values of a collection
+       // The value/s can optionally be executed if it's a function
+       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
+               var exec,
+                       bulk = key == null,
+                       i = 0,
+                       length = elems.length;
+
+               // Sets many values
+               if ( key && typeof key === "object" ) {
+                       for ( i in key ) {
+                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
+                       }
+                       chainable = 1;
+
+               // Sets one value
+               } else if ( value !== undefined ) {
+                       // Optionally, function values get executed if exec is true
+                       exec = pass === undefined && jQuery.isFunction( value );
+
+                       if ( bulk ) {
+                               // Bulk operations only iterate when executing function values
+                               if ( exec ) {
+                                       exec = fn;
+                                       fn = function( elem, key, value ) {
+                                               return exec.call( jQuery( elem ), value );
+                                       };
 
-                                       // A special, fast, case for the most common use of each
+                               // Otherwise they run against the entire set
                                } else {
-                                       if ( isObj ) {
-                                               for ( name in object ) {
-                                                       if ( callback.call( object[ name ], name, object[ name ] ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       } else {
-                                               for ( ; i < length; ) {
-                                                       if ( callback.call( object[ i ], i, object[ i++ ] ) === false ) {
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                                       fn.call( elems, value );
+                                       fn = null;
                                }
+                       }
 
-                               return object;
-                       },
+                       if ( fn ) {
+                               for (; i < length; i++ ) {
+                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                               }
+                       }
 
-                       // Use native String.trim function wherever possible
-                       trim: trim ?
-                               function( text ) {
-                                       return text == null ?
-                                               "" :
-                                               trim.call( text );
-                               } :
-
-                               // Otherwise use our own trimming functionality
-                               function( text ) {
-                                       return text == null ?
-                                               "" :
-                                               text.toString().replace( trimLeft, "" ).replace( trimRight, "" );
-                               },
+                       chainable = 1;
+               }
 
-                       // results is for internal usage only
-                       makeArray: function( array, results ) {
-                               var ret = results || [];
+               return chainable ?
+                       elems :
 
-                               if ( array != null ) {
-                                       // The window, strings (and functions) also have 'length'
-                                       // Tweaked logic slightly to handle Blackberry 4.7 RegExp issues #6930
-                                       var type = jQuery.type( array );
+                       // Gets
+                       bulk ?
+                               fn.call( elems ) :
+                               length ? fn( elems[0], key ) : emptyGet;
+       },
 
-                                       if ( array.length == null || type === "string" || type === "function" || type === "regexp" || jQuery.isWindow( array ) ) {
-                                               push.call( ret, array );
-                                       } else {
-                                               jQuery.merge( ret, array );
-                                       }
-                               }
+       now: function() {
+               return ( new Date() ).getTime();
+       }
+});
 
-                               return ret;
-                       },
+jQuery.ready.promise = function( obj ) {
+       if ( !readyList ) {
 
-                       inArray: function( elem, array, i ) {
-                               var len;
+               readyList = jQuery.Deferred();
 
-                               if ( array ) {
-                                       if ( indexOf ) {
-                                               return indexOf.call( array, elem, i );
-                                       }
+               // Catch cases where $(document).ready() is called after the browser event has already occurred.
+               // we once tried to use readyState "interactive" here, but it caused issues like the one
+               // discovered by ChrisS here: http://bugs.jquery.com/ticket/12282#comment:15
+               if ( document.readyState === "complete" ) {
+                       // Handle it asynchronously to allow scripts the opportunity to delay ready
+                       setTimeout( jQuery.ready, 1 );
 
-                                       len = array.length;
-                                       i = i ? i < 0 ? Math.max( 0, len + i ) : i : 0;
+               // Standards-based browsers support DOMContentLoaded
+               } else if ( document.addEventListener ) {
+                       // Use the handy event callback
+                       document.addEventListener( "DOMContentLoaded", DOMContentLoaded, false );
 
-                                       for ( ; i < len; i++ ) {
-                                               // Skip accessing in sparse arrays
-                                               if ( i in array && array[ i ] === elem ) {
-                                                       return i;
-                                               }
-                                       }
-                               }
+                       // A fallback to window.onload, that will always work
+                       window.addEventListener( "load", jQuery.ready, false );
 
-                               return -1;
-                       },
+               // If IE event model is used
+               } else {
+                       // Ensure firing before onload, maybe late but safe also for iframes
+                       document.attachEvent( "onreadystatechange", DOMContentLoaded );
 
-                       merge: function( first, second ) {
-                               var i = first.length,
-                                       j = 0;
+                       // A fallback to window.onload, that will always work
+                       window.attachEvent( "onload", jQuery.ready );
 
-                               if ( typeof second.length === "number" ) {
-                                       for ( var l = second.length; j < l; j++ ) {
-                                               first[ i++ ] = second[ j ];
-                                       }
+                       // If IE and not a frame
+                       // continually check to see if the document is ready
+                       var top = false;
 
-                               } else {
-                                       while ( second[j] !== undefined ) {
-                                               first[ i++ ] = second[ j++ ];
-                                       }
-                               }
-
-                               first.length = i;
-
-                               return first;
-                       },
-
-                       grep: function( elems, callback, inv ) {
-                               var ret = [], retVal;
-                               inv = !!inv;
-
-                               // Go through the array, only saving the items
-                               // that pass the validator function
-                               for ( var i = 0, length = elems.length; i < length; i++ ) {
-                                       retVal = !!callback( elems[ i ], i );
-                                       if ( inv !== retVal ) {
-                                               ret.push( elems[ i ] );
-                                       }
-                               }
-
-                               return ret;
-                       },
-
-                       // arg is for internal usage only
-                       map: function( elems, callback, arg ) {
-                               var value, key, ret = [],
-                                       i = 0,
-                                       length = elems.length,
-                               // jquery objects are treated as arrays
-                                       isArray = elems instanceof jQuery || length !== undefined && typeof length === "number" && ( ( length > 0 && elems[ 0 ] && elems[ length -1 ] ) || length === 0 || jQuery.isArray( elems ) ) ;
-
-                               // Go through the array, translating each of the items to their
-                               if ( isArray ) {
-                                       for ( ; i < length; i++ ) {
-                                               value = callback( elems[ i ], i, arg );
-
-                                               if ( value != null ) {
-                                                       ret[ ret.length ] = value;
-                                               }
-                                       }
-
-                                       // Go through every key on the object,
-                               } else {
-                                       for ( key in elems ) {
-                                               value = callback( elems[ key ], key, arg );
-
-                                               if ( value != null ) {
-                                                       ret[ ret.length ] = value;
-                                               }
-                                       }
-                               }
-
-                               // Flatten any nested arrays
-                               return ret.concat.apply( [], ret );
-                       },
-
-                       // A global GUID counter for objects
-                       guid: 1,
-
-                       // Bind a function to a context, optionally partially applying any
-                       // arguments.
-                       proxy: function( fn, context ) {
-                               if ( typeof context === "string" ) {
-                                       var tmp = fn[ context ];
-                                       context = fn;
-                                       fn = tmp;
-                               }
-
-                               // Quick check to determine if target is callable, in the spec
-                               // this throws a TypeError, but we will just return undefined.
-                               if ( !jQuery.isFunction( fn ) ) {
-                                       return undefined;
-                               }
-
-                               // Simulated bind
-                               var args = slice.call( arguments, 2 ),
-                                       proxy = function() {
-                                               return fn.apply( context, args.concat( slice.call( arguments ) ) );
-                                       };
-
-                               // Set the guid of unique handler to the same of original handler, so it can be removed
-                               proxy.guid = fn.guid = fn.guid || proxy.guid || jQuery.guid++;
-
-                               return proxy;
-                       },
-
-                       // Mutifunctional method to get and set values to a collection
-                       // The value/s can optionally be executed if it's a function
-                       access: function( elems, fn, key, value, chainable, emptyGet, pass ) {
-                               var exec,
-                                       bulk = key == null,
-                                       i = 0,
-                                       length = elems.length;
+                       try {
+                               top = window.frameElement == null && document.documentElement;
+                       } catch(e) {}
 
-                               // Sets many values
-                               if ( key && typeof key === "object" ) {
-                                       for ( i in key ) {
-                                               jQuery.access( elems, fn, i, key[i], 1, emptyGet, value );
-                                       }
-                                       chainable = 1;
-
-                                       // Sets one value
-                               } else if ( value !== undefined ) {
-                                       // Optionally, function values get executed if exec is true
-                                       exec = pass === undefined && jQuery.isFunction( value );
-
-                                       if ( bulk ) {
-                                               // Bulk operations only iterate when executing function values
-                                               if ( exec ) {
-                                                       exec = fn;
-                                                       fn = function( elem, key, value ) {
-                                                               return exec.call( jQuery( elem ), value );
-                                                       };
-
-                                                       // Otherwise they run against the entire set
-                                               } else {
-                                                       fn.call( elems, value );
-                                                       fn = null;
-                                               }
-                                       }
+                       if ( top && top.doScroll ) {
+                               (function doScrollCheck() {
+                                       if ( !jQuery.isReady ) {
 
-                                       if ( fn ) {
-                                               for (; i < length; i++ ) {
-                                                       fn( elems[i], key, exec ? value.call( elems[i], i, fn( elems[i], key ) ) : value, pass );
+                                               try {
+                                                       // Use the trick by Diego Perini
+                                                       // http://javascript.nwbox.com/IEContentLoaded/
+                                                       top.doScroll("left");
+                                               } catch(e) {
+                                                       return setTimeout( doScrollCheck, 50 );
                                                }
-                                       }
-
-                                       chainable = 1;
-                               }
-
-                               return chainable ?
-                                       elems :
-
-                                       // Gets
-                                       bulk ?
-                                               fn.call( elems ) :
-                                               length ? fn( elems[0], key ) : emptyGet;
-                       },
-
-                       now: function() {
-                               return ( new Date() ).getTime();
-                       },
-
-                       // Use of jQuery.browser is frowned upon.
-                       // More details: http://docs.jquery.com/Utilities/jQuery.browser
-                       uaMatch: function( ua ) {
-                               ua = ua.toLowerCase();
-
-                               var match = rwebkit.exec( ua ) ||
-                                       ropera.exec( ua ) ||
-                                       rmsie.exec( ua ) ||
-                                       ua.indexOf("compatible") < 0 && rmozilla.exec( ua ) ||
-                                       [];
 
-                               return { browser: match[1] || "", version: match[2] || "0" };
-                       },
-
-                       sub: function() {
-                               function jQuerySub( selector, context ) {
-                                       return new jQuerySub.fn.init( selector, context );
-                               }
-                               jQuery.extend( true, jQuerySub, this );
-                               jQuerySub.superclass = this;
-                               jQuerySub.fn = jQuerySub.prototype = this();
-                               jQuerySub.fn.constructor = jQuerySub;
-                               jQuerySub.sub = this.sub;
-                               jQuerySub.fn.init = function init( selector, context ) {
-                                       if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
-                                               context = jQuerySub( context );
+                                               // and execute any waiting functions
+                                               jQuery.ready();
                                        }
-
-                                       return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
-                               };
-                               jQuerySub.fn.init.prototype = jQuerySub.fn;
-                               var rootjQuerySub = jQuerySub(document);
-                               return jQuerySub;
-                       },
-
-                       browser: {}
-               });
-
-// Populate the class2type map
-               jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
-                       class2type[ "[object " + name + "]" ] = name.toLowerCase();
-               });
-
-               browserMatch = jQuery.uaMatch( userAgent );
-               if ( browserMatch.browser ) {
-                       jQuery.browser[ browserMatch.browser ] = true;
-                       jQuery.browser.version = browserMatch.version;
-               }
-
-// Deprecated, use jQuery.browser.webkit instead
-               if ( jQuery.browser.webkit ) {
-                       jQuery.browser.safari = true;
-               }
-
-// IE doesn't match non-breaking spaces with \s
-               if ( rnotwhite.test( "\xA0" ) ) {
-                       trimLeft = /^[\s\xA0]+/;
-                       trimRight = /[\s\xA0]+$/;
-               }
-
-// All jQuery objects should point back to these
-               rootjQuery = jQuery(document);
-
-// Cleanup functions for the document ready method
-               if ( document.addEventListener ) {
-                       DOMContentLoaded = function() {
-                               document.removeEventListener( "DOMContentLoaded", DOMContentLoaded, false );
-                               jQuery.ready();
-                       };
-
-               } else if ( document.attachEvent ) {
-                       DOMContentLoaded = function() {
-                               // Make sure body exists, at least, in case IE gets a little overzealous (ticket #5443).
-                               if ( document.readyState === "complete" ) {
-                                       document.detachEvent( "onreadystatechange", DOMContentLoaded );
-                                       jQuery.ready();
-                               }
-                       };
-               }
-
-// The DOM ready check for Internet Explorer
-               function doScrollCheck() {
-                       if ( jQuery.isReady ) {
-                               return;
-                       }
-
-                       try {
-                               // If IE is used, use the trick by Diego Perini
-                               // http://javascript.nwbox.com/IEContentLoaded/
-                               document.documentElement.doScroll("left");
-                       } catch(e) {
-                               setTimeout( doScrollCheck, 1 );
-                               return;
+                               })();
                        }
-
-                       // and execute any waiting functions
-                       jQuery.ready();
                }
+       }
+       return readyList.promise( obj );
+};
 
-               return jQuery;
-
-       })();
-
-
-// String to Object flags format cache
-       var flagsCache = {};
+// Populate the class2type map
+jQuery.each("Boolean Number String Function Array Date RegExp Object".split(" "), function(i, name) {
+       class2type[ "[object " + name + "]" ] = name.toLowerCase();
+});
 
-// Convert String-formatted flags into Object-formatted ones and store in cache
-       function createFlags( flags ) {
-               var object = flagsCache[ flags ] = {},
-                       i, length;
-               flags = flags.split( /\s+/ );
-               for ( i = 0, length = flags.length; i < length; i++ ) {
-                       object[ flags[i] ] = true;
-               }
-               return object;
-       }
+// All jQuery objects should point back to these
+rootjQuery = jQuery(document);
+// String to Object options format cache
+var optionsCache = {};
+
+// Convert String-formatted options into Object-formatted ones and store in cache
+function createOptions( options ) {
+       var object = optionsCache[ options ] = {};
+       jQuery.each( options.split( core_rspace ), function( _, flag ) {
+               object[ flag ] = true;
+       });
+       return object;
+}
 
-       /*
       * Create a callback list using the following parameters:
       *
       *      flags:  an optional list of space-separated flags that will change how
-        *                      the callback list behaves
       *
       * By default a callback list will act like an event callback list and can be
       * "fired" multiple times.
       *
       * Possible flags:
       *
       *      once:                   will ensure the callback list can only be fired once (like a Deferred)
       *
       *      memory:                 will keep track of previous values and will call any callback added
       *                                      after the list has been fired right away with the latest "memorized"
       *                                      values (like a Deferred)
       *
       *      unique:                 will ensure a callback can only be added once (no duplicate in the list)
       *
       *      stopOnFalse:    interrupt callings when a callback returns false
       *
       */
-       jQuery.Callbacks = function( flags ) {
+/*
+ * Create a callback list using the following parameters:
+ *
*     options: an optional list of space-separated options that will change how
+ *                     the callback list behaves or a more traditional option object
+ *
+ * By default a callback list will act like an event callback list and can be
+ * "fired" multiple times.
+ *
* Possible options:
+ *
*     once:                   will ensure the callback list can only be fired once (like a Deferred)
+ *
*     memory:                 will keep track of previous values and will call any callback added
*                                     after the list has been fired right away with the latest "memorized"
*                                     values (like a Deferred)
+ *
*     unique:                 will ensure a callback can only be added once (no duplicate in the list)
+ *
*     stopOnFalse:    interrupt callings when a callback returns false
+ *
+ */
+jQuery.Callbacks = function( options ) {
 
-               // Convert flags from String-formatted to Object-formatted
-               // (we check in cache first)
-               flags = flags ? ( flagsCache[ flags ] || createFlags( flags ) ) : {};
+       // Convert options from String-formatted to Object-formatted if needed
+       // (we check in cache first)
+       options = typeof options === "string" ?
+               ( optionsCache[ options ] || createOptions( options ) ) :
+               jQuery.extend( {}, options );
 
-               var // Actual callback list
-                       list = [],
-               // Stack of fire calls for repeatable lists
-                       stack = [],
-               // Last fire value (for non-forgettable lists)
-                       memory,
+       var // Last fire value (for non-forgettable lists)
+               memory,
                // Flag to know if list was already fired
-                       fired,
+               fired,
                // Flag to know if list is currently firing
-                       firing,
+               firing,
                // First callback to fire (used internally by add and fireWith)
-                       firingStart,
+               firingStart,
                // End of the loop when firing
-                       firingLength,
+               firingLength,
                // Index of currently firing callback (modified by remove if needed)
-                       firingIndex,
-               // Add one or several callbacks to the list
-                       add = function( args ) {
-                               var i,
-                                       length,
-                                       elem,
-                                       type,
-                                       actual;
-                               for ( i = 0, length = args.length; i < length; i++ ) {
-                                       elem = args[ i ];
-                                       type = jQuery.type( elem );
-                                       if ( type === "array" ) {
-                                               // Inspect recursively
-                                               add( elem );
-                                       } else if ( type === "function" ) {
-                                               // Add if not in unique mode and callback is not in
-                                               if ( !flags.unique || !self.has( elem ) ) {
-                                                       list.push( elem );
-                                               }
-                                       }
-                               }
-                       },
+               firingIndex,
+               // Actual callback list
+               list = [],
+               // Stack of fire calls for repeatable lists
+               stack = !options.once && [],
                // Fire callbacks
-                       fire = function( context, args ) {
-                               args = args || [];
-                               memory = !flags.memory || [ context, args ];
-                               fired = true;
-                               firing = true;
-                               firingIndex = firingStart || 0;
-                               firingStart = 0;
-                               firingLength = list.length;
-                               for ( ; list && firingIndex < firingLength; firingIndex++ ) {
-                                       if ( list[ firingIndex ].apply( context, args ) === false && flags.stopOnFalse ) {
-                                               memory = true; // Mark as halted
-                                               break;
+               fire = function( data ) {
+                       memory = options.memory && data;
+                       fired = true;
+                       firingIndex = firingStart || 0;
+                       firingStart = 0;
+                       firingLength = list.length;
+                       firing = true;
+                       for ( ; list && firingIndex < firingLength; firingIndex++ ) {
+                               if ( list[ firingIndex ].apply( data[ 0 ], data[ 1 ] ) === false && options.stopOnFalse ) {
+                                       memory = false; // To prevent further calls using add
+                                       break;
+                               }
+                       }
+                       firing = false;
+                       if ( list ) {
+                               if ( stack ) {
+                                       if ( stack.length ) {
+                                               fire( stack.shift() );
                                        }
+                               } else if ( memory ) {
+                                       list = [];
+                               } else {
+                                       self.disable();
                                }
-                               firing = false;
+                       }
+               },
+               // Actual Callbacks object
+               self = {
+                       // Add a callback or a collection of callbacks to the list
+                       add: function() {
                                if ( list ) {
-                                       if ( !flags.once ) {
-                                               if ( stack && stack.length ) {
-                                                       memory = stack.shift();
-                                                       self.fireWith( memory[ 0 ], memory[ 1 ] );
-                                               }
-                                       } else if ( memory === true ) {
-                                               self.disable();
-                                       } else {
-                                               list = [];
+                                       // First, we save the current length
+                                       var start = list.length;
+                                       (function add( args ) {
+                                               jQuery.each( args, function( _, arg ) {
+                                                       var type = jQuery.type( arg );
+                                                       if ( type === "function" && ( !options.unique || !self.has( arg ) ) ) {
+                                                               list.push( arg );
+                                                       } else if ( arg && arg.length && type !== "string" ) {
+                                                               // Inspect recursively
+                                                               add( arg );
+                                                       }
+                                               });
+                                       })( arguments );
+                                       // Do we need to add the callbacks to the
+                                       // current firing batch?
+                                       if ( firing ) {
+                                               firingLength = list.length;
+                                       // With memory, if we're not firing then
+                                       // we should call right away
+                                       } else if ( memory ) {
+                                               firingStart = start;
+                                               fire( memory );
                                        }
                                }
+                               return this;
                        },
-               // Actual Callbacks object
-                       self = {
-                               // Add a callback or a collection of callbacks to the list
-                               add: function() {
-                                       if ( list ) {
-                                               var length = list.length;
-                                               add( arguments );
-                                               // Do we need to add the callbacks to the
-                                               // current firing batch?
-                                               if ( firing ) {
-                                                       firingLength = list.length;
-                                                       // With memory, if we're not firing then
-                                                       // we should call right away, unless previous
-                                                       // firing was halted (stopOnFalse)
-                                               } else if ( memory && memory !== true ) {
-                                                       firingStart = length;
-                                                       fire( memory[ 0 ], memory[ 1 ] );
-                                               }
-                                       }
-                                       return this;
-                               },
-                               // Remove a callback from the list
-                               remove: function() {
-                                       if ( list ) {
-                                               var args = arguments,
-                                                       argIndex = 0,
-                                                       argLength = args.length;
-                                               for ( ; argIndex < argLength ; argIndex++ ) {
-                                                       for ( var i = 0; i < list.length; i++ ) {
-                                                               if ( args[ argIndex ] === list[ i ] ) {
-                                                                       // Handle firingIndex and firingLength
-                                                                       if ( firing ) {
-                                                                               if ( i <= firingLength ) {
-                                                                                       firingLength--;
-                                                                                       if ( i <= firingIndex ) {
-                                                                                               firingIndex--;
-                                                                                       }
-                                                                               }
-                                                                       }
-                                                                       // Remove the element
-                                                                       list.splice( i--, 1 );
-                                                                       // If we have some unicity property then
-                                                                       // we only need to do this once
-                                                                       if ( flags.unique ) {
-                                                                               break;
-                                                                       }
+                       // Remove a callback from the list
+                       remove: function() {
+                               if ( list ) {
+                                       jQuery.each( arguments, function( _, arg ) {
+                                               var index;
+                                               while( ( index = jQuery.inArray( arg, list, index ) ) > -1 ) {
+                                                       list.splice( index, 1 );
+                                                       // Handle firing indexes
+                                                       if ( firing ) {
+                                                               if ( index <= firingLength ) {
+                                                                       firingLength--;
+                                                               }
+                                                               if ( index <= firingIndex ) {
+                                                                       firingIndex--;
                                                                }
                                                        }
                                                }
+                                       });
+                               }
+                               return this;
+                       },
+                       // Control if a given callback is in the list
+                       has: function( fn ) {
+                               return jQuery.inArray( fn, list ) > -1;
+                       },
+                       // Remove all callbacks from the list
+                       empty: function() {
+                               list = [];
+                               return this;
+                       },
+                       // Have the list do nothing anymore
+                       disable: function() {
+                               list = stack = memory = undefined;
+                               return this;
+                       },
+                       // Is it disabled?
+                       disabled: function() {
+                               return !list;
+                       },
+                       // Lock the list in its current state
+                       lock: function() {
+                               stack = undefined;
+                               if ( !memory ) {
+                                       self.disable();
+                               }
+                               return this;
+                       },
+                       // Is it locked?
+                       locked: function() {
+                               return !stack;
+                       },
+                       // Call all callbacks with the given context and arguments
+                       fireWith: function( context, args ) {
+                               args = args || [];
+                               args = [ context, args.slice ? args.slice() : args ];
+                               if ( list && ( !fired || stack ) ) {
+                                       if ( firing ) {
+                                               stack.push( args );
+                                       } else {
+                                               fire( args );
                                        }
-                                       return this;
-                               },
-                               // Control if a given callback is in the list
-                               has: function( fn ) {
-                                       if ( list ) {
-                                               var i = 0,
-                                                       length = list.length;
-                                               for ( ; i < length; i++ ) {
-                                                       if ( fn === list[ i ] ) {
-                                                               return true;
-                                                       }
-                                               }
-                                       }
-                                       return false;
-                               },
-                               // Remove all callbacks from the list
-                               empty: function() {
-                                       list = [];
-                                       return this;
-                               },
-                               // Have the list do nothing anymore
-                               disable: function() {
-                                       list = stack = memory = undefined;
-                                       return this;
-                               },
-                               // Is it disabled?
-                               disabled: function() {
-                                       return !list;
-                               },
-                               // Lock the list in its current state
-                               lock: function() {
-                                       stack = undefined;
-                                       if ( !memory || memory === true ) {
-                                               self.disable();
-                                       }
-                                       return this;
-                               },
-                               // Is it locked?
-                               locked: function() {
-                                       return !stack;
+                               }
+                               return this;
+                       },
+                       // Call all the callbacks with the given arguments
+                       fire: function() {
+                               self.fireWith( this, arguments );
+                               return this;
+                       },
+                       // To know if the callbacks have already been called at least once
+                       fired: function() {
+                               return !!fired;
+                       }
+               };
+
+       return self;
+};
+jQuery.extend({
+
+       Deferred: function( func ) {
+               var tuples = [
+                               // action, add listener, listener list, final state
+                               [ "resolve", "done", jQuery.Callbacks("once memory"), "resolved" ],
+                               [ "reject", "fail", jQuery.Callbacks("once memory"), "rejected" ],
+                               [ "notify", "progress", jQuery.Callbacks("memory") ]
+                       ],
+                       state = "pending",
+                       promise = {
+                               state: function() {
+                                       return state;
                                },
-                               // Call all callbacks with the given context and arguments
-                               fireWith: function( context, args ) {
-                                       if ( stack ) {
-                                               if ( firing ) {
-                                                       if ( !flags.once ) {
-                                                               stack.push( [ context, args ] );
-                                                       }
-                                               } else if ( !( flags.once && memory ) ) {
-                                                       fire( context, args );
-                                               }
-                                       }
+                               always: function() {
+                                       deferred.done( arguments ).fail( arguments );
                                        return this;
                                },
-                               // Call all the callbacks with the given arguments
-                               fire: function() {
-                                       self.fireWith( this, arguments );
-                                       return this;
+                               then: function( /* fnDone, fnFail, fnProgress */ ) {
+                                       var fns = arguments;
+                                       return jQuery.Deferred(function( newDefer ) {
+                                               jQuery.each( tuples, function( i, tuple ) {
+                                                       var action = tuple[ 0 ],
+                                                               fn = fns[ i ];
+                                                       // deferred[ done | fail | progress ] for forwarding actions to newDefer
+                                                       deferred[ tuple[1] ]( jQuery.isFunction( fn ) ?
+                                                               function() {
+                                                                       var returned = fn.apply( this, arguments );
+                                                                       if ( returned && jQuery.isFunction( returned.promise ) ) {
+                                                                               returned.promise()
+                                                                                       .done( newDefer.resolve )
+                                                                                       .fail( newDefer.reject )
+                                                                                       .progress( newDefer.notify );
+                                                                       } else {
+                                                                               newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
+                                                                       }
+                                                               } :
+                                                               newDefer[ action ]
+                                                       );
+                                               });
+                                               fns = null;
+                                       }).promise();
                                },
-                               // To know if the callbacks have already been called at least once
-                               fired: function() {
-                                       return !!fired;
+                               // Get a promise for this deferred
+                               // If obj is provided, the promise aspect is added to the object
+                               promise: function( obj ) {
+                                       return typeof obj === "object" ? jQuery.extend( obj, promise ) : promise;
                                }
-                       };
+                       },
+                       deferred = {};
 
-               return self;
-       };
+               // Keep pipe for back-compat
+               promise.pipe = promise.then;
 
+               // Add list-specific methods
+               jQuery.each( tuples, function( i, tuple ) {
+                       var list = tuple[ 2 ],
+                               stateString = tuple[ 3 ];
 
+                       // promise[ done | fail | progress ] = list.add
+                       promise[ tuple[1] ] = list.add;
+
+                       // Handle state
+                       if ( stateString ) {
+                               list.add(function() {
+                                       // state = [ resolved | rejected ]
+                                       state = stateString;
 
+                               // [ reject_list | resolve_list ].disable; progress_list.lock
+                               }, tuples[ i ^ 1 ][ 2 ].disable, tuples[ 2 ][ 2 ].lock );
+                       }
 
-       var // Static reference to slice
-               sliceDeferred = [].slice;
+                       // deferred[ resolve | reject | notify ] = list.fire
+                       deferred[ tuple[0] ] = list.fire;
+                       deferred[ tuple[0] + "With" ] = list.fireWith;
+               });
 
-       jQuery.extend({
+               // Make the deferred a promise
+               promise.promise( deferred );
 
-               Deferred: function( func ) {
-                       var doneList = jQuery.Callbacks( "once memory" ),
-                               failList = jQuery.Callbacks( "once memory" ),
-                               progressList = jQuery.Callbacks( "memory" ),
-                               state = "pending",
-                               lists = {
-                                       resolve: doneList,
-                                       reject: failList,
-                                       notify: progressList
-                               },
-                               promise = {
-                                       done: doneList.add,
-                                       fail: failList.add,
-                                       progress: progressList.add,
-
-                                       state: function() {
-                                               return state;
-                                       },
-
-                                       // Deprecated
-                                       isResolved: doneList.fired,
-                                       isRejected: failList.fired,
-
-                                       then: function( doneCallbacks, failCallbacks, progressCallbacks ) {
-                                               deferred.done( doneCallbacks ).fail( failCallbacks ).progress( progressCallbacks );
-                                               return this;
-                                       },
-                                       always: function() {
-                                               deferred.done.apply( deferred, arguments ).fail.apply( deferred, arguments );
-                                               return this;
-                                       },
-                                       pipe: function( fnDone, fnFail, fnProgress ) {
-                                               return jQuery.Deferred(function( newDefer ) {
-                                                       jQuery.each( {
-                                                               done: [ fnDone, "resolve" ],
-                                                               fail: [ fnFail, "reject" ],
-                                                               progress: [ fnProgress, "notify" ]
-                                                       }, function( handler, data ) {
-                                                               var fn = data[ 0 ],
-                                                                       action = data[ 1 ],
-                                                                       returned;
-                                                               if ( jQuery.isFunction( fn ) ) {
-                                                                       deferred[ handler ](function() {
-                                                                               returned = fn.apply( this, arguments );
-                                                                               if ( returned && jQuery.isFunction( returned.promise ) ) {
-                                                                                       returned.promise().then( newDefer.resolve, newDefer.reject, newDefer.notify );
-                                                                               } else {
-                                                                                       newDefer[ action + "With" ]( this === deferred ? newDefer : this, [ returned ] );
-                                                                               }
-                                                                       });
-                                                               } else {
-                                                                       deferred[ handler ]( newDefer[ action ] );
-                                                               }
-                                                       });
-                                               }).promise();
-                                       },
-                                       // Get a promise for this deferred
-                                       // If obj is provided, the promise aspect is added to the object
-                                       promise: function( obj ) {
-                                               if ( obj == null ) {
-                                                       obj = promise;
-                                               } else {
-                                                       for ( var key in promise ) {
-                                                               obj[ key ] = promise[ key ];
-                                                       }
-                                               }
-                                               return obj;
-                                       }
-                               },
-                               deferred = promise.promise({}),
-                               key;
+               // Call given func if any
+               if ( func ) {
+                       func.call( deferred, deferred );
+               }
 
-                       for ( key in lists ) {
-                               deferred[ key ] = lists[ key ].fire;
-                               deferred[ key + "With" ] = lists[ key ].fireWith;
-                       }
+               // All done!
+               return deferred;
+       },
 
-                       // Handle state
-                       deferred.done( function() {
-                               state = "resolved";
-                       }, failList.disable, progressList.lock ).fail( function() {
-                                       state = "rejected";
-                               }, doneList.disable, progressList.lock );
+       // Deferred helper
+       when: function( subordinate /* , ..., subordinateN */ ) {
+               var i = 0,
+                       resolveValues = core_slice.call( arguments ),
+                       length = resolveValues.length,
 
-                       // Call given func if any
-                       if ( func ) {
-                               func.call( deferred, deferred );
-                       }
+                       // the count of uncompleted subordinates
+                       remaining = length !== 1 || ( subordinate && jQuery.isFunction( subordinate.promise ) ) ? length : 0,
 
-                       // All done!
-                       return deferred;
-               },
+                       // the master Deferred. If resolveValues consist of only a single Deferred, just use that.
+                       deferred = remaining === 1 ? subordinate : jQuery.Deferred(),
 
-               // Deferred helper
-               when: function( firstParam ) {
-                       var args = sliceDeferred.call( arguments, 0 ),
-                               i = 0,
-                               length = args.length,
-                               pValues = new Array( length ),
-                               count = length,
-                               pCount = length,
-                               deferred = length <= 1 && firstParam && jQuery.isFunction( firstParam.promise ) ?
-                                       firstParam :
-                                       jQuery.Deferred(),
-                               promise = deferred.promise();
-                       function resolveFunc( i ) {
+                       // Update function for both resolve and progress values
+                       updateFunc = function( i, contexts, values ) {
                                return function( value ) {
-                                       args[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                                       if ( !( --count ) ) {
-                                               deferred.resolveWith( deferred, args );
+                                       contexts[ i ] = this;
+                                       values[ i ] = arguments.length > 1 ? core_slice.call( arguments ) : value;
+                                       if( values === progressValues ) {
+                                               deferred.notifyWith( contexts, values );
+                                       } else if ( !( --remaining ) ) {
+                                               deferred.resolveWith( contexts, values );
                                        }
                                };
-                       }
-                       function progressFunc( i ) {
-                               return function( value ) {
-                                       pValues[ i ] = arguments.length > 1 ? sliceDeferred.call( arguments, 0 ) : value;
-                                       deferred.notifyWith( promise, pValues );
-                               };
-                       }
-                       if ( length > 1 ) {
-                               for ( ; i < length; i++ ) {
-                                       if ( args[ i ] && args[ i ].promise && jQuery.isFunction( args[ i ].promise ) ) {
-                                               args[ i ].promise().then( resolveFunc(i), deferred.reject, progressFunc(i) );
-                                       } else {
-                                               --count;
-                                       }
-                               }
-                               if ( !count ) {
-                                       deferred.resolveWith( deferred, args );
+                       },
+
+                       progressValues, progressContexts, resolveContexts;
+
+               // add listeners to Deferred subordinates; treat others as resolved
+               if ( length > 1 ) {
+                       progressValues = new Array( length );
+                       progressContexts = new Array( length );
+                       resolveContexts = new Array( length );
+                       for ( ; i < length; i++ ) {
+                               if ( resolveValues[ i ] && jQuery.isFunction( resolveValues[ i ].promise ) ) {
+                                       resolveValues[ i ].promise()
+                                               .done( updateFunc( i, resolveContexts, resolveValues ) )
+                                               .fail( deferred.reject )
+                                               .progress( updateFunc( i, progressContexts, progressValues ) );
+                               } else {
+                                       --remaining;
                                }
-                       } else if ( deferred !== firstParam ) {
-                               deferred.resolveWith( deferred, length ? [ firstParam ] : [] );
                        }
-                       return promise;
                }
-       });
-
-
 
+               // if we're not waiting on anything, resolve the master
+               if ( !remaining ) {
+                       deferred.resolveWith( resolveContexts, resolveValues );
+               }
 
-       jQuery.support = (function() {
+               return deferred.promise();
+       }
+});
+jQuery.support = (function() {
+
+       var support,
+               all,
+               a,
+               select,
+               opt,
+               input,
+               fragment,
+               eventName,
+               i,
+               isSupported,
+               clickFn,
+               div = document.createElement("div");
+
+       // Preliminary tests
+       div.setAttribute( "className", "t" );
+       div.innerHTML = "  <link/><table></table><a href='/a'>a</a><input type='checkbox'/>";
+
+       all = div.getElementsByTagName("*");
+       a = div.getElementsByTagName("a")[ 0 ];
+       a.style.cssText = "top:1px;float:left;opacity:.5";
+
+       // Can't get basic test support
+       if ( !all || !all.length || !a ) {
+               return {};
+       }
 
-               var support,
-                       all,
-                       a,
-                       select,
-                       opt,
-                       input,
-                       fragment,
-                       tds,
-                       events,
-                       eventName,
-                       i,
-                       isSupported,
-                       div = document.createElement( "div" ),
-                       documentElement = document.documentElement;
-
-               // Preliminary tests
-               div.setAttribute("className", "t");
-               div.innerHTML = "   <link/><table></table><a href='/a' style='top:1px;float:left;opacity:.55;'>a</a><input type='checkbox'/>";
-
-               all = div.getElementsByTagName( "*" );
-               a = div.getElementsByTagName( "a" )[ 0 ];
-
-               // Can't get basic test support
-               if ( !all || !all.length || !a ) {
-                       return {};
-               }
-
-               // First batch of supports tests
-               select = document.createElement( "select" );
-               opt = select.appendChild( document.createElement("option") );
-               input = div.getElementsByTagName( "input" )[ 0 ];
-
-               support = {
-                       // IE strips leading whitespace when .innerHTML is used
-                       leadingWhitespace: ( div.firstChild.nodeType === 3 ),
-
-                       // Make sure that tbody elements aren't automatically inserted
-                       // IE will insert them into empty tables
-                       tbody: !div.getElementsByTagName("tbody").length,
-
-                       // Make sure that link elements get serialized correctly by innerHTML
-                       // This requires a wrapper element in IE
-                       htmlSerialize: !!div.getElementsByTagName("link").length,
-
-                       // Get the style information from getAttribute
-                       // (IE uses .cssText instead)
-                       style: /top/.test( a.getAttribute("style") ),
-
-                       // Make sure that URLs aren't manipulated
-                       // (IE normalizes it by default)
-                       hrefNormalized: ( a.getAttribute("href") === "/a" ),
-
-                       // Make sure that element opacity exists
-                       // (IE uses filter instead)
-                       // Use a regex to work around a WebKit issue. See #5145
-                       opacity: /^0.55/.test( a.style.opacity ),
-
-                       // Verify style float existence
-                       // (IE uses styleFloat instead of cssFloat)
-                       cssFloat: !!a.style.cssFloat,
-
-                       // Make sure that if no value is specified for a checkbox
-                       // that it defaults to "on".
-                       // (WebKit defaults to "" instead)
-                       checkOn: ( input.value === "on" ),
-
-                       // Make sure that a selected-by-default option has a working selected property.
-                       // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
-                       optSelected: opt.selected,
-
-                       // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
-                       getSetAttribute: div.className !== "t",
-
-                       // Tests for enctype support on a form(#6743)
-                       enctype: !!document.createElement("form").enctype,
-
-                       // Makes sure cloning an html5 element does not cause problems
-                       // Where outerHTML is undefined, this still works
-                       html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
-
-                       // Will be defined later
-                       submitBubbles: true,
-                       changeBubbles: true,
-                       focusinBubbles: false,
-                       deleteExpando: true,
-                       noCloneEvent: true,
-                       inlineBlockNeedsLayout: false,
-                       shrinkWrapBlocks: false,
-                       reliableMarginRight: true,
-                       pixelMargin: true
-               };
+       // First batch of supports tests
+       select = document.createElement("select");
+       opt = select.appendChild( document.createElement("option") );
+       input = div.getElementsByTagName("input")[ 0 ];
+
+       support = {
+               // IE strips leading whitespace when .innerHTML is used
+               leadingWhitespace: ( div.firstChild.nodeType === 3 ),
+
+               // Make sure that tbody elements aren't automatically inserted
+               // IE will insert them into empty tables
+               tbody: !div.getElementsByTagName("tbody").length,
+
+               // Make sure that link elements get serialized correctly by innerHTML
+               // This requires a wrapper element in IE
+               htmlSerialize: !!div.getElementsByTagName("link").length,
+
+               // Get the style information from getAttribute
+               // (IE uses .cssText instead)
+               style: /top/.test( a.getAttribute("style") ),
+
+               // Make sure that URLs aren't manipulated
+               // (IE normalizes it by default)
+               hrefNormalized: ( a.getAttribute("href") === "/a" ),
+
+               // Make sure that element opacity exists
+               // (IE uses filter instead)
+               // Use a regex to work around a WebKit issue. See #5145
+               opacity: /^0.5/.test( a.style.opacity ),
+
+               // Verify style float existence
+               // (IE uses styleFloat instead of cssFloat)
+               cssFloat: !!a.style.cssFloat,
+
+               // Make sure that if no value is specified for a checkbox
+               // that it defaults to "on".
+               // (WebKit defaults to "" instead)
+               checkOn: ( input.value === "on" ),
+
+               // Make sure that a selected-by-default option has a working selected property.
+               // (WebKit defaults to false instead of true, IE too, if it's in an optgroup)
+               optSelected: opt.selected,
+
+               // Test setAttribute on camelCase class. If it works, we need attrFixes when doing get/setAttribute (ie6/7)
+               getSetAttribute: div.className !== "t",
+
+               // Tests for enctype support on a form(#6743)
+               enctype: !!document.createElement("form").enctype,
+
+               // Makes sure cloning an html5 element does not cause problems
+               // Where outerHTML is undefined, this still works
+               html5Clone: document.createElement("nav").cloneNode( true ).outerHTML !== "<:nav></:nav>",
+
+               // jQuery.support.boxModel DEPRECATED in 1.8 since we don't support Quirks Mode
+               boxModel: ( document.compatMode === "CSS1Compat" ),
+
+               // Will be defined later
+               submitBubbles: true,
+               changeBubbles: true,
+               focusinBubbles: false,
+               deleteExpando: true,
+               noCloneEvent: true,
+               inlineBlockNeedsLayout: false,
+               shrinkWrapBlocks: false,
+               reliableMarginRight: true,
+               boxSizingReliable: true,
+               pixelPosition: false
+       };
 
-               // jQuery.boxModel DEPRECATED in 1.3, use jQuery.support.boxModel instead
-               jQuery.boxModel = support.boxModel = (document.compatMode === "CSS1Compat");
+       // Make sure checked status is properly cloned
+       input.checked = true;
+       support.noCloneChecked = input.cloneNode( true ).checked;
 
-               // Make sure checked status is properly cloned
-               input.checked = true;
-               support.noCloneChecked = input.cloneNode( true ).checked;
+       // Make sure that the options inside disabled selects aren't marked as disabled
+       // (WebKit marks them as disabled)
+       select.disabled = true;
+       support.optDisabled = !opt.disabled;
 
-               // Make sure that the options inside disabled selects aren't marked as disabled
-               // (WebKit marks them as disabled)
-               select.disabled = true;
-               support.optDisabled = !opt.disabled;
+       // Test to see if it's possible to delete an expando from an element
+       // Fails in Internet Explorer
+       try {
+               delete div.test;
+       } catch( e ) {
+               support.deleteExpando = false;
+       }
 
-               // Test to see if it's possible to delete an expando from an element
-               // Fails in Internet Explorer
-               try {
-                       delete div.test;
-               } catch( e ) {
-                       support.deleteExpando = false;
-               }
+       if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
+               div.attachEvent( "onclick", clickFn = function() {
+                       // Cloning a node shouldn't copy over any
+                       // bound event handlers (IE does this)
+                       support.noCloneEvent = false;
+               });
+               div.cloneNode( true ).fireEvent("onclick");
+               div.detachEvent( "onclick", clickFn );
+       }
 
-               if ( !div.addEventListener && div.attachEvent && div.fireEvent ) {
-                       div.attachEvent( "onclick", function() {
-                               // Cloning a node shouldn't copy over any
-                               // bound event handlers (IE does this)
-                               support.noCloneEvent = false;
-                       });
-                       div.cloneNode( true ).fireEvent( "onclick" );
-               }
-
-               // Check if a radio maintains its value
-               // after being appended to the DOM
-               input = document.createElement("input");
-               input.value = "t";
-               input.setAttribute("type", "radio");
-               support.radioValue = input.value === "t";
-
-               input.setAttribute("checked", "checked");
-
-               // #11217 - WebKit loses check when the name is after the checked attribute
-               input.setAttribute( "name", "t" );
-
-               div.appendChild( input );
-               fragment = document.createDocumentFragment();
-               fragment.appendChild( div.lastChild );
-
-               // WebKit doesn't clone checked state correctly in fragments
-               support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
-
-               // Check if a disconnected checkbox will retain its checked
-               // value of true after appended to the DOM (IE6/7)
-               support.appendChecked = input.checked;
-
-               fragment.removeChild( input );
-               fragment.appendChild( div );
-
-               // Technique from Juriy Zaytsev
-               // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
-               // We only care about the case where non-standard event systems
-               // are used, namely in IE. Short-circuiting here helps us to
-               // avoid an eval call (in setAttribute) which can cause CSP
-               // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
-               if ( div.attachEvent ) {
-                       for ( i in {
-                               submit: 1,
-                               change: 1,
-                               focusin: 1
-                       }) {
-                               eventName = "on" + i;
-                               isSupported = ( eventName in div );
-                               if ( !isSupported ) {
-                                       div.setAttribute( eventName, "return;" );
-                                       isSupported = ( typeof div[ eventName ] === "function" );
-                               }
-                               support[ i + "Bubbles" ] = isSupported;
-                       }
+       // Check if a radio maintains its value
+       // after being appended to the DOM
+       input = document.createElement("input");
+       input.value = "t";
+       input.setAttribute( "type", "radio" );
+       support.radioValue = input.value === "t";
+
+       input.setAttribute( "checked", "checked" );
+
+       // #11217 - WebKit loses check when the name is after the checked attribute
+       input.setAttribute( "name", "t" );
+
+       div.appendChild( input );
+       fragment = document.createDocumentFragment();
+       fragment.appendChild( div.lastChild );
+
+       // WebKit doesn't clone checked state correctly in fragments
+       support.checkClone = fragment.cloneNode( true ).cloneNode( true ).lastChild.checked;
+
+       // Check if a disconnected checkbox will retain its checked
+       // value of true after appended to the DOM (IE6/7)
+       support.appendChecked = input.checked;
+
+       fragment.removeChild( input );
+       fragment.appendChild( div );
+
+       // Technique from Juriy Zaytsev
+       // http://perfectionkills.com/detecting-event-support-without-browser-sniffing/
+       // We only care about the case where non-standard event systems
+       // are used, namely in IE. Short-circuiting here helps us to
+       // avoid an eval call (in setAttribute) which can cause CSP
+       // to go haywire. See: https://developer.mozilla.org/en/Security/CSP
+       if ( div.attachEvent ) {
+               for ( i in {
+                       submit: true,
+                       change: true,
+                       focusin: true
+               }) {
+                       eventName = "on" + i;
+                       isSupported = ( eventName in div );
+                       if ( !isSupported ) {
+                               div.setAttribute( eventName, "return;" );
+                               isSupported = ( typeof div[ eventName ] === "function" );
+                       }
+                       support[ i + "Bubbles" ] = isSupported;
                }
+       }
 
-               fragment.removeChild( div );
-
-               // Null elements to avoid leaks in IE
-               fragment = select = opt = div = input = null;
-
-               // Run tests that need a body at doc ready
-               jQuery(function() {
-                       var container, outer, inner, table, td, offsetSupport,
-                               marginDiv, conMarginTop, style, html, positionTopLeftWidthHeight,
-                               paddingMarginBorderVisibility, paddingMarginBorder,
-                               body = document.getElementsByTagName("body")[0];
+       // Run tests that need a body at doc ready
+       jQuery(function() {
+               var container, div, tds, marginDiv,
+                       divReset = "padding:0;margin:0;border:0;display:block;overflow:hidden;",
+                       body = document.getElementsByTagName("body")[0];
 
-                       if ( !body ) {
-                               // Return for frameset docs that don't have a body
-                               return;
-                       }
+               if ( !body ) {
+                       // Return for frameset docs that don't have a body
+                       return;
+               }
 
-                       conMarginTop = 1;
-                       paddingMarginBorder = "padding:0;margin:0;border:";
-                       positionTopLeftWidthHeight = "position:absolute;top:0;left:0;width:1px;height:1px;";
-                       paddingMarginBorderVisibility = paddingMarginBorder + "0;visibility:hidden;";
-                       style = "style='" + positionTopLeftWidthHeight + paddingMarginBorder + "5px solid #000;";
-                       html = "<div " + style + "display:block;'><div style='" + paddingMarginBorder + "0;display:block;overflow:hidden;'></div></div>" +
-                               "<table " + style + "' cellpadding='0' cellspacing='0'>" +
-                               "<tr><td></td></tr></table>";
-
-                       container = document.createElement("div");
-                       container.style.cssText = paddingMarginBorderVisibility + "width:0;height:0;position:static;top:0;margin-top:" + conMarginTop + "px";
-                       body.insertBefore( container, body.firstChild );
-
-                       // Construct the test element
-                       div = document.createElement("div");
-                       container.appendChild( div );
-
-                       // Check if table cells still have offsetWidth/Height when they are set
-                       // to display:none and there are still other visible table cells in a
-                       // table row; if so, offsetWidth/Height are not reliable for use when
-                       // determining if an element has been hidden directly using
-                       // display:none (it is still safe to use offsets if a parent element is
-                       // hidden; don safety goggles and see bug #4512 for more information).
-                       // (only IE 8 fails this test)
-                       div.innerHTML = "<table><tr><td style='" + paddingMarginBorder + "0;display:none'></td><td>t</td></tr></table>";
-                       tds = div.getElementsByTagName( "td" );
-                       isSupported = ( tds[ 0 ].offsetHeight === 0 );
-
-                       tds[ 0 ].style.display = "";
-                       tds[ 1 ].style.display = "none";
-
-                       // Check if empty table cells still have offsetWidth/Height
-                       // (IE <= 8 fail this test)
-                       support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+               container = document.createElement("div");
+               container.style.cssText = "visibility:hidden;border:0;width:0;height:0;position:static;top:0;margin-top:1px";
+               body.insertBefore( container, body.firstChild );
+
+               // Construct the test element
+               div = document.createElement("div");
+               container.appendChild( div );
+
+               // Check if table cells still have offsetWidth/Height when they are set
+               // to display:none and there are still other visible table cells in a
+               // table row; if so, offsetWidth/Height are not reliable for use when
+               // determining if an element has been hidden directly using
+               // display:none (it is still safe to use offsets if a parent element is
+               // hidden; don safety goggles and see bug #4512 for more information).
+               // (only IE 8 fails this test)
+               div.innerHTML = "<table><tr><td></td><td>t</td></tr></table>";
+               tds = div.getElementsByTagName("td");
+               tds[ 0 ].style.cssText = "padding:0;margin:0;border:0;display:none";
+               isSupported = ( tds[ 0 ].offsetHeight === 0 );
+
+               tds[ 0 ].style.display = "";
+               tds[ 1 ].style.display = "none";
+
+               // Check if empty table cells still have offsetWidth/Height
+               // (IE <= 8 fail this test)
+               support.reliableHiddenOffsets = isSupported && ( tds[ 0 ].offsetHeight === 0 );
+
+               // Check box-sizing and margin behavior
+               div.innerHTML = "";
+               div.style.cssText = "box-sizing:border-box;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;padding:1px;border:1px;display:block;width:4px;margin-top:1%;position:absolute;top:1%;";
+               support.boxSizing = ( div.offsetWidth === 4 );
+               support.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== 1 );
+
+               // NOTE: To any future maintainer, we've window.getComputedStyle
+               // because jsdom on node.js will break without it.
+               if ( window.getComputedStyle ) {
+                       support.pixelPosition = ( window.getComputedStyle( div, null ) || {} ).top !== "1%";
+                       support.boxSizingReliable = ( window.getComputedStyle( div, null ) || { width: "4px" } ).width === "4px";
 
                        // Check if div with explicit width and no margin-right incorrectly
                        // gets computed margin-right based on width of container. For more
                        // info see bug #3333
                        // Fails in WebKit before Feb 2011 nightlies
                        // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                       if ( window.getComputedStyle ) {
-                               div.innerHTML = "";
-                               marginDiv = document.createElement( "div" );
-                               marginDiv.style.width = "0";
-                               marginDiv.style.marginRight = "0";
-                               div.style.width = "2px";
-                               div.appendChild( marginDiv );
-                               support.reliableMarginRight =
-                                       ( parseInt( ( window.getComputedStyle( marginDiv, null ) || { marginRight: 0 } ).marginRight, 10 ) || 0 ) === 0;
-                       }
-
-                       if ( typeof div.style.zoom !== "undefined" ) {
-                               // Check if natively block-level elements act like inline-block
-                               // elements when setting their display to 'inline' and giving
-                               // them layout
-                               // (IE < 8 does this)
-                               div.innerHTML = "";
-                               div.style.width = div.style.padding = "1px";
-                               div.style.border = 0;
-                               div.style.overflow = "hidden";
-                               div.style.display = "inline";
-                               div.style.zoom = 1;
-                               support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
-
-                               // Check if elements with layout shrink-wrap their children
-                               // (IE 6 does this)
-                               div.style.display = "block";
-                               div.style.overflow = "visible";
-                               div.innerHTML = "<div style='width:5px;'></div>";
-                               support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
-                       }
-
-                       div.style.cssText = positionTopLeftWidthHeight + paddingMarginBorderVisibility;
-                       div.innerHTML = html;
-
-                       outer = div.firstChild;
-                       inner = outer.firstChild;
-                       td = outer.nextSibling.firstChild.firstChild;
-
-                       offsetSupport = {
-                               doesNotAddBorder: ( inner.offsetTop !== 5 ),
-                               doesAddBorderForTableAndCells: ( td.offsetTop === 5 )
-                       };
+                       marginDiv = document.createElement("div");
+                       marginDiv.style.cssText = div.style.cssText = divReset;
+                       marginDiv.style.marginRight = marginDiv.style.width = "0";
+                       div.style.width = "1px";
+                       div.appendChild( marginDiv );
+                       support.reliableMarginRight =
+                               !parseFloat( ( window.getComputedStyle( marginDiv, null ) || {} ).marginRight );
+               }
 
-                       inner.style.position = "fixed";
-                       inner.style.top = "20px";
+               if ( typeof div.style.zoom !== "undefined" ) {
+                       // Check if natively block-level elements act like inline-block
+                       // elements when setting their display to 'inline' and giving
+                       // them layout
+                       // (IE < 8 does this)
+                       div.innerHTML = "";
+                       div.style.cssText = divReset + "width:1px;padding:1px;display:inline;zoom:1";
+                       support.inlineBlockNeedsLayout = ( div.offsetWidth === 3 );
+
+                       // Check if elements with layout shrink-wrap their children
+                       // (IE 6 does this)
+                       div.style.display = "block";
+                       div.style.overflow = "visible";
+                       div.innerHTML = "<div></div>";
+                       div.firstChild.style.width = "5px";
+                       support.shrinkWrapBlocks = ( div.offsetWidth !== 3 );
+
+                       container.style.zoom = 1;
+               }
 
-                       // safari subtracts parent border width here which is 5px
-                       offsetSupport.fixedPosition = ( inner.offsetTop === 20 || inner.offsetTop === 15 );
-                       inner.style.position = inner.style.top = "";
+               // Null elements to avoid leaks in IE
+               body.removeChild( container );
+               container = div = tds = marginDiv = null;
+       });
 
-                       outer.style.overflow = "hidden";
-                       outer.style.position = "relative";
-
-                       offsetSupport.subtractsBorderForOverflowNotVisible = ( inner.offsetTop === -5 );
-                       offsetSupport.doesNotIncludeMarginInBodyOffset = ( body.offsetTop !== conMarginTop );
-
-                       if ( window.getComputedStyle ) {
-                               div.style.marginTop = "1%";
-                               support.pixelMargin = ( window.getComputedStyle( div, null ) || { marginTop: 0 } ).marginTop !== "1%";
-                       }
-
-                       if ( typeof container.style.zoom !== "undefined" ) {
-                               container.style.zoom = 1;
-                       }
-
-                       body.removeChild( container );
-                       marginDiv = div = container = null;
-
-                       jQuery.extend( support, offsetSupport );
-               });
-
-               return support;
-       })();
+       // Null elements to avoid leaks in IE
+       fragment.removeChild( div );
+       all = a = select = opt = input = fragment = div = null;
 
+       return support;
+})();
+var rbrace = /(?:\{[\s\S]*\}|\[[\s\S]*\])$/,
+       rmultiDash = /([A-Z])/g;
 
+jQuery.extend({
+       cache: {},
 
+       deletedIds: [],
 
-       var rbrace = /^(?:\{.*\}|\[.*\])$/,
-               rmultiDash = /([A-Z])/g;
+       // Please use with caution
+       uuid: 0,
 
-       jQuery.extend({
-               cache: {},
+       // Unique for each copy of jQuery on the page
+       // Non-digits removed to match rinlinejQuery
+       expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
 
-               // Please use with caution
-               uuid: 0,
+       // The following elements throw uncatchable exceptions if you
+       // attempt to add expando properties to them.
+       noData: {
+               "embed": true,
+               // Ban all objects except for Flash (which handle expandos)
+               "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
+               "applet": true
+       },
 
-               // Unique for each copy of jQuery on the page
-               // Non-digits removed to match rinlinejQuery
-               expando: "jQuery" + ( jQuery.fn.jquery + Math.random() ).replace( /\D/g, "" ),
+       hasData: function( elem ) {
+               elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
+               return !!elem && !isEmptyDataObject( elem );
+       },
 
-               // The following elements throw uncatchable exceptions if you
-               // attempt to add expando properties to them.
-               noData: {
-                       "embed": true,
-                       // Ban all objects except for Flash (which handle expandos)
-                       "object": "clsid:D27CDB6E-AE6D-11cf-96B8-444553540000",
-                       "applet": true
-               },
-
-               hasData: function( elem ) {
-                       elem = elem.nodeType ? jQuery.cache[ elem[jQuery.expando] ] : elem[ jQuery.expando ];
-                       return !!elem && !isEmptyDataObject( elem );
-               },
-
-               data: function( elem, name, data, pvt /* Internal Use Only */ ) {
-                       if ( !jQuery.acceptData( elem ) ) {
-                               return;
-                       }
+       data: function( elem, name, data, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
 
-                       var privateCache, thisCache, ret,
-                               internalKey = jQuery.expando,
-                               getByName = typeof name === "string",
+               var thisCache, ret,
+                       internalKey = jQuery.expando,
+                       getByName = typeof name === "string",
 
                        // We have to handle DOM nodes and JS objects differently because IE6-7
                        // can't GC object references properly across the DOM-JS boundary
-                               isNode = elem.nodeType,
+                       isNode = elem.nodeType,
 
                        // Only DOM nodes need the global jQuery cache; JS object data is
                        // attached directly to the object so GC can occur automatically
-                               cache = isNode ? jQuery.cache : elem,
+                       cache = isNode ? jQuery.cache : elem,
 
                        // Only defining an ID for JS objects if its cache already exists allows
                        // the code to shortcut on the same path as a DOM node with no cache
-                               id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey,
-                               isEvents = name === "events";
-
-                       // Avoid doing any more work than we need to when trying to get data on an
-                       // object that has no data at all
-                       if ( (!id || !cache[id] || (!isEvents && !pvt && !cache[id].data)) && getByName && data === undefined ) {
-                               return;
-                       }
-
-                       if ( !id ) {
-                               // Only DOM nodes need a new unique ID for each element since their data
-                               // ends up in the global cache
-                               if ( isNode ) {
-                                       elem[ internalKey ] = id = ++jQuery.uuid;
-                               } else {
-                                       id = internalKey;
-                               }
-                       }
-
-                       if ( !cache[ id ] ) {
-                               cache[ id ] = {};
-
-                               // Avoids exposing jQuery metadata on plain JS objects when the object
-                               // is serialized using JSON.stringify
-                               if ( !isNode ) {
-                                       cache[ id ].toJSON = jQuery.noop;
-                               }
-                       }
-
-                       // An object can be passed to jQuery.data instead of a key/value pair; this gets
-                       // shallow copied over onto the existing cache
-                       if ( typeof name === "object" || typeof name === "function" ) {
-                               if ( pvt ) {
-                                       cache[ id ] = jQuery.extend( cache[ id ], name );
-                               } else {
-                                       cache[ id ].data = jQuery.extend( cache[ id ].data, name );
-                               }
-                       }
-
-                       privateCache = thisCache = cache[ id ];
-
-                       // jQuery data() is stored in a separate object inside the object's internal data
-                       // cache in order to avoid key collisions between internal data and user-defined
-                       // data.
-                       if ( !pvt ) {
-                               if ( !thisCache.data ) {
-                                       thisCache.data = {};
-                               }
-
-                               thisCache = thisCache.data;
-                       }
-
-                       if ( data !== undefined ) {
-                               thisCache[ jQuery.camelCase( name ) ] = data;
-                       }
-
-                       // Users should not attempt to inspect the internal events object using jQuery.data,
-                       // it is undocumented and subject to change. But does anyone listen? No.
-                       if ( isEvents && !thisCache[ name ] ) {
-                               return privateCache.events;
-                       }
-
-                       // Check for both converted-to-camel and non-converted data property names
-                       // If a data property was specified
-                       if ( getByName ) {
-
-                               // First Try to find as-is property data
-                               ret = thisCache[ name ];
-
-                               // Test for null|undefined property data
-                               if ( ret == null ) {
-
-                                       // Try to find the camelCased property
-                                       ret = thisCache[ jQuery.camelCase( name ) ];
-                               }
-                       } else {
-                               ret = thisCache;
-                       }
-
-                       return ret;
-               },
-
-               removeData: function( elem, name, pvt /* Internal Use Only */ ) {
-                       if ( !jQuery.acceptData( elem ) ) {
-                               return;
-                       }
-
-                       var thisCache, i, l,
-
-                       // Reference to internal data cache key
-                               internalKey = jQuery.expando,
-
-                               isNode = elem.nodeType,
-
-                       // See jQuery.data for more information
-                               cache = isNode ? jQuery.cache : elem,
-
-                       // See jQuery.data for more information
-                               id = isNode ? elem[ internalKey ] : internalKey;
-
-                       // If there is already no cache entry for this object, there is no
-                       // purpose in continuing
-                       if ( !cache[ id ] ) {
-                               return;
-                       }
-
-                       if ( name ) {
-
-                               thisCache = pvt ? cache[ id ] : cache[ id ].data;
-
-                               if ( thisCache ) {
-
-                                       // Support array or space separated string names for data keys
-                                       if ( !jQuery.isArray( name ) ) {
-
-                                               // try the string as a key before any manipulation
-                                               if ( name in thisCache ) {
-                                                       name = [ name ];
-                                               } else {
-
-                                                       // split the camel cased version by spaces unless a key with the spaces exists
-                                                       name = jQuery.camelCase( name );
-                                                       if ( name in thisCache ) {
-                                                               name = [ name ];
-                                                       } else {
-                                                               name = name.split( " " );
-                                                       }
-                                               }
-                                       }
-
-                                       for ( i = 0, l = name.length; i < l; i++ ) {
-                                               delete thisCache[ name[i] ];
-                                       }
-
-                                       // If there is no data left in the cache, we want to continue
-                                       // and let the cache object itself get destroyed
-                                       if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
-                                               return;
-                                       }
-                               }
-                       }
-
-                       // See jQuery.data for more information
-                       if ( !pvt ) {
-                               delete cache[ id ].data;
-
-                               // Don't destroy the parent cache unless the internal data object
-                               // had been the only thing left in it
-                               if ( !isEmptyDataObject(cache[ id ]) ) {
-                                       return;
-                               }
-                       }
-
-                       // Browsers that fail expando deletion also refuse to delete expandos on
-                       // the window, but it will allow it on all other JS objects; other browsers
-                       // don't care
-                       // Ensure that `cache` is not a window object #10080
-                       if ( jQuery.support.deleteExpando || !cache.setInterval ) {
-                               delete cache[ id ];
-                       } else {
-                               cache[ id ] = null;
-                       }
-
-                       // We destroyed the cache and need to eliminate the expando on the node to avoid
-                       // false lookups in the cache for entries that no longer exist
-                       if ( isNode ) {
-                               // IE does not allow us to delete expando properties from nodes,
-                               // nor does it have a removeAttribute function on Document nodes;
-                               // we must handle all of these cases
-                               if ( jQuery.support.deleteExpando ) {
-                                       delete elem[ internalKey ];
-                               } else if ( elem.removeAttribute ) {
-                                       elem.removeAttribute( internalKey );
-                               } else {
-                                       elem[ internalKey ] = null;
-                               }
-                       }
-               },
-
-               // For internal use only.
-               _data: function( elem, name, data ) {
-                       return jQuery.data( elem, name, data, true );
-               },
-
-               // A method for determining if a DOM node can handle the data expando
-               acceptData: function( elem ) {
-                       if ( elem.nodeName ) {
-                               var match = jQuery.noData[ elem.nodeName.toLowerCase() ];
-
-                               if ( match ) {
-                                       return !(match === true || elem.getAttribute("classid") !== match);
-                               }
-                       }
-
-                       return true;
-               }
-       });
-
-       jQuery.fn.extend({
-               data: function( key, value ) {
-                       var parts, part, attr, name, l,
-                               elem = this[0],
-                               i = 0,
-                               data = null;
-
-                       // Gets all values
-                       if ( key === undefined ) {
-                               if ( this.length ) {
-                                       data = jQuery.data( elem );
-
-                                       if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
-                                               attr = elem.attributes;
-                                               for ( l = attr.length; i < l; i++ ) {
-                                                       name = attr[i].name;
-
-                                                       if ( name.indexOf( "data-" ) === 0 ) {
-                                                               name = jQuery.camelCase( name.substring(5) );
-
-                                                               dataAttr( elem, name, data[ name ] );
-                                                       }
-                                               }
-                                               jQuery._data( elem, "parsedAttrs", true );
-                                       }
-                               }
-
-                               return data;
-                       }
-
-                       // Sets multiple values
-                       if ( typeof key === "object" ) {
-                               return this.each(function() {
-                                       jQuery.data( this, key );
-                               });
-                       }
-
-                       parts = key.split( ".", 2 );
-                       parts[1] = parts[1] ? "." + parts[1] : "";
-                       part = parts[1] + "!";
-
-                       return jQuery.access( this, function( value ) {
-
-                               if ( value === undefined ) {
-                                       data = this.triggerHandler( "getData" + part, [ parts[0] ] );
-
-                                       // Try to fetch any internally stored data first
-                                       if ( data === undefined && elem ) {
-                                               data = jQuery.data( elem, key );
-                                               data = dataAttr( elem, key, data );
-                                       }
-
-                                       return data === undefined && parts[1] ?
-                                               this.data( parts[0] ) :
-                                               data;
-                               }
+                       id = isNode ? elem[ internalKey ] : elem[ internalKey ] && internalKey;
 
-                               parts[1] = value;
-                               this.each(function() {
-                                       var self = jQuery( this );
-
-                                       self.triggerHandler( "setData" + part, parts );
-                                       jQuery.data( this, key, value );
-                                       self.triggerHandler( "changeData" + part, parts );
-                               });
-                       }, null, value, arguments.length > 1, null, false );
-               },
-
-               removeData: function( key ) {
-                       return this.each(function() {
-                               jQuery.removeData( this, key );
-                       });
+               // Avoid doing any more work than we need to when trying to get data on an
+               // object that has no data at all
+               if ( (!id || !cache[id] || (!pvt && !cache[id].data)) && getByName && data === undefined ) {
+                       return;
                }
-       });
-
-       function dataAttr( elem, key, data ) {
-               // If nothing was found internally, try to fetch any
-               // data from the HTML5 data-* attribute
-               if ( data === undefined && elem.nodeType === 1 ) {
-
-                       var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
-
-                       data = elem.getAttribute( name );
-
-                       if ( typeof data === "string" ) {
-                               try {
-                                       data = data === "true" ? true :
-                                               data === "false" ? false :
-                                                       data === "null" ? null :
-                                                               jQuery.isNumeric( data ) ? +data :
-                                                                       rbrace.test( data ) ? jQuery.parseJSON( data ) :
-                                                                               data;
-                               } catch( e ) {}
-
-                               // Make sure we set the data so it isn't changed later
-                               jQuery.data( elem, key, data );
 
+               if ( !id ) {
+                       // Only DOM nodes need a new unique ID for each element since their data
+                       // ends up in the global cache
+                       if ( isNode ) {
+                               elem[ internalKey ] = id = jQuery.deletedIds.pop() || ++jQuery.uuid;
                        } else {
-                               data = undefined;
-                       }
-               }
-
-               return data;
-       }
-
-// checks a cache object for emptiness
-       function isEmptyDataObject( obj ) {
-               for ( var name in obj ) {
-
-                       // if the public data object is empty, the private is still empty
-                       if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
-                               continue;
-                       }
-                       if ( name !== "toJSON" ) {
-                               return false;
-                       }
-               }
-
-               return true;
-       }
-
-
-
-
-       function handleQueueMarkDefer( elem, type, src ) {
-               var deferDataKey = type + "defer",
-                       queueDataKey = type + "queue",
-                       markDataKey = type + "mark",
-                       defer = jQuery._data( elem, deferDataKey );
-               if ( defer &&
-                       ( src === "queue" || !jQuery._data(elem, queueDataKey) ) &&
-                       ( src === "mark" || !jQuery._data(elem, markDataKey) ) ) {
-                       // Give room for hard-coded callbacks to fire first
-                       // and eventually mark/queue something else on the element
-                       setTimeout( function() {
-                               if ( !jQuery._data( elem, queueDataKey ) &&
-                                       !jQuery._data( elem, markDataKey ) ) {
-                                       jQuery.removeData( elem, deferDataKey, true );
-                                       defer.fire();
-                               }
-                       }, 0 );
-               }
-       }
-
-       jQuery.extend({
-
-               _mark: function( elem, type ) {
-                       if ( elem ) {
-                               type = ( type || "fx" ) + "mark";
-                               jQuery._data( elem, type, (jQuery._data( elem, type ) || 0) + 1 );
-                       }
-               },
-
-               _unmark: function( force, elem, type ) {
-                       if ( force !== true ) {
-                               type = elem;
-                               elem = force;
-                               force = false;
-                       }
-                       if ( elem ) {
-                               type = type || "fx";
-                               var key = type + "mark",
-                                       count = force ? 0 : ( (jQuery._data( elem, key ) || 1) - 1 );
-                               if ( count ) {
-                                       jQuery._data( elem, key, count );
-                               } else {
-                                       jQuery.removeData( elem, key, true );
-                                       handleQueueMarkDefer( elem, type, "mark" );
-                               }
-                       }
-               },
-
-               queue: function( elem, type, data ) {
-                       var q;
-                       if ( elem ) {
-                               type = ( type || "fx" ) + "queue";
-                               q = jQuery._data( elem, type );
-
-                               // Speed up dequeue by getting out quickly if this is just a lookup
-                               if ( data ) {
-                                       if ( !q || jQuery.isArray(data) ) {
-                                               q = jQuery._data( elem, type, jQuery.makeArray(data) );
-                                       } else {
-                                               q.push( data );
-                                       }
-                               }
-                               return q || [];
-                       }
-               },
-
-               dequeue: function( elem, type ) {
-                       type = type || "fx";
-
-                       var queue = jQuery.queue( elem, type ),
-                               fn = queue.shift(),
-                               hooks = {};
-
-                       // If the fx queue is dequeued, always remove the progress sentinel
-                       if ( fn === "inprogress" ) {
-                               fn = queue.shift();
-                       }
-
-                       if ( fn ) {
-                               // Add a progress sentinel to prevent the fx queue from being
-                               // automatically dequeued
-                               if ( type === "fx" ) {
-                                       queue.unshift( "inprogress" );
-                               }
-
-                               jQuery._data( elem, type + ".run", hooks );
-                               fn.call( elem, function() {
-                                       jQuery.dequeue( elem, type );
-                               }, hooks );
-                       }
-
-                       if ( !queue.length ) {
-                               jQuery.removeData( elem, type + "queue " + type + ".run", true );
-                               handleQueueMarkDefer( elem, type, "queue" );
+                               id = internalKey;
                        }
                }
-       });
-
-       jQuery.fn.extend({
-               queue: function( type, data ) {
-                       var setter = 2;
-
-                       if ( typeof type !== "string" ) {
-                               data = type;
-                               type = "fx";
-                               setter--;
-                       }
-
-                       if ( arguments.length < setter ) {
-                               return jQuery.queue( this[0], type );
-                       }
 
-                       return data === undefined ?
-                               this :
-                               this.each(function() {
-                                       var queue = jQuery.queue( this, type, data );
+               if ( !cache[ id ] ) {
+                       cache[ id ] = {};
 
-                                       if ( type === "fx" && queue[0] !== "inprogress" ) {
-                                               jQuery.dequeue( this, type );
-                                       }
-                               });
-               },
-               dequeue: function( type ) {
-                       return this.each(function() {
-                               jQuery.dequeue( this, type );
-                       });
-               },
-               // Based off of the plugin by Clint Helfers, with permission.
-               // http://blindsignals.com/index.php/2009/07/jquery-delay/
-               delay: function( time, type ) {
-                       time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
-                       type = type || "fx";
-
-                       return this.queue( type, function( next, hooks ) {
-                               var timeout = setTimeout( next, time );
-                               hooks.stop = function() {
-                                       clearTimeout( timeout );
-                               };
-                       });
-               },
-               clearQueue: function( type ) {
-                       return this.queue( type || "fx", [] );
-               },
-               // Get a promise resolved when queues of a certain type
-               // are emptied (fx is the type by default)
-               promise: function( type, object ) {
-                       if ( typeof type !== "string" ) {
-                               object = type;
-                               type = undefined;
-                       }
-                       type = type || "fx";
-                       var defer = jQuery.Deferred(),
-                               elements = this,
-                               i = elements.length,
-                               count = 1,
-                               deferDataKey = type + "defer",
-                               queueDataKey = type + "queue",
-                               markDataKey = type + "mark",
-                               tmp;
-                       function resolve() {
-                               if ( !( --count ) ) {
-                                       defer.resolveWith( elements, [ elements ] );
-                               }
-                       }
-                       while( i-- ) {
-                               if (( tmp = jQuery.data( elements[ i ], deferDataKey, undefined, true ) ||
-                                       ( jQuery.data( elements[ i ], queueDataKey, undefined, true ) ||
-                                               jQuery.data( elements[ i ], markDataKey, undefined, true ) ) &&
-                                               jQuery.data( elements[ i ], deferDataKey, jQuery.Callbacks( "once memory" ), true ) )) {
-                                       count++;
-                                       tmp.add( resolve );
-                               }
+                       // Avoids exposing jQuery metadata on plain JS objects when the object
+                       // is serialized using JSON.stringify
+                       if ( !isNode ) {
+                               cache[ id ].toJSON = jQuery.noop;
                        }
-                       resolve();
-                       return defer.promise( object );
                }
-       });
-
-
-
-
-       var rclass = /[\n\t\r]/g,
-               rspace = /\s+/,
-               rreturn = /\r/g,
-               rtype = /^(?:button|input)$/i,
-               rfocusable = /^(?:button|input|object|select|textarea)$/i,
-               rclickable = /^a(?:rea)?$/i,
-               rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
-               getSetAttribute = jQuery.support.getSetAttribute,
-               nodeHook, boolHook, fixSpecified;
 
-       jQuery.fn.extend({
-               attr: function( name, value ) {
-                       return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
-               },
-
-               removeAttr: function( name ) {
-                       return this.each(function() {
-                               jQuery.removeAttr( this, name );
-                       });
-               },
-
-               prop: function( name, value ) {
-                       return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
-               },
-
-               removeProp: function( name ) {
-                       name = jQuery.propFix[ name ] || name;
-                       return this.each(function() {
-                               // try/catch handles cases where IE balks (such as removing a property on window)
-                               try {
-                                       this[ name ] = undefined;
-                                       delete this[ name ];
-                               } catch( e ) {}
-                       });
-               },
-
-               addClass: function( value ) {
-                       var classNames, i, l, elem,
-                               setClass, c, cl;
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( j ) {
-                                       jQuery( this ).addClass( value.call(this, j, this.className) );
-                               });
-                       }
-
-                       if ( value && typeof value === "string" ) {
-                               classNames = value.split( rspace );
-
-                               for ( i = 0, l = this.length; i < l; i++ ) {
-                                       elem = this[ i ];
-
-                                       if ( elem.nodeType === 1 ) {
-                                               if ( !elem.className && classNames.length === 1 ) {
-                                                       elem.className = value;
-
-                                               } else {
-                                                       setClass = " " + elem.className + " ";
-
-                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                               if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
-                                                                       setClass += classNames[ c ] + " ";
-                                                               }
-                                                       }
-                                                       elem.className = jQuery.trim( setClass );
-                                               }
-                                       }
-                               }
-                       }
-
-                       return this;
-               },
-
-               removeClass: function( value ) {
-                       var classNames, i, l, elem, className, c, cl;
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( j ) {
-                                       jQuery( this ).removeClass( value.call(this, j, this.className) );
-                               });
-                       }
-
-                       if ( (value && typeof value === "string") || value === undefined ) {
-                               classNames = ( value || "" ).split( rspace );
-
-                               for ( i = 0, l = this.length; i < l; i++ ) {
-                                       elem = this[ i ];
-
-                                       if ( elem.nodeType === 1 && elem.className ) {
-                                               if ( value ) {
-                                                       className = (" " + elem.className + " ").replace( rclass, " " );
-                                                       for ( c = 0, cl = classNames.length; c < cl; c++ ) {
-                                                               className = className.replace(" " + classNames[ c ] + " ", " ");
-                                                       }
-                                                       elem.className = jQuery.trim( className );
-
-                                               } else {
-                                                       elem.className = "";
-                                               }
-                                       }
-                               }
-                       }
-
-                       return this;
-               },
-
-               toggleClass: function( value, stateVal ) {
-                       var type = typeof value,
-                               isBool = typeof stateVal === "boolean";
-
-                       if ( jQuery.isFunction( value ) ) {
-                               return this.each(function( i ) {
-                                       jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
-                               });
-                       }
-
-                       return this.each(function() {
-                               if ( type === "string" ) {
-                                       // toggle individual class names
-                                       var className,
-                                               i = 0,
-                                               self = jQuery( this ),
-                                               state = stateVal,
-                                               classNames = value.split( rspace );
-
-                                       while ( (className = classNames[ i++ ]) ) {
-                                               // check each className given, space seperated list
-                                               state = isBool ? state : !self.hasClass( className );
-                                               self[ state ? "addClass" : "removeClass" ]( className );
-                                       }
-
-                               } else if ( type === "undefined" || type === "boolean" ) {
-                                       if ( this.className ) {
-                                               // store className if set
-                                               jQuery._data( this, "__className__", this.className );
-                                       }
-
-                                       // toggle whole className
-                                       this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
-                               }
-                       });
-               },
-
-               hasClass: function( selector ) {
-                       var className = " " + selector + " ",
-                               i = 0,
-                               l = this.length;
-                       for ( ; i < l; i++ ) {
-                               if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
-                                       return true;
-                               }
-                       }
-
-                       return false;
-               },
-
-               val: function( value ) {
-                       var hooks, ret, isFunction,
-                               elem = this[0];
-
-                       if ( !arguments.length ) {
-                               if ( elem ) {
-                                       hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
-
-                                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
-                                               return ret;
-                                       }
-
-                                       ret = elem.value;
-
-                                       return typeof ret === "string" ?
-                                               // handle most common string cases
-                                               ret.replace(rreturn, "") :
-                                               // handle cases where value is null/undef or number
-                                               ret == null ? "" : ret;
-                               }
-
-                               return;
-                       }
-
-                       isFunction = jQuery.isFunction( value );
-
-                       return this.each(function( i ) {
-                               var self = jQuery(this), val;
-
-                               if ( this.nodeType !== 1 ) {
-                                       return;
-                               }
-
-                               if ( isFunction ) {
-                                       val = value.call( this, i, self.val() );
-                               } else {
-                                       val = value;
-                               }
-
-                               // Treat null/undefined as ""; convert numbers to string
-                               if ( val == null ) {
-                                       val = "";
-                               } else if ( typeof val === "number" ) {
-                                       val += "";
-                               } else if ( jQuery.isArray( val ) ) {
-                                       val = jQuery.map(val, function ( value ) {
-                                               return value == null ? "" : value + "";
-                                       });
-                               }
-
-                               hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
-
-                               // If set returns undefined, fall back to normal setting
-                               if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
-                                       this.value = val;
-                               }
-                       });
-               }
-       });
-
-       jQuery.extend({
-               valHooks: {
-                       option: {
-                               get: function( elem ) {
-                                       // attributes.value is undefined in Blackberry 4.7 but
-                                       // uses .value. See #6932
-                                       var val = elem.attributes.value;
-                                       return !val || val.specified ? elem.value : elem.text;
-                               }
-                       },
-                       select: {
-                               get: function( elem ) {
-                                       var value, i, max, option,
-                                               index = elem.selectedIndex,
-                                               values = [],
-                                               options = elem.options,
-                                               one = elem.type === "select-one";
-
-                                       // Nothing was selected
-                                       if ( index < 0 ) {
-                                               return null;
-                                       }
-
-                                       // Loop through all the selected options
-                                       i = one ? index : 0;
-                                       max = one ? index + 1 : options.length;
-                                       for ( ; i < max; i++ ) {
-                                               option = options[ i ];
-
-                                               // Don't return options that are disabled or in a disabled optgroup
-                                               if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
-                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
-
-                                                       // Get the specific value for the option
-                                                       value = jQuery( option ).val();
-
-                                                       // We don't need an array for one selects
-                                                       if ( one ) {
-                                                               return value;
-                                                       }
-
-                                                       // Multi-Selects return an array
-                                                       values.push( value );
-                                               }
-                                       }
-
-                                       // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
-                                       if ( one && !values.length && options.length ) {
-                                               return jQuery( options[ index ] ).val();
-                                       }
-
-                                       return values;
-                               },
-
-                               set: function( elem, value ) {
-                                       var values = jQuery.makeArray( value );
-
-                                       jQuery(elem).find("option").each(function() {
-                                               this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
-                                       });
-
-                                       if ( !values.length ) {
-                                               elem.selectedIndex = -1;
-                                       }
-                                       return values;
-                               }
-                       }
-               },
-
-               attrFn: {
-                       val: true,
-                       css: true,
-                       html: true,
-                       text: true,
-                       data: true,
-                       width: true,
-                       height: true,
-                       offset: true
-               },
-
-               attr: function( elem, name, value, pass ) {
-                       var ret, hooks, notxml,
-                               nType = elem.nodeType;
-
-                       // don't get/set attributes on text, comment and attribute nodes
-                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                               return;
-                       }
-
-                       if ( pass && name in jQuery.attrFn ) {
-                               return jQuery( elem )[ name ]( value );
-                       }
-
-                       // Fallback to prop when attributes are not supported
-                       if ( typeof elem.getAttribute === "undefined" ) {
-                               return jQuery.prop( elem, name, value );
-                       }
-
-                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-                       // All attributes are lowercase
-                       // Grab necessary hook if one is defined
-                       if ( notxml ) {
-                               name = name.toLowerCase();
-                               hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
-                       }
-
-                       if ( value !== undefined ) {
-
-                               if ( value === null ) {
-                                       jQuery.removeAttr( elem, name );
-                                       return;
-
-                               } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                                       return ret;
-
-                               } else {
-                                       elem.setAttribute( name, "" + value );
-                                       return value;
-                               }
-
-                       } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
-                               return ret;
-
-                       } else {
-
-                               ret = elem.getAttribute( name );
-
-                               // Non-existent attributes return null, we normalize to undefined
-                               return ret === null ?
-                                       undefined :
-                                       ret;
-                       }
-               },
-
-               removeAttr: function( elem, value ) {
-                       var propName, attrNames, name, l, isBool,
-                               i = 0;
-
-                       if ( value && elem.nodeType === 1 ) {
-                               attrNames = value.toLowerCase().split( rspace );
-                               l = attrNames.length;
-
-                               for ( ; i < l; i++ ) {
-                                       name = attrNames[ i ];
-
-                                       if ( name ) {
-                                               propName = jQuery.propFix[ name ] || name;
-                                               isBool = rboolean.test( name );
-
-                                               // See #9699 for explanation of this approach (setting first, then removal)
-                                               // Do not do this for boolean attributes (see #10870)
-                                               if ( !isBool ) {
-                                                       jQuery.attr( elem, name, "" );
-                                               }
-                                               elem.removeAttribute( getSetAttribute ? name : propName );
-
-                                               // Set corresponding property to false for boolean attributes
-                                               if ( isBool && propName in elem ) {
-                                                       elem[ propName ] = false;
-                                               }
-                                       }
-                               }
-                       }
-               },
-
-               attrHooks: {
-                       type: {
-                               set: function( elem, value ) {
-                                       // We can't allow the type property to be changed (since it causes problems in IE)
-                                       if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
-                                               jQuery.error( "type property can't be changed" );
-                                       } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
-                                               // Setting the type on a radio button after the value resets the value in IE6-9
-                                               // Reset value to it's default in case type is set after value
-                                               // This is for element creation
-                                               var val = elem.value;
-                                               elem.setAttribute( "type", value );
-                                               if ( val ) {
-                                                       elem.value = val;
-                                               }
-                                               return value;
-                                       }
-                               }
-                       },
-                       // Use the value property for back compat
-                       // Use the nodeHook for button elements in IE6/7 (#1954)
-                       value: {
-                               get: function( elem, name ) {
-                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                               return nodeHook.get( elem, name );
-                                       }
-                                       return name in elem ?
-                                               elem.value :
-                                               null;
-                               },
-                               set: function( elem, value, name ) {
-                                       if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
-                                               return nodeHook.set( elem, value, name );
-                                       }
-                                       // Does not return so that setAttribute is also used
-                                       elem.value = value;
-                               }
-                       }
-               },
-
-               propFix: {
-                       tabindex: "tabIndex",
-                       readonly: "readOnly",
-                       "for": "htmlFor",
-                       "class": "className",
-                       maxlength: "maxLength",
-                       cellspacing: "cellSpacing",
-                       cellpadding: "cellPadding",
-                       rowspan: "rowSpan",
-                       colspan: "colSpan",
-                       usemap: "useMap",
-                       frameborder: "frameBorder",
-                       contenteditable: "contentEditable"
-               },
-
-               prop: function( elem, name, value ) {
-                       var ret, hooks, notxml,
-                               nType = elem.nodeType;
-
-                       // don't get/set properties on text, comment and attribute nodes
-                       if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
-                               return;
-                       }
-
-                       notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
-
-                       if ( notxml ) {
-                               // Fix name and attach hooks
-                               name = jQuery.propFix[ name ] || name;
-                               hooks = jQuery.propHooks[ name ];
-                       }
-
-                       if ( value !== undefined ) {
-                               if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
-                                       return ret;
-
-                               } else {
-                                       return ( elem[ name ] = value );
-                               }
-
-                       } else {
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
-                                       return ret;
-
-                               } else {
-                                       return elem[ name ];
-                               }
-                       }
-               },
-
-               propHooks: {
-                       tabIndex: {
-                               get: function( elem ) {
-                                       // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
-                                       // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
-                                       var attributeNode = elem.getAttributeNode("tabindex");
-
-                                       return attributeNode && attributeNode.specified ?
-                                               parseInt( attributeNode.value, 10 ) :
-                                               rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
-                                                       0 :
-                                                       undefined;
-                               }
-                       }
-               }
-       });
-
-// Add the tabIndex propHook to attrHooks for back-compat (different case is intentional)
-       jQuery.attrHooks.tabindex = jQuery.propHooks.tabIndex;
-
-// Hook for boolean attributes
-       boolHook = {
-               get: function( elem, name ) {
-                       // Align boolean attributes with corresponding properties
-                       // Fall back to attribute presence where some booleans are not supported
-                       var attrNode,
-                               property = jQuery.prop( elem, name );
-                       return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
-                               name.toLowerCase() :
-                               undefined;
-               },
-               set: function( elem, value, name ) {
-                       var propName;
-                       if ( value === false ) {
-                               // Remove boolean attributes when set to false
-                               jQuery.removeAttr( elem, name );
-                       } else {
-                               // value is true since we know at this point it's type boolean and not false
-                               // Set boolean attributes to the same name and set the DOM property
-                               propName = jQuery.propFix[ name ] || name;
-                               if ( propName in elem ) {
-                                       // Only set the IDL specifically if it already exists on the element
-                                       elem[ propName ] = true;
-                               }
-
-                               elem.setAttribute( name, name.toLowerCase() );
-                       }
-                       return name;
-               }
-       };
-
-// IE6/7 do not support getting/setting some attributes with get/setAttribute
-       if ( !getSetAttribute ) {
-
-               fixSpecified = {
-                       name: true,
-                       id: true,
-                       coords: true
-               };
-
-               // Use this for any attribute in IE6/7
-               // This fixes almost every IE6/7 issue
-               nodeHook = jQuery.valHooks.button = {
-                       get: function( elem, name ) {
-                               var ret;
-                               ret = elem.getAttributeNode( name );
-                               return ret && ( fixSpecified[ name ] ? ret.nodeValue !== "" : ret.specified ) ?
-                                       ret.nodeValue :
-                                       undefined;
-                       },
-                       set: function( elem, value, name ) {
-                               // Set the existing or create a new attribute node
-                               var ret = elem.getAttributeNode( name );
-                               if ( !ret ) {
-                                       ret = document.createAttribute( name );
-                                       elem.setAttributeNode( ret );
-                               }
-                               return ( ret.nodeValue = value + "" );
-                       }
-               };
-
-               // Apply the nodeHook to tabindex
-               jQuery.attrHooks.tabindex.set = nodeHook.set;
-
-               // Set width and height to auto instead of 0 on empty string( Bug #8150 )
-               // This is for removals
-               jQuery.each([ "width", "height" ], function( i, name ) {
-                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                               set: function( elem, value ) {
-                                       if ( value === "" ) {
-                                               elem.setAttribute( name, "auto" );
-                                               return value;
-                                       }
-                               }
-                       });
-               });
-
-               // Set contenteditable to false on removals(#10429)
-               // Setting to empty string throws an error as an invalid value
-               jQuery.attrHooks.contenteditable = {
-                       get: nodeHook.get,
-                       set: function( elem, value, name ) {
-                               if ( value === "" ) {
-                                       value = "false";
-                               }
-                               nodeHook.set( elem, value, name );
-                       }
-               };
-       }
-
-
-// Some attributes require a special call on IE
-       if ( !jQuery.support.hrefNormalized ) {
-               jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
-                       jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
-                               get: function( elem ) {
-                                       var ret = elem.getAttribute( name, 2 );
-                                       return ret === null ? undefined : ret;
-                               }
-                       });
-               });
-       }
-
-       if ( !jQuery.support.style ) {
-               jQuery.attrHooks.style = {
-                       get: function( elem ) {
-                               // Return undefined in the case of empty string
-                               // Normalize to lowercase since IE uppercases css property names
-                               return elem.style.cssText.toLowerCase() || undefined;
-                       },
-                       set: function( elem, value ) {
-                               return ( elem.style.cssText = "" + value );
-                       }
-               };
-       }
-
-// Safari mis-reports the default selected property of an option
-// Accessing the parent's selectedIndex property fixes it
-       if ( !jQuery.support.optSelected ) {
-               jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
-                       get: function( elem ) {
-                               var parent = elem.parentNode;
-
-                               if ( parent ) {
-                                       parent.selectedIndex;
-
-                                       // Make sure that it also works with optgroups, see #5701
-                                       if ( parent.parentNode ) {
-                                               parent.parentNode.selectedIndex;
-                                       }
-                               }
-                               return null;
-                       }
-               });
-       }
-
-// IE6/7 call enctype encoding
-       if ( !jQuery.support.enctype ) {
-               jQuery.propFix.enctype = "encoding";
-       }
-
-// Radios and checkboxes getter/setter
-       if ( !jQuery.support.checkOn ) {
-               jQuery.each([ "radio", "checkbox" ], function() {
-                       jQuery.valHooks[ this ] = {
-                               get: function( elem ) {
-                                       // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
-                                       return elem.getAttribute("value") === null ? "on" : elem.value;
-                               }
-                       };
-               });
-       }
-       jQuery.each([ "radio", "checkbox" ], function() {
-               jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
-                       set: function( elem, value ) {
-                               if ( jQuery.isArray( value ) ) {
-                                       return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
-                               }
-                       }
-               });
-       });
-
-
-
-
-       var rformElems = /^(?:textarea|input|select)$/i,
-               rtypenamespace = /^([^\.]*)?(?:\.(.+))?$/,
-               rhoverHack = /(?:^|\s)hover(\.\S+)?\b/,
-               rkeyEvent = /^key/,
-               rmouseEvent = /^(?:mouse|contextmenu)|click/,
-               rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
-               rquickIs = /^(\w*)(?:#([\w\-]+))?(?:\.([\w\-]+))?$/,
-               quickParse = function( selector ) {
-                       var quick = rquickIs.exec( selector );
-                       if ( quick ) {
-                               //   0  1    2   3
-                               // [ _, tag, id, class ]
-                               quick[1] = ( quick[1] || "" ).toLowerCase();
-                               quick[3] = quick[3] && new RegExp( "(?:^|\\s)" + quick[3] + "(?:\\s|$)" );
-                       }
-                       return quick;
-               },
-               quickIs = function( elem, m ) {
-                       var attrs = elem.attributes || {};
-                       return (
-                               (!m[1] || elem.nodeName.toLowerCase() === m[1]) &&
-                                       (!m[2] || (attrs.id || {}).value === m[2]) &&
-                                       (!m[3] || m[3].test( (attrs[ "class" ] || {}).value ))
-                               );
-               },
-               hoverHack = function( events ) {
-                       return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
-               };
-
-       /*
-        * Helper functions for managing events -- not part of the public interface.
-        * Props to Dean Edwards' addEvent library for many of the ideas.
-        */
-       jQuery.event = {
-
-               add: function( elem, types, handler, data, selector ) {
-
-                       var elemData, eventHandle, events,
-                               t, tns, type, namespaces, handleObj,
-                               handleObjIn, quick, handlers, special;
-
-                       // Don't attach events to noData or text/comment nodes (allow plain objects tho)
-                       if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
-                               return;
-                       }
-
-                       // Caller can pass in an object of custom data in lieu of the handler
-                       if ( handler.handler ) {
-                               handleObjIn = handler;
-                               handler = handleObjIn.handler;
-                               selector = handleObjIn.selector;
-                       }
-
-                       // Make sure that the handler has a unique ID, used to find/remove it later
-                       if ( !handler.guid ) {
-                               handler.guid = jQuery.guid++;
-                       }
-
-                       // Init the element's event structure and main handler, if this is the first
-                       events = elemData.events;
-                       if ( !events ) {
-                               elemData.events = events = {};
-                       }
-                       eventHandle = elemData.handle;
-                       if ( !eventHandle ) {
-                               elemData.handle = eventHandle = function( e ) {
-                                       // Discard the second event of a jQuery.event.trigger() and
-                                       // when an event is called after a page has unloaded
-                                       return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
-                                               jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
-                                               undefined;
-                               };
-                               // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
-                               eventHandle.elem = elem;
-                       }
-
-                       // Handle multiple events separated by a space
-                       // jQuery(...).bind("mouseover mouseout", fn);
-                       types = jQuery.trim( hoverHack(types) ).split( " " );
-                       for ( t = 0; t < types.length; t++ ) {
-
-                               tns = rtypenamespace.exec( types[t] ) || [];
-                               type = tns[1];
-                               namespaces = ( tns[2] || "" ).split( "." ).sort();
-
-                               // If event changes its type, use the special event handlers for the changed type
-                               special = jQuery.event.special[ type ] || {};
-
-                               // If selector defined, determine special event api type, otherwise given type
-                               type = ( selector ? special.delegateType : special.bindType ) || type;
-
-                               // Update special based on newly reset type
-                               special = jQuery.event.special[ type ] || {};
-
-                               // handleObj is passed to all event handlers
-                               handleObj = jQuery.extend({
-                                       type: type,
-                                       origType: tns[1],
-                                       data: data,
-                                       handler: handler,
-                                       guid: handler.guid,
-                                       selector: selector,
-                                       quick: selector && quickParse( selector ),
-                                       namespace: namespaces.join(".")
-                               }, handleObjIn );
-
-                               // Init the event handler queue if we're the first
-                               handlers = events[ type ];
-                               if ( !handlers ) {
-                                       handlers = events[ type ] = [];
-                                       handlers.delegateCount = 0;
-
-                                       // Only use addEventListener/attachEvent if the special events handler returns false
-                                       if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
-                                               // Bind the global event handler to the element
-                                               if ( elem.addEventListener ) {
-                                                       elem.addEventListener( type, eventHandle, false );
-
-                                               } else if ( elem.attachEvent ) {
-                                                       elem.attachEvent( "on" + type, eventHandle );
-                                               }
-                                       }
-                               }
-
-                               if ( special.add ) {
-                                       special.add.call( elem, handleObj );
-
-                                       if ( !handleObj.handler.guid ) {
-                                               handleObj.handler.guid = handler.guid;
-                                       }
-                               }
-
-                               // Add to the element's handler list, delegates in front
-                               if ( selector ) {
-                                       handlers.splice( handlers.delegateCount++, 0, handleObj );
-                               } else {
-                                       handlers.push( handleObj );
-                               }
-
-                               // Keep track of which events have ever been used, for event optimization
-                               jQuery.event.global[ type ] = true;
-                       }
-
-                       // Nullify elem to prevent memory leaks in IE
-                       elem = null;
-               },
-
-               global: {},
-
-               // Detach an event or set of events from an element
-               remove: function( elem, types, handler, selector, mappedTypes ) {
-
-                       var elemData = jQuery.hasData( elem ) && jQuery._data( elem ),
-                               t, tns, type, origType, namespaces, origCount,
-                               j, events, special, handle, eventType, handleObj;
-
-                       if ( !elemData || !(events = elemData.events) ) {
-                               return;
-                       }
-
-                       // Once for each type.namespace in types; type may be omitted
-                       types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
-                       for ( t = 0; t < types.length; t++ ) {
-                               tns = rtypenamespace.exec( types[t] ) || [];
-                               type = origType = tns[1];
-                               namespaces = tns[2];
-
-                               // Unbind all events (on this namespace, if provided) for the element
-                               if ( !type ) {
-                                       for ( type in events ) {
-                                               jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
-                                       }
-                                       continue;
-                               }
-
-                               special = jQuery.event.special[ type ] || {};
-                               type = ( selector? special.delegateType : special.bindType ) || type;
-                               eventType = events[ type ] || [];
-                               origCount = eventType.length;
-                               namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-
-                               // Remove matching events
-                               for ( j = 0; j < eventType.length; j++ ) {
-                                       handleObj = eventType[ j ];
-
-                                       if ( ( mappedTypes || origType === handleObj.origType ) &&
-                                               ( !handler || handler.guid === handleObj.guid ) &&
-                                               ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
-                                               ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
-                                               eventType.splice( j--, 1 );
-
-                                               if ( handleObj.selector ) {
-                                                       eventType.delegateCount--;
-                                               }
-                                               if ( special.remove ) {
-                                                       special.remove.call( elem, handleObj );
-                                               }
-                                       }
-                               }
-
-                               // Remove generic event handler if we removed something and no more handlers exist
-                               // (avoids potential for endless recursion during removal of special event handlers)
-                               if ( eventType.length === 0 && origCount !== eventType.length ) {
-                                       if ( !special.teardown || special.teardown.call( elem, namespaces ) === false ) {
-                                               jQuery.removeEvent( elem, type, elemData.handle );
-                                       }
-
-                                       delete events[ type ];
-                               }
-                       }
-
-                       // Remove the expando if it's no longer used
-                       if ( jQuery.isEmptyObject( events ) ) {
-                               handle = elemData.handle;
-                               if ( handle ) {
-                                       handle.elem = null;
-                               }
-
-                               // removeData also checks for emptiness and clears the expando if empty
-                               // so use it instead of delete
-                               jQuery.removeData( elem, [ "events", "handle" ], true );
-                       }
-               },
-
-               // Events that are safe to short-circuit if no handlers are attached.
-               // Native DOM events should not be added, they may have inline handlers.
-               customEvent: {
-                       "getData": true,
-                       "setData": true,
-                       "changeData": true
-               },
-
-               trigger: function( event, data, elem, onlyHandlers ) {
-                       // Don't do events on text and comment nodes
-                       if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
-                               return;
-                       }
-
-                       // Event object or event type
-                       var type = event.type || event,
-                               namespaces = [],
-                               cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType;
-
-                       // focus/blur morphs to focusin/out; ensure we're not firing them right now
-                       if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
-                               return;
-                       }
-
-                       if ( type.indexOf( "!" ) >= 0 ) {
-                               // Exclusive events trigger only for the exact event (no namespaces)
-                               type = type.slice(0, -1);
-                               exclusive = true;
-                       }
-
-                       if ( type.indexOf( "." ) >= 0 ) {
-                               // Namespaced trigger; create a regexp to match event type in handle()
-                               namespaces = type.split(".");
-                               type = namespaces.shift();
-                               namespaces.sort();
-                       }
-
-                       if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
-                               // No jQuery handlers for this event type, and it can't have inline handlers
-                               return;
-                       }
-
-                       // Caller can pass in an Event, Object, or just an event type string
-                       event = typeof event === "object" ?
-                               // jQuery.Event object
-                               event[ jQuery.expando ] ? event :
-                                       // Object literal
-                                       new jQuery.Event( type, event ) :
-                               // Just the event type (string)
-                               new jQuery.Event( type );
-
-                       event.type = type;
-                       event.isTrigger = true;
-                       event.exclusive = exclusive;
-                       event.namespace = namespaces.join( "." );
-                       event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.)?") + "(\\.|$)") : null;
-                       ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
-
-                       // Handle a global trigger
-                       if ( !elem ) {
-
-                               // TODO: Stop taunting the data cache; remove global events and always attach to document
-                               cache = jQuery.cache;
-                               for ( i in cache ) {
-                                       if ( cache[ i ].events && cache[ i ].events[ type ] ) {
-                                               jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
-                                       }
-                               }
-                               return;
-                       }
-
-                       // Clean up the event in case it is being reused
-                       event.result = undefined;
-                       if ( !event.target ) {
-                               event.target = elem;
-                       }
-
-                       // Clone any incoming data and prepend the event, creating the handler arg list
-                       data = data != null ? jQuery.makeArray( data ) : [];
-                       data.unshift( event );
-
-                       // Allow special events to draw outside the lines
-                       special = jQuery.event.special[ type ] || {};
-                       if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
-                               return;
-                       }
-
-                       // Determine event propagation path in advance, per W3C events spec (#9951)
-                       // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
-                       eventPath = [[ elem, special.bindType || type ]];
-                       if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
-
-                               bubbleType = special.delegateType || type;
-                               cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
-                               old = null;
-                               for ( ; cur; cur = cur.parentNode ) {
-                                       eventPath.push([ cur, bubbleType ]);
-                                       old = cur;
-                               }
-
-                               // Only add window if we got to document (e.g., not plain obj or detached DOM)
-                               if ( old && old === elem.ownerDocument ) {
-                                       eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
-                               }
-                       }
-
-                       // Fire handlers on the event path
-                       for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
-
-                               cur = eventPath[i][0];
-                               event.type = eventPath[i][1];
-
-                               handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
-                               if ( handle ) {
-                                       handle.apply( cur, data );
-                               }
-                               // Note that this is a bare JS function and not a jQuery handler
-                               handle = ontype && cur[ ontype ];
-                               if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
-                                       event.preventDefault();
-                               }
-                       }
-                       event.type = type;
-
-                       // If nobody prevented the default action, do it now
-                       if ( !onlyHandlers && !event.isDefaultPrevented() ) {
-
-                               if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
-                                       !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
-
-                                       // Call a native DOM method on the target with the same name name as the event.
-                                       // Can't use an .isFunction() check here because IE6/7 fails that test.
-                                       // Don't do default actions on window, that's where global variables be (#6170)
-                                       // IE<9 dies on focus/blur to hidden element (#1486)
-                                       if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
-
-                                               // Don't re-trigger an onFOO event when we call its FOO() method
-                                               old = elem[ ontype ];
-
-                                               if ( old ) {
-                                                       elem[ ontype ] = null;
-                                               }
-
-                                               // Prevent re-triggering of the same event, since we already bubbled it above
-                                               jQuery.event.triggered = type;
-                                               elem[ type ]();
-                                               jQuery.event.triggered = undefined;
-
-                                               if ( old ) {
-                                                       elem[ ontype ] = old;
-                                               }
-                                       }
-                               }
-                       }
-
-                       return event.result;
-               },
-
-               dispatch: function( event ) {
-
-                       // Make a writable jQuery.Event from the native event object
-                       event = jQuery.event.fix( event || window.event );
-
-                       var handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
-                               delegateCount = handlers.delegateCount,
-                               args = [].slice.call( arguments, 0 ),
-                               run_all = !event.exclusive && !event.namespace,
-                               special = jQuery.event.special[ event.type ] || {},
-                               handlerQueue = [],
-                               i, j, cur, jqcur, ret, selMatch, matched, matches, handleObj, sel, related;
-
-                       // Use the fix-ed jQuery.Event rather than the (read-only) native event
-                       args[0] = event;
-                       event.delegateTarget = this;
-
-                       // Call the preDispatch hook for the mapped type, and let it bail if desired
-                       if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
-                               return;
-                       }
-
-                       // Determine handlers that should run if there are delegated events
-                       // Avoid non-left-click bubbling in Firefox (#3861)
-                       if ( delegateCount && !(event.button && event.type === "click") ) {
-
-                               // Pregenerate a single jQuery object for reuse with .is()
-                               jqcur = jQuery(this);
-                               jqcur.context = this.ownerDocument || this;
-
-                               for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
-
-                                       // Don't process events on disabled elements (#6911, #8165)
-                                       if ( cur.disabled !== true ) {
-                                               selMatch = {};
-                                               matches = [];
-                                               jqcur[0] = cur;
-                                               for ( i = 0; i < delegateCount; i++ ) {
-                                                       handleObj = handlers[ i ];
-                                                       sel = handleObj.selector;
-
-                                                       if ( selMatch[ sel ] === undefined ) {
-                                                               selMatch[ sel ] = (
-                                                                       handleObj.quick ? quickIs( cur, handleObj.quick ) : jqcur.is( sel )
-                                                                       );
-                                                       }
-                                                       if ( selMatch[ sel ] ) {
-                                                               matches.push( handleObj );
-                                                       }
-                                               }
-                                               if ( matches.length ) {
-                                                       handlerQueue.push({ elem: cur, matches: matches });
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Add the remaining (directly-bound) handlers
-                       if ( handlers.length > delegateCount ) {
-                               handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
-                       }
-
-                       // Run delegates first; they may want to stop propagation beneath us
-                       for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
-                               matched = handlerQueue[ i ];
-                               event.currentTarget = matched.elem;
-
-                               for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
-                                       handleObj = matched.matches[ j ];
-
-                                       // Triggered event must either 1) be non-exclusive and have no namespace, or
-                                       // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
-                                       if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
-
-                                               event.data = handleObj.data;
-                                               event.handleObj = handleObj;
-
-                                               ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
-                                                       .apply( matched.elem, args );
-
-                                               if ( ret !== undefined ) {
-                                                       event.result = ret;
-                                                       if ( ret === false ) {
-                                                               event.preventDefault();
-                                                               event.stopPropagation();
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-
-                       // Call the postDispatch hook for the mapped type
-                       if ( special.postDispatch ) {
-                               special.postDispatch.call( this, event );
-                       }
-
-                       return event.result;
-               },
-
-               // Includes some event props shared by KeyEvent and MouseEvent
-               // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
-               props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
-
-               fixHooks: {},
-
-               keyHooks: {
-                       props: "char charCode key keyCode".split(" "),
-                       filter: function( event, original ) {
-
-                               // Add which for key events
-                               if ( event.which == null ) {
-                                       event.which = original.charCode != null ? original.charCode : original.keyCode;
-                               }
-
-                               return event;
-                       }
-               },
-
-               mouseHooks: {
-                       props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
-                       filter: function( event, original ) {
-                               var eventDoc, doc, body,
-                                       button = original.button,
-                                       fromElement = original.fromElement;
-
-                               // Calculate pageX/Y if missing and clientX/Y available
-                               if ( event.pageX == null && original.clientX != null ) {
-                                       eventDoc = event.target.ownerDocument || document;
-                                       doc = eventDoc.documentElement;
-                                       body = eventDoc.body;
-
-                                       event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
-                                       event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
-                               }
-
-                               // Add relatedTarget, if necessary
-                               if ( !event.relatedTarget && fromElement ) {
-                                       event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
-                               }
-
-                               // Add which for click: 1 === left; 2 === middle; 3 === right
-                               // Note: button is not normalized, so don't use it
-                               if ( !event.which && button !== undefined ) {
-                                       event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
-                               }
-
-                               return event;
-                       }
-               },
-
-               fix: function( event ) {
-                       if ( event[ jQuery.expando ] ) {
-                               return event;
-                       }
-
-                       // Create a writable copy of the event object and normalize some properties
-                       var i, prop,
-                               originalEvent = event,
-                               fixHook = jQuery.event.fixHooks[ event.type ] || {},
-                               copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
-
-                       event = jQuery.Event( originalEvent );
-
-                       for ( i = copy.length; i; ) {
-                               prop = copy[ --i ];
-                               event[ prop ] = originalEvent[ prop ];
-                       }
-
-                       // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
-                       if ( !event.target ) {
-                               event.target = originalEvent.srcElement || document;
-                       }
-
-                       // Target should not be a text node (#504, Safari)
-                       if ( event.target.nodeType === 3 ) {
-                               event.target = event.target.parentNode;
-                       }
-
-                       // For mouse/key events; add metaKey if it's not there (#3368, IE6/7/8)
-                       if ( event.metaKey === undefined ) {
-                               event.metaKey = event.ctrlKey;
-                       }
-
-                       return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
-               },
-
-               special: {
-                       ready: {
-                               // Make sure the ready event is setup
-                               setup: jQuery.bindReady
-                       },
-
-                       load: {
-                               // Prevent triggered image.load events from bubbling to window.load
-                               noBubble: true
-                       },
-
-                       focus: {
-                               delegateType: "focusin"
-                       },
-                       blur: {
-                               delegateType: "focusout"
-                       },
-
-                       beforeunload: {
-                               setup: function( data, namespaces, eventHandle ) {
-                                       // We only want to do this special case on windows
-                                       if ( jQuery.isWindow( this ) ) {
-                                               this.onbeforeunload = eventHandle;
-                                       }
-                               },
-
-                               teardown: function( namespaces, eventHandle ) {
-                                       if ( this.onbeforeunload === eventHandle ) {
-                                               this.onbeforeunload = null;
-                                       }
-                               }
-                       }
-               },
-
-               simulate: function( type, elem, event, bubble ) {
-                       // Piggyback on a donor event to simulate a different one.
-                       // Fake originalEvent to avoid donor's stopPropagation, but if the
-                       // simulated event prevents default then we do the same on the donor.
-                       var e = jQuery.extend(
-                               new jQuery.Event(),
-                               event,
-                               { type: type,
-                                       isSimulated: true,
-                                       originalEvent: {}
-                               }
-                       );
-                       if ( bubble ) {
-                               jQuery.event.trigger( e, null, elem );
-                       } else {
-                               jQuery.event.dispatch.call( elem, e );
-                       }
-                       if ( e.isDefaultPrevented() ) {
-                               event.preventDefault();
-                       }
-               }
-       };
-
-// Some plugins are using, but it's undocumented/deprecated and will be removed.
-// The 1.7 special event interface should provide all the hooks needed now.
-       jQuery.event.handle = jQuery.event.dispatch;
-
-       jQuery.removeEvent = document.removeEventListener ?
-               function( elem, type, handle ) {
-                       if ( elem.removeEventListener ) {
-                               elem.removeEventListener( type, handle, false );
-                       }
-               } :
-               function( elem, type, handle ) {
-                       if ( elem.detachEvent ) {
-                               elem.detachEvent( "on" + type, handle );
-                       }
-               };
-
-       jQuery.Event = function( src, props ) {
-               // Allow instantiation without the 'new' keyword
-               if ( !(this instanceof jQuery.Event) ) {
-                       return new jQuery.Event( src, props );
-               }
-
-               // Event object
-               if ( src && src.type ) {
-                       this.originalEvent = src;
-                       this.type = src.type;
-
-                       // Events bubbling up the document may have been marked as prevented
-                       // by a handler lower down the tree; reflect the correct value.
-                       this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
-                               src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
-
-                       // Event type
-               } else {
-                       this.type = src;
-               }
-
-               // Put explicitly provided properties onto the event object
-               if ( props ) {
-                       jQuery.extend( this, props );
-               }
-
-               // Create a timestamp if incoming event doesn't have one
-               this.timeStamp = src && src.timeStamp || jQuery.now();
-
-               // Mark it as fixed
-               this[ jQuery.expando ] = true;
-       };
-
-       function returnFalse() {
-               return false;
-       }
-       function returnTrue() {
-               return true;
-       }
-
-// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
-// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
-       jQuery.Event.prototype = {
-               preventDefault: function() {
-                       this.isDefaultPrevented = returnTrue;
-
-                       var e = this.originalEvent;
-                       if ( !e ) {
-                               return;
-                       }
-
-                       // if preventDefault exists run it on the original event
-                       if ( e.preventDefault ) {
-                               e.preventDefault();
-
-                               // otherwise set the returnValue property of the original event to false (IE)
-                       } else {
-                               e.returnValue = false;
-                       }
-               },
-               stopPropagation: function() {
-                       this.isPropagationStopped = returnTrue;
-
-                       var e = this.originalEvent;
-                       if ( !e ) {
-                               return;
-                       }
-                       // if stopPropagation exists run it on the original event
-                       if ( e.stopPropagation ) {
-                               e.stopPropagation();
-                       }
-                       // otherwise set the cancelBubble property of the original event to true (IE)
-                       e.cancelBubble = true;
-               },
-               stopImmediatePropagation: function() {
-                       this.isImmediatePropagationStopped = returnTrue;
-                       this.stopPropagation();
-               },
-               isDefaultPrevented: returnFalse,
-               isPropagationStopped: returnFalse,
-               isImmediatePropagationStopped: returnFalse
-       };
-
-// Create mouseenter/leave events using mouseover/out and event-time checks
-       jQuery.each({
-               mouseenter: "mouseover",
-               mouseleave: "mouseout"
-       }, function( orig, fix ) {
-               jQuery.event.special[ orig ] = {
-                       delegateType: fix,
-                       bindType: fix,
-
-                       handle: function( event ) {
-                               var target = this,
-                                       related = event.relatedTarget,
-                                       handleObj = event.handleObj,
-                                       selector = handleObj.selector,
-                                       ret;
-
-                               // For mousenter/leave call the handler if related is outside the target.
-                               // NB: No relatedTarget if the mouse left/entered the browser window
-                               if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
-                                       event.type = handleObj.origType;
-                                       ret = handleObj.handler.apply( this, arguments );
-                                       event.type = fix;
-                               }
-                               return ret;
-                       }
-               };
-       });
-
-// IE submit delegation
-       if ( !jQuery.support.submitBubbles ) {
-
-               jQuery.event.special.submit = {
-                       setup: function() {
-                               // Only need this for delegated form submit events
-                               if ( jQuery.nodeName( this, "form" ) ) {
-                                       return false;
-                               }
-
-                               // Lazy-add a submit handler when a descendant form may potentially be submitted
-                               jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
-                                       // Node name check avoids a VML-related crash in IE (#9807)
-                                       var elem = e.target,
-                                               form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
-                                       if ( form && !form._submit_attached ) {
-                                               jQuery.event.add( form, "submit._submit", function( event ) {
-                                                       event._submit_bubble = true;
-                                               });
-                                               form._submit_attached = true;
-                                       }
-                               });
-                               // return undefined since we don't need an event listener
-                       },
-
-                       postDispatch: function( event ) {
-                               // If form was submitted by the user, bubble the event up the tree
-                               if ( event._submit_bubble ) {
-                                       delete event._submit_bubble;
-                                       if ( this.parentNode && !event.isTrigger ) {
-                                               jQuery.event.simulate( "submit", this.parentNode, event, true );
-                                       }
-                               }
-                       },
-
-                       teardown: function() {
-                               // Only need this for delegated form submit events
-                               if ( jQuery.nodeName( this, "form" ) ) {
-                                       return false;
-                               }
-
-                               // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
-                               jQuery.event.remove( this, "._submit" );
-                       }
-               };
-       }
-
-// IE change delegation and checkbox/radio fix
-       if ( !jQuery.support.changeBubbles ) {
-
-               jQuery.event.special.change = {
-
-                       setup: function() {
-
-                               if ( rformElems.test( this.nodeName ) ) {
-                                       // IE doesn't fire change on a check/radio until blur; trigger it on click
-                                       // after a propertychange. Eat the blur-change in special.change.handle.
-                                       // This still fires onchange a second time for check/radio after blur.
-                                       if ( this.type === "checkbox" || this.type === "radio" ) {
-                                               jQuery.event.add( this, "propertychange._change", function( event ) {
-                                                       if ( event.originalEvent.propertyName === "checked" ) {
-                                                               this._just_changed = true;
-                                                       }
-                                               });
-                                               jQuery.event.add( this, "click._change", function( event ) {
-                                                       if ( this._just_changed && !event.isTrigger ) {
-                                                               this._just_changed = false;
-                                                               jQuery.event.simulate( "change", this, event, true );
-                                                       }
-                                               });
-                                       }
-                                       return false;
-                               }
-                               // Delegated event; lazy-add a change handler on descendant inputs
-                               jQuery.event.add( this, "beforeactivate._change", function( e ) {
-                                       var elem = e.target;
-
-                                       if ( rformElems.test( elem.nodeName ) && !elem._change_attached ) {
-                                               jQuery.event.add( elem, "change._change", function( event ) {
-                                                       if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
-                                                               jQuery.event.simulate( "change", this.parentNode, event, true );
-                                                       }
-                                               });
-                                               elem._change_attached = true;
-                                       }
-                               });
-                       },
-
-                       handle: function( event ) {
-                               var elem = event.target;
-
-                               // Swallow native change events from checkbox/radio, we already triggered them above
-                               if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
-                                       return event.handleObj.handler.apply( this, arguments );
-                               }
-                       },
-
-                       teardown: function() {
-                               jQuery.event.remove( this, "._change" );
-
-                               return rformElems.test( this.nodeName );
-                       }
-               };
-       }
-
-// Create "bubbling" focus and blur events
-       if ( !jQuery.support.focusinBubbles ) {
-               jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
-
-                       // Attach a single capturing handler while someone wants focusin/focusout
-                       var attaches = 0,
-                               handler = function( event ) {
-                                       jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
-                               };
-
-                       jQuery.event.special[ fix ] = {
-                               setup: function() {
-                                       if ( attaches++ === 0 ) {
-                                               document.addEventListener( orig, handler, true );
-                                       }
-                               },
-                               teardown: function() {
-                                       if ( --attaches === 0 ) {
-                                               document.removeEventListener( orig, handler, true );
-                                       }
-                               }
-                       };
-               });
-       }
-
-       jQuery.fn.extend({
-
-               on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
-                       var origFn, type;
-
-                       // Types can be a map of types/handlers
-                       if ( typeof types === "object" ) {
-                               // ( types-Object, selector, data )
-                               if ( typeof selector !== "string" ) { // && selector != null
-                                       // ( types-Object, data )
-                                       data = data || selector;
-                                       selector = undefined;
-                               }
-                               for ( type in types ) {
-                                       this.on( type, selector, data, types[ type ], one );
-                               }
-                               return this;
-                       }
-
-                       if ( data == null && fn == null ) {
-                               // ( types, fn )
-                               fn = selector;
-                               data = selector = undefined;
-                       } else if ( fn == null ) {
-                               if ( typeof selector === "string" ) {
-                                       // ( types, selector, fn )
-                                       fn = data;
-                                       data = undefined;
-                               } else {
-                                       // ( types, data, fn )
-                                       fn = data;
-                                       data = selector;
-                                       selector = undefined;
-                               }
-                       }
-                       if ( fn === false ) {
-                               fn = returnFalse;
-                       } else if ( !fn ) {
-                               return this;
-                       }
-
-                       if ( one === 1 ) {
-                               origFn = fn;
-                               fn = function( event ) {
-                                       // Can use an empty set, since event contains the info
-                                       jQuery().off( event );
-                                       return origFn.apply( this, arguments );
-                               };
-                               // Use same guid so caller can remove using origFn
-                               fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
-                       }
-                       return this.each( function() {
-                               jQuery.event.add( this, types, fn, data, selector );
-                       });
-               },
-               one: function( types, selector, data, fn ) {
-                       return this.on( types, selector, data, fn, 1 );
-               },
-               off: function( types, selector, fn ) {
-                       if ( types && types.preventDefault && types.handleObj ) {
-                               // ( event )  dispatched jQuery.Event
-                               var handleObj = types.handleObj;
-                               jQuery( types.delegateTarget ).off(
-                                       handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
-                                       handleObj.selector,
-                                       handleObj.handler
-                               );
-                               return this;
-                       }
-                       if ( typeof types === "object" ) {
-                               // ( types-object [, selector] )
-                               for ( var type in types ) {
-                                       this.off( type, selector, types[ type ] );
-                               }
-                               return this;
-                       }
-                       if ( selector === false || typeof selector === "function" ) {
-                               // ( types [, fn] )
-                               fn = selector;
-                               selector = undefined;
-                       }
-                       if ( fn === false ) {
-                               fn = returnFalse;
-                       }
-                       return this.each(function() {
-                               jQuery.event.remove( this, types, fn, selector );
-                       });
-               },
-
-               bind: function( types, data, fn ) {
-                       return this.on( types, null, data, fn );
-               },
-               unbind: function( types, fn ) {
-                       return this.off( types, null, fn );
-               },
-
-               live: function( types, data, fn ) {
-                       jQuery( this.context ).on( types, this.selector, data, fn );
-                       return this;
-               },
-               die: function( types, fn ) {
-                       jQuery( this.context ).off( types, this.selector || "**", fn );
-                       return this;
-               },
-
-               delegate: function( selector, types, data, fn ) {
-                       return this.on( types, selector, data, fn );
-               },
-               undelegate: function( selector, types, fn ) {
-                       // ( namespace ) or ( selector, types [, fn] )
-                       return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector, fn );
-               },
-
-               trigger: function( type, data ) {
-                       return this.each(function() {
-                               jQuery.event.trigger( type, data, this );
-                       });
-               },
-               triggerHandler: function( type, data ) {
-                       if ( this[0] ) {
-                               return jQuery.event.trigger( type, data, this[0], true );
-                       }
-               },
-
-               toggle: function( fn ) {
-                       // Save reference to arguments for access in closure
-                       var args = arguments,
-                               guid = fn.guid || jQuery.guid++,
-                               i = 0,
-                               toggler = function( event ) {
-                                       // Figure out which function to execute
-                                       var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
-                                       jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
-
-                                       // Make sure that clicks stop
-                                       event.preventDefault();
-
-                                       // and execute the function
-                                       return args[ lastToggle ].apply( this, arguments ) || false;
-                               };
-
-                       // link all the functions, so any of them can unbind this click handler
-                       toggler.guid = guid;
-                       while ( i < args.length ) {
-                               args[ i++ ].guid = guid;
-                       }
-
-                       return this.click( toggler );
-               },
-
-               hover: function( fnOver, fnOut ) {
-                       return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
-               }
-       });
-
-       jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
-               "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
-               "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
-
-               // Handle event binding
-               jQuery.fn[ name ] = function( data, fn ) {
-                       if ( fn == null ) {
-                               fn = data;
-                               data = null;
-                       }
-
-                       return arguments.length > 0 ?
-                               this.on( name, null, data, fn ) :
-                               this.trigger( name );
-               };
-
-               if ( jQuery.attrFn ) {
-                       jQuery.attrFn[ name ] = true;
-               }
-
-               if ( rkeyEvent.test( name ) ) {
-                       jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
-               }
-
-               if ( rmouseEvent.test( name ) ) {
-                       jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
-               }
-       });
-
-
-
-       /*!
-        * Sizzle CSS Selector Engine
-        *  Copyright 2011, The Dojo Foundation
-        *  Released under the MIT, BSD, and GPL Licenses.
-        *  More information: http://sizzlejs.com/
-        */
-       (function(){
-
-               var chunker = /((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,
-                       expando = "sizcache" + (Math.random() + '').replace('.', ''),
-                       done = 0,
-                       toString = Object.prototype.toString,
-                       hasDuplicate = false,
-                       baseHasDuplicate = true,
-                       rBackslash = /\\/g,
-                       rReturn = /\r\n/g,
-                       rNonWord = /\W/;
-
-// Here we check if the JavaScript engine is using some sort of
-// optimization where it does not always call our comparision
-// function. If that is the case, discard the hasDuplicate value.
-//   Thus far that includes Google Chrome.
-               [0, 0].sort(function() {
-                       baseHasDuplicate = false;
-                       return 0;
-               });
-
-               var Sizzle = function( selector, context, results, seed ) {
-                       results = results || [];
-                       context = context || document;
-
-                       var origContext = context;
-
-                       if ( context.nodeType !== 1 && context.nodeType !== 9 ) {
-                               return [];
-                       }
-
-                       if ( !selector || typeof selector !== "string" ) {
-                               return results;
-                       }
-
-                       var m, set, checkSet, extra, ret, cur, pop, i,
-                               prune = true,
-                               contextXML = Sizzle.isXML( context ),
-                               parts = [],
-                               soFar = selector;
-
-                       // Reset the position of the chunker regexp (start from head)
-                       do {
-                               chunker.exec( "" );
-                               m = chunker.exec( soFar );
-
-                               if ( m ) {
-                                       soFar = m[3];
-
-                                       parts.push( m[1] );
-
-                                       if ( m[2] ) {
-                                               extra = m[3];
-                                               break;
-                                       }
-                               }
-                       } while ( m );
-
-                       if ( parts.length > 1 && origPOS.exec( selector ) ) {
-
-                               if ( parts.length === 2 && Expr.relative[ parts[0] ] ) {
-                                       set = posProcess( parts[0] + parts[1], context, seed );
-
-                               } else {
-                                       set = Expr.relative[ parts[0] ] ?
-                                               [ context ] :
-                                               Sizzle( parts.shift(), context );
-
-                                       while ( parts.length ) {
-                                               selector = parts.shift();
-
-                                               if ( Expr.relative[ selector ] ) {
-                                                       selector += parts.shift();
-                                               }
-
-                                               set = posProcess( selector, set, seed );
-                                       }
-                               }
-
-                       } else {
-                               // Take a shortcut and set the context if the root selector is an ID
-                               // (but not if it'll be faster if the inner selector is an ID)
-                               if ( !seed && parts.length > 1 && context.nodeType === 9 && !contextXML &&
-                                       Expr.match.ID.test(parts[0]) && !Expr.match.ID.test(parts[parts.length - 1]) ) {
-
-                                       ret = Sizzle.find( parts.shift(), context, contextXML );
-                                       context = ret.expr ?
-                                               Sizzle.filter( ret.expr, ret.set )[0] :
-                                               ret.set[0];
-                               }
-
-                               if ( context ) {
-                                       ret = seed ?
-                                       { expr: parts.pop(), set: makeArray(seed) } :
-                                               Sizzle.find( parts.pop(), parts.length === 1 && (parts[0] === "~" || parts[0] === "+") && context.parentNode ? context.parentNode : context, contextXML );
-
-                                       set = ret.expr ?
-                                               Sizzle.filter( ret.expr, ret.set ) :
-                                               ret.set;
-
-                                       if ( parts.length > 0 ) {
-                                               checkSet = makeArray( set );
-
-                                       } else {
-                                               prune = false;
-                                       }
-
-                                       while ( parts.length ) {
-                                               cur = parts.pop();
-                                               pop = cur;
-
-                                               if ( !Expr.relative[ cur ] ) {
-                                                       cur = "";
-                                               } else {
-                                                       pop = parts.pop();
-                                               }
-
-                                               if ( pop == null ) {
-                                                       pop = context;
-                                               }
-
-                                               Expr.relative[ cur ]( checkSet, pop, contextXML );
-                                       }
-
-                               } else {
-                                       checkSet = parts = [];
-                               }
-                       }
-
-                       if ( !checkSet ) {
-                               checkSet = set;
-                       }
-
-                       if ( !checkSet ) {
-                               Sizzle.error( cur || selector );
-                       }
-
-                       if ( toString.call(checkSet) === "[object Array]" ) {
-                               if ( !prune ) {
-                                       results.push.apply( results, checkSet );
-
-                               } else if ( context && context.nodeType === 1 ) {
-                                       for ( i = 0; checkSet[i] != null; i++ ) {
-                                               if ( checkSet[i] && (checkSet[i] === true || checkSet[i].nodeType === 1 && Sizzle.contains(context, checkSet[i])) ) {
-                                                       results.push( set[i] );
-                                               }
-                                       }
-
-                               } else {
-                                       for ( i = 0; checkSet[i] != null; i++ ) {
-                                               if ( checkSet[i] && checkSet[i].nodeType === 1 ) {
-                                                       results.push( set[i] );
-                                               }
-                                       }
-                               }
-
-                       } else {
-                               makeArray( checkSet, results );
-                       }
-
-                       if ( extra ) {
-                               Sizzle( extra, origContext, results, seed );
-                               Sizzle.uniqueSort( results );
-                       }
-
-                       return results;
-               };
-
-               Sizzle.uniqueSort = function( results ) {
-                       if ( sortOrder ) {
-                               hasDuplicate = baseHasDuplicate;
-                               results.sort( sortOrder );
-
-                               if ( hasDuplicate ) {
-                                       for ( var i = 1; i < results.length; i++ ) {
-                                               if ( results[i] === results[ i - 1 ] ) {
-                                                       results.splice( i--, 1 );
-                                               }
-                                       }
-                               }
-                       }
-
-                       return results;
-               };
-
-               Sizzle.matches = function( expr, set ) {
-                       return Sizzle( expr, null, null, set );
-               };
-
-               Sizzle.matchesSelector = function( node, expr ) {
-                       return Sizzle( expr, null, null, [node] ).length > 0;
-               };
-
-               Sizzle.find = function( expr, context, isXML ) {
-                       var set, i, len, match, type, left;
-
-                       if ( !expr ) {
-                               return [];
-                       }
-
-                       for ( i = 0, len = Expr.order.length; i < len; i++ ) {
-                               type = Expr.order[i];
-
-                               if ( (match = Expr.leftMatch[ type ].exec( expr )) ) {
-                                       left = match[1];
-                                       match.splice( 1, 1 );
-
-                                       if ( left.substr( left.length - 1 ) !== "\\" ) {
-                                               match[1] = (match[1] || "").replace( rBackslash, "" );
-                                               set = Expr.find[ type ]( match, context, isXML );
-
-                                               if ( set != null ) {
-                                                       expr = expr.replace( Expr.match[ type ], "" );
-                                                       break;
-                                               }
-                                       }
-                               }
-                       }
-
-                       if ( !set ) {
-                               set = typeof context.getElementsByTagName !== "undefined" ?
-                                       context.getElementsByTagName( "*" ) :
-                                       [];
-                       }
-
-                       return { set: set, expr: expr };
-               };
-
-               Sizzle.filter = function( expr, set, inplace, not ) {
-                       var match, anyFound,
-                               type, found, item, filter, left,
-                               i, pass,
-                               old = expr,
-                               result = [],
-                               curLoop = set,
-                               isXMLFilter = set && set[0] && Sizzle.isXML( set[0] );
-
-                       while ( expr && set.length ) {
-                               for ( type in Expr.filter ) {
-                                       if ( (match = Expr.leftMatch[ type ].exec( expr )) != null && match[2] ) {
-                                               filter = Expr.filter[ type ];
-                                               left = match[1];
-
-                                               anyFound = false;
-
-                                               match.splice(1,1);
-
-                                               if ( left.substr( left.length - 1 ) === "\\" ) {
-                                                       continue;
-                                               }
-
-                                               if ( curLoop === result ) {
-                                                       result = [];
-                                               }
-
-                                               if ( Expr.preFilter[ type ] ) {
-                                                       match = Expr.preFilter[ type ]( match, curLoop, inplace, result, not, isXMLFilter );
-
-                                                       if ( !match ) {
-                                                               anyFound = found = true;
-
-                                                       } else if ( match === true ) {
-                                                               continue;
-                                                       }
-                                               }
-
-                                               if ( match ) {
-                                                       for ( i = 0; (item = curLoop[i]) != null; i++ ) {
-                                                               if ( item ) {
-                                                                       found = filter( item, match, i, curLoop );
-                                                                       pass = not ^ found;
-
-                                                                       if ( inplace && found != null ) {
-                                                                               if ( pass ) {
-                                                                                       anyFound = true;
-
-                                                                               } else {
-                                                                                       curLoop[i] = false;
-                                                                               }
-
-                                                                       } else if ( pass ) {
-                                                                               result.push( item );
-                                                                               anyFound = true;
-                                                                       }
-                                                               }
-                                                       }
-                                               }
-
-                                               if ( found !== undefined ) {
-                                                       if ( !inplace ) {
-                                                               curLoop = result;
-                                                       }
-
-                                                       expr = expr.replace( Expr.match[ type ], "" );
-
-                                                       if ( !anyFound ) {
-                                                               return [];
-                                                       }
-
-                                                       break;
-                                               }
-                                       }
-                               }
-
-                               // Improper expression
-                               if ( expr === old ) {
-                                       if ( anyFound == null ) {
-                                               Sizzle.error( expr );
-
-                                       } else {
-                                               break;
-                                       }
-                               }
-
-                               old = expr;
-                       }
-
-                       return curLoop;
-               };
-
-               Sizzle.error = function( msg ) {
-                       throw new Error( "Syntax error, unrecognized expression: " + msg );
-               };
-
-               /**
-                * Utility function for retreiving the text value of an array of DOM nodes
-                * @param {Array|Element} elem
-                */
-               var getText = Sizzle.getText = function( elem ) {
-                       var i, node,
-                               nodeType = elem.nodeType,
-                               ret = "";
-
-                       if ( nodeType ) {
-                               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {
-                                       // Use textContent || innerText for elements
-                                       if ( typeof elem.textContent === 'string' ) {
-                                               return elem.textContent;
-                                       } else if ( typeof elem.innerText === 'string' ) {
-                                               // Replace IE's carriage returns
-                                               return elem.innerText.replace( rReturn, '' );
-                                       } else {
-                                               // Traverse it's children
-                                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling) {
-                                                       ret += getText( elem );
-                                               }
-                                       }
-                               } else if ( nodeType === 3 || nodeType === 4 ) {
-                                       return elem.nodeValue;
-                               }
+               // An object can be passed to jQuery.data instead of a key/value pair; this gets
+               // shallow copied over onto the existing cache
+               if ( typeof name === "object" || typeof name === "function" ) {
+                       if ( pvt ) {
+                               cache[ id ] = jQuery.extend( cache[ id ], name );
                        } else {
+                               cache[ id ].data = jQuery.extend( cache[ id ].data, name );
+                       }
+               }
 
-                               // If no nodeType, this is expected to be an array
-                               for ( i = 0; (node = elem[i]); i++ ) {
-                                       // Do not traverse comment nodes
-                                       if ( node.nodeType !== 8 ) {
-                                               ret += getText( node );
-                                       }
-                               }
-                       }
-                       return ret;
-               };
-
-               var Expr = Sizzle.selectors = {
-                       order: [ "ID", "NAME", "TAG" ],
-
-                       match: {
-                               ID: /#((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-                               CLASS: /\.((?:[\w\u00c0-\uFFFF\-]|\\.)+)/,
-                               NAME: /\[name=['"]*((?:[\w\u00c0-\uFFFF\-]|\\.)+)['"]*\]/,
-                               ATTR: /\[\s*((?:[\w\u00c0-\uFFFF\-]|\\.)+)\s*(?:(\S?=)\s*(?:(['"])(.*?)\3|(#?(?:[\w\u00c0-\uFFFF\-]|\\.)*)|)|)\s*\]/,
-                               TAG: /^((?:[\w\u00c0-\uFFFF\*\-]|\\.)+)/,
-                               CHILD: /:(only|nth|last|first)-child(?:\(\s*(even|odd|(?:[+\-]?\d+|(?:[+\-]?\d*)?n\s*(?:[+\-]\s*\d+)?))\s*\))?/,
-                               POS: /:(nth|eq|gt|lt|first|last|even|odd)(?:\((\d*)\))?(?=[^\-]|$)/,
-                               PSEUDO: /:((?:[\w\u00c0-\uFFFF\-]|\\.)+)(?:\((['"]?)((?:\([^\)]+\)|[^\(\)]*)+)\2\))?/
-                       },
-
-                       leftMatch: {},
-
-                       attrMap: {
-                               "class": "className",
-                               "for": "htmlFor"
-                       },
-
-                       attrHandle: {
-                               href: function( elem ) {
-                                       return elem.getAttribute( "href" );
-                               },
-                               type: function( elem ) {
-                                       return elem.getAttribute( "type" );
-                               }
-                       },
-
-                       relative: {
-                               "+": function(checkSet, part){
-                                       var isPartStr = typeof part === "string",
-                                               isTag = isPartStr && !rNonWord.test( part ),
-                                               isPartStrNotTag = isPartStr && !isTag;
-
-                                       if ( isTag ) {
-                                               part = part.toLowerCase();
-                                       }
-
-                                       for ( var i = 0, l = checkSet.length, elem; i < l; i++ ) {
-                                               if ( (elem = checkSet[i]) ) {
-                                                       while ( (elem = elem.previousSibling) && elem.nodeType !== 1 ) {}
-
-                                                       checkSet[i] = isPartStrNotTag || elem && elem.nodeName.toLowerCase() === part ?
-                                                               elem || false :
-                                                               elem === part;
-                                               }
-                                       }
-
-                                       if ( isPartStrNotTag ) {
-                                               Sizzle.filter( part, checkSet, true );
-                                       }
-                               },
-
-                               ">": function( checkSet, part ) {
-                                       var elem,
-                                               isPartStr = typeof part === "string",
-                                               i = 0,
-                                               l = checkSet.length;
-
-                                       if ( isPartStr && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-
-                                               for ( ; i < l; i++ ) {
-                                                       elem = checkSet[i];
-
-                                                       if ( elem ) {
-                                                               var parent = elem.parentNode;
-                                                               checkSet[i] = parent.nodeName.toLowerCase() === part ? parent : false;
-                                                       }
-                                               }
-
-                                       } else {
-                                               for ( ; i < l; i++ ) {
-                                                       elem = checkSet[i];
-
-                                                       if ( elem ) {
-                                                               checkSet[i] = isPartStr ?
-                                                                       elem.parentNode :
-                                                                       elem.parentNode === part;
-                                                       }
-                                               }
-
-                                               if ( isPartStr ) {
-                                                       Sizzle.filter( part, checkSet, true );
-                                               }
-                                       }
-                               },
-
-                               "": function(checkSet, part, isXML){
-                                       var nodeCheck,
-                                               doneName = done++,
-                                               checkFn = dirCheck;
-
-                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-                                               nodeCheck = part;
-                                               checkFn = dirNodeCheck;
-                                       }
-
-                                       checkFn( "parentNode", part, doneName, checkSet, nodeCheck, isXML );
-                               },
-
-                               "~": function( checkSet, part, isXML ) {
-                                       var nodeCheck,
-                                               doneName = done++,
-                                               checkFn = dirCheck;
-
-                                       if ( typeof part === "string" && !rNonWord.test( part ) ) {
-                                               part = part.toLowerCase();
-                                               nodeCheck = part;
-                                               checkFn = dirNodeCheck;
-                                       }
-
-                                       checkFn( "previousSibling", part, doneName, checkSet, nodeCheck, isXML );
-                               }
-                       },
-
-                       find: {
-                               ID: function( match, context, isXML ) {
-                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                                               var m = context.getElementById(match[1]);
-                                               // Check parentNode to catch when Blackberry 4.6 returns
-                                               // nodes that are no longer in the document #6963
-                                               return m && m.parentNode ? [m] : [];
-                                       }
-                               },
-
-                               NAME: function( match, context ) {
-                                       if ( typeof context.getElementsByName !== "undefined" ) {
-                                               var ret = [],
-                                                       results = context.getElementsByName( match[1] );
-
-                                               for ( var i = 0, l = results.length; i < l; i++ ) {
-                                                       if ( results[i].getAttribute("name") === match[1] ) {
-                                                               ret.push( results[i] );
-                                                       }
-                                               }
-
-                                               return ret.length === 0 ? null : ret;
-                                       }
-                               },
-
-                               TAG: function( match, context ) {
-                                       if ( typeof context.getElementsByTagName !== "undefined" ) {
-                                               return context.getElementsByTagName( match[1] );
-                                       }
-                               }
-                       },
-                       preFilter: {
-                               CLASS: function( match, curLoop, inplace, result, not, isXML ) {
-                                       match = " " + match[1].replace( rBackslash, "" ) + " ";
-
-                                       if ( isXML ) {
-                                               return match;
-                                       }
-
-                                       for ( var i = 0, elem; (elem = curLoop[i]) != null; i++ ) {
-                                               if ( elem ) {
-                                                       if ( not ^ (elem.className && (" " + elem.className + " ").replace(/[\t\n\r]/g, " ").indexOf(match) >= 0) ) {
-                                                               if ( !inplace ) {
-                                                                       result.push( elem );
-                                                               }
-
-                                                       } else if ( inplace ) {
-                                                               curLoop[i] = false;
-                                                       }
-                                               }
-                                       }
-
-                                       return false;
-                               },
-
-                               ID: function( match ) {
-                                       return match[1].replace( rBackslash, "" );
-                               },
-
-                               TAG: function( match, curLoop ) {
-                                       return match[1].replace( rBackslash, "" ).toLowerCase();
-                               },
-
-                               CHILD: function( match ) {
-                                       if ( match[1] === "nth" ) {
-                                               if ( !match[2] ) {
-                                                       Sizzle.error( match[0] );
-                                               }
-
-                                               match[2] = match[2].replace(/^\+|\s*/g, '');
-
-                                               // parse equations like 'even', 'odd', '5', '2n', '3n+2', '4n-1', '-n+6'
-                                               var test = /(-?)(\d*)(?:n([+\-]?\d*))?/.exec(
-                                                       match[2] === "even" && "2n" || match[2] === "odd" && "2n+1" ||
-                                                               !/\D/.test( match[2] ) && "0n+" + match[2] || match[2]);
-
-                                               // calculate the numbers (first)n+(last) including if they are negative
-                                               match[2] = (test[1] + (test[2] || 1)) - 0;
-                                               match[3] = test[3] - 0;
-                                       }
-                                       else if ( match[2] ) {
-                                               Sizzle.error( match[0] );
-                                       }
+               thisCache = cache[ id ];
 
-                                       // TODO: Move to normal caching system
-                                       match[0] = done++;
+               // jQuery data() is stored in a separate object inside the object's internal data
+               // cache in order to avoid key collisions between internal data and user-defined
+               // data.
+               if ( !pvt ) {
+                       if ( !thisCache.data ) {
+                               thisCache.data = {};
+                       }
 
-                                       return match;
-                               },
+                       thisCache = thisCache.data;
+               }
 
-                               ATTR: function( match, curLoop, inplace, result, not, isXML ) {
-                                       var name = match[1] = match[1].replace( rBackslash, "" );
+               if ( data !== undefined ) {
+                       thisCache[ jQuery.camelCase( name ) ] = data;
+               }
 
-                                       if ( !isXML && Expr.attrMap[name] ) {
-                                               match[1] = Expr.attrMap[name];
-                                       }
+               // Check for both converted-to-camel and non-converted data property names
+               // If a data property was specified
+               if ( getByName ) {
 
-                                       // Handle if an un-quoted value was used
-                                       match[4] = ( match[4] || match[5] || "" ).replace( rBackslash, "" );
+                       // First Try to find as-is property data
+                       ret = thisCache[ name ];
 
-                                       if ( match[2] === "~=" ) {
-                                               match[4] = " " + match[4] + " ";
-                                       }
+                       // Test for null|undefined property data
+                       if ( ret == null ) {
 
-                                       return match;
-                               },
+                               // Try to find the camelCased property
+                               ret = thisCache[ jQuery.camelCase( name ) ];
+                       }
+               } else {
+                       ret = thisCache;
+               }
 
-                               PSEUDO: function( match, curLoop, inplace, result, not ) {
-                                       if ( match[1] === "not" ) {
-                                               // If we're dealing with a complex expression, or a simple one
-                                               if ( ( chunker.exec(match[3]) || "" ).length > 1 || /^\w/.test(match[3]) ) {
-                                                       match[3] = Sizzle(match[3], null, null, curLoop);
+               return ret;
+       },
 
-                                               } else {
-                                                       var ret = Sizzle.filter(match[3], curLoop, inplace, true ^ not);
+       removeData: function( elem, name, pvt /* Internal Use Only */ ) {
+               if ( !jQuery.acceptData( elem ) ) {
+                       return;
+               }
 
-                                                       if ( !inplace ) {
-                                                               result.push.apply( result, ret );
-                                                       }
+               var thisCache, i, l,
 
-                                                       return false;
-                                               }
+                       isNode = elem.nodeType,
 
-                                       } else if ( Expr.match.POS.test( match[0] ) || Expr.match.CHILD.test( match[0] ) ) {
-                                               return true;
-                                       }
+                       // See jQuery.data for more information
+                       cache = isNode ? jQuery.cache : elem,
+                       id = isNode ? elem[ jQuery.expando ] : jQuery.expando;
 
-                                       return match;
-                               },
+               // If there is already no cache entry for this object, there is no
+               // purpose in continuing
+               if ( !cache[ id ] ) {
+                       return;
+               }
 
-                               POS: function( match ) {
-                                       match.unshift( true );
+               if ( name ) {
 
-                                       return match;
-                               }
-                       },
+                       thisCache = pvt ? cache[ id ] : cache[ id ].data;
 
-                       filters: {
-                               enabled: function( elem ) {
-                                       return elem.disabled === false && elem.type !== "hidden";
-                               },
+                       if ( thisCache ) {
 
-                               disabled: function( elem ) {
-                                       return elem.disabled === true;
-                               },
+                               // Support array or space separated string names for data keys
+                               if ( !jQuery.isArray( name ) ) {
 
-                               checked: function( elem ) {
-                                       return elem.checked === true;
-                               },
+                                       // try the string as a key before any manipulation
+                                       if ( name in thisCache ) {
+                                               name = [ name ];
+                                       } else {
 
-                               selected: function( elem ) {
-                                       // Accessing this property makes selected-by-default
-                                       // options in Safari work properly
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.selectedIndex;
+                                               // split the camel cased version by spaces unless a key with the spaces exists
+                                               name = jQuery.camelCase( name );
+                                               if ( name in thisCache ) {
+                                                       name = [ name ];
+                                               } else {
+                                                       name = name.split(" ");
+                                               }
                                        }
+                               }
 
-                                       return elem.selected === true;
-                               },
-
-                               parent: function( elem ) {
-                                       return !!elem.firstChild;
-                               },
+                               for ( i = 0, l = name.length; i < l; i++ ) {
+                                       delete thisCache[ name[i] ];
+                               }
 
-                               empty: function( elem ) {
-                                       return !elem.firstChild;
-                               },
+                               // If there is no data left in the cache, we want to continue
+                               // and let the cache object itself get destroyed
+                               if ( !( pvt ? isEmptyDataObject : jQuery.isEmptyObject )( thisCache ) ) {
+                                       return;
+                               }
+                       }
+               }
 
-                               has: function( elem, i, match ) {
-                                       return !!Sizzle( match[3], elem ).length;
-                               },
+               // See jQuery.data for more information
+               if ( !pvt ) {
+                       delete cache[ id ].data;
 
-                               header: function( elem ) {
-                                       return (/h\d/i).test( elem.nodeName );
-                               },
+                       // Don't destroy the parent cache unless the internal data object
+                       // had been the only thing left in it
+                       if ( !isEmptyDataObject( cache[ id ] ) ) {
+                               return;
+                       }
+               }
 
-                               text: function( elem ) {
-                                       var attr = elem.getAttribute( "type" ), type = elem.type;
-                                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)
-                                       // use getAttribute instead to test this case
-                                       return elem.nodeName.toLowerCase() === "input" && "text" === type && ( attr === type || attr === null );
-                               },
+               // Destroy the cache
+               if ( isNode ) {
+                       jQuery.cleanData( [ elem ], true );
 
-                               radio: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "radio" === elem.type;
-                               },
+               // Use delete when supported for expandos or `cache` is not a window per isWindow (#10080)
+               } else if ( jQuery.support.deleteExpando || cache != cache.window ) {
+                       delete cache[ id ];
 
-                               checkbox: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "checkbox" === elem.type;
-                               },
+               // When all else fails, null
+               } else {
+                       cache[ id ] = null;
+               }
+       },
 
-                               file: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "file" === elem.type;
-                               },
+       // For internal use only.
+       _data: function( elem, name, data ) {
+               return jQuery.data( elem, name, data, true );
+       },
 
-                               password: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "password" === elem.type;
-                               },
+       // A method for determining if a DOM node can handle the data expando
+       acceptData: function( elem ) {
+               var noData = elem.nodeName && jQuery.noData[ elem.nodeName.toLowerCase() ];
 
-                               submit: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return (name === "input" || name === "button") && "submit" === elem.type;
-                               },
+               // nodes accept data unless otherwise specified; rejection can be conditional
+               return !noData || noData !== true && elem.getAttribute("classid") === noData;
+       }
+});
 
-                               image: function( elem ) {
-                                       return elem.nodeName.toLowerCase() === "input" && "image" === elem.type;
-                               },
+jQuery.fn.extend({
+       data: function( key, value ) {
+               var parts, part, attr, name, l,
+                       elem = this[0],
+                       i = 0,
+                       data = null;
 
-                               reset: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return (name === "input" || name === "button") && "reset" === elem.type;
-                               },
+               // Gets all values
+               if ( key === undefined ) {
+                       if ( this.length ) {
+                               data = jQuery.data( elem );
 
-                               button: function( elem ) {
-                                       var name = elem.nodeName.toLowerCase();
-                                       return name === "input" && "button" === elem.type || name === "button";
-                               },
+                               if ( elem.nodeType === 1 && !jQuery._data( elem, "parsedAttrs" ) ) {
+                                       attr = elem.attributes;
+                                       for ( l = attr.length; i < l; i++ ) {
+                                               name = attr[i].name;
 
-                               input: function( elem ) {
-                                       return (/input|select|textarea|button/i).test( elem.nodeName );
-                               },
+                                               if ( name.indexOf( "data-" ) === 0 ) {
+                                                       name = jQuery.camelCase( name.substring(5) );
 
-                               focus: function( elem ) {
-                                       return elem === elem.ownerDocument.activeElement;
+                                                       dataAttr( elem, name, data[ name ] );
+                                               }
+                                       }
+                                       jQuery._data( elem, "parsedAttrs", true );
                                }
-                       },
-                       setFilters: {
-                               first: function( elem, i ) {
-                                       return i === 0;
-                               },
-
-                               last: function( elem, i, match, array ) {
-                                       return i === array.length - 1;
-                               },
+                       }
 
-                               even: function( elem, i ) {
-                                       return i % 2 === 0;
-                               },
+                       return data;
+               }
 
-                               odd: function( elem, i ) {
-                                       return i % 2 === 1;
-                               },
+               // Sets multiple values
+               if ( typeof key === "object" ) {
+                       return this.each(function() {
+                               jQuery.data( this, key );
+                       });
+               }
 
-                               lt: function( elem, i, match ) {
-                                       return i < match[3] - 0;
-                               },
+               parts = key.split( ".", 2 );
+               parts[1] = parts[1] ? "." + parts[1] : "";
+               part = parts[1] + "!";
 
-                               gt: function( elem, i, match ) {
-                                       return i > match[3] - 0;
-                               },
+               return jQuery.access( this, function( value ) {
 
-                               nth: function( elem, i, match ) {
-                                       return match[3] - 0 === i;
-                               },
+                       if ( value === undefined ) {
+                               data = this.triggerHandler( "getData" + part, [ parts[0] ] );
 
-                               eq: function( elem, i, match ) {
-                                       return match[3] - 0 === i;
+                               // Try to fetch any internally stored data first
+                               if ( data === undefined && elem ) {
+                                       data = jQuery.data( elem, key );
+                                       data = dataAttr( elem, key, data );
                                }
-                       },
-                       filter: {
-                               PSEUDO: function( elem, match, i, array ) {
-                                       var name = match[1],
-                                               filter = Expr.filters[ name ];
 
-                                       if ( filter ) {
-                                               return filter( elem, i, match, array );
+                               return data === undefined && parts[1] ?
+                                       this.data( parts[0] ) :
+                                       data;
+                       }
 
-                                       } else if ( name === "contains" ) {
-                                               return (elem.textContent || elem.innerText || getText([ elem ]) || "").indexOf(match[3]) >= 0;
+                       parts[1] = value;
+                       this.each(function() {
+                               var self = jQuery( this );
 
-                                       } else if ( name === "not" ) {
-                                               var not = match[3];
+                               self.triggerHandler( "setData" + part, parts );
+                               jQuery.data( this, key, value );
+                               self.triggerHandler( "changeData" + part, parts );
+                       });
+               }, null, value, arguments.length > 1, null, false );
+       },
 
-                                               for ( var j = 0, l = not.length; j < l; j++ ) {
-                                                       if ( not[j] === elem ) {
-                                                               return false;
-                                                       }
-                                               }
+       removeData: function( key ) {
+               return this.each(function() {
+                       jQuery.removeData( this, key );
+               });
+       }
+});
 
-                                               return true;
+function dataAttr( elem, key, data ) {
+       // If nothing was found internally, try to fetch any
+       // data from the HTML5 data-* attribute
+       if ( data === undefined && elem.nodeType === 1 ) {
 
-                                       } else {
-                                               Sizzle.error( name );
-                                       }
-                               },
+               var name = "data-" + key.replace( rmultiDash, "-$1" ).toLowerCase();
 
-                               CHILD: function( elem, match ) {
-                                       var first, last,
-                                               doneName, parent, cache,
-                                               count, diff,
-                                               type = match[1],
-                                               node = elem;
-
-                                       switch ( type ) {
-                                               case "only":
-                                               case "first":
-                                                       while ( (node = node.previousSibling) ) {
-                                                               if ( node.nodeType === 1 ) {
-                                                                       return false;
-                                                               }
-                                                       }
+               data = elem.getAttribute( name );
 
-                                                       if ( type === "first" ) {
-                                                               return true;
-                                                       }
+               if ( typeof data === "string" ) {
+                       try {
+                               data = data === "true" ? true :
+                               data === "false" ? false :
+                               data === "null" ? null :
+                               // Only convert to a number if it doesn't change the string
+                               +data + "" === data ? +data :
+                               rbrace.test( data ) ? jQuery.parseJSON( data ) :
+                                       data;
+                       } catch( e ) {}
+
+                       // Make sure we set the data so it isn't changed later
+                       jQuery.data( elem, key, data );
 
-                                                       node = elem;
+               } else {
+                       data = undefined;
+               }
+       }
 
-                                               /* falls through */
-                                               case "last":
-                                                       while ( (node = node.nextSibling) ) {
-                                                               if ( node.nodeType === 1 ) {
-                                                                       return false;
-                                                               }
-                                                       }
+       return data;
+}
 
-                                                       return true;
+// checks a cache object for emptiness
+function isEmptyDataObject( obj ) {
+       var name;
+       for ( name in obj ) {
 
-                                               case "nth":
-                                                       first = match[2];
-                                                       last = match[3];
+               // if the public data object is empty, the private is still empty
+               if ( name === "data" && jQuery.isEmptyObject( obj[name] ) ) {
+                       continue;
+               }
+               if ( name !== "toJSON" ) {
+                       return false;
+               }
+       }
 
-                                                       if ( first === 1 && last === 0 ) {
-                                                               return true;
-                                                       }
+       return true;
+}
+jQuery.extend({
+       queue: function( elem, type, data ) {
+               var queue;
 
-                                                       doneName = match[0];
-                                                       parent = elem.parentNode;
+               if ( elem ) {
+                       type = ( type || "fx" ) + "queue";
+                       queue = jQuery._data( elem, type );
 
-                                                       if ( parent && (parent[ expando ] !== doneName || !elem.nodeIndex) ) {
-                                                               count = 0;
+                       // Speed up dequeue by getting out quickly if this is just a lookup
+                       if ( data ) {
+                               if ( !queue || jQuery.isArray(data) ) {
+                                       queue = jQuery._data( elem, type, jQuery.makeArray(data) );
+                               } else {
+                                       queue.push( data );
+                               }
+                       }
+                       return queue || [];
+               }
+       },
 
-                                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {
-                                                                       if ( node.nodeType === 1 ) {
-                                                                               node.nodeIndex = ++count;
-                                                                       }
-                                                               }
+       dequeue: function( elem, type ) {
+               type = type || "fx";
 
-                                                               parent[ expando ] = doneName;
-                                                       }
+               var queue = jQuery.queue( elem, type ),
+                       startLength = queue.length,
+                       fn = queue.shift(),
+                       hooks = jQuery._queueHooks( elem, type ),
+                       next = function() {
+                               jQuery.dequeue( elem, type );
+                       };
 
-                                                       diff = elem.nodeIndex - last;
+               // If the fx queue is dequeued, always remove the progress sentinel
+               if ( fn === "inprogress" ) {
+                       fn = queue.shift();
+                       startLength--;
+               }
 
-                                                       if ( first === 0 ) {
-                                                               return diff === 0;
+               if ( fn ) {
 
-                                                       } else {
-                                                               return ( diff % first === 0 && diff / first >= 0 );
-                                                       }
-                                       }
-                               },
+                       // Add a progress sentinel to prevent the fx queue from being
+                       // automatically dequeued
+                       if ( type === "fx" ) {
+                               queue.unshift( "inprogress" );
+                       }
 
-                               ID: function( elem, match ) {
-                                       return elem.nodeType === 1 && elem.getAttribute("id") === match;
-                               },
+                       // clear up the last queue stop function
+                       delete hooks.stop;
+                       fn.call( elem, next, hooks );
+               }
 
-                               TAG: function( elem, match ) {
-                                       return (match === "*" && elem.nodeType === 1) || !!elem.nodeName && elem.nodeName.toLowerCase() === match;
-                               },
+               if ( !startLength && hooks ) {
+                       hooks.empty.fire();
+               }
+       },
+
+       // not intended for public consumption - generates a queueHooks object, or returns the current one
+       _queueHooks: function( elem, type ) {
+               var key = type + "queueHooks";
+               return jQuery._data( elem, key ) || jQuery._data( elem, key, {
+                       empty: jQuery.Callbacks("once memory").add(function() {
+                               jQuery.removeData( elem, type + "queue", true );
+                               jQuery.removeData( elem, key, true );
+                       })
+               });
+       }
+});
 
-                               CLASS: function( elem, match ) {
-                                       return (" " + (elem.className || elem.getAttribute("class")) + " ")
-                                               .indexOf( match ) > -1;
-                               },
+jQuery.fn.extend({
+       queue: function( type, data ) {
+               var setter = 2;
 
-                               ATTR: function( elem, match ) {
-                                       var name = match[1],
-                                               result = Sizzle.attr ?
-                                                       Sizzle.attr( elem, name ) :
-                                                       Expr.attrHandle[ name ] ?
-                                                               Expr.attrHandle[ name ]( elem ) :
-                                                               elem[ name ] != null ?
-                                                                       elem[ name ] :
-                                                                       elem.getAttribute( name ),
-                                               value = result + "",
-                                               type = match[2],
-                                               check = match[4];
-
-                                       return result == null ?
-                                               type === "!=" :
-                                               !type && Sizzle.attr ?
-                                                       result != null :
-                                                       type === "=" ?
-                                                               value === check :
-                                                               type === "*=" ?
-                                                                       value.indexOf(check) >= 0 :
-                                                                       type === "~=" ?
-                                                                               (" " + value + " ").indexOf(check) >= 0 :
-                                                                               !check ?
-                                                                                       value && result !== false :
-                                                                                       type === "!=" ?
-                                                                                               value !== check :
-                                                                                               type === "^=" ?
-                                                                                                       value.indexOf(check) === 0 :
-                                                                                                       type === "$=" ?
-                                                                                                               value.substr(value.length - check.length) === check :
-                                                                                                               type === "|=" ?
-                                                                                                                       value === check || value.substr(0, check.length + 1) === check + "-" :
-                                                                                                                       false;
-                               },
+               if ( typeof type !== "string" ) {
+                       data = type;
+                       type = "fx";
+                       setter--;
+               }
 
-                               POS: function( elem, match, i, array ) {
-                                       var name = match[2],
-                                               filter = Expr.setFilters[ name ];
+               if ( arguments.length < setter ) {
+                       return jQuery.queue( this[0], type );
+               }
 
-                                       if ( filter ) {
-                                               return filter( elem, i, match, array );
-                                       }
-                               }
-                       }
-               };
+               return data === undefined ?
+                       this :
+                       this.each(function() {
+                               var queue = jQuery.queue( this, type, data );
 
-               var origPOS = Expr.match.POS,
-                       fescape = function(all, num){
-                               return "\\" + (num - 0 + 1);
+                               // ensure a hooks for this queue
+                               jQuery._queueHooks( this, type );
+
+                               if ( type === "fx" && queue[0] !== "inprogress" ) {
+                                       jQuery.dequeue( this, type );
+                               }
+                       });
+       },
+       dequeue: function( type ) {
+               return this.each(function() {
+                       jQuery.dequeue( this, type );
+               });
+       },
+       // Based off of the plugin by Clint Helfers, with permission.
+       // http://blindsignals.com/index.php/2009/07/jquery-delay/
+       delay: function( time, type ) {
+               time = jQuery.fx ? jQuery.fx.speeds[ time ] || time : time;
+               type = type || "fx";
+
+               return this.queue( type, function( next, hooks ) {
+                       var timeout = setTimeout( next, time );
+                       hooks.stop = function() {
+                               clearTimeout( timeout );
+                       };
+               });
+       },
+       clearQueue: function( type ) {
+               return this.queue( type || "fx", [] );
+       },
+       // Get a promise resolved when queues of a certain type
+       // are emptied (fx is the type by default)
+       promise: function( type, obj ) {
+               var tmp,
+                       count = 1,
+                       defer = jQuery.Deferred(),
+                       elements = this,
+                       i = this.length,
+                       resolve = function() {
+                               if ( !( --count ) ) {
+                                       defer.resolveWith( elements, [ elements ] );
+                               }
                        };
 
-               for ( var type in Expr.match ) {
-                       Expr.match[ type ] = new RegExp( Expr.match[ type ].source + (/(?![^\[]*\])(?![^\(]*\))/.source) );
-                       Expr.leftMatch[ type ] = new RegExp( /(^(?:.|\r|\n)*?)/.source + Expr.match[ type ].source.replace(/\\(\d+)/g, fescape) );
+               if ( typeof type !== "string" ) {
+                       obj = type;
+                       type = undefined;
                }
-// Expose origPOS
-// "global" as in regardless of relation to brackets/parens
-               Expr.match.globalPOS = origPOS;
+               type = type || "fx";
 
-               var makeArray = function( array, results ) {
-                       array = Array.prototype.slice.call( array, 0 );
-
-                       if ( results ) {
-                               results.push.apply( results, array );
-                               return results;
+               while( i-- ) {
+                       tmp = jQuery._data( elements[ i ], type + "queueHooks" );
+                       if ( tmp && tmp.empty ) {
+                               count++;
+                               tmp.empty.add( resolve );
                        }
+               }
+               resolve();
+               return defer.promise( obj );
+       }
+});
+var nodeHook, boolHook, fixSpecified,
+       rclass = /[\t\r\n]/g,
+       rreturn = /\r/g,
+       rtype = /^(?:button|input)$/i,
+       rfocusable = /^(?:button|input|object|select|textarea)$/i,
+       rclickable = /^a(?:rea|)$/i,
+       rboolean = /^(?:autofocus|autoplay|async|checked|controls|defer|disabled|hidden|loop|multiple|open|readonly|required|scoped|selected)$/i,
+       getSetAttribute = jQuery.support.getSetAttribute;
+
+jQuery.fn.extend({
+       attr: function( name, value ) {
+               return jQuery.access( this, jQuery.attr, name, value, arguments.length > 1 );
+       },
+
+       removeAttr: function( name ) {
+               return this.each(function() {
+                       jQuery.removeAttr( this, name );
+               });
+       },
 
-                       return array;
-               };
+       prop: function( name, value ) {
+               return jQuery.access( this, jQuery.prop, name, value, arguments.length > 1 );
+       },
 
-// Perform a simple check to determine if the browser is capable of
-// converting a NodeList to an array using builtin methods.
-// Also verifies that the returned array holds DOM nodes
-// (which is not the case in the Blackberry browser)
-               try {
-                       Array.prototype.slice.call( document.documentElement.childNodes, 0 )[0].nodeType;
+       removeProp: function( name ) {
+               name = jQuery.propFix[ name ] || name;
+               return this.each(function() {
+                       // try/catch handles cases where IE balks (such as removing a property on window)
+                       try {
+                               this[ name ] = undefined;
+                               delete this[ name ];
+                       } catch( e ) {}
+               });
+       },
 
-// Provide a fallback method if it does not work
-               } catch( e ) {
-                       makeArray = function( array, results ) {
-                               var i = 0,
-                                       ret = results || [];
+       addClass: function( value ) {
+               var classNames, i, l, elem,
+                       setClass, c, cl;
+
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).addClass( value.call(this, j, this.className) );
+                       });
+               }
 
-                               if ( toString.call(array) === "[object Array]" ) {
-                                       Array.prototype.push.apply( ret, array );
+               if ( value && typeof value === "string" ) {
+                       classNames = value.split( core_rspace );
 
-                               } else {
-                                       if ( typeof array.length === "number" ) {
-                                               for ( var l = array.length; i < l; i++ ) {
-                                                       ret.push( array[i] );
-                                               }
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+
+                               if ( elem.nodeType === 1 ) {
+                                       if ( !elem.className && classNames.length === 1 ) {
+                                               elem.className = value;
 
                                        } else {
-                                               for ( ; array[i]; i++ ) {
-                                                       ret.push( array[i] );
+                                               setClass = " " + elem.className + " ";
+
+                                               for ( c = 0, cl = classNames.length; c < cl; c++ ) {
+                                                       if ( !~setClass.indexOf( " " + classNames[ c ] + " " ) ) {
+                                                               setClass += classNames[ c ] + " ";
+                                                       }
                                                }
+                                               elem.className = jQuery.trim( setClass );
                                        }
                                }
-
-                               return ret;
-                       };
+                       }
                }
 
-               var sortOrder, siblingCheck;
+               return this;
+       },
 
-               if ( document.documentElement.compareDocumentPosition ) {
-                       sortOrder = function( a, b ) {
-                               if ( a === b ) {
-                                       hasDuplicate = true;
-                                       return 0;
-                               }
+       removeClass: function( value ) {
+               var removes, className, elem, c, cl, i, l;
 
-                               if ( !a.compareDocumentPosition || !b.compareDocumentPosition ) {
-                                       return a.compareDocumentPosition ? -1 : 1;
-                               }
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( j ) {
+                               jQuery( this ).removeClass( value.call(this, j, this.className) );
+                       });
+               }
+               if ( (value && typeof value === "string") || value === undefined ) {
+                       removes = ( value || "" ).split( core_rspace );
 
-                               return a.compareDocumentPosition(b) & 4 ? -1 : 1;
-                       };
+                       for ( i = 0, l = this.length; i < l; i++ ) {
+                               elem = this[ i ];
+                               if ( elem.nodeType === 1 && elem.className ) {
 
-               } else {
-                       sortOrder = function( a, b ) {
-                               // The nodes are identical, we can exit early
-                               if ( a === b ) {
-                                       hasDuplicate = true;
-                                       return 0;
-
-                                       // Fallback to using sourceIndex (in IE) if it's available on both nodes
-                               } else if ( a.sourceIndex && b.sourceIndex ) {
-                                       return a.sourceIndex - b.sourceIndex;
+                                       className = (" " + elem.className + " ").replace( rclass, " " );
+
+                                       // loop over each item in the removal list
+                                       for ( c = 0, cl = removes.length; c < cl; c++ ) {
+                                               // Remove until there is nothing to remove,
+                                               while ( className.indexOf(" " + removes[ c ] + " ") > -1 ) {
+                                                       className = className.replace( " " + removes[ c ] + " " , " " );
+                                               }
+                                       }
+                                       elem.className = value ? jQuery.trim( className ) : "";
                                }
+                       }
+               }
+
+               return this;
+       },
 
-                               var al, bl,
-                                       ap = [],
-                                       bp = [],
-                                       aup = a.parentNode,
-                                       bup = b.parentNode,
-                                       cur = aup;
+       toggleClass: function( value, stateVal ) {
+               var type = typeof value,
+                       isBool = typeof stateVal === "boolean";
 
-                               // If the nodes are siblings (or identical) we can do a quick check
-                               if ( aup === bup ) {
-                                       return siblingCheck( a, b );
+               if ( jQuery.isFunction( value ) ) {
+                       return this.each(function( i ) {
+                               jQuery( this ).toggleClass( value.call(this, i, this.className, stateVal), stateVal );
+                       });
+               }
 
-                                       // If no parents were found then the nodes are disconnected
-                               } else if ( !aup ) {
-                                       return -1;
+               return this.each(function() {
+                       if ( type === "string" ) {
+                               // toggle individual class names
+                               var className,
+                                       i = 0,
+                                       self = jQuery( this ),
+                                       state = stateVal,
+                                       classNames = value.split( core_rspace );
 
-                               } else if ( !bup ) {
-                                       return 1;
+                               while ( (className = classNames[ i++ ]) ) {
+                                       // check each className given, space separated list
+                                       state = isBool ? state : !self.hasClass( className );
+                                       self[ state ? "addClass" : "removeClass" ]( className );
                                }
 
-                               // Otherwise they're somewhere else in the tree so we need
-                               // to build up a full list of the parentNodes for comparison
-                               while ( cur ) {
-                                       ap.unshift( cur );
-                                       cur = cur.parentNode;
+                       } else if ( type === "undefined" || type === "boolean" ) {
+                               if ( this.className ) {
+                                       // store className if set
+                                       jQuery._data( this, "__className__", this.className );
                                }
 
-                               cur = bup;
+                               // toggle whole className
+                               this.className = this.className || value === false ? "" : jQuery._data( this, "__className__" ) || "";
+                       }
+               });
+       },
 
-                               while ( cur ) {
-                                       bp.unshift( cur );
-                                       cur = cur.parentNode;
-                               }
+       hasClass: function( selector ) {
+               var className = " " + selector + " ",
+                       i = 0,
+                       l = this.length;
+               for ( ; i < l; i++ ) {
+                       if ( this[i].nodeType === 1 && (" " + this[i].className + " ").replace(rclass, " ").indexOf( className ) > -1 ) {
+                               return true;
+                       }
+               }
 
-                               al = ap.length;
-                               bl = bp.length;
+               return false;
+       },
 
-                               // Start walking down the tree looking for a discrepancy
-                               for ( var i = 0; i < al && i < bl; i++ ) {
-                                       if ( ap[i] !== bp[i] ) {
-                                               return siblingCheck( ap[i], bp[i] );
-                                       }
-                               }
+       val: function( value ) {
+               var hooks, ret, isFunction,
+                       elem = this[0];
 
-                               // We ended someplace up the tree so do a sibling check
-                               return i === al ?
-                                       siblingCheck( a, bp[i], -1 ) :
-                                       siblingCheck( ap[i], b, 1 );
-                       };
+               if ( !arguments.length ) {
+                       if ( elem ) {
+                               hooks = jQuery.valHooks[ elem.type ] || jQuery.valHooks[ elem.nodeName.toLowerCase() ];
 
-                       siblingCheck = function( a, b, ret ) {
-                               if ( a === b ) {
+                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, "value" )) !== undefined ) {
                                        return ret;
                                }
 
-                               var cur = a.nextSibling;
-
-                               while ( cur ) {
-                                       if ( cur === b ) {
-                                               return -1;
-                                       }
+                               ret = elem.value;
 
-                                       cur = cur.nextSibling;
-                               }
+                               return typeof ret === "string" ?
+                                       // handle most common string cases
+                                       ret.replace(rreturn, "") :
+                                       // handle cases where value is null/undef or number
+                                       ret == null ? "" : ret;
+                       }
 
-                               return 1;
-                       };
+                       return;
                }
 
-// Check to see if the browser returns elements by name when
-// querying by getElementById (and provide a workaround)
-               (function(){
-                       // We're going to inject a fake input element with a specified name
-                       var form = document.createElement("div"),
-                               id = "script" + (new Date()).getTime(),
-                               root = document.documentElement;
+               isFunction = jQuery.isFunction( value );
 
-                       form.innerHTML = "<a name='" + id + "'/>";
+               return this.each(function( i ) {
+                       var val,
+                               self = jQuery(this);
 
-                       // Inject it into the root element, check its status, and remove it quickly
-                       root.insertBefore( form, root.firstChild );
-
-                       // The workaround has to do additional checks after a getElementById
-                       // Which slows things down for other browsers (hence the branching)
-                       if ( document.getElementById( id ) ) {
-                               Expr.find.ID = function( match, context, isXML ) {
-                                       if ( typeof context.getElementById !== "undefined" && !isXML ) {
-                                               var m = context.getElementById(match[1]);
-
-                                               return m ?
-                                                       m.id === match[1] || typeof m.getAttributeNode !== "undefined" && m.getAttributeNode("id").nodeValue === match[1] ?
-                                                               [m] :
-                                                               undefined :
-                                                       [];
-                                       }
-                               };
+                       if ( this.nodeType !== 1 ) {
+                               return;
+                       }
 
-                               Expr.filter.ID = function( elem, match ) {
-                                       var node = typeof elem.getAttributeNode !== "undefined" && elem.getAttributeNode("id");
+                       if ( isFunction ) {
+                               val = value.call( this, i, self.val() );
+                       } else {
+                               val = value;
+                       }
 
-                                       return elem.nodeType === 1 && node && node.nodeValue === match;
-                               };
+                       // Treat null/undefined as ""; convert numbers to string
+                       if ( val == null ) {
+                               val = "";
+                       } else if ( typeof val === "number" ) {
+                               val += "";
+                       } else if ( jQuery.isArray( val ) ) {
+                               val = jQuery.map(val, function ( value ) {
+                                       return value == null ? "" : value + "";
+                               });
                        }
 
-                       root.removeChild( form );
+                       hooks = jQuery.valHooks[ this.type ] || jQuery.valHooks[ this.nodeName.toLowerCase() ];
 
-                       // release memory in IE
-                       root = form = null;
-               })();
+                       // If set returns undefined, fall back to normal setting
+                       if ( !hooks || !("set" in hooks) || hooks.set( this, val, "value" ) === undefined ) {
+                               this.value = val;
+                       }
+               });
+       }
+});
 
-               (function(){
-                       // Check to see if the browser returns only elements
-                       // when doing getElementsByTagName("*")
+jQuery.extend({
+       valHooks: {
+               option: {
+                       get: function( elem ) {
+                               // attributes.value is undefined in Blackberry 4.7 but
+                               // uses .value. See #6932
+                               var val = elem.attributes.value;
+                               return !val || val.specified ? elem.value : elem.text;
+                       }
+               },
+               select: {
+                       get: function( elem ) {
+                               var value, i, max, option,
+                                       index = elem.selectedIndex,
+                                       values = [],
+                                       options = elem.options,
+                                       one = elem.type === "select-one";
+
+                               // Nothing was selected
+                               if ( index < 0 ) {
+                                       return null;
+                               }
 
-                       // Create a fake element
-                       var div = document.createElement("div");
-                       div.appendChild( document.createComment("") );
+                               // Loop through all the selected options
+                               i = one ? index : 0;
+                               max = one ? index + 1 : options.length;
+                               for ( ; i < max; i++ ) {
+                                       option = options[ i ];
 
-                       // Make sure no comments are found
-                       if ( div.getElementsByTagName("*").length > 0 ) {
-                               Expr.find.TAG = function( match, context ) {
-                                       var results = context.getElementsByTagName( match[1] );
+                                       // Don't return options that are disabled or in a disabled optgroup
+                                       if ( option.selected && (jQuery.support.optDisabled ? !option.disabled : option.getAttribute("disabled") === null) &&
+                                                       (!option.parentNode.disabled || !jQuery.nodeName( option.parentNode, "optgroup" )) ) {
 
-                                       // Filter out possible comments
-                                       if ( match[1] === "*" ) {
-                                               var tmp = [];
+                                               // Get the specific value for the option
+                                               value = jQuery( option ).val();
 
-                                               for ( var i = 0; results[i]; i++ ) {
-                                                       if ( results[i].nodeType === 1 ) {
-                                                               tmp.push( results[i] );
-                                                       }
+                                               // We don't need an array for one selects
+                                               if ( one ) {
+                                                       return value;
                                                }
 
-                                               results = tmp;
+                                               // Multi-Selects return an array
+                                               values.push( value );
                                        }
+                               }
 
-                                       return results;
-                               };
-                       }
+                               // Fixes Bug #2551 -- select.val() broken in IE after form.reset()
+                               if ( one && !values.length && options.length ) {
+                                       return jQuery( options[ index ] ).val();
+                               }
 
-                       // Check to see if an attribute returns normalized href attributes
-                       div.innerHTML = "<a href='#'></a>";
+                               return values;
+                       },
 
-                       if ( div.firstChild && typeof div.firstChild.getAttribute !== "undefined" &&
-                               div.firstChild.getAttribute("href") !== "#" ) {
+                       set: function( elem, value ) {
+                               var values = jQuery.makeArray( value );
 
-                               Expr.attrHandle.href = function( elem ) {
-                                       return elem.getAttribute( "href", 2 );
-                               };
-                       }
+                               jQuery(elem).find("option").each(function() {
+                                       this.selected = jQuery.inArray( jQuery(this).val(), values ) >= 0;
+                               });
 
-                       // release memory in IE
-                       div = null;
-               })();
+                               if ( !values.length ) {
+                                       elem.selectedIndex = -1;
+                               }
+                               return values;
+                       }
+               }
+       },
 
-               if ( document.querySelectorAll ) {
-                       (function(){
-                               var oldSizzle = Sizzle,
-                                       div = document.createElement("div"),
-                                       id = "__sizzle__";
+       // Unused in 1.8, left in so attrFn-stabbers won't die; remove in 1.9
+       attrFn: {},
 
-                               div.innerHTML = "<p class='TEST'></p>";
+       attr: function( elem, name, value, pass ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
 
-                               // Safari can't handle uppercase or unicode characters when
-                               // in quirks mode.
-                               if ( div.querySelectorAll && div.querySelectorAll(".TEST").length === 0 ) {
-                                       return;
-                               }
+               // don't get/set attributes on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-                               Sizzle = function( query, context, extra, seed ) {
-                                       context = context || document;
+               if ( pass && jQuery.isFunction( jQuery.fn[ name ] ) ) {
+                       return jQuery( elem )[ name ]( value );
+               }
 
-                                       // Only use querySelectorAll on non-XML documents
-                                       // (ID selectors don't work in non-HTML documents)
-                                       if ( !seed && !Sizzle.isXML(context) ) {
-                                               // See if we find a selector to speed up
-                                               var match = /^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec( query );
+               // Fallback to prop when attributes are not supported
+               if ( typeof elem.getAttribute === "undefined" ) {
+                       return jQuery.prop( elem, name, value );
+               }
 
-                                               if ( match && (context.nodeType === 1 || context.nodeType === 9) ) {
-                                                       // Speed-up: Sizzle("TAG")
-                                                       if ( match[1] ) {
-                                                               return makeArray( context.getElementsByTagName( query ), extra );
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-                                                               // Speed-up: Sizzle(".CLASS")
-                                                       } else if ( match[2] && Expr.find.CLASS && context.getElementsByClassName ) {
-                                                               return makeArray( context.getElementsByClassName( match[2] ), extra );
-                                                       }
-                                               }
+               // All attributes are lowercase
+               // Grab necessary hook if one is defined
+               if ( notxml ) {
+                       name = name.toLowerCase();
+                       hooks = jQuery.attrHooks[ name ] || ( rboolean.test( name ) ? boolHook : nodeHook );
+               }
 
-                                               if ( context.nodeType === 9 ) {
-                                                       // Speed-up: Sizzle("body")
-                                                       // The body element only exists once, optimize finding it
-                                                       if ( query === "body" && context.body ) {
-                                                               return makeArray( [ context.body ], extra );
-
-                                                               // Speed-up: Sizzle("#ID")
-                                                       } else if ( match && match[3] ) {
-                                                               var elem = context.getElementById( match[3] );
-
-                                                               // Check parentNode to catch when Blackberry 4.6 returns
-                                                               // nodes that are no longer in the document #6963
-                                                               if ( elem && elem.parentNode ) {
-                                                                       // Handle the case where IE and Opera return items
-                                                                       // by name instead of ID
-                                                                       if ( elem.id === match[3] ) {
-                                                                               return makeArray( [ elem ], extra );
-                                                                       }
+               if ( value !== undefined ) {
 
-                                                               } else {
-                                                                       return makeArray( [], extra );
-                                                               }
-                                                       }
+                       if ( value === null ) {
+                               jQuery.removeAttr( elem, name );
+                               return;
 
-                                                       try {
-                                                               return makeArray( context.querySelectorAll(query), extra );
-                                                       } catch(qsaError) {}
-
-                                                       // qSA works strangely on Element-rooted queries
-                                                       // We can work around this by specifying an extra ID on the root
-                                                       // and working up from there (Thanks to Andrew Dupont for the technique)
-                                                       // IE 8 doesn't work on object elements
-                                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {
-                                                       var oldContext = context,
-                                                               old = context.getAttribute( "id" ),
-                                                               nid = old || id,
-                                                               hasParent = context.parentNode,
-                                                               relativeHierarchySelector = /^\s*[+~]/.test( query );
-
-                                                       if ( !old ) {
-                                                               context.setAttribute( "id", nid );
-                                                       } else {
-                                                               nid = nid.replace( /'/g, "\\$&" );
-                                                       }
-                                                       if ( relativeHierarchySelector && hasParent ) {
-                                                               context = context.parentNode;
-                                                       }
+                       } else if ( hooks && "set" in hooks && notxml && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
 
-                                                       try {
-                                                               if ( !relativeHierarchySelector || hasParent ) {
-                                                                       return makeArray( context.querySelectorAll( "[id='" + nid + "'] " + query ), extra );
-                                                               }
+                       } else {
+                               elem.setAttribute( name, "" + value );
+                               return value;
+                       }
 
-                                                       } catch(pseudoError) {
-                                                       } finally {
-                                                               if ( !old ) {
-                                                                       oldContext.removeAttribute( "id" );
-                                                               }
-                                                       }
-                                               }
-                                       }
+               } else if ( hooks && "get" in hooks && notxml && (ret = hooks.get( elem, name )) !== null ) {
+                       return ret;
 
-                                       return oldSizzle(query, context, extra, seed);
-                               };
+               } else {
 
-                               for ( var prop in oldSizzle ) {
-                                       Sizzle[ prop ] = oldSizzle[ prop ];
-                               }
+                       ret = elem.getAttribute( name );
 
-                               // release memory in IE
-                               div = null;
-                       })();
+                       // Non-existent attributes return null, we normalize to undefined
+                       return ret === null ?
+                               undefined :
+                               ret;
                }
+       },
 
-               (function(){
-                       var html = document.documentElement,
-                               matches = html.matchesSelector || html.mozMatchesSelector || html.webkitMatchesSelector || html.msMatchesSelector;
+       removeAttr: function( elem, value ) {
+               var propName, attrNames, name, isBool,
+                       i = 0;
 
-                       if ( matches ) {
-                               // Check to see if it's possible to do matchesSelector
-                               // on a disconnected node (IE 9 fails this)
-                               var disconnectedMatch = !matches.call( document.createElement( "div" ), "div" ),
-                                       pseudoWorks = false;
+               if ( value && elem.nodeType === 1 ) {
 
-                               try {
-                                       // This should fail with an exception
-                                       // Gecko does not error, returns false instead
-                                       matches.call( document.documentElement, "[test!='']:sizzle" );
+                       attrNames = value.split( core_rspace );
 
-                               } catch( pseudoError ) {
-                                       pseudoWorks = true;
-                               }
+                       for ( ; i < attrNames.length; i++ ) {
+                               name = attrNames[ i ];
 
-                               Sizzle.matchesSelector = function( node, expr ) {
-                                       // Make sure that attribute selectors are quoted
-                                       expr = expr.replace(/\=\s*([^'"\]]*)\s*\]/g, "='$1']");
+                               if ( name ) {
+                                       propName = jQuery.propFix[ name ] || name;
+                                       isBool = rboolean.test( name );
 
-                                       if ( !Sizzle.isXML( node ) ) {
-                                               try {
-                                                       if ( pseudoWorks || !Expr.match.PSEUDO.test( expr ) && !/!=/.test( expr ) ) {
-                                                               var ret = matches.call( node, expr );
-
-                                                               // IE 9's matchesSelector returns false on disconnected nodes
-                                                               if ( ret || !disconnectedMatch ||
-                                                                       // As well, disconnected nodes are said to be in a document
-                                                                       // fragment in IE 9, so check for that
-                                                                       node.document && node.document.nodeType !== 11 ) {
-                                                                       return ret;
-                                                               }
-                                                       }
-                                               } catch(e) {}
+                                       // See #9699 for explanation of this approach (setting first, then removal)
+                                       // Do not do this for boolean attributes (see #10870)
+                                       if ( !isBool ) {
+                                               jQuery.attr( elem, name, "" );
                                        }
+                                       elem.removeAttribute( getSetAttribute ? name : propName );
 
-                                       return Sizzle(expr, null, null, [node]).length > 0;
-                               };
+                                       // Set corresponding property to false for boolean attributes
+                                       if ( isBool && propName in elem ) {
+                                               elem[ propName ] = false;
+                                       }
+                               }
+                       }
+               }
+       },
+
+       attrHooks: {
+               type: {
+                       set: function( elem, value ) {
+                               // We can't allow the type property to be changed (since it causes problems in IE)
+                               if ( rtype.test( elem.nodeName ) && elem.parentNode ) {
+                                       jQuery.error( "type property can't be changed" );
+                               } else if ( !jQuery.support.radioValue && value === "radio" && jQuery.nodeName(elem, "input") ) {
+                                       // Setting the type on a radio button after the value resets the value in IE6-9
+                                       // Reset value to it's default in case type is set after value
+                                       // This is for element creation
+                                       var val = elem.value;
+                                       elem.setAttribute( "type", value );
+                                       if ( val ) {
+                                               elem.value = val;
+                                       }
+                                       return value;
+                               }
+                       }
+               },
+               // Use the value property for back compat
+               // Use the nodeHook for button elements in IE6/7 (#1954)
+               value: {
+                       get: function( elem, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.get( elem, name );
+                               }
+                               return name in elem ?
+                                       elem.value :
+                                       null;
+                       },
+                       set: function( elem, value, name ) {
+                               if ( nodeHook && jQuery.nodeName( elem, "button" ) ) {
+                                       return nodeHook.set( elem, value, name );
+                               }
+                               // Does not return so that setAttribute is also used
+                               elem.value = value;
                        }
-               })();
+               }
+       },
+
+       propFix: {
+               tabindex: "tabIndex",
+               readonly: "readOnly",
+               "for": "htmlFor",
+               "class": "className",
+               maxlength: "maxLength",
+               cellspacing: "cellSpacing",
+               cellpadding: "cellPadding",
+               rowspan: "rowSpan",
+               colspan: "colSpan",
+               usemap: "useMap",
+               frameborder: "frameBorder",
+               contenteditable: "contentEditable"
+       },
+
+       prop: function( elem, name, value ) {
+               var ret, hooks, notxml,
+                       nType = elem.nodeType;
+
+               // don't get/set properties on text, comment and attribute nodes
+               if ( !elem || nType === 3 || nType === 8 || nType === 2 ) {
+                       return;
+               }
 
-               (function(){
-                       var div = document.createElement("div");
+               notxml = nType !== 1 || !jQuery.isXMLDoc( elem );
 
-                       div.innerHTML = "<div class='test e'></div><div class='test'></div>";
+               if ( notxml ) {
+                       // Fix name and attach hooks
+                       name = jQuery.propFix[ name ] || name;
+                       hooks = jQuery.propHooks[ name ];
+               }
 
-                       // Opera can't find a second classname (in 9.6)
-                       // Also, make sure that getElementsByClassName actually exists
-                       if ( !div.getElementsByClassName || div.getElementsByClassName("e").length === 0 ) {
-                               return;
+               if ( value !== undefined ) {
+                       if ( hooks && "set" in hooks && (ret = hooks.set( elem, value, name )) !== undefined ) {
+                               return ret;
+
+                       } else {
+                               return ( elem[ name ] = value );
                        }
 
-                       // Safari caches class attributes, doesn't catch changes (in 3.2)
-                       div.lastChild.className = "e";
+               } else {
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, name )) !== null ) {
+                               return ret;
 
-                       if ( div.getElementsByClassName("e").length === 1 ) {
-                               return;
+                       } else {
+                               return elem[ name ];
                        }
+               }
+       },
 
-                       Expr.order.splice(1, 0, "CLASS");
-                       Expr.find.CLASS = function( match, context, isXML ) {
-                               if ( typeof context.getElementsByClassName !== "undefined" && !isXML ) {
-                                       return context.getElementsByClassName(match[1]);
-                               }
-                       };
+       propHooks: {
+               tabIndex: {
+                       get: function( elem ) {
+                               // elem.tabIndex doesn't always return the correct value when it hasn't been explicitly set
+                               // http://fluidproject.org/blog/2008/01/09/getting-setting-and-removing-tabindex-values-with-javascript/
+                               var attributeNode = elem.getAttributeNode("tabindex");
+
+                               return attributeNode && attributeNode.specified ?
+                                       parseInt( attributeNode.value, 10 ) :
+                                       rfocusable.test( elem.nodeName ) || rclickable.test( elem.nodeName ) && elem.href ?
+                                               0 :
+                                               undefined;
+                       }
+               }
+       }
+});
 
-                       // release memory in IE
-                       div = null;
-               })();
+// Hook for boolean attributes
+boolHook = {
+       get: function( elem, name ) {
+               // Align boolean attributes with corresponding properties
+               // Fall back to attribute presence where some booleans are not supported
+               var attrNode,
+                       property = jQuery.prop( elem, name );
+               return property === true || typeof property !== "boolean" && ( attrNode = elem.getAttributeNode(name) ) && attrNode.nodeValue !== false ?
+                       name.toLowerCase() :
+                       undefined;
+       },
+       set: function( elem, value, name ) {
+               var propName;
+               if ( value === false ) {
+                       // Remove boolean attributes when set to false
+                       jQuery.removeAttr( elem, name );
+               } else {
+                       // value is true since we know at this point it's type boolean and not false
+                       // Set boolean attributes to the same name and set the DOM property
+                       propName = jQuery.propFix[ name ] || name;
+                       if ( propName in elem ) {
+                               // Only set the IDL specifically if it already exists on the element
+                               elem[ propName ] = true;
+                       }
 
-               function dirNodeCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-                               var elem = checkSet[i];
+                       elem.setAttribute( name, name.toLowerCase() );
+               }
+               return name;
+       }
+};
 
-                               if ( elem ) {
-                                       var match = false;
+// IE6/7 do not support getting/setting some attributes with get/setAttribute
+if ( !getSetAttribute ) {
 
-                                       elem = elem[dir];
+       fixSpecified = {
+               name: true,
+               id: true,
+               coords: true
+       };
 
-                                       while ( elem ) {
-                                               if ( elem[ expando ] === doneName ) {
-                                                       match = checkSet[elem.sizset];
-                                                       break;
-                                               }
+       // Use this for any attribute in IE6/7
+       // This fixes almost every IE6/7 issue
+       nodeHook = jQuery.valHooks.button = {
+               get: function( elem, name ) {
+                       var ret;
+                       ret = elem.getAttributeNode( name );
+                       return ret && ( fixSpecified[ name ] ? ret.value !== "" : ret.specified ) ?
+                               ret.value :
+                               undefined;
+               },
+               set: function( elem, value, name ) {
+                       // Set the existing or create a new attribute node
+                       var ret = elem.getAttributeNode( name );
+                       if ( !ret ) {
+                               ret = document.createAttribute( name );
+                               elem.setAttributeNode( ret );
+                       }
+                       return ( ret.value = value + "" );
+               }
+       };
 
-                                               if ( elem.nodeType === 1 && !isXML ){
-                                                       elem[ expando ] = doneName;
-                                                       elem.sizset = i;
-                                               }
+       // Set width and height to auto instead of 0 on empty string( Bug #8150 )
+       // This is for removals
+       jQuery.each([ "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       set: function( elem, value ) {
+                               if ( value === "" ) {
+                                       elem.setAttribute( name, "auto" );
+                                       return value;
+                               }
+                       }
+               });
+       });
 
-                                               if ( elem.nodeName.toLowerCase() === cur ) {
-                                                       match = elem;
-                                                       break;
-                                               }
+       // Set contenteditable to false on removals(#10429)
+       // Setting to empty string throws an error as an invalid value
+       jQuery.attrHooks.contenteditable = {
+               get: nodeHook.get,
+               set: function( elem, value, name ) {
+                       if ( value === "" ) {
+                               value = "false";
+                       }
+                       nodeHook.set( elem, value, name );
+               }
+       };
+}
 
-                                               elem = elem[dir];
-                                       }
 
-                                       checkSet[i] = match;
-                               }
+// Some attributes require a special call on IE
+if ( !jQuery.support.hrefNormalized ) {
+       jQuery.each([ "href", "src", "width", "height" ], function( i, name ) {
+               jQuery.attrHooks[ name ] = jQuery.extend( jQuery.attrHooks[ name ], {
+                       get: function( elem ) {
+                               var ret = elem.getAttribute( name, 2 );
+                               return ret === null ? undefined : ret;
                        }
+               });
+       });
+}
+
+if ( !jQuery.support.style ) {
+       jQuery.attrHooks.style = {
+               get: function( elem ) {
+                       // Return undefined in the case of empty string
+                       // Normalize to lowercase since IE uppercases css property names
+                       return elem.style.cssText.toLowerCase() || undefined;
+               },
+               set: function( elem, value ) {
+                       return ( elem.style.cssText = "" + value );
                }
+       };
+}
 
-               function dirCheck( dir, cur, doneName, checkSet, nodeCheck, isXML ) {
-                       for ( var i = 0, l = checkSet.length; i < l; i++ ) {
-                               var elem = checkSet[i];
+// Safari mis-reports the default selected property of an option
+// Accessing the parent's selectedIndex property fixes it
+if ( !jQuery.support.optSelected ) {
+       jQuery.propHooks.selected = jQuery.extend( jQuery.propHooks.selected, {
+               get: function( elem ) {
+                       var parent = elem.parentNode;
 
-                               if ( elem ) {
-                                       var match = false;
+                       if ( parent ) {
+                               parent.selectedIndex;
 
-                                       elem = elem[dir];
+                               // Make sure that it also works with optgroups, see #5701
+                               if ( parent.parentNode ) {
+                                       parent.parentNode.selectedIndex;
+                               }
+                       }
+                       return null;
+               }
+       });
+}
 
-                                       while ( elem ) {
-                                               if ( elem[ expando ] === doneName ) {
-                                                       match = checkSet[elem.sizset];
-                                                       break;
-                                               }
+// IE6/7 call enctype encoding
+if ( !jQuery.support.enctype ) {
+       jQuery.propFix.enctype = "encoding";
+}
 
-                                               if ( elem.nodeType === 1 ) {
-                                                       if ( !isXML ) {
-                                                               elem[ expando ] = doneName;
-                                                               elem.sizset = i;
-                                                       }
+// Radios and checkboxes getter/setter
+if ( !jQuery.support.checkOn ) {
+       jQuery.each([ "radio", "checkbox" ], function() {
+               jQuery.valHooks[ this ] = {
+                       get: function( elem ) {
+                               // Handle the case where in Webkit "" is returned instead of "on" if a value isn't specified
+                               return elem.getAttribute("value") === null ? "on" : elem.value;
+                       }
+               };
+       });
+}
+jQuery.each([ "radio", "checkbox" ], function() {
+       jQuery.valHooks[ this ] = jQuery.extend( jQuery.valHooks[ this ], {
+               set: function( elem, value ) {
+                       if ( jQuery.isArray( value ) ) {
+                               return ( elem.checked = jQuery.inArray( jQuery(elem).val(), value ) >= 0 );
+                       }
+               }
+       });
+});
+var rformElems = /^(?:textarea|input|select)$/i,
+       rtypenamespace = /^([^\.]*|)(?:\.(.+)|)$/,
+       rhoverHack = /(?:^|\s)hover(\.\S+|)\b/,
+       rkeyEvent = /^key/,
+       rmouseEvent = /^(?:mouse|contextmenu)|click/,
+       rfocusMorph = /^(?:focusinfocus|focusoutblur)$/,
+       hoverHack = function( events ) {
+               return jQuery.event.special.hover ? events : events.replace( rhoverHack, "mouseenter$1 mouseleave$1" );
+       };
 
-                                                       if ( typeof cur !== "string" ) {
-                                                               if ( elem === cur ) {
-                                                                       match = true;
-                                                                       break;
-                                                               }
+/*
+ * Helper functions for managing events -- not part of the public interface.
+ * Props to Dean Edwards' addEvent library for many of the ideas.
+ */
+jQuery.event = {
 
-                                                       } else if ( Sizzle.filter( cur, [elem] ).length > 0 ) {
-                                                               match = elem;
-                                                               break;
-                                                       }
-                                               }
+       add: function( elem, types, handler, data, selector ) {
 
-                                               elem = elem[dir];
-                                       }
+               var elemData, eventHandle, events,
+                       t, tns, type, namespaces, handleObj,
+                       handleObjIn, handlers, special;
 
-                                       checkSet[i] = match;
-                               }
-                       }
+               // Don't attach events to noData or text/comment nodes (allow plain objects tho)
+               if ( elem.nodeType === 3 || elem.nodeType === 8 || !types || !handler || !(elemData = jQuery._data( elem )) ) {
+                       return;
                }
 
-               if ( document.documentElement.contains ) {
-                       Sizzle.contains = function( a, b ) {
-                               return a !== b && (a.contains ? a.contains(b) : true);
-                       };
+               // Caller can pass in an object of custom data in lieu of the handler
+               if ( handler.handler ) {
+                       handleObjIn = handler;
+                       handler = handleObjIn.handler;
+                       selector = handleObjIn.selector;
+               }
 
-               } else if ( document.documentElement.compareDocumentPosition ) {
-                       Sizzle.contains = function( a, b ) {
-                               return !!(a.compareDocumentPosition(b) & 16);
-                       };
+               // Make sure that the handler has a unique ID, used to find/remove it later
+               if ( !handler.guid ) {
+                       handler.guid = jQuery.guid++;
+               }
 
-               } else {
-                       Sizzle.contains = function() {
-                               return false;
+               // Init the element's event structure and main handler, if this is the first
+               events = elemData.events;
+               if ( !events ) {
+                       elemData.events = events = {};
+               }
+               eventHandle = elemData.handle;
+               if ( !eventHandle ) {
+                       elemData.handle = eventHandle = function( e ) {
+                               // Discard the second event of a jQuery.event.trigger() and
+                               // when an event is called after a page has unloaded
+                               return typeof jQuery !== "undefined" && (!e || jQuery.event.triggered !== e.type) ?
+                                       jQuery.event.dispatch.apply( eventHandle.elem, arguments ) :
+                                       undefined;
                        };
+                       // Add elem as a property of the handle fn to prevent a memory leak with IE non-native events
+                       eventHandle.elem = elem;
                }
 
-               Sizzle.isXML = function( elem ) {
-                       // documentElement is verified for cases where it doesn't yet exist
-                       // (such as loading iframes in IE - #4833)
-                       var documentElement = (elem ? elem.ownerDocument || elem : 0).documentElement;
+               // Handle multiple events separated by a space
+               // jQuery(...).bind("mouseover mouseout", fn);
+               types = jQuery.trim( hoverHack(types) ).split( " " );
+               for ( t = 0; t < types.length; t++ ) {
 
-                       return documentElement ? documentElement.nodeName !== "HTML" : false;
-               };
-
-               var posProcess = function( selector, context, seed ) {
-                       var match,
-                               tmpSet = [],
-                               later = "",
-                               root = context.nodeType ? [context] : context;
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = tns[1];
+                       namespaces = ( tns[2] || "" ).split( "." ).sort();
 
-                       // Position selectors must be done after the filter
-                       // And so must :not(positional) so we move all PSEUDOs to the end
-                       while ( (match = Expr.match.PSEUDO.exec( selector )) ) {
-                               later += match[0];
-                               selector = selector.replace( Expr.match.PSEUDO, "" );
-                       }
+                       // If event changes its type, use the special event handlers for the changed type
+                       special = jQuery.event.special[ type ] || {};
 
-                       selector = Expr.relative[selector] ? selector + "*" : selector;
+                       // If selector defined, determine special event api type, otherwise given type
+                       type = ( selector ? special.delegateType : special.bindType ) || type;
 
-                       for ( var i = 0, l = root.length; i < l; i++ ) {
-                               Sizzle( selector, root[i], tmpSet, seed );
-                       }
+                       // Update special based on newly reset type
+                       special = jQuery.event.special[ type ] || {};
 
-                       return Sizzle.filter( later, tmpSet );
-               };
+                       // handleObj is passed to all event handlers
+                       handleObj = jQuery.extend({
+                               type: type,
+                               origType: tns[1],
+                               data: data,
+                               handler: handler,
+                               guid: handler.guid,
+                               selector: selector,
+                               namespace: namespaces.join(".")
+                       }, handleObjIn );
 
-// EXPOSE
-// Override sizzle attribute retrieval
-               Sizzle.attr = jQuery.attr;
-               Sizzle.selectors.attrMap = {};
-               jQuery.find = Sizzle;
-               jQuery.expr = Sizzle.selectors;
-               jQuery.expr[":"] = jQuery.expr.filters;
-               jQuery.unique = Sizzle.uniqueSort;
-               jQuery.text = Sizzle.getText;
-               jQuery.isXMLDoc = Sizzle.isXML;
-               jQuery.contains = Sizzle.contains;
-
-
-       })();
-
-
-       var runtil = /Until$/,
-               rparentsprev = /^(?:parents|prevUntil|prevAll)/,
-       // Note: This RegExp should be improved, or likely pulled from Sizzle
-               rmultiselector = /,/,
-               isSimple = /^.[^:#\[\.,]*$/,
-               slice = Array.prototype.slice,
-               POS = jQuery.expr.match.globalPOS,
-       // methods guaranteed to produce a unique set when starting from a unique set
-               guaranteedUnique = {
-                       children: true,
-                       contents: true,
-                       next: true,
-                       prev: true
-               };
+                       // Init the event handler queue if we're the first
+                       handlers = events[ type ];
+                       if ( !handlers ) {
+                               handlers = events[ type ] = [];
+                               handlers.delegateCount = 0;
 
-       jQuery.fn.extend({
-               find: function( selector ) {
-                       var self = this,
-                               i, l;
+                               // Only use addEventListener/attachEvent if the special events handler returns false
+                               if ( !special.setup || special.setup.call( elem, data, namespaces, eventHandle ) === false ) {
+                                       // Bind the global event handler to the element
+                                       if ( elem.addEventListener ) {
+                                               elem.addEventListener( type, eventHandle, false );
 
-                       if ( typeof selector !== "string" ) {
-                               return jQuery( selector ).filter(function() {
-                                       for ( i = 0, l = self.length; i < l; i++ ) {
-                                               if ( jQuery.contains( self[ i ], this ) ) {
-                                                       return true;
-                                               }
+                                       } else if ( elem.attachEvent ) {
+                                               elem.attachEvent( "on" + type, eventHandle );
                                        }
-                               });
+                               }
                        }
 
-                       var ret = this.pushStack( "", "find", selector ),
-                               length, n, r;
+                       if ( special.add ) {
+                               special.add.call( elem, handleObj );
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               length = ret.length;
-                               jQuery.find( selector, this[i], ret );
-
-                               if ( i > 0 ) {
-                                       // Make sure that the results are unique
-                                       for ( n = length; n < ret.length; n++ ) {
-                                               for ( r = 0; r < length; r++ ) {
-                                                       if ( ret[r] === ret[n] ) {
-                                                               ret.splice(n--, 1);
-                                                               break;
-                                                       }
-                                               }
-                                       }
+                               if ( !handleObj.handler.guid ) {
+                                       handleObj.handler.guid = handler.guid;
                                }
                        }
 
-                       return ret;
-               },
-
-               has: function( target ) {
-                       var targets = jQuery( target );
-                       return this.filter(function() {
-                               for ( var i = 0, l = targets.length; i < l; i++ ) {
-                                       if ( jQuery.contains( this, targets[i] ) ) {
-                                               return true;
-                                       }
-                               }
-                       });
-               },
+                       // Add to the element's handler list, delegates in front
+                       if ( selector ) {
+                               handlers.splice( handlers.delegateCount++, 0, handleObj );
+                       } else {
+                               handlers.push( handleObj );
+                       }
 
-               not: function( selector ) {
-                       return this.pushStack( winnow(this, selector, false), "not", selector);
-               },
+                       // Keep track of which events have ever been used, for event optimization
+                       jQuery.event.global[ type ] = true;
+               }
 
-               filter: function( selector ) {
-                       return this.pushStack( winnow(this, selector, true), "filter", selector );
-               },
+               // Nullify elem to prevent memory leaks in IE
+               elem = null;
+       },
 
-               is: function( selector ) {
-                       return !!selector && (
-                               typeof selector === "string" ?
-                                       // If this is a positional selector, check membership in the returned set
-                                       // so $("p:first").is("p:last") won't return true for a doc with two "p".
-                                       POS.test( selector ) ?
-                                               jQuery( selector, this.context ).index( this[0] ) >= 0 :
-                                               jQuery.filter( selector, this ).length > 0 :
-                                       this.filter( selector ).length > 0 );
-               },
+       global: {},
 
-               closest: function( selectors, context ) {
-                       var ret = [], i, l, cur = this[0];
+       // Detach an event or set of events from an element
+       remove: function( elem, types, handler, selector, mappedTypes ) {
 
-                       // Array (deprecated as of jQuery 1.7)
-                       if ( jQuery.isArray( selectors ) ) {
-                               var level = 1;
+               var t, tns, type, origType, namespaces, origCount,
+                       j, events, special, eventType, handleObj,
+                       elemData = jQuery.hasData( elem ) && jQuery._data( elem );
 
-                               while ( cur && cur.ownerDocument && cur !== context ) {
-                                       for ( i = 0; i < selectors.length; i++ ) {
+               if ( !elemData || !(events = elemData.events) ) {
+                       return;
+               }
 
-                                               if ( jQuery( cur ).is( selectors[ i ] ) ) {
-                                                       ret.push({ selector: selectors[ i ], elem: cur, level: level });
-                                               }
-                                       }
+               // Once for each type.namespace in types; type may be omitted
+               types = jQuery.trim( hoverHack( types || "" ) ).split(" ");
+               for ( t = 0; t < types.length; t++ ) {
+                       tns = rtypenamespace.exec( types[t] ) || [];
+                       type = origType = tns[1];
+                       namespaces = tns[2];
 
-                                       cur = cur.parentNode;
-                                       level++;
+                       // Unbind all events (on this namespace, if provided) for the element
+                       if ( !type ) {
+                               for ( type in events ) {
+                                       jQuery.event.remove( elem, type + types[ t ], handler, selector, true );
                                }
-
-                               return ret;
+                               continue;
                        }
 
-                       // String
-                       var pos = POS.test( selectors ) || typeof selectors !== "string" ?
-                               jQuery( selectors, context || this.context ) :
-                               0;
+                       special = jQuery.event.special[ type ] || {};
+                       type = ( selector? special.delegateType : special.bindType ) || type;
+                       eventType = events[ type ] || [];
+                       origCount = eventType.length;
+                       namespaces = namespaces ? new RegExp("(^|\\.)" + namespaces.split(".").sort().join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
 
-                       for ( i = 0, l = this.length; i < l; i++ ) {
-                               cur = this[i];
+                       // Remove matching events
+                       for ( j = 0; j < eventType.length; j++ ) {
+                               handleObj = eventType[ j ];
 
-                               while ( cur ) {
-                                       if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
-                                               ret.push( cur );
-                                               break;
+                               if ( ( mappedTypes || origType === handleObj.origType ) &&
+                                        ( !handler || handler.guid === handleObj.guid ) &&
+                                        ( !namespaces || namespaces.test( handleObj.namespace ) ) &&
+                                        ( !selector || selector === handleObj.selector || selector === "**" && handleObj.selector ) ) {
+                                       eventType.splice( j--, 1 );
 
-                                       } else {
-                                               cur = cur.parentNode;
-                                               if ( !cur || !cur.ownerDocument || cur === context || cur.nodeType === 11 ) {
-                                                       break;
-                                               }
+                                       if ( handleObj.selector ) {
+                                               eventType.delegateCount--;
+                                       }
+                                       if ( special.remove ) {
+                                               special.remove.call( elem, handleObj );
                                        }
                                }
                        }
 
-                       ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
+                       // Remove generic event handler if we removed something and no more handlers exist
+                       // (avoids potential for endless recursion during removal of special event handlers)
+                       if ( eventType.length === 0 && origCount !== eventType.length ) {
+                               if ( !special.teardown || special.teardown.call( elem, namespaces, elemData.handle ) === false ) {
+                                       jQuery.removeEvent( elem, type, elemData.handle );
+                               }
 
-                       return this.pushStack( ret, "closest", selectors );
-               },
+                               delete events[ type ];
+                       }
+               }
 
-               // Determine the position of an element within
-               // the matched set of elements
-               index: function( elem ) {
+               // Remove the expando if it's no longer used
+               if ( jQuery.isEmptyObject( events ) ) {
+                       delete elemData.handle;
 
-                       // No argument, return index in parent
-                       if ( !elem ) {
-                               return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
-                       }
+                       // removeData also checks for emptiness and clears the expando if empty
+                       // so use it instead of delete
+                       jQuery.removeData( elem, "events", true );
+               }
+       },
+
+       // Events that are safe to short-circuit if no handlers are attached.
+       // Native DOM events should not be added, they may have inline handlers.
+       customEvent: {
+               "getData": true,
+               "setData": true,
+               "changeData": true
+       },
+
+       trigger: function( event, data, elem, onlyHandlers ) {
+               // Don't do events on text and comment nodes
+               if ( elem && (elem.nodeType === 3 || elem.nodeType === 8) ) {
+                       return;
+               }
 
-                       // index in selector
-                       if ( typeof elem === "string" ) {
-                               return jQuery.inArray( this[0], jQuery( elem ) );
-                       }
+               // Event object or event type
+               var cache, exclusive, i, cur, old, ontype, special, handle, eventPath, bubbleType,
+                       type = event.type || event,
+                       namespaces = [];
 
-                       // Locate the position of the desired element
-                       return jQuery.inArray(
-                               // If it receives a jQuery object, the first element is used
-                               elem.jquery ? elem[0] : elem, this );
-               },
+               // focus/blur morphs to focusin/out; ensure we're not firing them right now
+               if ( rfocusMorph.test( type + jQuery.event.triggered ) ) {
+                       return;
+               }
 
-               add: function( selector, context ) {
-                       var set = typeof selector === "string" ?
-                                       jQuery( selector, context ) :
-                                       jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
-                               all = jQuery.merge( this.get(), set );
+               if ( type.indexOf( "!" ) >= 0 ) {
+                       // Exclusive events trigger only for the exact event (no namespaces)
+                       type = type.slice(0, -1);
+                       exclusive = true;
+               }
 
-                       return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
-                               all :
-                               jQuery.unique( all ) );
-               },
+               if ( type.indexOf( "." ) >= 0 ) {
+                       // Namespaced trigger; create a regexp to match event type in handle()
+                       namespaces = type.split(".");
+                       type = namespaces.shift();
+                       namespaces.sort();
+               }
 
-               andSelf: function() {
-                       return this.add( this.prevObject );
+               if ( (!elem || jQuery.event.customEvent[ type ]) && !jQuery.event.global[ type ] ) {
+                       // No jQuery handlers for this event type, and it can't have inline handlers
+                       return;
                }
-       });
 
-// A painfully simple check to see if an element is disconnected
-// from a document (should be improved, where feasible).
-       function isDisconnected( node ) {
-               return !node || !node.parentNode || node.parentNode.nodeType === 11;
-       }
+               // Caller can pass in an Event, Object, or just an event type string
+               event = typeof event === "object" ?
+                       // jQuery.Event object
+                       event[ jQuery.expando ] ? event :
+                       // Object literal
+                       new jQuery.Event( type, event ) :
+                       // Just the event type (string)
+                       new jQuery.Event( type );
 
-       jQuery.each({
-               parent: function( elem ) {
-                       var parent = elem.parentNode;
-                       return parent && parent.nodeType !== 11 ? parent : null;
-               },
-               parents: function( elem ) {
-                       return jQuery.dir( elem, "parentNode" );
-               },
-               parentsUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "parentNode", until );
-               },
-               next: function( elem ) {
-                       return jQuery.nth( elem, 2, "nextSibling" );
-               },
-               prev: function( elem ) {
-                       return jQuery.nth( elem, 2, "previousSibling" );
-               },
-               nextAll: function( elem ) {
-                       return jQuery.dir( elem, "nextSibling" );
-               },
-               prevAll: function( elem ) {
-                       return jQuery.dir( elem, "previousSibling" );
-               },
-               nextUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "nextSibling", until );
-               },
-               prevUntil: function( elem, i, until ) {
-                       return jQuery.dir( elem, "previousSibling", until );
-               },
-               siblings: function( elem ) {
-                       return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
-               },
-               children: function( elem ) {
-                       return jQuery.sibling( elem.firstChild );
-               },
-               contents: function( elem ) {
-                       return jQuery.nodeName( elem, "iframe" ) ?
-                               elem.contentDocument || elem.contentWindow.document :
-                               jQuery.makeArray( elem.childNodes );
+               event.type = type;
+               event.isTrigger = true;
+               event.exclusive = exclusive;
+               event.namespace = namespaces.join( "." );
+               event.namespace_re = event.namespace? new RegExp("(^|\\.)" + namespaces.join("\\.(?:.*\\.|)") + "(\\.|$)") : null;
+               ontype = type.indexOf( ":" ) < 0 ? "on" + type : "";
+
+               // Handle a global trigger
+               if ( !elem ) {
+
+                       // TODO: Stop taunting the data cache; remove global events and always attach to document
+                       cache = jQuery.cache;
+                       for ( i in cache ) {
+                               if ( cache[ i ].events && cache[ i ].events[ type ] ) {
+                                       jQuery.event.trigger( event, data, cache[ i ].handle.elem, true );
+                               }
+                       }
+                       return;
+               }
+
+               // Clean up the event in case it is being reused
+               event.result = undefined;
+               if ( !event.target ) {
+                       event.target = elem;
+               }
+
+               // Clone any incoming data and prepend the event, creating the handler arg list
+               data = data != null ? jQuery.makeArray( data ) : [];
+               data.unshift( event );
+
+               // Allow special events to draw outside the lines
+               special = jQuery.event.special[ type ] || {};
+               if ( special.trigger && special.trigger.apply( elem, data ) === false ) {
+                       return;
                }
-       }, function( name, fn ) {
-               jQuery.fn[ name ] = function( until, selector ) {
-                       var ret = jQuery.map( this, fn, until );
 
-                       if ( !runtil.test( name ) ) {
-                               selector = until;
+               // Determine event propagation path in advance, per W3C events spec (#9951)
+               // Bubble up to document, then to window; watch for a global ownerDocument var (#9724)
+               eventPath = [[ elem, special.bindType || type ]];
+               if ( !onlyHandlers && !special.noBubble && !jQuery.isWindow( elem ) ) {
+
+                       bubbleType = special.delegateType || type;
+                       cur = rfocusMorph.test( bubbleType + type ) ? elem : elem.parentNode;
+                       for ( old = elem; cur; cur = cur.parentNode ) {
+                               eventPath.push([ cur, bubbleType ]);
+                               old = cur;
                        }
 
-                       if ( selector && typeof selector === "string" ) {
-                               ret = jQuery.filter( selector, ret );
+                       // Only add window if we got to document (e.g., not plain obj or detached DOM)
+                       if ( old === (elem.ownerDocument || document) ) {
+                               eventPath.push([ old.defaultView || old.parentWindow || window, bubbleType ]);
                        }
+               }
+
+               // Fire handlers on the event path
+               for ( i = 0; i < eventPath.length && !event.isPropagationStopped(); i++ ) {
 
-                       ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
+                       cur = eventPath[i][0];
+                       event.type = eventPath[i][1];
 
-                       if ( (this.length > 1 || rmultiselector.test( selector )) && rparentsprev.test( name ) ) {
-                               ret = ret.reverse();
+                       handle = ( jQuery._data( cur, "events" ) || {} )[ event.type ] && jQuery._data( cur, "handle" );
+                       if ( handle ) {
+                               handle.apply( cur, data );
+                       }
+                       // Note that this is a bare JS function and not a jQuery handler
+                       handle = ontype && cur[ ontype ];
+                       if ( handle && jQuery.acceptData( cur ) && handle.apply( cur, data ) === false ) {
+                               event.preventDefault();
                        }
+               }
+               event.type = type;
 
-                       return this.pushStack( ret, name, slice.call( arguments ).join(",") );
-               };
-       });
+               // If nobody prevented the default action, do it now
+               if ( !onlyHandlers && !event.isDefaultPrevented() ) {
 
-       jQuery.extend({
-               filter: function( expr, elems, not ) {
-                       if ( not ) {
-                               expr = ":not(" + expr + ")";
-                       }
+                       if ( (!special._default || special._default.apply( elem.ownerDocument, data ) === false) &&
+                               !(type === "click" && jQuery.nodeName( elem, "a" )) && jQuery.acceptData( elem ) ) {
 
-                       return elems.length === 1 ?
-                               jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
-                               jQuery.find.matches(expr, elems);
-               },
+                               // Call a native DOM method on the target with the same name name as the event.
+                               // Can't use an .isFunction() check here because IE6/7 fails that test.
+                               // Don't do default actions on window, that's where global variables be (#6170)
+                               // IE<9 dies on focus/blur to hidden element (#1486)
+                               if ( ontype && elem[ type ] && ((type !== "focus" && type !== "blur") || event.target.offsetWidth !== 0) && !jQuery.isWindow( elem ) ) {
 
-               dir: function( elem, dir, until ) {
-                       var matched = [],
-                               cur = elem[ dir ];
+                                       // Don't re-trigger an onFOO event when we call its FOO() method
+                                       old = elem[ ontype ];
 
-                       while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
-                               if ( cur.nodeType === 1 ) {
-                                       matched.push( cur );
-                               }
-                               cur = cur[dir];
-                       }
-                       return matched;
-               },
+                                       if ( old ) {
+                                               elem[ ontype ] = null;
+                                       }
 
-               nth: function( cur, result, dir, elem ) {
-                       result = result || 1;
-                       var num = 0;
+                                       // Prevent re-triggering of the same event, since we already bubbled it above
+                                       jQuery.event.triggered = type;
+                                       elem[ type ]();
+                                       jQuery.event.triggered = undefined;
 
-                       for ( ; cur; cur = cur[dir] ) {
-                               if ( cur.nodeType === 1 && ++num === result ) {
-                                       break;
+                                       if ( old ) {
+                                               elem[ ontype ] = old;
+                                       }
                                }
                        }
+               }
 
-                       return cur;
-               },
+               return event.result;
+       },
+
+       dispatch: function( event ) {
+
+               // Make a writable jQuery.Event from the native event object
+               event = jQuery.event.fix( event || window.event );
+
+               var i, j, cur, ret, selMatch, matched, matches, handleObj, sel, related,
+                       handlers = ( (jQuery._data( this, "events" ) || {} )[ event.type ] || []),
+                       delegateCount = handlers.delegateCount,
+                       args = [].slice.call( arguments ),
+                       run_all = !event.exclusive && !event.namespace,
+                       special = jQuery.event.special[ event.type ] || {},
+                       handlerQueue = [];
 
-               sibling: function( n, elem ) {
-                       var r = [];
+               // Use the fix-ed jQuery.Event rather than the (read-only) native event
+               args[0] = event;
+               event.delegateTarget = this;
 
-                       for ( ; n; n = n.nextSibling ) {
-                               if ( n.nodeType === 1 && n !== elem ) {
-                                       r.push( n );
+               // Call the preDispatch hook for the mapped type, and let it bail if desired
+               if ( special.preDispatch && special.preDispatch.call( this, event ) === false ) {
+                       return;
+               }
+
+               // Determine handlers that should run if there are delegated events
+               // Avoid non-left-click bubbling in Firefox (#3861)
+               if ( delegateCount && !(event.button && event.type === "click") ) {
+
+                       for ( cur = event.target; cur != this; cur = cur.parentNode || this ) {
+
+                               // Don't process clicks (ONLY) on disabled elements (#6911, #8165, #11382, #11764)
+                               if ( cur.disabled !== true || event.type !== "click" ) {
+                                       selMatch = {};
+                                       matches = [];
+                                       for ( i = 0; i < delegateCount; i++ ) {
+                                               handleObj = handlers[ i ];
+                                               sel = handleObj.selector;
+
+                                               if ( selMatch[ sel ] === undefined ) {
+                                                       selMatch[ sel ] = jQuery( sel, this ).index( cur ) >= 0;
+                                               }
+                                               if ( selMatch[ sel ] ) {
+                                                       matches.push( handleObj );
+                                               }
+                                       }
+                                       if ( matches.length ) {
+                                               handlerQueue.push({ elem: cur, matches: matches });
+                                       }
                                }
                        }
+               }
 
-                       return r;
+               // Add the remaining (directly-bound) handlers
+               if ( handlers.length > delegateCount ) {
+                       handlerQueue.push({ elem: this, matches: handlers.slice( delegateCount ) });
                }
-       });
 
-// Implement the identical functionality for filter and not
-       function winnow( elements, qualifier, keep ) {
+               // Run delegates first; they may want to stop propagation beneath us
+               for ( i = 0; i < handlerQueue.length && !event.isPropagationStopped(); i++ ) {
+                       matched = handlerQueue[ i ];
+                       event.currentTarget = matched.elem;
 
-               // Can't pass null or undefined to indexOf in Firefox 4
-               // Set to 0 to skip string check
-               qualifier = qualifier || 0;
+                       for ( j = 0; j < matched.matches.length && !event.isImmediatePropagationStopped(); j++ ) {
+                               handleObj = matched.matches[ j ];
 
-               if ( jQuery.isFunction( qualifier ) ) {
-                       return jQuery.grep(elements, function( elem, i ) {
-                               var retVal = !!qualifier.call( elem, i, elem );
-                               return retVal === keep;
-                       });
+                               // Triggered event must either 1) be non-exclusive and have no namespace, or
+                               // 2) have namespace(s) a subset or equal to those in the bound event (both can have no namespace).
+                               if ( run_all || (!event.namespace && !handleObj.namespace) || event.namespace_re && event.namespace_re.test( handleObj.namespace ) ) {
 
-               } else if ( qualifier.nodeType ) {
-                       return jQuery.grep(elements, function( elem, i ) {
-                               return ( elem === qualifier ) === keep;
-                       });
+                                       event.data = handleObj.data;
+                                       event.handleObj = handleObj;
 
-               } else if ( typeof qualifier === "string" ) {
-                       var filtered = jQuery.grep(elements, function( elem ) {
-                               return elem.nodeType === 1;
-                       });
+                                       ret = ( (jQuery.event.special[ handleObj.origType ] || {}).handle || handleObj.handler )
+                                                       .apply( matched.elem, args );
 
-                       if ( isSimple.test( qualifier ) ) {
-                               return jQuery.filter(qualifier, filtered, !keep);
-                       } else {
-                               qualifier = jQuery.filter( qualifier, filtered );
+                                       if ( ret !== undefined ) {
+                                               event.result = ret;
+                                               if ( ret === false ) {
+                                                       event.preventDefault();
+                                                       event.stopPropagation();
+                                               }
+                                       }
+                               }
                        }
                }
 
-               return jQuery.grep(elements, function( elem, i ) {
-                       return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
-               });
-       }
+               // Call the postDispatch hook for the mapped type
+               if ( special.postDispatch ) {
+                       special.postDispatch.call( this, event );
+               }
 
+               return event.result;
+       },
 
+       // Includes some event props shared by KeyEvent and MouseEvent
+       // *** attrChange attrName relatedNode srcElement  are not normalized, non-W3C, deprecated, will be removed in 1.8 ***
+       props: "attrChange attrName relatedNode srcElement altKey bubbles cancelable ctrlKey currentTarget eventPhase metaKey relatedTarget shiftKey target timeStamp view which".split(" "),
 
+       fixHooks: {},
 
-       function createSafeFragment( document ) {
-               var list = nodeNames.split( "|" ),
-                       safeFrag = document.createDocumentFragment();
+       keyHooks: {
+               props: "char charCode key keyCode".split(" "),
+               filter: function( event, original ) {
 
-               if ( safeFrag.createElement ) {
-                       while ( list.length ) {
-                               safeFrag.createElement(
-                                       list.pop()
-                               );
+                       // Add which for key events
+                       if ( event.which == null ) {
+                               event.which = original.charCode != null ? original.charCode : original.keyCode;
                        }
+
+                       return event;
                }
-               return safeFrag;
-       }
+       },
 
-       var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
-                       "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
-               rinlinejQuery = / jQuery\d+="(?:\d+|null)"/g,
-               rleadingWhitespace = /^\s+/,
-               rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/ig,
-               rtagName = /<([\w:]+)/,
-               rtbody = /<tbody/i,
-               rhtml = /<|&#?\w+;/,
-               rnoInnerhtml = /<(?:script|style)/i,
-               rnocache = /<(?:script|object|embed|option|style)/i,
-               rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
-       // checked="checked" or checked
-               rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
-               rscriptType = /\/(java|ecma)script/i,
-               rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)/,
-               wrapMap = {
-                       option: [ 1, "<select multiple='multiple'>", "</select>" ],
-                       legend: [ 1, "<fieldset>", "</fieldset>" ],
-                       thead: [ 1, "<table>", "</table>" ],
-                       tr: [ 2, "<table><tbody>", "</tbody></table>" ],
-                       td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
-                       col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
-                       area: [ 1, "<map>", "</map>" ],
-                       _default: [ 0, "", "" ]
-               },
-               safeFragment = createSafeFragment( document );
+       mouseHooks: {
+               props: "button buttons clientX clientY fromElement offsetX offsetY pageX pageY screenX screenY toElement".split(" "),
+               filter: function( event, original ) {
+                       var eventDoc, doc, body,
+                               button = original.button,
+                               fromElement = original.fromElement;
 
-       wrapMap.optgroup = wrapMap.option;
-       wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
-       wrapMap.th = wrapMap.td;
+                       // Calculate pageX/Y if missing and clientX/Y available
+                       if ( event.pageX == null && original.clientX != null ) {
+                               eventDoc = event.target.ownerDocument || document;
+                               doc = eventDoc.documentElement;
+                               body = eventDoc.body;
 
-// IE can't serialize <link> and <script> tags normally
-       if ( !jQuery.support.htmlSerialize ) {
-               wrapMap._default = [ 1, "div<div>", "</div>" ];
-       }
+                               event.pageX = original.clientX + ( doc && doc.scrollLeft || body && body.scrollLeft || 0 ) - ( doc && doc.clientLeft || body && body.clientLeft || 0 );
+                               event.pageY = original.clientY + ( doc && doc.scrollTop  || body && body.scrollTop  || 0 ) - ( doc && doc.clientTop  || body && body.clientTop  || 0 );
+                       }
 
-       jQuery.fn.extend({
-               text: function( value ) {
-                       return jQuery.access( this, function( value ) {
-                               return value === undefined ?
-                                       jQuery.text( this ) :
-                                       this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
-                       }, null, value, arguments.length );
-               },
+                       // Add relatedTarget, if necessary
+                       if ( !event.relatedTarget && fromElement ) {
+                               event.relatedTarget = fromElement === event.target ? original.toElement : fromElement;
+                       }
 
-               wrapAll: function( html ) {
-                       if ( jQuery.isFunction( html ) ) {
-                               return this.each(function(i) {
-                                       jQuery(this).wrapAll( html.call(this, i) );
-                               });
+                       // Add which for click: 1 === left; 2 === middle; 3 === right
+                       // Note: button is not normalized, so don't use it
+                       if ( !event.which && button !== undefined ) {
+                               event.which = ( button & 1 ? 1 : ( button & 2 ? 3 : ( button & 4 ? 2 : 0 ) ) );
                        }
 
-                       if ( this[0] ) {
-                               // The elements to wrap the target around
-                               var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
+                       return event;
+               }
+       },
 
-                               if ( this[0].parentNode ) {
-                                       wrap.insertBefore( this[0] );
-                               }
+       fix: function( event ) {
+               if ( event[ jQuery.expando ] ) {
+                       return event;
+               }
 
-                               wrap.map(function() {
-                                       var elem = this;
+               // Create a writable copy of the event object and normalize some properties
+               var i, prop,
+                       originalEvent = event,
+                       fixHook = jQuery.event.fixHooks[ event.type ] || {},
+                       copy = fixHook.props ? this.props.concat( fixHook.props ) : this.props;
 
-                                       while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
-                                               elem = elem.firstChild;
-                                       }
+               event = jQuery.Event( originalEvent );
 
-                                       return elem;
-                               }).append( this );
-                       }
+               for ( i = copy.length; i; ) {
+                       prop = copy[ --i ];
+                       event[ prop ] = originalEvent[ prop ];
+               }
 
-                       return this;
-               },
+               // Fix target property, if necessary (#1925, IE 6/7/8 & Safari2)
+               if ( !event.target ) {
+                       event.target = originalEvent.srcElement || document;
+               }
 
-               wrapInner: function( html ) {
-                       if ( jQuery.isFunction( html ) ) {
-                               return this.each(function(i) {
-                                       jQuery(this).wrapInner( html.call(this, i) );
-                               });
-                       }
+               // Target should not be a text node (#504, Safari)
+               if ( event.target.nodeType === 3 ) {
+                       event.target = event.target.parentNode;
+               }
 
-                       return this.each(function() {
-                               var self = jQuery( this ),
-                                       contents = self.contents();
+               // For mouse/key events, metaKey==false if it's undefined (#3368, #11328; IE6/7/8)
+               event.metaKey = !!event.metaKey;
 
-                               if ( contents.length ) {
-                                       contents.wrapAll( html );
+               return fixHook.filter? fixHook.filter( event, originalEvent ) : event;
+       },
 
-                               } else {
-                                       self.append( html );
-                               }
-                       });
+       special: {
+               load: {
+                       // Prevent triggered image.load events from bubbling to window.load
+                       noBubble: true
                },
 
-               wrap: function( html ) {
-                       var isFunction = jQuery.isFunction( html );
-
-                       return this.each(function(i) {
-                               jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
-                       });
+               focus: {
+                       delegateType: "focusin"
                },
-
-               unwrap: function() {
-                       return this.parent().each(function() {
-                               if ( !jQuery.nodeName( this, "body" ) ) {
-                                       jQuery( this ).replaceWith( this.childNodes );
-                               }
-                       }).end();
+               blur: {
+                       delegateType: "focusout"
                },
 
-               append: function() {
-                       return this.domManip(arguments, true, function( elem ) {
-                               if ( this.nodeType === 1 ) {
-                                       this.appendChild( elem );
+               beforeunload: {
+                       setup: function( data, namespaces, eventHandle ) {
+                               // We only want to do this special case on windows
+                               if ( jQuery.isWindow( this ) ) {
+                                       this.onbeforeunload = eventHandle;
                                }
-                       });
-               },
+                       },
 
-               prepend: function() {
-                       return this.domManip(arguments, true, function( elem ) {
-                               if ( this.nodeType === 1 ) {
-                                       this.insertBefore( elem, this.firstChild );
+                       teardown: function( namespaces, eventHandle ) {
+                               if ( this.onbeforeunload === eventHandle ) {
+                                       this.onbeforeunload = null;
                                }
-                       });
-               },
-
-               before: function() {
-                       if ( this[0] && this[0].parentNode ) {
-                               return this.domManip(arguments, false, function( elem ) {
-                                       this.parentNode.insertBefore( elem, this );
-                               });
-                       } else if ( arguments.length ) {
-                               var set = jQuery.clean( arguments );
-                               set.push.apply( set, this.toArray() );
-                               return this.pushStack( set, "before", arguments );
-                       }
-               },
-
-               after: function() {
-                       if ( this[0] && this[0].parentNode ) {
-                               return this.domManip(arguments, false, function( elem ) {
-                                       this.parentNode.insertBefore( elem, this.nextSibling );
-                               });
-                       } else if ( arguments.length ) {
-                               var set = this.pushStack( this, "after", arguments );
-                               set.push.apply( set, jQuery.clean(arguments) );
-                               return set;
                        }
-               },
-
-               // keepData is for internal use only--do not document
-               remove: function( selector, keepData ) {
-                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-                               if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
-                                       if ( !keepData && elem.nodeType === 1 ) {
-                                               jQuery.cleanData( elem.getElementsByTagName("*") );
-                                               jQuery.cleanData( [ elem ] );
-                                       }
+               }
+       },
+
+       simulate: function( type, elem, event, bubble ) {
+               // Piggyback on a donor event to simulate a different one.
+               // Fake originalEvent to avoid donor's stopPropagation, but if the
+               // simulated event prevents default then we do the same on the donor.
+               var e = jQuery.extend(
+                       new jQuery.Event(),
+                       event,
+                       { type: type,
+                               isSimulated: true,
+                               originalEvent: {}
+                       }
+               );
+               if ( bubble ) {
+                       jQuery.event.trigger( e, null, elem );
+               } else {
+                       jQuery.event.dispatch.call( elem, e );
+               }
+               if ( e.isDefaultPrevented() ) {
+                       event.preventDefault();
+               }
+       }
+};
 
-                                       if ( elem.parentNode ) {
-                                               elem.parentNode.removeChild( elem );
-                                       }
-                               }
-                       }
+// Some plugins are using, but it's undocumented/deprecated and will be removed.
+// The 1.7 special event interface should provide all the hooks needed now.
+jQuery.event.handle = jQuery.event.dispatch;
 
-                       return this;
-               },
+jQuery.removeEvent = document.removeEventListener ?
+       function( elem, type, handle ) {
+               if ( elem.removeEventListener ) {
+                       elem.removeEventListener( type, handle, false );
+               }
+       } :
+       function( elem, type, handle ) {
+               var name = "on" + type;
 
-               empty: function() {
-                       for ( var i = 0, elem; (elem = this[i]) != null; i++ ) {
-                               // Remove element nodes and prevent memory leaks
-                               if ( elem.nodeType === 1 ) {
-                                       jQuery.cleanData( elem.getElementsByTagName("*") );
-                               }
+               if ( elem.detachEvent ) {
 
-                               // Remove any remaining nodes
-                               while ( elem.firstChild ) {
-                                       elem.removeChild( elem.firstChild );
-                               }
+                       // #8545, #7054, preventing memory leaks for custom events in IE6-8 –
+                       // detachEvent needed property on element, by name of that event, to properly expose it to GC
+                       if ( typeof elem[ name ] === "undefined" ) {
+                               elem[ name ] = null;
                        }
 
-                       return this;
-               },
+                       elem.detachEvent( name, handle );
+               }
+       };
 
-               clone: function( dataAndEvents, deepDataAndEvents ) {
-                       dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
-                       deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
+jQuery.Event = function( src, props ) {
+       // Allow instantiation without the 'new' keyword
+       if ( !(this instanceof jQuery.Event) ) {
+               return new jQuery.Event( src, props );
+       }
 
-                       return this.map( function () {
-                               return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
-                       });
-               },
+       // Event object
+       if ( src && src.type ) {
+               this.originalEvent = src;
+               this.type = src.type;
 
-               html: function( value ) {
-                       return jQuery.access( this, function( value ) {
-                               var elem = this[0] || {},
-                                       i = 0,
-                                       l = this.length;
+               // Events bubbling up the document may have been marked as prevented
+               // by a handler lower down the tree; reflect the correct value.
+               this.isDefaultPrevented = ( src.defaultPrevented || src.returnValue === false ||
+                       src.getPreventDefault && src.getPreventDefault() ) ? returnTrue : returnFalse;
 
-                               if ( value === undefined ) {
-                                       return elem.nodeType === 1 ?
-                                               elem.innerHTML.replace( rinlinejQuery, "" ) :
-                                               null;
-                               }
+       // Event type
+       } else {
+               this.type = src;
+       }
 
+       // Put explicitly provided properties onto the event object
+       if ( props ) {
+               jQuery.extend( this, props );
+       }
 
-                               if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
-                                       ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
-                                       !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
+       // Create a timestamp if incoming event doesn't have one
+       this.timeStamp = src && src.timeStamp || jQuery.now();
 
-                                       value = value.replace( rxhtmlTag, "<$1></$2>" );
+       // Mark it as fixed
+       this[ jQuery.expando ] = true;
+};
 
-                                       try {
-                                               for (; i < l; i++ ) {
-                                                       // Remove element nodes and prevent memory leaks
-                                                       elem = this[i] || {};
-                                                       if ( elem.nodeType === 1 ) {
-                                                               jQuery.cleanData( elem.getElementsByTagName( "*" ) );
-                                                               elem.innerHTML = value;
-                                                       }
-                                               }
+function returnFalse() {
+       return false;
+}
+function returnTrue() {
+       return true;
+}
 
-                                               elem = 0;
+// jQuery.Event is based on DOM3 Events as specified by the ECMAScript Language Binding
+// http://www.w3.org/TR/2003/WD-DOM-Level-3-Events-20030331/ecma-script-binding.html
+jQuery.Event.prototype = {
+       preventDefault: function() {
+               this.isDefaultPrevented = returnTrue;
 
-                                               // If using innerHTML throws an exception, use the fallback method
-                                       } catch(e) {}
-                               }
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
 
-                               if ( elem ) {
-                                       this.empty().append( value );
-                               }
-                       }, null, value, arguments.length );
-               },
+               // if preventDefault exists run it on the original event
+               if ( e.preventDefault ) {
+                       e.preventDefault();
 
-               replaceWith: function( value ) {
-                       if ( this[0] && this[0].parentNode ) {
-                               // Make sure that the elements are removed from the DOM before they are inserted
-                               // this can help fix replacing a parent with child elements
-                               if ( jQuery.isFunction( value ) ) {
-                                       return this.each(function(i) {
-                                               var self = jQuery(this), old = self.html();
-                                               self.replaceWith( value.call( this, i, old ) );
-                                       });
-                               }
+               // otherwise set the returnValue property of the original event to false (IE)
+               } else {
+                       e.returnValue = false;
+               }
+       },
+       stopPropagation: function() {
+               this.isPropagationStopped = returnTrue;
 
-                               if ( typeof value !== "string" ) {
-                                       value = jQuery( value ).detach();
-                               }
+               var e = this.originalEvent;
+               if ( !e ) {
+                       return;
+               }
+               // if stopPropagation exists run it on the original event
+               if ( e.stopPropagation ) {
+                       e.stopPropagation();
+               }
+               // otherwise set the cancelBubble property of the original event to true (IE)
+               e.cancelBubble = true;
+       },
+       stopImmediatePropagation: function() {
+               this.isImmediatePropagationStopped = returnTrue;
+               this.stopPropagation();
+       },
+       isDefaultPrevented: returnFalse,
+       isPropagationStopped: returnFalse,
+       isImmediatePropagationStopped: returnFalse
+};
 
-                               return this.each(function() {
-                                       var next = this.nextSibling,
-                                               parent = this.parentNode;
+// Create mouseenter/leave events using mouseover/out and event-time checks
+jQuery.each({
+       mouseenter: "mouseover",
+       mouseleave: "mouseout"
+}, function( orig, fix ) {
+       jQuery.event.special[ orig ] = {
+               delegateType: fix,
+               bindType: fix,
+
+               handle: function( event ) {
+                       var ret,
+                               target = this,
+                               related = event.relatedTarget,
+                               handleObj = event.handleObj,
+                               selector = handleObj.selector;
+
+                       // For mousenter/leave call the handler if related is outside the target.
+                       // NB: No relatedTarget if the mouse left/entered the browser window
+                       if ( !related || (related !== target && !jQuery.contains( target, related )) ) {
+                               event.type = handleObj.origType;
+                               ret = handleObj.handler.apply( this, arguments );
+                               event.type = fix;
+                       }
+                       return ret;
+               }
+       };
+});
 
-                                       jQuery( this ).remove();
+// IE submit delegation
+if ( !jQuery.support.submitBubbles ) {
 
-                                       if ( next ) {
-                                               jQuery(next).before( value );
-                                       } else {
-                                               jQuery(parent).append( value );
-                                       }
-                               });
-                       } else {
-                               return this.length ?
-                                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
-                                       this;
+       jQuery.event.special.submit = {
+               setup: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
                        }
-               },
 
-               detach: function( selector ) {
-                       return this.remove( selector, true );
+                       // Lazy-add a submit handler when a descendant form may potentially be submitted
+                       jQuery.event.add( this, "click._submit keypress._submit", function( e ) {
+                               // Node name check avoids a VML-related crash in IE (#9807)
+                               var elem = e.target,
+                                       form = jQuery.nodeName( elem, "input" ) || jQuery.nodeName( elem, "button" ) ? elem.form : undefined;
+                               if ( form && !jQuery._data( form, "_submit_attached" ) ) {
+                                       jQuery.event.add( form, "submit._submit", function( event ) {
+                                               event._submit_bubble = true;
+                                       });
+                                       jQuery._data( form, "_submit_attached", true );
+                               }
+                       });
+                       // return undefined since we don't need an event listener
                },
 
-               domManip: function( args, table, callback ) {
-                       var results, first, fragment, parent,
-                               value = args[0],
-                               scripts = [];
-
-                       // We can't cloneNode fragments that contain checked, in WebKit
-                       if ( !jQuery.support.checkClone && arguments.length === 3 && typeof value === "string" && rchecked.test( value ) ) {
-                               return this.each(function() {
-                                       jQuery(this).domManip( args, table, callback, true );
-                               });
+               postDispatch: function( event ) {
+                       // If form was submitted by the user, bubble the event up the tree
+                       if ( event._submit_bubble ) {
+                               delete event._submit_bubble;
+                               if ( this.parentNode && !event.isTrigger ) {
+                                       jQuery.event.simulate( "submit", this.parentNode, event, true );
+                               }
                        }
+               },
 
-                       if ( jQuery.isFunction(value) ) {
-                               return this.each(function(i) {
-                                       var self = jQuery(this);
-                                       args[0] = value.call(this, i, table ? self.html() : undefined);
-                                       self.domManip( args, table, callback );
-                               });
+               teardown: function() {
+                       // Only need this for delegated form submit events
+                       if ( jQuery.nodeName( this, "form" ) ) {
+                               return false;
                        }
 
-                       if ( this[0] ) {
-                               parent = value && value.parentNode;
-
-                               // If we're in a fragment, just use that instead of building a new one
-                               if ( jQuery.support.parentNode && parent && parent.nodeType === 11 && parent.childNodes.length === this.length ) {
-                                       results = { fragment: parent };
-
-                               } else {
-                                       results = jQuery.buildFragment( args, this, scripts );
-                               }
+                       // Remove delegated handlers; cleanData eventually reaps submit handlers attached above
+                       jQuery.event.remove( this, "._submit" );
+               }
+       };
+}
 
-                               fragment = results.fragment;
+// IE change delegation and checkbox/radio fix
+if ( !jQuery.support.changeBubbles ) {
 
-                               if ( fragment.childNodes.length === 1 ) {
-                                       first = fragment = fragment.firstChild;
-                               } else {
-                                       first = fragment.firstChild;
-                               }
+       jQuery.event.special.change = {
 
-                               if ( first ) {
-                                       table = table && jQuery.nodeName( first, "tr" );
-
-                                       for ( var i = 0, l = this.length, lastIndex = l - 1; i < l; i++ ) {
-                                               callback.call(
-                                                       table ?
-                                                               root(this[i], first) :
-                                                               this[i],
-                                                       // Make sure that we do not leak memory by inadvertently discarding
-                                                       // the original fragment (which might have attached data) instead of
-                                                       // using it; in addition, use the original fragment object for the last
-                                                       // item instead of first because it can end up being emptied incorrectly
-                                                       // in certain situations (Bug #8070).
-                                                       // Fragments from the fragment cache must always be cloned and never used
-                                                       // in place.
-                                                       results.cacheable || ( l > 1 && i < lastIndex ) ?
-                                                               jQuery.clone( fragment, true, true ) :
-                                                               fragment
-                                               );
-                                       }
-                               }
+               setup: function() {
 
-                               if ( scripts.length ) {
-                                       jQuery.each( scripts, function( i, elem ) {
-                                               if ( elem.src ) {
-                                                       jQuery.ajax({
-                                                               type: "GET",
-                                                               global: false,
-                                                               url: elem.src,
-                                                               async: false,
-                                                               dataType: "script"
-                                                       });
-                                               } else {
-                                                       jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "/*$0*/" ) );
+                       if ( rformElems.test( this.nodeName ) ) {
+                               // IE doesn't fire change on a check/radio until blur; trigger it on click
+                               // after a propertychange. Eat the blur-change in special.change.handle.
+                               // This still fires onchange a second time for check/radio after blur.
+                               if ( this.type === "checkbox" || this.type === "radio" ) {
+                                       jQuery.event.add( this, "propertychange._change", function( event ) {
+                                               if ( event.originalEvent.propertyName === "checked" ) {
+                                                       this._just_changed = true;
                                                }
-
-                                               if ( elem.parentNode ) {
-                                                       elem.parentNode.removeChild( elem );
+                                       });
+                                       jQuery.event.add( this, "click._change", function( event ) {
+                                               if ( this._just_changed && !event.isTrigger ) {
+                                                       this._just_changed = false;
                                                }
+                                               // Allow triggered, simulated change events (#11500)
+                                               jQuery.event.simulate( "change", this, event, true );
                                        });
                                }
+                               return false;
                        }
+                       // Delegated event; lazy-add a change handler on descendant inputs
+                       jQuery.event.add( this, "beforeactivate._change", function( e ) {
+                               var elem = e.target;
 
-                       return this;
-               }
-       });
+                               if ( rformElems.test( elem.nodeName ) && !jQuery._data( elem, "_change_attached" ) ) {
+                                       jQuery.event.add( elem, "change._change", function( event ) {
+                                               if ( this.parentNode && !event.isSimulated && !event.isTrigger ) {
+                                                       jQuery.event.simulate( "change", this.parentNode, event, true );
+                                               }
+                                       });
+                                       jQuery._data( elem, "_change_attached", true );
+                               }
+                       });
+               },
 
-       function root( elem, cur ) {
-               return jQuery.nodeName(elem, "table") ?
-                       (elem.getElementsByTagName("tbody")[0] ||
-                               elem.appendChild(elem.ownerDocument.createElement("tbody"))) :
-                       elem;
-       }
+               handle: function( event ) {
+                       var elem = event.target;
+
+                       // Swallow native change events from checkbox/radio, we already triggered them above
+                       if ( this !== elem || event.isSimulated || event.isTrigger || (elem.type !== "radio" && elem.type !== "checkbox") ) {
+                               return event.handleObj.handler.apply( this, arguments );
+                       }
+               },
 
-       function cloneCopyEvent( src, dest ) {
+               teardown: function() {
+                       jQuery.event.remove( this, "._change" );
 
-               if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
-                       return;
+                       return !rformElems.test( this.nodeName );
                }
+       };
+}
 
-               var type, i, l,
-                       oldData = jQuery._data( src ),
-                       curData = jQuery._data( dest, oldData ),
-                       events = oldData.events;
+// Create "bubbling" focus and blur events
+if ( !jQuery.support.focusinBubbles ) {
+       jQuery.each({ focus: "focusin", blur: "focusout" }, function( orig, fix ) {
 
-               if ( events ) {
-                       delete curData.handle;
-                       curData.events = {};
+               // Attach a single capturing handler while someone wants focusin/focusout
+               var attaches = 0,
+                       handler = function( event ) {
+                               jQuery.event.simulate( fix, event.target, jQuery.event.fix( event ), true );
+                       };
 
-                       for ( type in events ) {
-                               for ( i = 0, l = events[ type ].length; i < l; i++ ) {
-                                       jQuery.event.add( dest, type, events[ type ][ i ] );
+               jQuery.event.special[ fix ] = {
+                       setup: function() {
+                               if ( attaches++ === 0 ) {
+                                       document.addEventListener( orig, handler, true );
+                               }
+                       },
+                       teardown: function() {
+                               if ( --attaches === 0 ) {
+                                       document.removeEventListener( orig, handler, true );
                                }
                        }
-               }
-
-               // make the cloned public data object a copy from the original
-               if ( curData.data ) {
-                       curData.data = jQuery.extend( {}, curData.data );
-               }
-       }
-
-       function cloneFixAttributes( src, dest ) {
-               var nodeName;
-
-               // We do not need to do anything for non-Elements
-               if ( dest.nodeType !== 1 ) {
-                       return;
-               }
-
-               // clearAttributes removes the attributes, which we don't want,
-               // but also removes the attachEvent events, which we *do* want
-               if ( dest.clearAttributes ) {
-                       dest.clearAttributes();
-               }
-
-               // mergeAttributes, in contrast, only merges back on the
-               // original attributes, not the events
-               if ( dest.mergeAttributes ) {
-                       dest.mergeAttributes( src );
-               }
+               };
+       });
+}
 
-               nodeName = dest.nodeName.toLowerCase();
+jQuery.fn.extend({
 
-               // IE6-8 fail to clone children inside object elements that use
-               // the proprietary classid attribute value (rather than the type
-               // attribute) to identify the type of content to display
-               if ( nodeName === "object" ) {
-                       dest.outerHTML = src.outerHTML;
+       on: function( types, selector, data, fn, /*INTERNAL*/ one ) {
+               var origFn, type;
 
-               } else if ( nodeName === "input" && (src.type === "checkbox" || src.type === "radio") ) {
-                       // IE6-8 fails to persist the checked state of a cloned checkbox
-                       // or radio button. Worse, IE6-7 fail to give the cloned element
-                       // a checked appearance if the defaultChecked value isn't also set
-                       if ( src.checked ) {
-                               dest.defaultChecked = dest.checked = src.checked;
+               // Types can be a map of types/handlers
+               if ( typeof types === "object" ) {
+                       // ( types-Object, selector, data )
+                       if ( typeof selector !== "string" ) { // && selector != null
+                               // ( types-Object, data )
+                               data = data || selector;
+                               selector = undefined;
                        }
-
-                       // IE6-7 get confused and end up setting the value of a cloned
-                       // checkbox/radio button to an empty string instead of "on"
-                       if ( dest.value !== src.value ) {
-                               dest.value = src.value;
+                       for ( type in types ) {
+                               this.on( type, selector, data, types[ type ], one );
                        }
-
-                       // IE6-8 fails to return the selected option to the default selected
-                       // state when cloning options
-               } else if ( nodeName === "option" ) {
-                       dest.selected = src.defaultSelected;
-
-                       // IE6-8 fails to set the defaultValue to the correct value when
-                       // cloning other types of input fields
-               } else if ( nodeName === "input" || nodeName === "textarea" ) {
-                       dest.defaultValue = src.defaultValue;
-
-                       // IE blanks contents when cloning scripts
-               } else if ( nodeName === "script" && dest.text !== src.text ) {
-                       dest.text = src.text;
+                       return this;
                }
 
-               // Event data gets referenced instead of copied if the expando
-               // gets copied too
-               dest.removeAttribute( jQuery.expando );
-
-               // Clear flags for bubbling special change/submit events, they must
-               // be reattached when the newly cloned events are first activated
-               dest.removeAttribute( "_submit_attached" );
-               dest.removeAttribute( "_change_attached" );
-       }
-
-       jQuery.buildFragment = function( args, nodes, scripts ) {
-               var fragment, cacheable, cacheresults, doc,
-                       first = args[ 0 ];
-
-               // nodes may contain either an explicit document object,
-               // a jQuery collection or context object.
-               // If nodes[0] contains a valid object to assign to doc
-               if ( nodes && nodes[0] ) {
-                       doc = nodes[0].ownerDocument || nodes[0];
+               if ( data == null && fn == null ) {
+                       // ( types, fn )
+                       fn = selector;
+                       data = selector = undefined;
+               } else if ( fn == null ) {
+                       if ( typeof selector === "string" ) {
+                               // ( types, selector, fn )
+                               fn = data;
+                               data = undefined;
+                       } else {
+                               // ( types, data, fn )
+                               fn = data;
+                               data = selector;
+                               selector = undefined;
+                       }
                }
-
-               // Ensure that an attr object doesn't incorrectly stand in as a document object
-               // Chrome and Firefox seem to allow this to occur and will throw exception
-               // Fixes #8950
-               if ( !doc.createDocumentFragment ) {
-                       doc = document;
+               if ( fn === false ) {
+                       fn = returnFalse;
+               } else if ( !fn ) {
+                       return this;
                }
 
-               // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
-               // Cloning options loses the selected state, so don't cache them
-               // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
-               // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
-               // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
-               if ( args.length === 1 && typeof first === "string" && first.length < 512 && doc === document &&
-                       first.charAt(0) === "<" && !rnocache.test( first ) &&
-                       (jQuery.support.checkClone || !rchecked.test( first )) &&
-                       (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
-
-                       cacheable = true;
-
-                       cacheresults = jQuery.fragments[ first ];
-                       if ( cacheresults && cacheresults !== 1 ) {
-                               fragment = cacheresults;
+               if ( one === 1 ) {
+                       origFn = fn;
+                       fn = function( event ) {
+                               // Can use an empty set, since event contains the info
+                               jQuery().off( event );
+                               return origFn.apply( this, arguments );
+                       };
+                       // Use same guid so caller can remove using origFn
+                       fn.guid = origFn.guid || ( origFn.guid = jQuery.guid++ );
+               }
+               return this.each( function() {
+                       jQuery.event.add( this, types, fn, data, selector );
+               });
+       },
+       one: function( types, selector, data, fn ) {
+               return this.on( types, selector, data, fn, 1 );
+       },
+       off: function( types, selector, fn ) {
+               var handleObj, type;
+               if ( types && types.preventDefault && types.handleObj ) {
+                       // ( event )  dispatched jQuery.Event
+                       handleObj = types.handleObj;
+                       jQuery( types.delegateTarget ).off(
+                               handleObj.namespace ? handleObj.origType + "." + handleObj.namespace : handleObj.origType,
+                               handleObj.selector,
+                               handleObj.handler
+                       );
+                       return this;
+               }
+               if ( typeof types === "object" ) {
+                       // ( types-object [, selector] )
+                       for ( type in types ) {
+                               this.off( type, selector, types[ type ] );
                        }
+                       return this;
                }
-
-               if ( !fragment ) {
-                       fragment = doc.createDocumentFragment();
-                       jQuery.clean( args, doc, fragment, scripts );
+               if ( selector === false || typeof selector === "function" ) {
+                       // ( types [, fn] )
+                       fn = selector;
+                       selector = undefined;
                }
-
-               if ( cacheable ) {
-                       jQuery.fragments[ first ] = cacheresults ? fragment : 1;
+               if ( fn === false ) {
+                       fn = returnFalse;
                }
+               return this.each(function() {
+                       jQuery.event.remove( this, types, fn, selector );
+               });
+       },
+
+       bind: function( types, data, fn ) {
+               return this.on( types, null, data, fn );
+       },
+       unbind: function( types, fn ) {
+               return this.off( types, null, fn );
+       },
+
+       live: function( types, data, fn ) {
+               jQuery( this.context ).on( types, this.selector, data, fn );
+               return this;
+       },
+       die: function( types, fn ) {
+               jQuery( this.context ).off( types, this.selector || "**", fn );
+               return this;
+       },
+
+       delegate: function( selector, types, data, fn ) {
+               return this.on( types, selector, data, fn );
+       },
+       undelegate: function( selector, types, fn ) {
+               // ( namespace ) or ( selector, types [, fn] )
+               return arguments.length == 1? this.off( selector, "**" ) : this.off( types, selector || "**", fn );
+       },
+
+       trigger: function( type, data ) {
+               return this.each(function() {
+                       jQuery.event.trigger( type, data, this );
+               });
+       },
+       triggerHandler: function( type, data ) {
+               if ( this[0] ) {
+                       return jQuery.event.trigger( type, data, this[0], true );
+               }
+       },
 
-               return { fragment: fragment, cacheable: cacheable };
-       };
-
-       jQuery.fragments = {};
-
-       jQuery.each({
-               appendTo: "append",
-               prependTo: "prepend",
-               insertBefore: "before",
-               insertAfter: "after",
-               replaceAll: "replaceWith"
-       }, function( name, original ) {
-               jQuery.fn[ name ] = function( selector ) {
-                       var ret = [],
-                               insert = jQuery( selector ),
-                               parent = this.length === 1 && this[0].parentNode;
-
-                       if ( parent && parent.nodeType === 11 && parent.childNodes.length === 1 && insert.length === 1 ) {
-                               insert[ original ]( this[0] );
-                               return this;
+       toggle: function( fn ) {
+               // Save reference to arguments for access in closure
+               var args = arguments,
+                       guid = fn.guid || jQuery.guid++,
+                       i = 0,
+                       toggler = function( event ) {
+                               // Figure out which function to execute
+                               var lastToggle = ( jQuery._data( this, "lastToggle" + fn.guid ) || 0 ) % i;
+                               jQuery._data( this, "lastToggle" + fn.guid, lastToggle + 1 );
 
-                       } else {
-                               for ( var i = 0, l = insert.length; i < l; i++ ) {
-                                       var elems = ( i > 0 ? this.clone(true) : this ).get();
-                                       jQuery( insert[i] )[ original ]( elems );
-                                       ret = ret.concat( elems );
-                               }
+                               // Make sure that clicks stop
+                               event.preventDefault();
 
-                               return this.pushStack( ret, name, insert.selector );
-                       }
-               };
-       });
+                               // and execute the function
+                               return args[ lastToggle ].apply( this, arguments ) || false;
+                       };
 
-       function getAll( elem ) {
-               if ( typeof elem.getElementsByTagName !== "undefined" ) {
-                       return elem.getElementsByTagName( "*" );
+               // link all the functions, so any of them can unbind this click handler
+               toggler.guid = guid;
+               while ( i < args.length ) {
+                       args[ i++ ].guid = guid;
+               }
 
-               } else if ( typeof elem.querySelectorAll !== "undefined" ) {
-                       return elem.querySelectorAll( "*" );
+               return this.click( toggler );
+       },
 
-               } else {
-                       return [];
-               }
+       hover: function( fnOver, fnOut ) {
+               return this.mouseenter( fnOver ).mouseleave( fnOut || fnOver );
        }
+});
 
-// Used in clean, fixes the defaultChecked property
-       function fixDefaultChecked( elem ) {
-               if ( elem.type === "checkbox" || elem.type === "radio" ) {
-                       elem.defaultChecked = elem.checked;
-               }
-       }
-// Finds all inputs and passes them to fixDefaultChecked
-       function findInputs( elem ) {
-               var nodeName = ( elem.nodeName || "" ).toLowerCase();
-               if ( nodeName === "input" ) {
-                       fixDefaultChecked( elem );
-                       // Skip scripts, get other children
-               } else if ( nodeName !== "script" && typeof elem.getElementsByTagName !== "undefined" ) {
-                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+jQuery.each( ("blur focus focusin focusout load resize scroll unload click dblclick " +
+       "mousedown mouseup mousemove mouseover mouseout mouseenter mouseleave " +
+       "change select submit keydown keypress keyup error contextmenu").split(" "), function( i, name ) {
+
+       // Handle event binding
+       jQuery.fn[ name ] = function( data, fn ) {
+               if ( fn == null ) {
+                       fn = data;
+                       data = null;
                }
-       }
 
-// Derived From: http://www.iecss.com/shimprove/javascript/shimprove.1-0-1.js
-       function shimCloneNode( elem ) {
-               var div = document.createElement( "div" );
-               safeFragment.appendChild( div );
+               return arguments.length > 0 ?
+                       this.on( name, null, data, fn ) :
+                       this.trigger( name );
+       };
 
-               div.innerHTML = elem.outerHTML;
-               return div.firstChild;
+       if ( rkeyEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.keyHooks;
        }
 
-       jQuery.extend({
-               clone: function( elem, dataAndEvents, deepDataAndEvents ) {
-                       var srcElements,
-                               destElements,
-                               i,
-                       // IE<=8 does not properly clone detached, unknown element nodes
-                               clone = jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ?
-                                       elem.cloneNode( true ) :
-                                       shimCloneNode( elem );
-
-                       if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
-                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
-                               // IE copies events bound via attachEvent when using cloneNode.
-                               // Calling detachEvent on the clone will also remove the events
-                               // from the original. In order to get around this, we use some
-                               // proprietary methods to clear the events. Thanks to MooTools
-                               // guys for this hotness.
-
-                               cloneFixAttributes( elem, clone );
+       if ( rmouseEvent.test( name ) ) {
+               jQuery.event.fixHooks[ name ] = jQuery.event.mouseHooks;
+       }
+});
+/*!\r
+ * Sizzle CSS Selector Engine\r
+ *  Copyright 2012 jQuery Foundation and other contributors\r
+ *  Released under the MIT license\r
+ *  http://sizzlejs.com/\r
+ */\r
+(function( window, undefined ) {\r
+\r
+var dirruns,\r
+       cachedruns,\r
+       assertGetIdNotName,\r
+       Expr,\r
+       getText,\r
+       isXML,\r
+       contains,\r
+       compile,\r
+       sortOrder,\r
+       hasDuplicate,\r
+\r
+       baseHasDuplicate = true,\r
+       strundefined = "undefined",\r
+\r
+       expando = ( "sizcache" + Math.random() ).replace( ".", "" ),\r
+\r
+       document = window.document,\r
+       docElem = document.documentElement,\r
+       done = 0,\r
+       slice = [].slice,\r
+       push = [].push,\r
+\r
+       // Augment a function for special use by Sizzle\r
+       markFunction = function( fn, value ) {\r
+               fn[ expando ] = value || true;\r
+               return fn;\r
+       },\r
+\r
+       createCache = function() {\r
+               var cache = {},\r
+                       keys = [];\r
+\r
+               return markFunction(function( key, value ) {\r
+                       // Only keep the most recent entries\r
+                       if ( keys.push( key ) > Expr.cacheLength ) {\r
+                               delete cache[ keys.shift() ];\r
+                       }\r
+\r
+                       return (cache[ key ] = value);\r
+               }, cache );\r
+       },\r
+\r
+       classCache = createCache(),\r
+       tokenCache = createCache(),\r
+       compilerCache = createCache(),\r
+\r
+       // Regex\r
+\r
+       // Whitespace characters http://www.w3.org/TR/css3-selectors/#whitespace\r
+       whitespace = "[\\x20\\t\\r\\n\\f]",\r
+       // http://www.w3.org/TR/css3-syntax/#characters\r
+       characterEncoding = "(?:\\\\.|[-\\w]|[^\\x00-\\xa0])+",\r
+\r
+       // Loosely modeled on CSS identifier characters\r
+       // An unquoted value should be a CSS identifier (http://www.w3.org/TR/css3-selectors/#attribute-selectors)\r
+       // Proper syntax: http://www.w3.org/TR/CSS21/syndata.html#value-def-identifier\r
+       identifier = characterEncoding.replace( "w", "w#" ),\r
+\r
+       // Acceptable operators http://www.w3.org/TR/selectors/#attribute-selectors\r
+       operators = "([*^$|!~]?=)",\r
+       attributes = "\\[" + whitespace + "*(" + characterEncoding + ")" + whitespace +\r
+               "*(?:" + operators + whitespace + "*(?:(['\"])((?:\\\\.|[^\\\\])*?)\\3|(" + identifier + ")|)|)" + whitespace + "*\\]",\r
+\r
+       // Prefer arguments not in parens/brackets,\r
+       //   then attribute selectors and non-pseudos (denoted by :),\r
+       //   then anything else\r
+       // These preferences are here to reduce the number of selectors\r
+       //   needing tokenize in the PSEUDO preFilter\r
+       pseudos = ":(" + characterEncoding + ")(?:\\((?:(['\"])((?:\\\\.|[^\\\\])*?)\\2|([^()[\\]]*|(?:(?:" + attributes + ")|[^:]|\\\\.)*|.*))\\)|)",\r
+\r
+       // For matchExpr.POS and matchExpr.needsContext\r
+       pos = ":(nth|eq|gt|lt|first|last|even|odd)(?:\\(((?:-\\d)?\\d*)\\)|)(?=[^-]|$)",\r
+\r
+       // Leading and non-escaped trailing whitespace, capturing some non-whitespace characters preceding the latter\r
+       rtrim = new RegExp( "^" + whitespace + "+|((?:^|[^\\\\])(?:\\\\.)*)" + whitespace + "+$", "g" ),\r
+\r
+       rcomma = new RegExp( "^" + whitespace + "*," + whitespace + "*" ),\r
+       rcombinators = new RegExp( "^" + whitespace + "*([\\x20\\t\\r\\n\\f>+~])" + whitespace + "*" ),\r
+       rpseudo = new RegExp( pseudos ),\r
+\r
+       // Easily-parseable/retrievable ID or TAG or CLASS selectors\r
+       rquickExpr = /^(?:#([\w\-]+)|(\w+)|\.([\w\-]+))$/,\r
+\r
+       rnot = /^:not/,\r
+       rsibling = /[\x20\t\r\n\f]*[+~]/,\r
+       rendsWithNot = /:not\($/,\r
+\r
+       rheader = /h\d/i,\r
+       rinputs = /input|select|textarea|button/i,\r
+\r
+       rbackslash = /\\(?!\\)/g,\r
+\r
+       matchExpr = {\r
+               "ID": new RegExp( "^#(" + characterEncoding + ")" ),\r
+               "CLASS": new RegExp( "^\\.(" + characterEncoding + ")" ),\r
+               "NAME": new RegExp( "^\\[name=['\"]?(" + characterEncoding + ")['\"]?\\]" ),\r
+               "TAG": new RegExp( "^(" + characterEncoding.replace( "w", "w*" ) + ")" ),\r
+               "ATTR": new RegExp( "^" + attributes ),\r
+               "PSEUDO": new RegExp( "^" + pseudos ),\r
+               "CHILD": new RegExp( "^:(only|nth|last|first)-child(?:\\(" + whitespace +\r
+                       "*(even|odd|(([+-]|)(\\d*)n|)" + whitespace + "*(?:([+-]|)" + whitespace +\r
+                       "*(\\d+)|))" + whitespace + "*\\)|)", "i" ),\r
+               "POS": new RegExp( pos, "ig" ),\r
+               // For use in libraries implementing .is()\r
+               "needsContext": new RegExp( "^" + whitespace + "*[>+~]|" + pos, "i" )\r
+       },\r
+\r
+       // Support\r
+\r
+       // Used for testing something on an element\r
+       assert = function( fn ) {\r
+               var div = document.createElement("div");\r
+\r
+               try {\r
+                       return fn( div );\r
+               } catch (e) {\r
+                       return false;\r
+               } finally {\r
+                       // release memory in IE\r
+                       div = null;\r
+               }\r
+       },\r
+\r
+       // Check if getElementsByTagName("*") returns only elements\r
+       assertTagNameNoComments = assert(function( div ) {\r
+               div.appendChild( document.createComment("") );\r
+               return !div.getElementsByTagName("*").length;\r
+       }),\r
+\r
+       // Check if getAttribute returns normalized href attributes\r
+       assertHrefNotNormalized = assert(function( div ) {\r
+               div.innerHTML = "<a href='#'></a>";\r
+               return div.firstChild && typeof div.firstChild.getAttribute !== strundefined &&\r
+                       div.firstChild.getAttribute("href") === "#";\r
+       }),\r
+\r
+       // Check if attributes should be retrieved by attribute nodes\r
+       assertAttributes = assert(function( div ) {\r
+               div.innerHTML = "<select></select>";\r
+               var type = typeof div.lastChild.getAttribute("multiple");\r
+               // IE8 returns a string for some attributes even when not present\r
+               return type !== "boolean" && type !== "string";\r
+       }),\r
+\r
+       // Check if getElementsByClassName can be trusted\r
+       assertUsableClassName = assert(function( div ) {\r
+               // Opera can't find a second classname (in 9.6)\r
+               div.innerHTML = "<div class='hidden e'></div><div class='hidden'></div>";\r
+               if ( !div.getElementsByClassName || !div.getElementsByClassName("e").length ) {\r
+                       return false;\r
+               }\r
+\r
+               // Safari 3.2 caches class attributes and doesn't catch changes\r
+               div.lastChild.className = "e";\r
+               return div.getElementsByClassName("e").length === 2;\r
+       }),\r
+\r
+       // Check if getElementById returns elements by name\r
+       // Check if getElementsByName privileges form controls or returns elements by ID\r
+       assertUsableName = assert(function( div ) {\r
+               // Inject content\r
+               div.id = expando + 0;\r
+               div.innerHTML = "<a name='" + expando + "'></a><div name='" + expando + "'></div>";\r
+               docElem.insertBefore( div, docElem.firstChild );\r
+\r
+               // Test\r
+               var pass = document.getElementsByName &&\r
+                       // buggy browsers will return fewer than the correct 2\r
+                       document.getElementsByName( expando ).length === 2 +\r
+                       // buggy browsers will return more than the correct 0\r
+                       document.getElementsByName( expando + 0 ).length;\r
+               assertGetIdNotName = !document.getElementById( expando );\r
+\r
+               // Cleanup\r
+               docElem.removeChild( div );\r
+\r
+               return pass;\r
+       });\r
+\r
+// If slice is not available, provide a backup\r
+try {\r
+       slice.call( docElem.childNodes, 0 )[0].nodeType;\r
+} catch ( e ) {\r
+       slice = function( i ) {\r
+               var elem, results = [];\r
+               for ( ; (elem = this[i]); i++ ) {\r
+                       results.push( elem );\r
+               }\r
+               return results;\r
+       };\r
+}\r
+\r
+function Sizzle( selector, context, results, seed ) {\r
+       results = results || [];\r
+       context = context || document;\r
+       var match, elem, xml, m,\r
+               nodeType = context.nodeType;\r
+\r
+       if ( nodeType !== 1 && nodeType !== 9 ) {\r
+               return [];\r
+       }\r
+\r
+       if ( !selector || typeof selector !== "string" ) {\r
+               return results;\r
+       }\r
+\r
+       xml = isXML( context );\r
+\r
+       if ( !xml && !seed ) {\r
+               if ( (match = rquickExpr.exec( selector )) ) {\r
+                       // Speed-up: Sizzle("#ID")\r
+                       if ( (m = match[1]) ) {\r
+                               if ( nodeType === 9 ) {\r
+                                       elem = context.getElementById( m );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       if ( elem && elem.parentNode ) {\r
+                                               // Handle the case where IE, Opera, and Webkit return items\r
+                                               // by name instead of ID\r
+                                               if ( elem.id === m ) {\r
+                                                       results.push( elem );\r
+                                                       return results;\r
+                                               }\r
+                                       } else {\r
+                                               return results;\r
+                                       }\r
+                               } else {\r
+                                       // Context is not a document\r
+                                       if ( context.ownerDocument && (elem = context.ownerDocument.getElementById( m )) &&\r
+                                               contains( context, elem ) && elem.id === m ) {\r
+                                               results.push( elem );\r
+                                               return results;\r
+                                       }\r
+                               }\r
+\r
+                       // Speed-up: Sizzle("TAG")\r
+                       } else if ( match[2] ) {\r
+                               push.apply( results, slice.call(context.getElementsByTagName( selector ), 0) );\r
+                               return results;\r
+\r
+                       // Speed-up: Sizzle(".CLASS")\r
+                       } else if ( (m = match[3]) && assertUsableClassName && context.getElementsByClassName ) {\r
+                               push.apply( results, slice.call(context.getElementsByClassName( m ), 0) );\r
+                               return results;\r
+                       }\r
+               }\r
+       }\r
+\r
+       // All others\r
+       return select( selector, context, results, seed, xml );\r
+}\r
+\r
+Sizzle.matches = function( expr, elements ) {\r
+       return Sizzle( expr, null, null, elements );\r
+};\r
+\r
+Sizzle.matchesSelector = function( elem, expr ) {\r
+       return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+};\r
+\r
+// Returns a function to use in pseudos for input types\r
+function createInputPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return name === "input" && elem.type === type;\r
+       };\r
+}\r
+\r
+// Returns a function to use in pseudos for buttons\r
+function createButtonPseudo( type ) {\r
+       return function( elem ) {\r
+               var name = elem.nodeName.toLowerCase();\r
+               return (name === "input" || name === "button") && elem.type === type;\r
+       };\r
+}\r
+\r
+/**\r
+ * Utility function for retrieving the text value of an array of DOM nodes\r
+ * @param {Array|Element} elem\r
+ */\r
+getText = Sizzle.getText = function( elem ) {\r
+       var node,\r
+               ret = "",\r
+               i = 0,\r
+               nodeType = elem.nodeType;\r
+\r
+       if ( nodeType ) {\r
+               if ( nodeType === 1 || nodeType === 9 || nodeType === 11 ) {\r
+                       // Use textContent for elements\r
+                       // innerText usage removed for consistency of new lines (see #11153)\r
+                       if ( typeof elem.textContent === "string" ) {\r
+                               return elem.textContent;\r
+                       } else {\r
+                               // Traverse its children\r
+                               for ( elem = elem.firstChild; elem; elem = elem.nextSibling ) {\r
+                                       ret += getText( elem );\r
+                               }\r
+                       }\r
+               } else if ( nodeType === 3 || nodeType === 4 ) {\r
+                       return elem.nodeValue;\r
+               }\r
+               // Do not include comment or processing instruction nodes\r
+       } else {\r
+\r
+               // If no nodeType, this is expected to be an array\r
+               for ( ; (node = elem[i]); i++ ) {\r
+                       // Do not traverse comment nodes\r
+                       ret += getText( node );\r
+               }\r
+       }\r
+       return ret;\r
+};\r
+\r
+isXML = Sizzle.isXML = function isXML( elem ) {\r
+       // documentElement is verified for cases where it doesn't yet exist\r
+       // (such as loading iframes in IE - #4833)\r
+       var documentElement = elem && (elem.ownerDocument || elem).documentElement;\r
+       return documentElement ? documentElement.nodeName !== "HTML" : false;\r
+};\r
+\r
+// Element contains another\r
+contains = Sizzle.contains = docElem.contains ?\r
+       function( a, b ) {\r
+               var adown = a.nodeType === 9 ? a.documentElement : a,\r
+                       bup = b && b.parentNode;\r
+               return a === bup || !!( bup && bup.nodeType === 1 && adown.contains && adown.contains(bup) );\r
+       } :\r
+       docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               return b && !!( a.compareDocumentPosition( b ) & 16 );\r
+       } :\r
+       function( a, b ) {\r
+               while ( (b = b.parentNode) ) {\r
+                       if ( b === a ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+\r
+Sizzle.attr = function( elem, name ) {\r
+       var attr,\r
+               xml = isXML( elem );\r
+\r
+       if ( !xml ) {\r
+               name = name.toLowerCase();\r
+       }\r
+       if ( Expr.attrHandle[ name ] ) {\r
+               return Expr.attrHandle[ name ]( elem );\r
+       }\r
+       if ( assertAttributes || xml ) {\r
+               return elem.getAttribute( name );\r
+       }\r
+       attr = elem.getAttributeNode( name );\r
+       return attr ?\r
+               typeof elem[ name ] === "boolean" ?\r
+                       elem[ name ] ? name : null :\r
+                       attr.specified ? attr.value : null :\r
+               null;\r
+};\r
+\r
+Expr = Sizzle.selectors = {\r
+\r
+       // Can be adjusted by the user\r
+       cacheLength: 50,\r
+\r
+       createPseudo: markFunction,\r
+\r
+       match: matchExpr,\r
+\r
+       order: new RegExp( "ID|TAG" +\r
+               (assertUsableName ? "|NAME" : "") +\r
+               (assertUsableClassName ? "|CLASS" : "")\r
+       ),\r
+\r
+       // IE6/7 return a modified href\r
+       attrHandle: assertHrefNotNormalized ?\r
+               {} :\r
+               {\r
+                       "href": function( elem ) {\r
+                               return elem.getAttribute( "href", 2 );\r
+                       },\r
+                       "type": function( elem ) {\r
+                               return elem.getAttribute("type");\r
+                       }\r
+               },\r
+\r
+       find: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+                                       // Check parentNode to catch when Blackberry 4.6 returns\r
+                                       // nodes that are no longer in the document #6963\r
+                                       return m && m.parentNode ? [m] : [];\r
+                               }\r
+                       } :\r
+                       function( id, context, xml ) {\r
+                               if ( typeof context.getElementById !== strundefined && !xml ) {\r
+                                       var m = context.getElementById( id );\r
+\r
+                                       return m ?\r
+                                               m.id === id || typeof m.getAttributeNode !== strundefined && m.getAttributeNode("id").value === id ?\r
+                                                       [m] :\r
+                                                       undefined :\r
+                                               [];\r
+                               }\r
+                       },\r
+\r
+               "TAG": assertTagNameNoComments ?\r
+                       function( tag, context ) {\r
+                               if ( typeof context.getElementsByTagName !== strundefined ) {\r
+                                       return context.getElementsByTagName( tag );\r
+                               }\r
+                       } :\r
+                       function( tag, context ) {\r
+                               var results = context.getElementsByTagName( tag );\r
+\r
+                               // Filter out possible comments\r
+                               if ( tag === "*" ) {\r
+                                       var elem,\r
+                                               tmp = [],\r
+                                               i = 0;\r
+\r
+                                       for ( ; (elem = results[i]); i++ ) {\r
+                                               if ( elem.nodeType === 1 ) {\r
+                                                       tmp.push( elem );\r
+                                               }\r
+                                       }\r
+\r
+                                       return tmp;\r
+                               }\r
+                               return results;\r
+                       },\r
+\r
+               "NAME": function( tag, context ) {\r
+                       if ( typeof context.getElementsByName !== strundefined ) {\r
+                               return context.getElementsByName( name );\r
+                       }\r
+               },\r
+\r
+               "CLASS": function( className, context, xml ) {\r
+                       if ( typeof context.getElementsByClassName !== strundefined && !xml ) {\r
+                               return context.getElementsByClassName( className );\r
+                       }\r
+               }\r
+       },\r
+\r
+       relative: {\r
+               ">": { dir: "parentNode", first: true },\r
+               " ": { dir: "parentNode" },\r
+               "+": { dir: "previousSibling", first: true },\r
+               "~": { dir: "previousSibling" }\r
+       },\r
+\r
+       preFilter: {\r
+               "ATTR": function( match ) {\r
+                       match[1] = match[1].replace( rbackslash, "" );\r
+\r
+                       // Move the given value to match[3] whether quoted or unquoted\r
+                       match[3] = ( match[4] || match[5] || "" ).replace( rbackslash, "" );\r
+\r
+                       if ( match[2] === "~=" ) {\r
+                               match[3] = " " + match[3] + " ";\r
+                       }\r
+\r
+                       return match.slice( 0, 4 );\r
+               },\r
+\r
+               "CHILD": function( match ) {\r
+                       /* matches from matchExpr.CHILD\r
+                               1 type (only|nth|...)\r
+                               2 argument (even|odd|\d*|\d*n([+-]\d+)?|...)\r
+                               3 xn-component of xn+y argument ([+-]?\d*n|)\r
+                               4 sign of xn-component\r
+                               5 x of xn-component\r
+                               6 sign of y-component\r
+                               7 y of y-component\r
+                       */\r
+                       match[1] = match[1].toLowerCase();\r
+\r
+                       if ( match[1] === "nth" ) {\r
+                               // nth-child requires argument\r
+                               if ( !match[2] ) {\r
+                                       Sizzle.error( match[0] );\r
+                               }\r
+\r
+                               // numeric x and y parameters for Expr.filter.CHILD\r
+                               // remember that false/true cast respectively to 0/1\r
+                               match[3] = +( match[3] ? match[4] + (match[5] || 1) : 2 * ( match[2] === "even" || match[2] === "odd" ) );\r
+                               match[4] = +( ( match[6] + match[7] ) || match[2] === "odd" );\r
+\r
+                       // other types prohibit arguments\r
+                       } else if ( match[2] ) {\r
+                               Sizzle.error( match[0] );\r
+                       }\r
+\r
+                       return match;\r
+               },\r
+\r
+               "PSEUDO": function( match, context, xml ) {\r
+                       var unquoted, excess;\r
+                       if ( matchExpr["CHILD"].test( match[0] ) ) {\r
+                               return null;\r
+                       }\r
+\r
+                       if ( match[3] ) {\r
+                               match[2] = match[3];\r
+                       } else if ( (unquoted = match[4]) ) {\r
+                               // Only check arguments that contain a pseudo\r
+                               if ( rpseudo.test(unquoted) &&\r
+                                       // Get excess from tokenize (recursively)\r
+                                       (excess = tokenize( unquoted, context, xml, true )) &&\r
+                                       // advance to the next closing parenthesis\r
+                                       (excess = unquoted.indexOf( ")", unquoted.length - excess ) - unquoted.length) ) {\r
+\r
+                                       // excess is a negative index\r
+                                       unquoted = unquoted.slice( 0, excess );\r
+                                       match[0] = match[0].slice( 0, excess );\r
+                               }\r
+                               match[2] = unquoted;\r
+                       }\r
+\r
+                       // Return only captures needed by the pseudo filter method (type and argument)\r
+                       return match.slice( 0, 3 );\r
+               }\r
+       },\r
+\r
+       filter: {\r
+               "ID": assertGetIdNotName ?\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       return elem.getAttribute("id") === id;\r
+                               };\r
+                       } :\r
+                       function( id ) {\r
+                               id = id.replace( rbackslash, "" );\r
+                               return function( elem ) {\r
+                                       var node = typeof elem.getAttributeNode !== strundefined && elem.getAttributeNode("id");\r
+                                       return node && node.value === id;\r
+                               };\r
+                       },\r
+\r
+               "TAG": function( nodeName ) {\r
+                       if ( nodeName === "*" ) {\r
+                               return function() { return true; };\r
+                       }\r
+                       nodeName = nodeName.replace( rbackslash, "" ).toLowerCase();\r
+\r
+                       return function( elem ) {\r
+                               return elem.nodeName && elem.nodeName.toLowerCase() === nodeName;\r
+                       };\r
+               },\r
+\r
+               "CLASS": function( className ) {\r
+                       var pattern = classCache[ expando ][ className ];\r
+                       if ( !pattern ) {\r
+                               pattern = classCache( className, new RegExp("(^|" + whitespace + ")" + className + "(" + whitespace + "|$)") );\r
+                       }\r
+                       return function( elem ) {\r
+                               return pattern.test( elem.className || (typeof elem.getAttribute !== strundefined && elem.getAttribute("class")) || "" );\r
+                       };\r
+               },\r
+\r
+               "ATTR": function( name, operator, check ) {\r
+                       if ( !operator ) {\r
+                               return function( elem ) {\r
+                                       return Sizzle.attr( elem, name ) != null;\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var result = Sizzle.attr( elem, name ),\r
+                                       value = result + "";\r
+\r
+                               if ( result == null ) {\r
+                                       return operator === "!=";\r
+                               }\r
+\r
+                               switch ( operator ) {\r
+                                       case "=":\r
+                                               return value === check;\r
+                                       case "!=":\r
+                                               return value !== check;\r
+                                       case "^=":\r
+                                               return check && value.indexOf( check ) === 0;\r
+                                       case "*=":\r
+                                               return check && value.indexOf( check ) > -1;\r
+                                       case "$=":\r
+                                               return check && value.substr( value.length - check.length ) === check;\r
+                                       case "~=":\r
+                                               return ( " " + value + " " ).indexOf( check ) > -1;\r
+                                       case "|=":\r
+                                               return value === check || value.substr( 0, check.length + 1 ) === check + "-";\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "CHILD": function( type, argument, first, last ) {\r
+\r
+                       if ( type === "nth" ) {\r
+                               var doneName = done++;\r
+\r
+                               return function( elem ) {\r
+                                       var parent, diff,\r
+                                               count = 0,\r
+                                               node = elem;\r
+\r
+                                       if ( first === 1 && last === 0 ) {\r
+                                               return true;\r
+                                       }\r
+\r
+                                       parent = elem.parentNode;\r
+\r
+                                       if ( parent && (parent[ expando ] !== doneName || !elem.sizset) ) {\r
+                                               for ( node = parent.firstChild; node; node = node.nextSibling ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               node.sizset = ++count;\r
+                                                               if ( node === elem ) {\r
+                                                                       break;\r
+                                                               }\r
+                                                       }\r
+                                               }\r
+\r
+                                               parent[ expando ] = doneName;\r
+                                       }\r
+\r
+                                       diff = elem.sizset - last;\r
+\r
+                                       if ( first === 0 ) {\r
+                                               return diff === 0;\r
+\r
+                                       } else {\r
+                                               return ( diff % first === 0 && diff / first >= 0 );\r
+                                       }\r
+                               };\r
+                       }\r
+\r
+                       return function( elem ) {\r
+                               var node = elem;\r
+\r
+                               switch ( type ) {\r
+                                       case "only":\r
+                                       case "first":\r
+                                               while ( (node = node.previousSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               if ( type === "first" ) {\r
+                                                       return true;\r
+                                               }\r
+\r
+                                               node = elem;\r
+\r
+                                               /* falls through */\r
+                                       case "last":\r
+                                               while ( (node = node.nextSibling) ) {\r
+                                                       if ( node.nodeType === 1 ) {\r
+                                                               return false;\r
+                                                       }\r
+                                               }\r
+\r
+                                               return true;\r
+                               }\r
+                       };\r
+               },\r
+\r
+               "PSEUDO": function( pseudo, argument, context, xml ) {\r
+                       // pseudo-class names are case-insensitive\r
+                       // http://www.w3.org/TR/selectors/#pseudo-classes\r
+                       // Prioritize by case sensitivity in case custom pseudos are added with uppercase letters\r
+                       var args,\r
+                               fn = Expr.pseudos[ pseudo ] || Expr.pseudos[ pseudo.toLowerCase() ];\r
+\r
+                       if ( !fn ) {\r
+                               Sizzle.error( "unsupported pseudo: " + pseudo );\r
+                       }\r
+\r
+                       // The user may use createPseudo to indicate that\r
+                       // arguments are needed to create the filter function\r
+                       // just as Sizzle does\r
+                       if ( !fn[ expando ] ) {\r
+                               if ( fn.length > 1 ) {\r
+                                       args = [ pseudo, pseudo, "", argument ];\r
+                                       return function( elem ) {\r
+                                               return fn( elem, 0, args );\r
+                                       };\r
+                               }\r
+                               return fn;\r
+                       }\r
+\r
+                       return fn( argument, context, xml );\r
+               }\r
+       },\r
+\r
+       pseudos: {\r
+               "not": markFunction(function( selector, context, xml ) {\r
+                       // Trim the selector passed to compile\r
+                       // to avoid treating leading and trailing\r
+                       // spaces as combinators\r
+                       var matcher = compile( selector.replace( rtrim, "$1" ), context, xml );\r
+                       return function( elem ) {\r
+                               return !matcher( elem );\r
+                       };\r
+               }),\r
+\r
+               "enabled": function( elem ) {\r
+                       return elem.disabled === false;\r
+               },\r
+\r
+               "disabled": function( elem ) {\r
+                       return elem.disabled === true;\r
+               },\r
+\r
+               "checked": function( elem ) {\r
+                       // In CSS3, :checked should return both checked and selected elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       var nodeName = elem.nodeName.toLowerCase();\r
+                       return (nodeName === "input" && !!elem.checked) || (nodeName === "option" && !!elem.selected);\r
+               },\r
+\r
+               "selected": function( elem ) {\r
+                       // Accessing this property makes selected-by-default\r
+                       // options in Safari work properly\r
+                       if ( elem.parentNode ) {\r
+                               elem.parentNode.selectedIndex;\r
+                       }\r
+\r
+                       return elem.selected === true;\r
+               },\r
+\r
+               "parent": function( elem ) {\r
+                       return !Expr.pseudos["empty"]( elem );\r
+               },\r
+\r
+               "empty": function( elem ) {\r
+                       // http://www.w3.org/TR/selectors/#empty-pseudo\r
+                       // :empty is only affected by element nodes and content nodes(including text(3), cdata(4)),\r
+                       //   not comment, processing instructions, or others\r
+                       // Thanks to Diego Perini for the nodeName shortcut\r
+                       //   Greater than "@" means alpha characters (specifically not starting with "#" or "?")\r
+                       var nodeType;\r
+                       elem = elem.firstChild;\r
+                       while ( elem ) {\r
+                               if ( elem.nodeName > "@" || (nodeType = elem.nodeType) === 3 || nodeType === 4 ) {\r
+                                       return false;\r
+                               }\r
+                               elem = elem.nextSibling;\r
+                       }\r
+                       return true;\r
+               },\r
+\r
+               "contains": markFunction(function( text ) {\r
+                       return function( elem ) {\r
+                               return ( elem.textContent || elem.innerText || getText( elem ) ).indexOf( text ) > -1;\r
+                       };\r
+               }),\r
+\r
+               "has": markFunction(function( selector ) {\r
+                       return function( elem ) {\r
+                               return Sizzle( selector, elem ).length > 0;\r
+                       };\r
+               }),\r
+\r
+               "header": function( elem ) {\r
+                       return rheader.test( elem.nodeName );\r
+               },\r
+\r
+               "text": function( elem ) {\r
+                       var type, attr;\r
+                       // IE6 and 7 will map elem.type to 'text' for new HTML5 types (search, etc)\r
+                       // use getAttribute instead to test this case\r
+                       return elem.nodeName.toLowerCase() === "input" &&\r
+                               (type = elem.type) === "text" &&\r
+                               ( (attr = elem.getAttribute("type")) == null || attr.toLowerCase() === type );\r
+               },\r
+\r
+               // Input types\r
+               "radio": createInputPseudo("radio"),\r
+               "checkbox": createInputPseudo("checkbox"),\r
+               "file": createInputPseudo("file"),\r
+               "password": createInputPseudo("password"),\r
+               "image": createInputPseudo("image"),\r
+\r
+               "submit": createButtonPseudo("submit"),\r
+               "reset": createButtonPseudo("reset"),\r
+\r
+               "button": function( elem ) {\r
+                       var name = elem.nodeName.toLowerCase();\r
+                       return name === "input" && elem.type === "button" || name === "button";\r
+               },\r
+\r
+               "input": function( elem ) {\r
+                       return rinputs.test( elem.nodeName );\r
+               },\r
+\r
+               "focus": function( elem ) {\r
+                       var doc = elem.ownerDocument;\r
+                       return elem === doc.activeElement && (!doc.hasFocus || doc.hasFocus()) && !!(elem.type || elem.href);\r
+               },\r
+\r
+               "active": function( elem ) {\r
+                       return elem === elem.ownerDocument.activeElement;\r
+               }\r
+       },\r
+\r
+       setFilters: {\r
+               "first": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 1 ) : [ elements[0] ];\r
+               },\r
+\r
+               "last": function( elements, argument, not ) {\r
+                       var elem = elements.pop();\r
+                       return not ? elements : [ elem ];\r
+               },\r
+\r
+               "even": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 1 : 0,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "odd": function( elements, argument, not ) {\r
+                       var results = [],\r
+                               i = not ? 0 : 1,\r
+                               len = elements.length;\r
+                       for ( ; i < len; i = i + 2 ) {\r
+                               results.push( elements[i] );\r
+                       }\r
+                       return results;\r
+               },\r
+\r
+               "lt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( +argument ) : elements.slice( 0, +argument );\r
+               },\r
+\r
+               "gt": function( elements, argument, not ) {\r
+                       return not ? elements.slice( 0, +argument + 1 ) : elements.slice( +argument + 1 );\r
+               },\r
+\r
+               "eq": function( elements, argument, not ) {\r
+                       var elem = elements.splice( +argument, 1 );\r
+                       return not ? elements : elem;\r
+               }\r
+       }\r
+};\r
+\r
+function siblingCheck( a, b, ret ) {\r
+       if ( a === b ) {\r
+               return ret;\r
+       }\r
+\r
+       var cur = a.nextSibling;\r
+\r
+       while ( cur ) {\r
+               if ( cur === b ) {\r
+                       return -1;\r
+               }\r
+\r
+               cur = cur.nextSibling;\r
+       }\r
+\r
+       return 1;\r
+}\r
+\r
+sortOrder = docElem.compareDocumentPosition ?\r
+       function( a, b ) {\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+               }\r
+\r
+               return ( !a.compareDocumentPosition || !b.compareDocumentPosition ?\r
+                       a.compareDocumentPosition :\r
+                       a.compareDocumentPosition(b) & 4\r
+               ) ? -1 : 1;\r
+       } :\r
+       function( a, b ) {\r
+               // The nodes are identical, we can exit early\r
+               if ( a === b ) {\r
+                       hasDuplicate = true;\r
+                       return 0;\r
+\r
+               // Fallback to using sourceIndex (in IE) if it's available on both nodes\r
+               } else if ( a.sourceIndex && b.sourceIndex ) {\r
+                       return a.sourceIndex - b.sourceIndex;\r
+               }\r
+\r
+               var al, bl,\r
+                       ap = [],\r
+                       bp = [],\r
+                       aup = a.parentNode,\r
+                       bup = b.parentNode,\r
+                       cur = aup;\r
+\r
+               // If the nodes are siblings (or identical) we can do a quick check\r
+               if ( aup === bup ) {\r
+                       return siblingCheck( a, b );\r
+\r
+               // If no parents were found then the nodes are disconnected\r
+               } else if ( !aup ) {\r
+                       return -1;\r
+\r
+               } else if ( !bup ) {\r
+                       return 1;\r
+               }\r
+\r
+               // Otherwise they're somewhere else in the tree so we need\r
+               // to build up a full list of the parentNodes for comparison\r
+               while ( cur ) {\r
+                       ap.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               cur = bup;\r
+\r
+               while ( cur ) {\r
+                       bp.unshift( cur );\r
+                       cur = cur.parentNode;\r
+               }\r
+\r
+               al = ap.length;\r
+               bl = bp.length;\r
+\r
+               // Start walking down the tree looking for a discrepancy\r
+               for ( var i = 0; i < al && i < bl; i++ ) {\r
+                       if ( ap[i] !== bp[i] ) {\r
+                               return siblingCheck( ap[i], bp[i] );\r
+                       }\r
+               }\r
+\r
+               // We ended someplace up the tree so do a sibling check\r
+               return i === al ?\r
+                       siblingCheck( a, bp[i], -1 ) :\r
+                       siblingCheck( ap[i], b, 1 );\r
+       };\r
+\r
+// Always assume the presence of duplicates if sort doesn't\r
+// pass them to our comparison function (as in Google Chrome).\r
+[0, 0].sort( sortOrder );\r
+baseHasDuplicate = !hasDuplicate;\r
+\r
+// Document sorting and removing duplicates\r
+Sizzle.uniqueSort = function( results ) {\r
+       var elem,\r
+               i = 1;\r
+\r
+       hasDuplicate = baseHasDuplicate;\r
+       results.sort( sortOrder );\r
+\r
+       if ( hasDuplicate ) {\r
+               for ( ; (elem = results[i]); i++ ) {\r
+                       if ( elem === results[ i - 1 ] ) {\r
+                               results.splice( i--, 1 );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+};\r
+\r
+Sizzle.error = function( msg ) {\r
+       throw new Error( "Syntax error, unrecognized expression: " + msg );\r
+};\r
+\r
+function tokenize( selector, context, xml, parseOnly ) {\r
+       var matched, match, tokens, type,\r
+               soFar, groups, group, i,\r
+               preFilters, filters,\r
+               checkContext = !xml && context !== document,\r
+               // Token cache should maintain spaces\r
+               key = ( checkContext ? "<s>" : "" ) + selector.replace( rtrim, "$1<s>" ),\r
+               cached = tokenCache[ expando ][ key ];\r
+\r
+       if ( cached ) {\r
+               return parseOnly ? 0 : slice.call( cached, 0 );\r
+       }\r
+\r
+       soFar = selector;\r
+       groups = [];\r
+       i = 0;\r
+       preFilters = Expr.preFilter;\r
+       filters = Expr.filter;\r
+\r
+       while ( soFar ) {\r
+\r
+               // Comma and first run\r
+               if ( !matched || (match = rcomma.exec( soFar )) ) {\r
+                       if ( match ) {\r
+                               soFar = soFar.slice( match[0].length );\r
+                               tokens.selector = group;\r
+                       }\r
+                       groups.push( tokens = [] );\r
+                       group = "";\r
+\r
+                       // Need to make sure we're within a narrower context if necessary\r
+                       // Adding a descendant combinator will generate what is needed\r
+                       if ( checkContext ) {\r
+                               soFar = " " + soFar;\r
+                       }\r
+               }\r
+\r
+               matched = false;\r
+\r
+               // Combinators\r
+               if ( (match = rcombinators.exec( soFar )) ) {\r
+                       group += match[0];\r
+                       soFar = soFar.slice( match[0].length );\r
+\r
+                       // Cast descendant combinators to space\r
+                       matched = tokens.push({\r
+                               part: match.pop().replace( rtrim, " " ),\r
+                               string: match[0],\r
+                               captures: match\r
+                       });\r
+               }\r
+\r
+               // Filters\r
+               for ( type in filters ) {\r
+                       if ( (match = matchExpr[ type ].exec( soFar )) && (!preFilters[ type ] ||\r
+                               ( match = preFilters[ type ](match, context, xml) )) ) {\r
+\r
+                               group += match[0];\r
+                               soFar = soFar.slice( match[0].length );\r
+                               matched = tokens.push({\r
+                                       part: type,\r
+                                       string: match.shift(),\r
+                                       captures: match\r
+                               });\r
+                       }\r
+               }\r
+\r
+               if ( !matched ) {\r
+                       break;\r
+               }\r
+       }\r
+\r
+       // Attach the full group as a selector\r
+       if ( group ) {\r
+               tokens.selector = group;\r
+       }\r
+\r
+       // Return the length of the invalid excess\r
+       // if we're just parsing\r
+       // Otherwise, throw an error or return tokens\r
+       return parseOnly ?\r
+               soFar.length :\r
+               soFar ?\r
+                       Sizzle.error( selector ) :\r
+                       // Cache the tokens\r
+                       slice.call( tokenCache(key, groups), 0 );\r
+}\r
+\r
+function addCombinator( matcher, combinator, context, xml ) {\r
+       var dir = combinator.dir,\r
+               doneName = done++;\r
+\r
+       if ( !matcher ) {\r
+               // If there is no matcher to check, check against the context\r
+               matcher = function( elem ) {\r
+                       return elem === context;\r
+               };\r
+       }\r
+       return combinator.first ?\r
+               function( elem ) {\r
+                       while ( (elem = elem[ dir ]) ) {\r
+                               if ( elem.nodeType === 1 ) {\r
+                                       return matcher( elem ) && elem;\r
+                               }\r
+                       }\r
+               } :\r
+               xml ?\r
+                       function( elem ) {\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( elem.nodeType === 1 ) {\r
+                                               if ( matcher( elem ) ) {\r
+                                                       return elem;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       } :\r
+                       function( elem ) {\r
+                               var cache,\r
+                                       dirkey = doneName + "." + dirruns,\r
+                                       cachedkey = dirkey + "." + cachedruns;\r
+                               while ( (elem = elem[ dir ]) ) {\r
+                                       if ( elem.nodeType === 1 ) {\r
+                                               if ( (cache = elem[ expando ]) === cachedkey ) {\r
+                                                       return elem.sizset;\r
+                                               } else if ( typeof cache === "string" && cache.indexOf(dirkey) === 0 ) {\r
+                                                       if ( elem.sizset ) {\r
+                                                               return elem;\r
+                                                       }\r
+                                               } else {\r
+                                                       elem[ expando ] = cachedkey;\r
+                                                       if ( matcher( elem ) ) {\r
+                                                               elem.sizset = true;\r
+                                                               return elem;\r
+                                                       }\r
+                                                       elem.sizset = false;\r
+                                               }\r
+                                       }\r
+                               }\r
+                       };\r
+}\r
+\r
+function addMatcher( higher, deeper ) {\r
+       return higher ?\r
+               function( elem ) {\r
+                       var result = deeper( elem );\r
+                       return result && higher( result === true ? elem : result );\r
+               } :\r
+               deeper;\r
+}\r
+\r
+// ["TAG", ">", "ID", " ", "CLASS"]\r
+function matcherFromTokens( tokens, context, xml ) {\r
+       var token, matcher,\r
+               i = 0;\r
+\r
+       for ( ; (token = tokens[i]); i++ ) {\r
+               if ( Expr.relative[ token.part ] ) {\r
+                       matcher = addCombinator( matcher, Expr.relative[ token.part ], context, xml );\r
+               } else {\r
+                       matcher = addMatcher( matcher, Expr.filter[ token.part ].apply(null, token.captures.concat( context, xml )) );\r
+               }\r
+       }\r
+\r
+       return matcher;\r
+}\r
+\r
+function matcherFromGroupMatchers( matchers ) {\r
+       return function( elem ) {\r
+               var matcher,\r
+                       j = 0;\r
+               for ( ; (matcher = matchers[j]); j++ ) {\r
+                       if ( matcher(elem) ) {\r
+                               return true;\r
+                       }\r
+               }\r
+               return false;\r
+       };\r
+}\r
+\r
+compile = Sizzle.compile = function( selector, context, xml ) {\r
+       var group, i, len,\r
+               cached = compilerCache[ expando ][ selector ];\r
+\r
+       // Return a cached group function if already generated (context dependent)\r
+       if ( cached && cached.context === context ) {\r
+               return cached;\r
+       }\r
+\r
+       // Generate a function of recursive functions that can be used to check each element\r
+       group = tokenize( selector, context, xml );\r
+       for ( i = 0, len = group.length; i < len; i++ ) {\r
+               group[i] = matcherFromTokens(group[i], context, xml);\r
+       }\r
+\r
+       // Cache the compiled function\r
+       cached = compilerCache( selector, matcherFromGroupMatchers(group) );\r
+       cached.context = context;\r
+       cached.runs = cached.dirruns = 0;\r
+       return cached;\r
+};\r
+\r
+function multipleContexts( selector, contexts, results, seed ) {\r
+       var i = 0,\r
+               len = contexts.length;\r
+       for ( ; i < len; i++ ) {\r
+               Sizzle( selector, contexts[i], results, seed );\r
+       }\r
+}\r
+\r
+function handlePOSGroup( selector, posfilter, argument, contexts, seed, not ) {\r
+       var results,\r
+               fn = Expr.setFilters[ posfilter.toLowerCase() ];\r
+\r
+       if ( !fn ) {\r
+               Sizzle.error( posfilter );\r
+       }\r
+\r
+       if ( selector || !(results = seed) ) {\r
+               multipleContexts( selector || "*", contexts, (results = []), seed );\r
+       }\r
+\r
+       return results.length > 0 ? fn( results, argument, not ) : [];\r
+}\r
+\r
+function handlePOS( groups, context, results, seed ) {\r
+       var group, part, j, groupLen, token, selector,\r
+               anchor, elements, match, matched,\r
+               lastIndex, currentContexts, not,\r
+               i = 0,\r
+               len = groups.length,\r
+               rpos = matchExpr["POS"],\r
+               // This is generated here in case matchExpr["POS"] is extended\r
+               rposgroups = new RegExp( "^" + rpos.source + "(?!" + whitespace + ")", "i" ),\r
+               // This is for making sure non-participating\r
+               // matching groups are represented cross-browser (IE6-8)\r
+               setUndefined = function() {\r
+                       var i = 1,\r
+                               len = arguments.length - 2;\r
+                       for ( ; i < len; i++ ) {\r
+                               if ( arguments[i] === undefined ) {\r
+                                       match[i] = undefined;\r
+                               }\r
+                       }\r
+               };\r
+\r
+       for ( ; i < len; i++ ) {\r
+               group = groups[i];\r
+               part = "";\r
+               elements = seed;\r
+               for ( j = 0, groupLen = group.length; j < groupLen; j++ ) {\r
+                       token = group[j];\r
+                       selector = token.string;\r
+                       if ( token.part === "PSEUDO" ) {\r
+                               // Reset regex index to 0\r
+                               rpos.exec("");\r
+                               anchor = 0;\r
+                               while ( (match = rpos.exec( selector )) ) {\r
+                                       matched = true;\r
+                                       lastIndex = rpos.lastIndex = match.index + match[0].length;\r
+                                       if ( lastIndex > anchor ) {\r
+                                               part += selector.slice( anchor, match.index );\r
+                                               anchor = lastIndex;\r
+                                               currentContexts = [ context ];\r
+\r
+                                               if ( rcombinators.test(part) ) {\r
+                                                       if ( elements ) {\r
+                                                               currentContexts = elements;\r
+                                                       }\r
+                                                       elements = seed;\r
+                                               }\r
+\r
+                                               if ( (not = rendsWithNot.test( part )) ) {\r
+                                                       part = part.slice( 0, -5 ).replace( rcombinators, "$&*" );\r
+                                                       anchor++;\r
+                                               }\r
+\r
+                                               if ( match.length > 1 ) {\r
+                                                       match[0].replace( rposgroups, setUndefined );\r
+                                               }\r
+                                               elements = handlePOSGroup( part, match[1], match[2], currentContexts, elements, not );\r
+                                       }\r
+                                       part = "";\r
+                               }\r
+\r
+                       }\r
+\r
+                       if ( !matched ) {\r
+                               part += selector;\r
+                       }\r
+                       matched = false;\r
+               }\r
+\r
+               if ( part ) {\r
+                       if ( rcombinators.test(part) ) {\r
+                               multipleContexts( part, elements || [ context ], results, seed );\r
+                       } else {\r
+                               Sizzle( part, context, results, seed ? seed.concat(elements) : elements );\r
+                       }\r
+               } else {\r
+                       push.apply( results, elements );\r
+               }\r
+       }\r
+\r
+       // Do not sort if this is a single filter\r
+       return len === 1 ? results : Sizzle.uniqueSort( results );\r
+}\r
+\r
+function select( selector, context, results, seed, xml ) {\r
+       // Remove excessive whitespace\r
+       selector = selector.replace( rtrim, "$1" );\r
+       var elements, matcher, cached, elem,\r
+               i, tokens, token, lastToken, findContext, type,\r
+               match = tokenize( selector, context, xml ),\r
+               contextNodeType = context.nodeType;\r
+\r
+       // POS handling\r
+       if ( matchExpr["POS"].test(selector) ) {\r
+               return handlePOS( match, context, results, seed );\r
+       }\r
+\r
+       if ( seed ) {\r
+               elements = slice.call( seed, 0 );\r
+\r
+       // To maintain document order, only narrow the\r
+       // set if there is one group\r
+       } else if ( match.length === 1 ) {\r
+\r
+               // Take a shortcut and set the context if the root selector is an ID\r
+               if ( (tokens = slice.call( match[0], 0 )).length > 2 &&\r
+                               (token = tokens[0]).part === "ID" &&\r
+                               contextNodeType === 9 && !xml &&\r
+                               Expr.relative[ tokens[1].part ] ) {\r
+\r
+                       context = Expr.find["ID"]( token.captures[0].replace( rbackslash, "" ), context, xml )[0];\r
+                       if ( !context ) {\r
+                               return results;\r
+                       }\r
+\r
+                       selector = selector.slice( tokens.shift().string.length );\r
+               }\r
+\r
+               findContext = ( (match = rsibling.exec( tokens[0].string )) && !match.index && context.parentNode ) || context;\r
+\r
+               // Reduce the set if possible\r
+               lastToken = "";\r
+               for ( i = tokens.length - 1; i >= 0; i-- ) {\r
+                       token = tokens[i];\r
+                       type = token.part;\r
+                       lastToken = token.string + lastToken;\r
+                       if ( Expr.relative[ type ] ) {\r
+                               break;\r
+                       }\r
+                       if ( Expr.order.test(type) ) {\r
+                               elements = Expr.find[ type ]( token.captures[0].replace( rbackslash, "" ), findContext, xml );\r
+                               if ( elements == null ) {\r
+                                       continue;\r
+                               } else {\r
+                                       selector = selector.slice( 0, selector.length - lastToken.length ) +\r
+                                               lastToken.replace( matchExpr[ type ], "" );\r
+\r
+                                       if ( !selector ) {\r
+                                               push.apply( results, slice.call(elements, 0) );\r
+                                       }\r
+\r
+                                       break;\r
+                               }\r
+                       }\r
+               }\r
+       }\r
+\r
+       // Only loop over the given elements once\r
+       if ( selector ) {\r
+               matcher = compile( selector, context, xml );\r
+               dirruns = matcher.dirruns++;\r
+               if ( elements == null ) {\r
+                       elements = Expr.find["TAG"]( "*", (rsibling.test( selector ) && context.parentNode) || context );\r
+               }\r
+\r
+               for ( i = 0; (elem = elements[i]); i++ ) {\r
+                       cachedruns = matcher.runs++;\r
+                       if ( matcher(elem) ) {\r
+                               results.push( elem );\r
+                       }\r
+               }\r
+       }\r
+\r
+       return results;\r
+}\r
+\r
+if ( document.querySelectorAll ) {\r
+       (function() {\r
+               var disconnectedMatch,\r
+                       oldSelect = select,\r
+                       rescape = /'|\\/g,\r
+                       rattributeQuotes = /\=[\x20\t\r\n\f]*([^'"\]]*)[\x20\t\r\n\f]*\]/g,\r
+                       rbuggyQSA = [],\r
+                       // matchesSelector(:active) reports false when true (IE9/Opera 11.5)\r
+                       // A support test would require too much code (would include document ready)\r
+                       // just skip matchesSelector for :active\r
+                       rbuggyMatches = [":active"],\r
+                       matches = docElem.matchesSelector ||\r
+                               docElem.mozMatchesSelector ||\r
+                               docElem.webkitMatchesSelector ||\r
+                               docElem.oMatchesSelector ||\r
+                               docElem.msMatchesSelector;\r
+\r
+               // Build QSA regex\r
+               // Regex strategy adopted from Diego Perini\r
+               assert(function( div ) {\r
+                       // Select is set to empty string on purpose\r
+                       // This is to test IE's treatment of not explictly\r
+                       // setting a boolean content attribute,\r
+                       // since its presence should be enough\r
+                       // http://bugs.jquery.com/ticket/12359\r
+                       div.innerHTML = "<select><option selected=''></option></select>";\r
+\r
+                       // IE8 - Some boolean attributes are not treated correctly\r
+                       if ( !div.querySelectorAll("[selected]").length ) {\r
+                               rbuggyQSA.push( "\\[" + whitespace + "*(?:checked|disabled|ismap|multiple|readonly|selected|value)" );\r
+                       }\r
+\r
+                       // Webkit/Opera - :checked should return selected option elements\r
+                       // http://www.w3.org/TR/2011/REC-css3-selectors-20110929/#checked\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       if ( !div.querySelectorAll(":checked").length ) {\r
+                               rbuggyQSA.push(":checked");\r
+                       }\r
+               });\r
+\r
+               assert(function( div ) {\r
+\r
+                       // Opera 10-12/IE9 - ^= $= *= and empty values\r
+                       // Should not select anything\r
+                       div.innerHTML = "<p test=''></p>";\r
+                       if ( div.querySelectorAll("[test^='']").length ) {\r
+                               rbuggyQSA.push( "[*^$]=" + whitespace + "*(?:\"\"|'')" );\r
+                       }\r
+\r
+                       // FF 3.5 - :enabled/:disabled and hidden elements (hidden elements are still enabled)\r
+                       // IE8 throws error here (do not put tests after this one)\r
+                       div.innerHTML = "<input type='hidden'/>";\r
+                       if ( !div.querySelectorAll(":enabled").length ) {\r
+                               rbuggyQSA.push(":enabled", ":disabled");\r
+                       }\r
+               });\r
+\r
+               rbuggyQSA = rbuggyQSA.length && new RegExp( rbuggyQSA.join("|") );\r
+\r
+               select = function( selector, context, results, seed, xml ) {\r
+                       // Only use querySelectorAll when not filtering,\r
+                       // when this is not xml,\r
+                       // and when no QSA bugs apply\r
+                       if ( !seed && !xml && (!rbuggyQSA || !rbuggyQSA.test( selector )) ) {\r
+                               if ( context.nodeType === 9 ) {\r
+                                       try {\r
+                                               push.apply( results, slice.call(context.querySelectorAll( selector ), 0) );\r
+                                               return results;\r
+                                       } catch(qsaError) {}\r
+                               // qSA works strangely on Element-rooted queries\r
+                               // We can work around this by specifying an extra ID on the root\r
+                               // and working up from there (Thanks to Andrew Dupont for the technique)\r
+                               // IE 8 doesn't work on object elements\r
+                               } else if ( context.nodeType === 1 && context.nodeName.toLowerCase() !== "object" ) {\r
+                                       var groups, i, len,\r
+                                               old = context.getAttribute("id"),\r
+                                               nid = old || expando,\r
+                                               newContext = rsibling.test( selector ) && context.parentNode || context;\r
+\r
+                                       if ( old ) {\r
+                                               nid = nid.replace( rescape, "\\$&" );\r
+                                       } else {\r
+                                               context.setAttribute( "id", nid );\r
+                                       }\r
+\r
+                                       groups = tokenize(selector, context, xml);\r
+                                       // Trailing space is unnecessary\r
+                                       // There is always a context check\r
+                                       nid = "[id='" + nid + "']";\r
+                                       for ( i = 0, len = groups.length; i < len; i++ ) {\r
+                                               groups[i] = nid + groups[i].selector;\r
+                                       }\r
+                                       try {\r
+                                               push.apply( results, slice.call( newContext.querySelectorAll(\r
+                                                       groups.join(",")\r
+                                               ), 0 ) );\r
+                                               return results;\r
+                                       } catch(qsaError) {\r
+                                       } finally {\r
+                                               if ( !old ) {\r
+                                                       context.removeAttribute("id");\r
+                                               }\r
+                                       }\r
+                               }\r
+                       }\r
+\r
+                       return oldSelect( selector, context, results, seed, xml );\r
+               };\r
+\r
+               if ( matches ) {\r
+                       assert(function( div ) {\r
+                               // Check to see if it's possible to do matchesSelector\r
+                               // on a disconnected node (IE 9)\r
+                               disconnectedMatch = matches.call( div, "div" );\r
+\r
+                               // This should fail with an exception\r
+                               // Gecko does not error, returns false instead\r
+                               try {\r
+                                       matches.call( div, "[test!='']:sizzle" );\r
+                                       rbuggyMatches.push( matchExpr["PSEUDO"].source, matchExpr["POS"].source, "!=" );\r
+                               } catch ( e ) {}\r
+                       });\r
+\r
+                       // rbuggyMatches always contains :active, so no need for a length check\r
+                       rbuggyMatches = /* rbuggyMatches.length && */ new RegExp( rbuggyMatches.join("|") );\r
+\r
+                       Sizzle.matchesSelector = function( elem, expr ) {\r
+                               // Make sure that attribute selectors are quoted\r
+                               expr = expr.replace( rattributeQuotes, "='$1']" );\r
+\r
+                               // rbuggyMatches always contains :active, so no need for an existence check\r
+                               if ( !isXML( elem ) && !rbuggyMatches.test( expr ) && (!rbuggyQSA || !rbuggyQSA.test( expr )) ) {\r
+                                       try {\r
+                                               var ret = matches.call( elem, expr );\r
+\r
+                                               // IE 9's matchesSelector returns false on disconnected nodes\r
+                                               if ( ret || disconnectedMatch ||\r
+                                                               // As well, disconnected nodes are said to be in a document\r
+                                                               // fragment in IE 9\r
+                                                               elem.document && elem.document.nodeType !== 11 ) {\r
+                                                       return ret;\r
+                                               }\r
+                                       } catch(e) {}\r
+                               }\r
+\r
+                               return Sizzle( expr, null, null, [ elem ] ).length > 0;\r
+                       };\r
+               }\r
+       })();\r
+}\r
+\r
+// Deprecated\r
+Expr.setFilters["nth"] = Expr.setFilters["eq"];\r
+\r
+// Back-compat\r
+Expr.filters = Expr.pseudos;\r
+\r
+// Override sizzle attribute retrieval
+Sizzle.attr = jQuery.attr;
+jQuery.find = Sizzle;
+jQuery.expr = Sizzle.selectors;
+jQuery.expr[":"] = jQuery.expr.pseudos;
+jQuery.unique = Sizzle.uniqueSort;
+jQuery.text = Sizzle.getText;
+jQuery.isXMLDoc = Sizzle.isXML;
+jQuery.contains = Sizzle.contains;
+\r
+\r
+})( window );\r
+var runtil = /Until$/,
+       rparentsprev = /^(?:parents|prev(?:Until|All))/,
+       isSimple = /^.[^:#\[\.,]*$/,
+       rneedsContext = jQuery.expr.match.needsContext,
+       // methods guaranteed to produce a unique set when starting from a unique set
+       guaranteedUnique = {
+               children: true,
+               contents: true,
+               next: true,
+               prev: true
+       };
 
-                               // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
-                               srcElements = getAll( elem );
-                               destElements = getAll( clone );
+jQuery.fn.extend({
+       find: function( selector ) {
+               var i, l, length, n, r, ret,
+                       self = this;
 
-                               // Weird iteration because IE will replace the length property
-                               // with an element if you are cloning the body and one of the
-                               // elements on the page has a name or id of "length"
-                               for ( i = 0; srcElements[i]; ++i ) {
-                                       // Ensure that the destination node is not null; Fixes #9587
-                                       if ( destElements[i] ) {
-                                               cloneFixAttributes( srcElements[i], destElements[i] );
+               if ( typeof selector !== "string" ) {
+                       return jQuery( selector ).filter(function() {
+                               for ( i = 0, l = self.length; i < l; i++ ) {
+                                       if ( jQuery.contains( self[ i ], this ) ) {
+                                               return true;
                                        }
                                }
-                       }
+                       });
+               }
 
-                       // Copy the events from the original to the clone
-                       if ( dataAndEvents ) {
-                               cloneCopyEvent( elem, clone );
+               ret = this.pushStack( "", "find", selector );
 
-                               if ( deepDataAndEvents ) {
-                                       srcElements = getAll( elem );
-                                       destElements = getAll( clone );
+               for ( i = 0, l = this.length; i < l; i++ ) {
+                       length = ret.length;
+                       jQuery.find( selector, this[i], ret );
 
-                                       for ( i = 0; srcElements[i]; ++i ) {
-                                               cloneCopyEvent( srcElements[i], destElements[i] );
+                       if ( i > 0 ) {
+                               // Make sure that the results are unique
+                               for ( n = length; n < ret.length; n++ ) {
+                                       for ( r = 0; r < length; r++ ) {
+                                               if ( ret[r] === ret[n] ) {
+                                                       ret.splice(n--, 1);
+                                                       break;
+                                               }
                                        }
                                }
                        }
+               }
 
-                       srcElements = destElements = null;
-
-                       // Return the cloned set
-                       return clone;
-               },
-
-               clean: function( elems, context, fragment, scripts ) {
-                       var checkScriptType, script, j,
-                               ret = [];
+               return ret;
+       },
 
-                       context = context || document;
+       has: function( target ) {
+               var i,
+                       targets = jQuery( target, this ),
+                       len = targets.length;
 
-                       // !context.createElement fails in IE with an error but returns typeof 'object'
-                       if ( typeof context.createElement === "undefined" ) {
-                               context = context.ownerDocument || context[0] && context[0].ownerDocument || document;
+               return this.filter(function() {
+                       for ( i = 0; i < len; i++ ) {
+                               if ( jQuery.contains( this, targets[i] ) ) {
+                                       return true;
+                               }
                        }
+               });
+       },
+
+       not: function( selector ) {
+               return this.pushStack( winnow(this, selector, false), "not", selector);
+       },
+
+       filter: function( selector ) {
+               return this.pushStack( winnow(this, selector, true), "filter", selector );
+       },
+
+       is: function( selector ) {
+               return !!selector && (
+                       typeof selector === "string" ?
+                               // If this is a positional/relative selector, check membership in the returned set
+                               // so $("p:first").is("p:last") won't return true for a doc with two "p".
+                               rneedsContext.test( selector ) ?
+                                       jQuery( selector, this.context ).index( this[0] ) >= 0 :
+                                       jQuery.filter( selector, this ).length > 0 :
+                               this.filter( selector ).length > 0 );
+       },
+
+       closest: function( selectors, context ) {
+               var cur,
+                       i = 0,
+                       l = this.length,
+                       ret = [],
+                       pos = rneedsContext.test( selectors ) || typeof selectors !== "string" ?
+                               jQuery( selectors, context || this.context ) :
+                               0;
 
-                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                               if ( typeof elem === "number" ) {
-                                       elem += "";
-                               }
+               for ( ; i < l; i++ ) {
+                       cur = this[i];
 
-                               if ( !elem ) {
-                                       continue;
+                       while ( cur && cur.ownerDocument && cur !== context && cur.nodeType !== 11 ) {
+                               if ( pos ? pos.index(cur) > -1 : jQuery.find.matchesSelector(cur, selectors) ) {
+                                       ret.push( cur );
+                                       break;
                                }
+                               cur = cur.parentNode;
+                       }
+               }
 
-                               // Convert html string into DOM nodes
-                               if ( typeof elem === "string" ) {
-                                       if ( !rhtml.test( elem ) ) {
-                                               elem = context.createTextNode( elem );
-                                       } else {
-                                               // Fix "XHTML"-style tags in all browsers
-                                               elem = elem.replace(rxhtmlTag, "<$1></$2>");
-
-                                               // Trim whitespace, otherwise indexOf won't work as expected
-                                               var tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase(),
-                                                       wrap = wrapMap[ tag ] || wrapMap._default,
-                                                       depth = wrap[0],
-                                                       div = context.createElement("div"),
-                                                       safeChildNodes = safeFragment.childNodes,
-                                                       remove;
-
-                                               // Append wrapper element to unknown element safe doc fragment
-                                               if ( context === document ) {
-                                                       // Use the fragment we've already created for this document
-                                                       safeFragment.appendChild( div );
-                                               } else {
-                                                       // Use a fragment created with the owner document
-                                                       createSafeFragment( context ).appendChild( div );
-                                               }
+               ret = ret.length > 1 ? jQuery.unique( ret ) : ret;
 
-                                               // Go to html and back, then peel off extra wrappers
-                                               div.innerHTML = wrap[1] + elem + wrap[2];
+               return this.pushStack( ret, "closest", selectors );
+       },
 
-                                               // Move to the right depth
-                                               while ( depth-- ) {
-                                                       div = div.lastChild;
-                                               }
+       // Determine the position of an element within
+       // the matched set of elements
+       index: function( elem ) {
 
-                                               // Remove IE's autoinserted <tbody> from table fragments
-                                               if ( !jQuery.support.tbody ) {
+               // No argument, return index in parent
+               if ( !elem ) {
+                       return ( this[0] && this[0].parentNode ) ? this.prevAll().length : -1;
+               }
 
-                                                       // String was a <table>, *may* have spurious <tbody>
-                                                       var hasBody = rtbody.test(elem),
-                                                               tbody = tag === "table" && !hasBody ?
-                                                                       div.firstChild && div.firstChild.childNodes :
+               // index in selector
+               if ( typeof elem === "string" ) {
+                       return jQuery.inArray( this[0], jQuery( elem ) );
+               }
 
-                                                                       // String was a bare <thead> or <tfoot>
-                                                                       wrap[1] === "<table>" && !hasBody ?
-                                                                               div.childNodes :
-                                                                               [];
+               // Locate the position of the desired element
+               return jQuery.inArray(
+                       // If it receives a jQuery object, the first element is used
+                       elem.jquery ? elem[0] : elem, this );
+       },
+
+       add: function( selector, context ) {
+               var set = typeof selector === "string" ?
+                               jQuery( selector, context ) :
+                               jQuery.makeArray( selector && selector.nodeType ? [ selector ] : selector ),
+                       all = jQuery.merge( this.get(), set );
+
+               return this.pushStack( isDisconnected( set[0] ) || isDisconnected( all[0] ) ?
+                       all :
+                       jQuery.unique( all ) );
+       },
+
+       addBack: function( selector ) {
+               return this.add( selector == null ?
+                       this.prevObject : this.prevObject.filter(selector)
+               );
+       }
+});
 
-                                                       for ( j = tbody.length - 1; j >= 0 ; --j ) {
-                                                               if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
-                                                                       tbody[ j ].parentNode.removeChild( tbody[ j ] );
-                                                               }
-                                                       }
-                                               }
+jQuery.fn.andSelf = jQuery.fn.addBack;
 
-                                               // IE completely kills leading whitespace when innerHTML is used
-                                               if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
-                                                       div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
-                                               }
+// A painfully simple check to see if an element is disconnected
+// from a document (should be improved, where feasible).
+function isDisconnected( node ) {
+       return !node || !node.parentNode || node.parentNode.nodeType === 11;
+}
+
+function sibling( cur, dir ) {
+       do {
+               cur = cur[ dir ];
+       } while ( cur && cur.nodeType !== 1 );
+
+       return cur;
+}
+
+jQuery.each({
+       parent: function( elem ) {
+               var parent = elem.parentNode;
+               return parent && parent.nodeType !== 11 ? parent : null;
+       },
+       parents: function( elem ) {
+               return jQuery.dir( elem, "parentNode" );
+       },
+       parentsUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "parentNode", until );
+       },
+       next: function( elem ) {
+               return sibling( elem, "nextSibling" );
+       },
+       prev: function( elem ) {
+               return sibling( elem, "previousSibling" );
+       },
+       nextAll: function( elem ) {
+               return jQuery.dir( elem, "nextSibling" );
+       },
+       prevAll: function( elem ) {
+               return jQuery.dir( elem, "previousSibling" );
+       },
+       nextUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "nextSibling", until );
+       },
+       prevUntil: function( elem, i, until ) {
+               return jQuery.dir( elem, "previousSibling", until );
+       },
+       siblings: function( elem ) {
+               return jQuery.sibling( ( elem.parentNode || {} ).firstChild, elem );
+       },
+       children: function( elem ) {
+               return jQuery.sibling( elem.firstChild );
+       },
+       contents: function( elem ) {
+               return jQuery.nodeName( elem, "iframe" ) ?
+                       elem.contentDocument || elem.contentWindow.document :
+                       jQuery.merge( [], elem.childNodes );
+       }
+}, function( name, fn ) {
+       jQuery.fn[ name ] = function( until, selector ) {
+               var ret = jQuery.map( this, fn, until );
 
-                                               elem = div.childNodes;
+               if ( !runtil.test( name ) ) {
+                       selector = until;
+               }
 
-                                               // Clear elements from DocumentFragment (safeFragment or otherwise)
-                                               // to avoid hoarding elements. Fixes #11356
-                                               if ( div ) {
-                                                       div.parentNode.removeChild( div );
+               if ( selector && typeof selector === "string" ) {
+                       ret = jQuery.filter( selector, ret );
+               }
 
-                                                       // Guard against -1 index exceptions in FF3.6
-                                                       if ( safeChildNodes.length > 0 ) {
-                                                               remove = safeChildNodes[ safeChildNodes.length - 1 ];
+               ret = this.length > 1 && !guaranteedUnique[ name ] ? jQuery.unique( ret ) : ret;
 
-                                                               if ( remove && remove.parentNode ) {
-                                                                       remove.parentNode.removeChild( remove );
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
+               if ( this.length > 1 && rparentsprev.test( name ) ) {
+                       ret = ret.reverse();
+               }
 
-                               // Resets defaultChecked for any radios and checkboxes
-                               // about to be appended to the DOM in IE 6/7 (#8060)
-                               var len;
-                               if ( !jQuery.support.appendChecked ) {
-                                       if ( elem[0] && typeof (len = elem.length) === "number" ) {
-                                               for ( j = 0; j < len; j++ ) {
-                                                       findInputs( elem[j] );
-                                               }
-                                       } else {
-                                               findInputs( elem );
-                                       }
-                               }
+               return this.pushStack( ret, name, core_slice.call( arguments ).join(",") );
+       };
+});
 
-                               if ( elem.nodeType ) {
-                                       ret.push( elem );
-                               } else {
-                                       ret = jQuery.merge( ret, elem );
-                               }
-                       }
+jQuery.extend({
+       filter: function( expr, elems, not ) {
+               if ( not ) {
+                       expr = ":not(" + expr + ")";
+               }
 
-                       if ( fragment ) {
-                               checkScriptType = function( elem ) {
-                                       return !elem.type || rscriptType.test( elem.type );
-                               };
-                               for ( i = 0; ret[i]; i++ ) {
-                                       script = ret[i];
-                                       if ( scripts && jQuery.nodeName( script, "script" ) && (!script.type || rscriptType.test( script.type )) ) {
-                                               scripts.push( script.parentNode ? script.parentNode.removeChild( script ) : script );
+               return elems.length === 1 ?
+                       jQuery.find.matchesSelector(elems[0], expr) ? [ elems[0] ] : [] :
+                       jQuery.find.matches(expr, elems);
+       },
 
-                                       } else {
-                                               if ( script.nodeType === 1 ) {
-                                                       var jsTags = jQuery.grep( script.getElementsByTagName( "script" ), checkScriptType );
+       dir: function( elem, dir, until ) {
+               var matched = [],
+                       cur = elem[ dir ];
 
-                                                       ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
-                                               }
-                                               fragment.appendChild( script );
-                                       }
-                               }
+               while ( cur && cur.nodeType !== 9 && (until === undefined || cur.nodeType !== 1 || !jQuery( cur ).is( until )) ) {
+                       if ( cur.nodeType === 1 ) {
+                               matched.push( cur );
                        }
+                       cur = cur[dir];
+               }
+               return matched;
+       },
 
-                       return ret;
-               },
+       sibling: function( n, elem ) {
+               var r = [];
+
+               for ( ; n; n = n.nextSibling ) {
+                       if ( n.nodeType === 1 && n !== elem ) {
+                               r.push( n );
+                       }
+               }
 
-               cleanData: function( elems ) {
-                       var data, id,
-                               cache = jQuery.cache,
-                               special = jQuery.event.special,
-                               deleteExpando = jQuery.support.deleteExpando;
+               return r;
+       }
+});
 
-                       for ( var i = 0, elem; (elem = elems[i]) != null; i++ ) {
-                               if ( elem.nodeName && jQuery.noData[elem.nodeName.toLowerCase()] ) {
-                                       continue;
-                               }
+// Implement the identical functionality for filter and not
+function winnow( elements, qualifier, keep ) {
 
-                               id = elem[ jQuery.expando ];
+       // Can't pass null or undefined to indexOf in Firefox 4
+       // Set to 0 to skip string check
+       qualifier = qualifier || 0;
 
-                               if ( id ) {
-                                       data = cache[ id ];
+       if ( jQuery.isFunction( qualifier ) ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       var retVal = !!qualifier.call( elem, i, elem );
+                       return retVal === keep;
+               });
 
-                                       if ( data && data.events ) {
-                                               for ( var type in data.events ) {
-                                                       if ( special[ type ] ) {
-                                                               jQuery.event.remove( elem, type );
+       } else if ( qualifier.nodeType ) {
+               return jQuery.grep(elements, function( elem, i ) {
+                       return ( elem === qualifier ) === keep;
+               });
 
-                                                               // This is a shortcut to avoid jQuery.event.remove's overhead
-                                                       } else {
-                                                               jQuery.removeEvent( elem, type, data.handle );
-                                                       }
-                                               }
+       } else if ( typeof qualifier === "string" ) {
+               var filtered = jQuery.grep(elements, function( elem ) {
+                       return elem.nodeType === 1;
+               });
 
-                                               // Null the DOM reference to avoid IE6/7/8 leak (#7054)
-                                               if ( data.handle ) {
-                                                       data.handle.elem = null;
-                                               }
-                                       }
+               if ( isSimple.test( qualifier ) ) {
+                       return jQuery.filter(qualifier, filtered, !keep);
+               } else {
+                       qualifier = jQuery.filter( qualifier, filtered );
+               }
+       }
 
-                                       if ( deleteExpando ) {
-                                               delete elem[ jQuery.expando ];
+       return jQuery.grep(elements, function( elem, i ) {
+               return ( jQuery.inArray( elem, qualifier ) >= 0 ) === keep;
+       });
+}
+function createSafeFragment( document ) {
+       var list = nodeNames.split( "|" ),
+       safeFrag = document.createDocumentFragment();
+
+       if ( safeFrag.createElement ) {
+               while ( list.length ) {
+                       safeFrag.createElement(
+                               list.pop()
+                       );
+               }
+       }
+       return safeFrag;
+}
+
+var nodeNames = "abbr|article|aside|audio|bdi|canvas|data|datalist|details|figcaption|figure|footer|" +
+               "header|hgroup|mark|meter|nav|output|progress|section|summary|time|video",
+       rinlinejQuery = / jQuery\d+="(?:null|\d+)"/g,
+       rleadingWhitespace = /^\s+/,
+       rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([\w:]+)[^>]*)\/>/gi,
+       rtagName = /<([\w:]+)/,
+       rtbody = /<tbody/i,
+       rhtml = /<|&#?\w+;/,
+       rnoInnerhtml = /<(?:script|style|link)/i,
+       rnocache = /<(?:script|object|embed|option|style)/i,
+       rnoshimcache = new RegExp("<(?:" + nodeNames + ")[\\s/>]", "i"),
+       rcheckableType = /^(?:checkbox|radio)$/,
+       // checked="checked" or checked
+       rchecked = /checked\s*(?:[^=]|=\s*.checked.)/i,
+       rscriptType = /\/(java|ecma)script/i,
+       rcleanScript = /^\s*<!(?:\[CDATA\[|\-\-)|[\]\-]{2}>\s*$/g,
+       wrapMap = {
+               option: [ 1, "<select multiple='multiple'>", "</select>" ],
+               legend: [ 1, "<fieldset>", "</fieldset>" ],
+               thead: [ 1, "<table>", "</table>" ],
+               tr: [ 2, "<table><tbody>", "</tbody></table>" ],
+               td: [ 3, "<table><tbody><tr>", "</tr></tbody></table>" ],
+               col: [ 2, "<table><tbody></tbody><colgroup>", "</colgroup></table>" ],
+               area: [ 1, "<map>", "</map>" ],
+               _default: [ 0, "", "" ]
+       },
+       safeFragment = createSafeFragment( document ),
+       fragmentDiv = safeFragment.appendChild( document.createElement("div") );
+
+wrapMap.optgroup = wrapMap.option;
+wrapMap.tbody = wrapMap.tfoot = wrapMap.colgroup = wrapMap.caption = wrapMap.thead;
+wrapMap.th = wrapMap.td;
+
+// IE6-8 can't serialize link, script, style, or any html5 (NoScope) tags,
+// unless wrapped in a div with non-breaking characters in front of it.
+if ( !jQuery.support.htmlSerialize ) {
+       wrapMap._default = [ 1, "X<div>", "</div>" ];
+}
+
+jQuery.fn.extend({
+       text: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       return value === undefined ?
+                               jQuery.text( this ) :
+                               this.empty().append( ( this[0] && this[0].ownerDocument || document ).createTextNode( value ) );
+               }, null, value, arguments.length );
+       },
+
+       wrapAll: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapAll( html.call(this, i) );
+                       });
+               }
 
-                                       } else if ( elem.removeAttribute ) {
-                                               elem.removeAttribute( jQuery.expando );
-                                       }
+               if ( this[0] ) {
+                       // The elements to wrap the target around
+                       var wrap = jQuery( html, this[0].ownerDocument ).eq(0).clone(true);
 
-                                       delete cache[ id ];
-                               }
+                       if ( this[0].parentNode ) {
+                               wrap.insertBefore( this[0] );
                        }
-               }
-       });
 
+                       wrap.map(function() {
+                               var elem = this;
 
+                               while ( elem.firstChild && elem.firstChild.nodeType === 1 ) {
+                                       elem = elem.firstChild;
+                               }
 
+                               return elem;
+                       }).append( this );
+               }
 
-       var ralpha = /alpha\([^)]*\)/i,
-               ropacity = /opacity=([^)]*)/,
-       // fixed for IE9, see #8346
-               rupper = /([A-Z]|^ms)/g,
-               rnum = /^[\-+]?(?:\d*\.)?\d+$/i,
-               rnumnonpx = /^-?(?:\d*\.)?\d+(?!px)[^\d\s]+$/i,
-               rrelNum = /^([\-+])=([\-+.\de]+)/,
-               rmargin = /^margin/,
+               return this;
+       },
 
-               cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       wrapInner: function( html ) {
+               if ( jQuery.isFunction( html ) ) {
+                       return this.each(function(i) {
+                               jQuery(this).wrapInner( html.call(this, i) );
+                       });
+               }
 
-       // order is important!
-               cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+               return this.each(function() {
+                       var self = jQuery( this ),
+                               contents = self.contents();
 
-               curCSS,
+                       if ( contents.length ) {
+                               contents.wrapAll( html );
 
-               getComputedStyle,
-               currentStyle;
+                       } else {
+                               self.append( html );
+                       }
+               });
+       },
 
-       jQuery.fn.css = function( name, value ) {
-               return jQuery.access( this, function( elem, name, value ) {
-                       return value !== undefined ?
-                               jQuery.style( elem, name, value ) :
-                               jQuery.css( elem, name );
-               }, name, value, arguments.length > 1 );
-       };
+       wrap: function( html ) {
+               var isFunction = jQuery.isFunction( html );
 
-       jQuery.extend({
-               // Add in style property hooks for overriding the default
-               // behavior of getting and setting a style property
-               cssHooks: {
-                       opacity: {
-                               get: function( elem, computed ) {
-                                       if ( computed ) {
-                                               // We should always get a number back from opacity
-                                               var ret = curCSS( elem, "opacity" );
-                                               return ret === "" ? "1" : ret;
+               return this.each(function(i) {
+                       jQuery( this ).wrapAll( isFunction ? html.call(this, i) : html );
+               });
+       },
 
-                                       } else {
-                                               return elem.style.opacity;
-                                       }
-                               }
+       unwrap: function() {
+               return this.parent().each(function() {
+                       if ( !jQuery.nodeName( this, "body" ) ) {
+                               jQuery( this ).replaceWith( this.childNodes );
                        }
-               },
-
-               // Exclude the following css properties to add px
-               cssNumber: {
-                       "fillOpacity": true,
-                       "fontWeight": true,
-                       "lineHeight": true,
-                       "opacity": true,
-                       "orphans": true,
-                       "widows": true,
-                       "zIndex": true,
-                       "zoom": true
-               },
+               }).end();
+       },
 
-               // Add in properties whose names you wish to fix before
-               // setting or getting the value
-               cssProps: {
-                       // normalize float css property
-                       "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
-               },
+       append: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.appendChild( elem );
+                       }
+               });
+       },
 
-               // Get and set the style property on a DOM Node
-               style: function( elem, name, value, extra ) {
-                       // Don't set styles on text and comment nodes
-                       if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
-                               return;
+       prepend: function() {
+               return this.domManip(arguments, true, function( elem ) {
+                       if ( this.nodeType === 1 || this.nodeType === 11 ) {
+                               this.insertBefore( elem, this.firstChild );
                        }
+               });
+       },
 
-                       // Make sure that we're working with the right name
-                       var ret, type, origName = jQuery.camelCase( name ),
-                               style = elem.style, hooks = jQuery.cssHooks[ origName ];
+       before: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this );
+                       });
+               }
 
-                       name = jQuery.cssProps[ origName ] || origName;
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( set, this ), "before", this.selector );
+               }
+       },
 
-                       // Check if we're setting a value
-                       if ( value !== undefined ) {
-                               type = typeof value;
+       after: function() {
+               if ( !isDisconnected( this[0] ) ) {
+                       return this.domManip(arguments, false, function( elem ) {
+                               this.parentNode.insertBefore( elem, this.nextSibling );
+                       });
+               }
 
-                               // convert relative number strings (+= or -=) to relative numbers. #7345
-                               if ( type === "string" && (ret = rrelNum.exec( value )) ) {
-                                       value = ( +( ret[1] + 1) * +ret[2] ) + parseFloat( jQuery.css( elem, name ) );
-                                       // Fixes bug #9237
-                                       type = "number";
-                               }
+               if ( arguments.length ) {
+                       var set = jQuery.clean( arguments );
+                       return this.pushStack( jQuery.merge( this, set ), "after", this.selector );
+               }
+       },
 
-                               // Make sure that NaN and null values aren't set. See: #7116
-                               if ( value == null || type === "number" && isNaN( value ) ) {
-                                       return;
-                               }
+       // keepData is for internal use only--do not document
+       remove: function( selector, keepData ) {
+               var elem,
+                       i = 0;
 
-                               // If a number was passed in, add 'px' to the (except for certain CSS properties)
-                               if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
-                                       value += "px";
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       if ( !selector || jQuery.filter( selector, [ elem ] ).length ) {
+                               if ( !keepData && elem.nodeType === 1 ) {
+                                       jQuery.cleanData( elem.getElementsByTagName("*") );
+                                       jQuery.cleanData( [ elem ] );
                                }
 
-                               // If a hook was provided, use that value, otherwise just set the specified value
-                               if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value )) !== undefined ) {
-                                       // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
-                                       // Fixes bug #5509
-                                       try {
-                                               style[ name ] = value;
-                                       } catch(e) {}
+                               if ( elem.parentNode ) {
+                                       elem.parentNode.removeChild( elem );
                                }
+                       }
+               }
 
-                       } else {
-                               // If a hook was provided get the non-computed value from there
-                               if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
-                                       return ret;
-                               }
+               return this;
+       },
+
+       empty: function() {
+               var elem,
+                       i = 0;
 
-                               // Otherwise just get the value from the style object
-                               return style[ name ];
+               for ( ; (elem = this[i]) != null; i++ ) {
+                       // Remove element nodes and prevent memory leaks
+                       if ( elem.nodeType === 1 ) {
+                               jQuery.cleanData( elem.getElementsByTagName("*") );
                        }
-               },
 
-               css: function( elem, name, extra ) {
-                       var ret, hooks;
+                       // Remove any remaining nodes
+                       while ( elem.firstChild ) {
+                               elem.removeChild( elem.firstChild );
+                       }
+               }
 
-                       // Make sure that we're working with the right name
-                       name = jQuery.camelCase( name );
-                       hooks = jQuery.cssHooks[ name ];
-                       name = jQuery.cssProps[ name ] || name;
+               return this;
+       },
 
-                       // cssFloat needs a special treatment
-                       if ( name === "cssFloat" ) {
-                               name = "float";
-                       }
+       clone: function( dataAndEvents, deepDataAndEvents ) {
+               dataAndEvents = dataAndEvents == null ? false : dataAndEvents;
+               deepDataAndEvents = deepDataAndEvents == null ? dataAndEvents : deepDataAndEvents;
 
-                       // If a hook was provided get the computed value from there
-                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, true, extra )) !== undefined ) {
-                               return ret;
+               return this.map( function () {
+                       return jQuery.clone( this, dataAndEvents, deepDataAndEvents );
+               });
+       },
+
+       html: function( value ) {
+               return jQuery.access( this, function( value ) {
+                       var elem = this[0] || {},
+                               i = 0,
+                               l = this.length;
 
-                               // Otherwise, if a way to get the computed value exists, use that
-                       } else if ( curCSS ) {
-                               return curCSS( elem, name );
+                       if ( value === undefined ) {
+                               return elem.nodeType === 1 ?
+                                       elem.innerHTML.replace( rinlinejQuery, "" ) :
+                                       undefined;
                        }
-               },
 
-               // A method for quickly swapping in/out CSS properties to get correct calculations
-               swap: function( elem, options, callback ) {
-                       var old = {},
-                               ret, name;
+                       // See if we can take a shortcut and just use innerHTML
+                       if ( typeof value === "string" && !rnoInnerhtml.test( value ) &&
+                               ( jQuery.support.htmlSerialize || !rnoshimcache.test( value )  ) &&
+                               ( jQuery.support.leadingWhitespace || !rleadingWhitespace.test( value ) ) &&
+                               !wrapMap[ ( rtagName.exec( value ) || ["", ""] )[1].toLowerCase() ] ) {
 
-                       // Remember the old values, and insert the new ones
-                       for ( name in options ) {
-                               old[ name ] = elem.style[ name ];
-                               elem.style[ name ] = options[ name ];
+                               value = value.replace( rxhtmlTag, "<$1></$2>" );
+
+                               try {
+                                       for (; i < l; i++ ) {
+                                               // Remove element nodes and prevent memory leaks
+                                               elem = this[i] || {};
+                                               if ( elem.nodeType === 1 ) {
+                                                       jQuery.cleanData( elem.getElementsByTagName( "*" ) );
+                                                       elem.innerHTML = value;
+                                               }
+                                       }
+
+                                       elem = 0;
+
+                               // If using innerHTML throws an exception, use the fallback method
+                               } catch(e) {}
+                       }
+
+                       if ( elem ) {
+                               this.empty().append( value );
                        }
+               }, null, value, arguments.length );
+       },
 
-                       ret = callback.call( elem );
+       replaceWith: function( value ) {
+               if ( !isDisconnected( this[0] ) ) {
+                       // Make sure that the elements are removed from the DOM before they are inserted
+                       // this can help fix replacing a parent with child elements
+                       if ( jQuery.isFunction( value ) ) {
+                               return this.each(function(i) {
+                                       var self = jQuery(this), old = self.html();
+                                       self.replaceWith( value.call( this, i, old ) );
+                               });
+                       }
 
-                       // Revert the old values
-                       for ( name in options ) {
-                               elem.style[ name ] = old[ name ];
+                       if ( typeof value !== "string" ) {
+                               value = jQuery( value ).detach();
                        }
 
-                       return ret;
+                       return this.each(function() {
+                               var next = this.nextSibling,
+                                       parent = this.parentNode;
+
+                               jQuery( this ).remove();
+
+                               if ( next ) {
+                                       jQuery(next).before( value );
+                               } else {
+                                       jQuery(parent).append( value );
+                               }
+                       });
                }
-       });
 
-// DEPRECATED in 1.3, Use jQuery.css() instead
-       jQuery.curCSS = jQuery.css;
+               return this.length ?
+                       this.pushStack( jQuery(jQuery.isFunction(value) ? value() : value), "replaceWith", value ) :
+                       this;
+       },
+
+       detach: function( selector ) {
+               return this.remove( selector, true );
+       },
 
-       if ( document.defaultView && document.defaultView.getComputedStyle ) {
-               getComputedStyle = function( elem, name ) {
-                       var ret, defaultView, computedStyle, width,
-                               style = elem.style;
+       domManip: function( args, table, callback ) {
 
-                       name = name.replace( rupper, "-$1" ).toLowerCase();
+               // Flatten any nested arrays
+               args = [].concat.apply( [], args );
 
-                       if ( (defaultView = elem.ownerDocument.defaultView) &&
-                               (computedStyle = defaultView.getComputedStyle( elem, null )) ) {
+               var results, first, fragment, iNoClone,
+                       i = 0,
+                       value = args[0],
+                       scripts = [],
+                       l = this.length;
+
+               // We can't cloneNode fragments that contain checked, in WebKit
+               if ( !jQuery.support.checkClone && l > 1 && typeof value === "string" && rchecked.test( value ) ) {
+                       return this.each(function() {
+                               jQuery(this).domManip( args, table, callback );
+                       });
+               }
+
+               if ( jQuery.isFunction(value) ) {
+                       return this.each(function(i) {
+                               var self = jQuery(this);
+                               args[0] = value.call( this, i, table ? self.html() : undefined );
+                               self.domManip( args, table, callback );
+                       });
+               }
 
-                               ret = computedStyle.getPropertyValue( name );
-                               if ( ret === "" && !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-                                       ret = jQuery.style( elem, name );
+               if ( this[0] ) {
+                       results = jQuery.buildFragment( args, this, scripts );
+                       fragment = results.fragment;
+                       first = fragment.firstChild;
+
+                       if ( fragment.childNodes.length === 1 ) {
+                               fragment = first;
+                       }
+
+                       if ( first ) {
+                               table = table && jQuery.nodeName( first, "tr" );
+
+                               // Use the original fragment for the last item instead of the first because it can end up
+                               // being emptied incorrectly in certain situations (#8070).
+                               // Fragments from the fragment cache must always be cloned and never used in place.
+                               for ( iNoClone = results.cacheable || l - 1; i < l; i++ ) {
+                                       callback.call(
+                                               table && jQuery.nodeName( this[i], "table" ) ?
+                                                       findOrAppend( this[i], "tbody" ) :
+                                                       this[i],
+                                               i === iNoClone ?
+                                                       fragment :
+                                                       jQuery.clone( fragment, true, true )
+                                       );
                                }
                        }
 
-                       // A tribute to the "awesome hack by Dean Edwards"
-                       // WebKit uses "computed value (percentage if specified)" instead of "used value" for margins
-                       // which is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
-                       if ( !jQuery.support.pixelMargin && computedStyle && rmargin.test( name ) && rnumnonpx.test( ret ) ) {
-                               width = style.width;
-                               style.width = ret;
-                               ret = computedStyle.width;
-                               style.width = width;
+                       // Fix #11809: Avoid leaking memory
+                       fragment = first = null;
+
+                       if ( scripts.length ) {
+                               jQuery.each( scripts, function( i, elem ) {
+                                       if ( elem.src ) {
+                                               if ( jQuery.ajax ) {
+                                                       jQuery.ajax({
+                                                               url: elem.src,
+                                                               type: "GET",
+                                                               dataType: "script",
+                                                               async: false,
+                                                               global: false,
+                                                               "throws": true
+                                                       });
+                                               } else {
+                                                       jQuery.error("no ajax");
+                                               }
+                                       } else {
+                                               jQuery.globalEval( ( elem.text || elem.textContent || elem.innerHTML || "" ).replace( rcleanScript, "" ) );
+                                       }
+
+                                       if ( elem.parentNode ) {
+                                               elem.parentNode.removeChild( elem );
+                                       }
+                               });
                        }
+               }
 
-                       return ret;
-               };
+               return this;
        }
+});
 
-       if ( document.documentElement.currentStyle ) {
-               currentStyle = function( elem, name ) {
-                       var left, rsLeft, uncomputed,
-                               ret = elem.currentStyle && elem.currentStyle[ name ],
-                               style = elem.style;
+function findOrAppend( elem, tag ) {
+       return elem.getElementsByTagName( tag )[0] || elem.appendChild( elem.ownerDocument.createElement( tag ) );
+}
 
-                       // Avoid setting ret to empty string here
-                       // so we don't default to auto
-                       if ( ret == null && style && (uncomputed = style[ name ]) ) {
-                               ret = uncomputed;
-                       }
-
-                       // From the awesome hack by Dean Edwards
-                       // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
+function cloneCopyEvent( src, dest ) {
 
-                       // If we're not dealing with a regular pixel number
-                       // but a number that has a weird ending, we need to convert it to pixels
-                       if ( rnumnonpx.test( ret ) ) {
+       if ( dest.nodeType !== 1 || !jQuery.hasData( src ) ) {
+               return;
+       }
 
-                               // Remember the original values
-                               left = style.left;
-                               rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
+       var type, i, l,
+               oldData = jQuery._data( src ),
+               curData = jQuery._data( dest, oldData ),
+               events = oldData.events;
 
-                               // Put in the new values to get a computed value out
-                               if ( rsLeft ) {
-                                       elem.runtimeStyle.left = elem.currentStyle.left;
-                               }
-                               style.left = name === "fontSize" ? "1em" : ret;
-                               ret = style.pixelLeft + "px";
+       if ( events ) {
+               delete curData.handle;
+               curData.events = {};
 
-                               // Revert the changed values
-                               style.left = left;
-                               if ( rsLeft ) {
-                                       elem.runtimeStyle.left = rsLeft;
-                               }
+               for ( type in events ) {
+                       for ( i = 0, l = events[ type ].length; i < l; i++ ) {
+                               jQuery.event.add( dest, type, events[ type ][ i ] );
                        }
+               }
+       }
 
-                       return ret === "" ? "auto" : ret;
-               };
+       // make the cloned public data object a copy from the original
+       if ( curData.data ) {
+               curData.data = jQuery.extend( {}, curData.data );
        }
+}
 
-       curCSS = getComputedStyle || currentStyle;
+function cloneFixAttributes( src, dest ) {
+       var nodeName;
 
-       function getWidthOrHeight( elem, name, extra ) {
+       // We do not need to do anything for non-Elements
+       if ( dest.nodeType !== 1 ) {
+               return;
+       }
 
-               // Start with offset property
-               var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
-                       i = name === "width" ? 1 : 0,
-                       len = 4;
+       // clearAttributes removes the attributes, which we don't want,
+       // but also removes the attachEvent events, which we *do* want
+       if ( dest.clearAttributes ) {
+               dest.clearAttributes();
+       }
 
-               if ( val > 0 ) {
-                       if ( extra !== "border" ) {
-                               for ( ; i < len; i += 2 ) {
-                                       if ( !extra ) {
-                                               val -= parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                                       }
-                                       if ( extra === "margin" ) {
-                                               val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ] ) ) || 0;
-                                       } else {
-                                               val -= parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                                       }
-                               }
-                       }
+       // mergeAttributes, in contrast, only merges back on the
+       // original attributes, not the events
+       if ( dest.mergeAttributes ) {
+               dest.mergeAttributes( src );
+       }
 
-                       return val + "px";
-               }
+       nodeName = dest.nodeName.toLowerCase();
 
-               // Fall back to computed then uncomputed css if necessary
-               val = curCSS( elem, name );
-               if ( val < 0 || val == null ) {
-                       val = elem.style[ name ];
+       if ( nodeName === "object" ) {
+               // IE6-10 improperly clones children of object elements using classid.
+               // IE10 throws NoModificationAllowedError if parent is null, #12132.
+               if ( dest.parentNode ) {
+                       dest.outerHTML = src.outerHTML;
                }
 
-               // Computed unit is not pixels. Stop here and return.
-               if ( rnumnonpx.test(val) ) {
-                       return val;
+               // This path appears unavoidable for IE9. When cloning an object
+               // element in IE9, the outerHTML strategy above is not sufficient.
+               // If the src has innerHTML and the destination does not,
+               // copy the src.innerHTML into the dest.innerHTML. #10324
+               if ( jQuery.support.html5Clone && (src.innerHTML && !jQuery.trim(dest.innerHTML)) ) {
+                       dest.innerHTML = src.innerHTML;
                }
 
-               // Normalize "", auto, and prepare for extra
-               val = parseFloat( val ) || 0;
+       } else if ( nodeName === "input" && rcheckableType.test( src.type ) ) {
+               // IE6-8 fails to persist the checked state of a cloned checkbox
+               // or radio button. Worse, IE6-7 fail to give the cloned element
+               // a checked appearance if the defaultChecked value isn't also set
 
-               // Add padding, border, margin
-               if ( extra ) {
-                       for ( ; i < len; i += 2 ) {
-                               val += parseFloat( jQuery.css( elem, "padding" + cssExpand[ i ] ) ) || 0;
-                               if ( extra !== "padding" ) {
-                                       val += parseFloat( jQuery.css( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
-                               }
-                               if ( extra === "margin" ) {
-                                       val += parseFloat( jQuery.css( elem, extra + cssExpand[ i ]) ) || 0;
-                               }
-                       }
+               dest.defaultChecked = dest.checked = src.checked;
+
+               // IE6-7 get confused and end up setting the value of a cloned
+               // checkbox/radio button to an empty string instead of "on"
+               if ( dest.value !== src.value ) {
+                       dest.value = src.value;
                }
 
-               return val + "px";
-       }
+       // IE6-8 fails to return the selected option to the default selected
+       // state when cloning options
+       } else if ( nodeName === "option" ) {
+               dest.selected = src.defaultSelected;
 
-       jQuery.each([ "height", "width" ], function( i, name ) {
-               jQuery.cssHooks[ name ] = {
-                       get: function( elem, computed, extra ) {
-                               if ( computed ) {
-                                       if ( elem.offsetWidth !== 0 ) {
-                                               return getWidthOrHeight( elem, name, extra );
-                                       } else {
-                                               return jQuery.swap( elem, cssShow, function() {
-                                                       return getWidthOrHeight( elem, name, extra );
-                                               });
-                                       }
-                               }
-                       },
+       // IE6-8 fails to set the defaultValue to the correct value when
+       // cloning other types of input fields
+       } else if ( nodeName === "input" || nodeName === "textarea" ) {
+               dest.defaultValue = src.defaultValue;
 
-                       set: function( elem, value ) {
-                               return rnum.test( value ) ?
-                                       value + "px" :
-                                       value;
-                       }
-               };
-       });
+       // IE blanks contents when cloning scripts
+       } else if ( nodeName === "script" && dest.text !== src.text ) {
+               dest.text = src.text;
+       }
 
-       if ( !jQuery.support.opacity ) {
-               jQuery.cssHooks.opacity = {
-                       get: function( elem, computed ) {
-                               // IE uses filters for opacity
-                               return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
-                                       ( parseFloat( RegExp.$1 ) / 100 ) + "" :
-                                       computed ? "1" : "";
-                       },
+       // Event data gets referenced instead of copied if the expando
+       // gets copied too
+       dest.removeAttribute( jQuery.expando );
+}
+
+jQuery.buildFragment = function( args, context, scripts ) {
+       var fragment, cacheable, cachehit,
+               first = args[ 0 ];
+
+       // Set context from what may come in as undefined or a jQuery collection or a node
+       // Updated to fix #12266 where accessing context[0] could throw an exception in IE9/10 &
+       // also doubles as fix for #8950 where plain objects caused createDocumentFragment exception
+       context = context || document;
+       context = !context.nodeType && context[0] || context;
+       context = context.ownerDocument || context;
+
+       // Only cache "small" (1/2 KB) HTML strings that are associated with the main document
+       // Cloning options loses the selected state, so don't cache them
+       // IE 6 doesn't like it when you put <object> or <embed> elements in a fragment
+       // Also, WebKit does not clone 'checked' attributes on cloneNode, so don't cache
+       // Lastly, IE6,7,8 will not correctly reuse cached fragments that were created from unknown elems #10501
+       if ( args.length === 1 && typeof first === "string" && first.length < 512 && context === document &&
+               first.charAt(0) === "<" && !rnocache.test( first ) &&
+               (jQuery.support.checkClone || !rchecked.test( first )) &&
+               (jQuery.support.html5Clone || !rnoshimcache.test( first )) ) {
+
+               // Mark cacheable and look for a hit
+               cacheable = true;
+               fragment = jQuery.fragments[ first ];
+               cachehit = fragment !== undefined;
+       }
 
-                       set: function( elem, value ) {
-                               var style = elem.style,
-                                       currentStyle = elem.currentStyle,
-                                       opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
-                                       filter = currentStyle && currentStyle.filter || style.filter || "";
+       if ( !fragment ) {
+               fragment = context.createDocumentFragment();
+               jQuery.clean( args, context, fragment, scripts );
 
-                               // IE has trouble with opacity if it does not have layout
-                               // Force it by setting the zoom level
-                               style.zoom = 1;
+               // Update the cache, but only store false
+               // unless this is a second parsing of the same content
+               if ( cacheable ) {
+                       jQuery.fragments[ first ] = cachehit && fragment;
+               }
+       }
 
-                               // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
-                               if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" ) {
+       return { fragment: fragment, cacheable: cacheable };
+};
 
-                                       // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
-                                       // if "filter:" is present at all, clearType is disabled, we want to avoid this
-                                       // style.removeAttribute is IE Only, but so apparently is this code path...
-                                       style.removeAttribute( "filter" );
+jQuery.fragments = {};
 
-                                       // if there there is no filter style applied in a css rule, we are done
-                                       if ( currentStyle && !currentStyle.filter ) {
-                                               return;
-                                       }
-                               }
+jQuery.each({
+       appendTo: "append",
+       prependTo: "prepend",
+       insertBefore: "before",
+       insertAfter: "after",
+       replaceAll: "replaceWith"
+}, function( name, original ) {
+       jQuery.fn[ name ] = function( selector ) {
+               var elems,
+                       i = 0,
+                       ret = [],
+                       insert = jQuery( selector ),
+                       l = insert.length,
+                       parent = this.length === 1 && this[0].parentNode;
 
-                               // otherwise, set new filter values
-                               style.filter = ralpha.test( filter ) ?
-                                       filter.replace( ralpha, opacity ) :
-                                       filter + " " + opacity;
+               if ( (parent == null || parent && parent.nodeType === 11 && parent.childNodes.length === 1) && l === 1 ) {
+                       insert[ original ]( this[0] );
+                       return this;
+               } else {
+                       for ( ; i < l; i++ ) {
+                               elems = ( i > 0 ? this.clone(true) : this ).get();
+                               jQuery( insert[i] )[ original ]( elems );
+                               ret = ret.concat( elems );
                        }
-               };
-       }
 
-       jQuery(function() {
-               // This hook cannot be added until DOM ready because the support test
-               // for it is not run until after DOM ready
-               if ( !jQuery.support.reliableMarginRight ) {
-                       jQuery.cssHooks.marginRight = {
-                               get: function( elem, computed ) {
-                                       // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
-                                       // Work around by temporarily setting element display to inline-block
-                                       return jQuery.swap( elem, { "display": "inline-block" }, function() {
-                                               if ( computed ) {
-                                                       return curCSS( elem, "margin-right" );
-                                               } else {
-                                                       return elem.style.marginRight;
-                                               }
-                                       });
-                               }
-                       };
+                       return this.pushStack( ret, name, insert.selector );
                }
-       });
+       };
+});
 
-       if ( jQuery.expr && jQuery.expr.filters ) {
-               jQuery.expr.filters.hidden = function( elem ) {
-                       var width = elem.offsetWidth,
-                               height = elem.offsetHeight;
+function getAll( elem ) {
+       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+               return elem.getElementsByTagName( "*" );
 
-                       return ( width === 0 && height === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || jQuery.css( elem, "display" )) === "none");
-               };
+       } else if ( typeof elem.querySelectorAll !== "undefined" ) {
+               return elem.querySelectorAll( "*" );
 
-               jQuery.expr.filters.visible = function( elem ) {
-                       return !jQuery.expr.filters.hidden( elem );
-               };
+       } else {
+               return [];
        }
+}
 
-// These hooks are used by animate to expand properties
-       jQuery.each({
-               margin: "",
-               padding: "",
-               border: "Width"
-       }, function( prefix, suffix ) {
+// Used in clean, fixes the defaultChecked property
+function fixDefaultChecked( elem ) {
+       if ( rcheckableType.test( elem.type ) ) {
+               elem.defaultChecked = elem.checked;
+       }
+}
 
-               jQuery.cssHooks[ prefix + suffix ] = {
-                       expand: function( value ) {
-                               var i,
+jQuery.extend({
+       clone: function( elem, dataAndEvents, deepDataAndEvents ) {
+               var srcElements,
+                       destElements,
+                       i,
+                       clone;
 
-                               // assumes a single number if not a string
-                                       parts = typeof value === "string" ? value.split(" ") : [ value ],
-                                       expanded = {};
+               if ( jQuery.support.html5Clone || jQuery.isXMLDoc(elem) || !rnoshimcache.test( "<" + elem.nodeName + ">" ) ) {
+                       clone = elem.cloneNode( true );
 
-                               for ( i = 0; i < 4; i++ ) {
-                                       expanded[ prefix + cssExpand[ i ] + suffix ] =
-                                               parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
-                               }
+               // IE<=8 does not properly clone detached, unknown element nodes
+               } else {
+                       fragmentDiv.innerHTML = elem.outerHTML;
+                       fragmentDiv.removeChild( clone = fragmentDiv.firstChild );
+               }
 
-                               return expanded;
-                       }
-               };
-       });
+               if ( (!jQuery.support.noCloneEvent || !jQuery.support.noCloneChecked) &&
+                               (elem.nodeType === 1 || elem.nodeType === 11) && !jQuery.isXMLDoc(elem) ) {
+                       // IE copies events bound via attachEvent when using cloneNode.
+                       // Calling detachEvent on the clone will also remove the events
+                       // from the original. In order to get around this, we use some
+                       // proprietary methods to clear the events. Thanks to MooTools
+                       // guys for this hotness.
 
+                       cloneFixAttributes( elem, clone );
 
+                       // Using Sizzle here is crazy slow, so we use getElementsByTagName instead
+                       srcElements = getAll( elem );
+                       destElements = getAll( clone );
 
+                       // Weird iteration because IE will replace the length property
+                       // with an element if you are cloning the body and one of the
+                       // elements on the page has a name or id of "length"
+                       for ( i = 0; srcElements[i]; ++i ) {
+                               // Ensure that the destination node is not null; Fixes #9587
+                               if ( destElements[i] ) {
+                                       cloneFixAttributes( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
 
-       var r20 = /%20/g,
-               rbracket = /\[\]$/,
-               rCRLF = /\r?\n/g,
-               rhash = /#.*$/,
-               rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
-               rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
-       // #7653, #8125, #8152: local protocol detection
-               rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
-               rnoContent = /^(?:GET|HEAD)$/,
-               rprotocol = /^\/\//,
-               rquery = /\?/,
-               rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
-               rselectTextarea = /^(?:select|textarea)/i,
-               rspacesAjax = /\s+/,
-               rts = /([?&])_=[^&]*/,
-               rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+))?)?/,
+               // Copy the events from the original to the clone
+               if ( dataAndEvents ) {
+                       cloneCopyEvent( elem, clone );
 
-       // Keep a copy of the old load method
-               _load = jQuery.fn.load,
+                       if ( deepDataAndEvents ) {
+                               srcElements = getAll( elem );
+                               destElements = getAll( clone );
 
-       /* Prefilters
-        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
-        * 2) These are called:
-        *    - BEFORE asking for a transport
-        *    - AFTER param serialization (s.data is a string if s.processData is true)
-        * 3) key is the dataType
-        * 4) the catchall symbol "*" can be used
-        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
-        */
-               prefilters = {},
+                               for ( i = 0; srcElements[i]; ++i ) {
+                                       cloneCopyEvent( srcElements[i], destElements[i] );
+                               }
+                       }
+               }
 
-       /* Transports bindings
-        * 1) key is the dataType
-        * 2) the catchall symbol "*" can be used
-        * 3) selection will start with transport dataType and THEN go to "*" if needed
-        */
-               transports = {},
+               srcElements = destElements = null;
 
-       // Document location
-               ajaxLocation,
+               // Return the cloned set
+               return clone;
+       },
 
-       // Document location segments
-               ajaxLocParts,
+       clean: function( elems, context, fragment, scripts ) {
+               var i, j, elem, tag, wrap, depth, div, hasBody, tbody, len, handleScript, jsTags,
+                       safe = context === document && safeFragment,
+                       ret = [];
 
-       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
-               allTypes = ["*/"] + ["*"];
+               // Ensure that context is a document
+               if ( !context || typeof context.createDocumentFragment === "undefined" ) {
+                       context = document;
+               }
 
-// #8138, IE may throw an exception when accessing
-// a field from window.location if document.domain has been set
-       try {
-               ajaxLocation = location.href;
-       } catch( e ) {
-               // Use the href attribute of an A element
-               // since IE will modify it given document.location
-               ajaxLocation = document.createElement( "a" );
-               ajaxLocation.href = "";
-               ajaxLocation = ajaxLocation.href;
-       }
+               // Use the already-created safe fragment if context permits
+               for ( i = 0; (elem = elems[i]) != null; i++ ) {
+                       if ( typeof elem === "number" ) {
+                               elem += "";
+                       }
 
-// Segment location into parts
-       ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+                       if ( !elem ) {
+                               continue;
+                       }
 
-// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
-       function addToPrefiltersOrTransports( structure ) {
+                       // Convert html string into DOM nodes
+                       if ( typeof elem === "string" ) {
+                               if ( !rhtml.test( elem ) ) {
+                                       elem = context.createTextNode( elem );
+                               } else {
+                                       // Ensure a safe container in which to render the html
+                                       safe = safe || createSafeFragment( context );
+                                       div = context.createElement("div");
+                                       safe.appendChild( div );
 
-               // dataTypeExpression is optional and defaults to "*"
-               return function( dataTypeExpression, func ) {
+                                       // Fix "XHTML"-style tags in all browsers
+                                       elem = elem.replace(rxhtmlTag, "<$1></$2>");
 
-                       if ( typeof dataTypeExpression !== "string" ) {
-                               func = dataTypeExpression;
-                               dataTypeExpression = "*";
-                       }
+                                       // Go to html and back, then peel off extra wrappers
+                                       tag = ( rtagName.exec( elem ) || ["", ""] )[1].toLowerCase();
+                                       wrap = wrapMap[ tag ] || wrapMap._default;
+                                       depth = wrap[0];
+                                       div.innerHTML = wrap[1] + elem + wrap[2];
 
-                       if ( jQuery.isFunction( func ) ) {
-                               var dataTypes = dataTypeExpression.toLowerCase().split( rspacesAjax ),
-                                       i = 0,
-                                       length = dataTypes.length,
-                                       dataType,
-                                       list,
-                                       placeBefore;
-
-                               // For each dataType in the dataTypeExpression
-                               for ( ; i < length; i++ ) {
-                                       dataType = dataTypes[ i ];
-                                       // We control if we're asked to add before
-                                       // any existing element
-                                       placeBefore = /^\+/.test( dataType );
-                                       if ( placeBefore ) {
-                                               dataType = dataType.substr( 1 ) || "*";
+                                       // Move to the right depth
+                                       while ( depth-- ) {
+                                               div = div.lastChild;
                                        }
-                                       list = structure[ dataType ] = structure[ dataType ] || [];
-                                       // then we add to the structure accordingly
-                                       list[ placeBefore ? "unshift" : "push" ]( func );
-                               }
-                       }
-               };
-       }
 
-// Base inspection function for prefilters and transports
-       function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
-                                               dataType /* internal */, inspected /* internal */ ) {
+                                       // Remove IE's autoinserted <tbody> from table fragments
+                                       if ( !jQuery.support.tbody ) {
 
-               dataType = dataType || options.dataTypes[ 0 ];
-               inspected = inspected || {};
+                                               // String was a <table>, *may* have spurious <tbody>
+                                               hasBody = rtbody.test(elem);
+                                                       tbody = tag === "table" && !hasBody ?
+                                                               div.firstChild && div.firstChild.childNodes :
 
-               inspected[ dataType ] = true;
+                                                               // String was a bare <thead> or <tfoot>
+                                                               wrap[1] === "<table>" && !hasBody ?
+                                                                       div.childNodes :
+                                                                       [];
 
-               var list = structure[ dataType ],
-                       i = 0,
-                       length = list ? list.length : 0,
-                       executeOnly = ( structure === prefilters ),
-                       selection;
-
-               for ( ; i < length && ( executeOnly || !selection ); i++ ) {
-                       selection = list[ i ]( options, originalOptions, jqXHR );
-                       // If we got redirected to another dataType
-                       // we try there if executing only and not done already
-                       if ( typeof selection === "string" ) {
-                               if ( !executeOnly || inspected[ selection ] ) {
-                                       selection = undefined;
-                               } else {
-                                       options.dataTypes.unshift( selection );
-                                       selection = inspectPrefiltersOrTransports(
-                                               structure, options, originalOptions, jqXHR, selection, inspected );
+                                               for ( j = tbody.length - 1; j >= 0 ; --j ) {
+                                                       if ( jQuery.nodeName( tbody[ j ], "tbody" ) && !tbody[ j ].childNodes.length ) {
+                                                               tbody[ j ].parentNode.removeChild( tbody[ j ] );
+                                                       }
+                                               }
+                                       }
+
+                                       // IE completely kills leading whitespace when innerHTML is used
+                                       if ( !jQuery.support.leadingWhitespace && rleadingWhitespace.test( elem ) ) {
+                                               div.insertBefore( context.createTextNode( rleadingWhitespace.exec(elem)[0] ), div.firstChild );
+                                       }
+
+                                       elem = div.childNodes;
+
+                                       // Take out of fragment container (we need a fresh div each time)
+                                       div.parentNode.removeChild( div );
                                }
                        }
+
+                       if ( elem.nodeType ) {
+                               ret.push( elem );
+                       } else {
+                               jQuery.merge( ret, elem );
+                       }
                }
-               // If we're only executing or nothing was selected
-               // we try the catchall dataType if not done already
-               if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
-                       selection = inspectPrefiltersOrTransports(
-                               structure, options, originalOptions, jqXHR, "*", inspected );
+
+               // Fix #11356: Clear elements from safeFragment
+               if ( div ) {
+                       elem = div = safe = null;
                }
-               // unnecessary when only executing (prefilters)
-               // but it'll be ignored by the caller in that case
-               return selection;
-       }
 
-// A special extend for ajax options
-// that takes "flat" options (not to be deep extended)
-// Fixes #9887
-       function ajaxExtend( target, src ) {
-               var key, deep,
-                       flatOptions = jQuery.ajaxSettings.flatOptions || {};
-               for ( key in src ) {
-                       if ( src[ key ] !== undefined ) {
-                               ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
+               // Reset defaultChecked for any radios and checkboxes
+               // about to be appended to the DOM in IE 6/7 (#8060)
+               if ( !jQuery.support.appendChecked ) {
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               if ( jQuery.nodeName( elem, "input" ) ) {
+                                       fixDefaultChecked( elem );
+                               } else if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                       jQuery.grep( elem.getElementsByTagName("input"), fixDefaultChecked );
+                               }
                        }
                }
-               if ( deep ) {
-                       jQuery.extend( true, target, deep );
-               }
-       }
 
-       jQuery.fn.extend({
-               load: function( url, params, callback ) {
-                       if ( typeof url !== "string" && _load ) {
-                               return _load.apply( this, arguments );
+               // Append elements to a provided document fragment
+               if ( fragment ) {
+                       // Special handling of each script element
+                       handleScript = function( elem ) {
+                               // Check if we consider it executable
+                               if ( !elem.type || rscriptType.test( elem.type ) ) {
+                                       // Detach the script and store it in the scripts array (if provided) or the fragment
+                                       // Return truthy to indicate that it has been handled
+                                       return scripts ?
+                                               scripts.push( elem.parentNode ? elem.parentNode.removeChild( elem ) : elem ) :
+                                               fragment.appendChild( elem );
+                               }
+                       };
 
-                               // Don't do a request if no elements are being requested
-                       } else if ( !this.length ) {
-                               return this;
-                       }
+                       for ( i = 0; (elem = ret[i]) != null; i++ ) {
+                               // Check if we're done after handling an executable script
+                               if ( !( jQuery.nodeName( elem, "script" ) && handleScript( elem ) ) ) {
+                                       // Append to fragment and handle embedded scripts
+                                       fragment.appendChild( elem );
+                                       if ( typeof elem.getElementsByTagName !== "undefined" ) {
+                                               // handleScript alters the DOM, so use jQuery.merge to ensure snapshot iteration
+                                               jsTags = jQuery.grep( jQuery.merge( [], elem.getElementsByTagName("script") ), handleScript );
 
-                       var off = url.indexOf( " " );
-                       if ( off >= 0 ) {
-                               var selector = url.slice( off, url.length );
-                               url = url.slice( 0, off );
+                                               // Splice the scripts into ret after their former ancestor and advance our index beyond them
+                                               ret.splice.apply( ret, [i + 1, 0].concat( jsTags ) );
+                                               i += jsTags.length;
+                                       }
+                               }
                        }
+               }
 
-                       // Default to a GET request
-                       var type = "GET";
+               return ret;
+       },
 
-                       // If the second parameter was provided
-                       if ( params ) {
-                               // If it's a function
-                               if ( jQuery.isFunction( params ) ) {
-                                       // We assume that it's the callback
-                                       callback = params;
-                                       params = undefined;
+       cleanData: function( elems, /* internal */ acceptData ) {
+               var data, id, elem, type,
+                       i = 0,
+                       internalKey = jQuery.expando,
+                       cache = jQuery.cache,
+                       deleteExpando = jQuery.support.deleteExpando,
+                       special = jQuery.event.special;
 
-                                       // Otherwise, build a param string
-                               } else if ( typeof params === "object" ) {
-                                       params = jQuery.param( params, jQuery.ajaxSettings.traditional );
-                                       type = "POST";
-                               }
-                       }
+               for ( ; (elem = elems[i]) != null; i++ ) {
 
-                       var self = this;
+                       if ( acceptData || jQuery.acceptData( elem ) ) {
 
-                       // Request the remote document
-                       jQuery.ajax({
-                               url: url,
-                               type: type,
-                               dataType: "html",
-                               data: params,
-                               // Complete callback (responseText is used internally)
-                               complete: function( jqXHR, status, responseText ) {
-                                       // Store the response as specified by the jqXHR object
-                                       responseText = jqXHR.responseText;
-                                       // If successful, inject the HTML into all the matched elements
-                                       if ( jqXHR.isResolved() ) {
-                                               // #4825: Get the actual response in case
-                                               // a dataFilter is present in ajaxSettings
-                                               jqXHR.done(function( r ) {
-                                                       responseText = r;
-                                               });
-                                               // See if a selector was specified
-                                               self.html( selector ?
-                                                       // Create a dummy div to hold the results
-                                                       jQuery("<div>")
-                                                               // inject the contents of the document in, removing the scripts
-                                                               // to avoid any 'Permission Denied' errors in IE
-                                                               .append(responseText.replace(rscript, ""))
-
-                                                               // Locate the specified elements
-                                                               .find(selector) :
-
-                                                       // If not, just inject the full result
-                                                       responseText );
+                               id = elem[ internalKey ];
+                               data = id && cache[ id ];
+
+                               if ( data ) {
+                                       if ( data.events ) {
+                                               for ( type in data.events ) {
+                                                       if ( special[ type ] ) {
+                                                               jQuery.event.remove( elem, type );
+
+                                                       // This is a shortcut to avoid jQuery.event.remove's overhead
+                                                       } else {
+                                                               jQuery.removeEvent( elem, type, data.handle );
+                                                       }
+                                               }
                                        }
 
-                                       if ( callback ) {
-                                               self.each( callback, [ responseText, status, jqXHR ] );
+                                       // Remove cache only if it was not already removed by jQuery.event.remove
+                                       if ( cache[ id ] ) {
+
+                                               delete cache[ id ];
+
+                                               // IE does not allow us to delete expando properties from nodes,
+                                               // nor does it have a removeAttribute function on Document nodes;
+                                               // we must handle all of these cases
+                                               if ( deleteExpando ) {
+                                                       delete elem[ internalKey ];
+
+                                               } else if ( elem.removeAttribute ) {
+                                                       elem.removeAttribute( internalKey );
+
+                                               } else {
+                                                       elem[ internalKey ] = null;
+                                               }
+
+                                               jQuery.deletedIds.push( id );
                                        }
                                }
-                       });
+                       }
+               }
+       }
+});
+// Limit scope pollution from any deprecated API
+(function() {
+
+var matched, browser;
+
+// Use of jQuery.browser is frowned upon.
+// More details: http://api.jquery.com/jQuery.browser
+// jQuery.uaMatch maintained for back-compat
+jQuery.uaMatch = function( ua ) {
+       ua = ua.toLowerCase();
+
+       var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) ||
+               /(webkit)[ \/]([\w.]+)/.exec( ua ) ||
+               /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) ||
+               /(msie) ([\w.]+)/.exec( ua ) ||
+               ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) ||
+               [];
+
+       return {
+               browser: match[ 1 ] || "",
+               version: match[ 2 ] || "0"
+       };
+};
 
-                       return this;
-               },
+matched = jQuery.uaMatch( navigator.userAgent );
+browser = {};
 
-               serialize: function() {
-                       return jQuery.param( this.serializeArray() );
-               },
+if ( matched.browser ) {
+       browser[ matched.browser ] = true;
+       browser.version = matched.version;
+}
 
-               serializeArray: function() {
-                       return this.map(function(){
-                               return this.elements ? jQuery.makeArray( this.elements ) : this;
-                       })
-                               .filter(function(){
-                                       return this.name && !this.disabled &&
-                                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
-                                                       rinput.test( this.type ) );
-                               })
-                               .map(function( i, elem ){
-                                       var val = jQuery( this ).val();
-
-                                       return val == null ?
-                                               null :
-                                               jQuery.isArray( val ) ?
-                                                       jQuery.map( val, function( val, i ){
-                                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                                                       }) :
-                                               { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
-                               }).get();
+// Chrome is Webkit, but Webkit is also Safari.
+if ( browser.chrome ) {
+       browser.webkit = true;
+} else if ( browser.webkit ) {
+       browser.safari = true;
+}
+
+jQuery.browser = browser;
+
+jQuery.sub = function() {
+       function jQuerySub( selector, context ) {
+               return new jQuerySub.fn.init( selector, context );
+       }
+       jQuery.extend( true, jQuerySub, this );
+       jQuerySub.superclass = this;
+       jQuerySub.fn = jQuerySub.prototype = this();
+       jQuerySub.fn.constructor = jQuerySub;
+       jQuerySub.sub = this.sub;
+       jQuerySub.fn.init = function init( selector, context ) {
+               if ( context && context instanceof jQuery && !(context instanceof jQuerySub) ) {
+                       context = jQuerySub( context );
                }
-       });
 
-// Attach a bunch of functions for handling common AJAX events
-       jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
-               jQuery.fn[ o ] = function( f ){
-                       return this.on( o, f );
-               };
-       });
+               return jQuery.fn.init.call( this, selector, context, rootjQuerySub );
+       };
+       jQuerySub.fn.init.prototype = jQuerySub.fn;
+       var rootjQuerySub = jQuerySub(document);
+       return jQuerySub;
+};
+
+})();
+var curCSS, iframe, iframeDoc,
+       ralpha = /alpha\([^)]*\)/i,
+       ropacity = /opacity=([^)]*)/,
+       rposition = /^(top|right|bottom|left)$/,
+       // swappable if display is none or starts with table except "table", "table-cell", or "table-caption"
+       // see here for display values: https://developer.mozilla.org/en-US/docs/CSS/display
+       rdisplayswap = /^(none|table(?!-c[ea]).+)/,
+       rmargin = /^margin/,
+       rnumsplit = new RegExp( "^(" + core_pnum + ")(.*)$", "i" ),
+       rnumnonpx = new RegExp( "^(" + core_pnum + ")(?!px)[a-z%]+$", "i" ),
+       rrelNum = new RegExp( "^([-+])=(" + core_pnum + ")", "i" ),
+       elemdisplay = {},
+
+       cssShow = { position: "absolute", visibility: "hidden", display: "block" },
+       cssNormalTransform = {
+               letterSpacing: 0,
+               fontWeight: 400
+       },
+
+       cssExpand = [ "Top", "Right", "Bottom", "Left" ],
+       cssPrefixes = [ "Webkit", "O", "Moz", "ms" ],
+
+       eventsToggle = jQuery.fn.toggle;
+
+// return a css property mapped to a potentially vendor prefixed property
+function vendorPropName( style, name ) {
+
+       // shortcut for names that are not vendor prefixed
+       if ( name in style ) {
+               return name;
+       }
 
-       jQuery.each( [ "get", "post" ], function( i, method ) {
-               jQuery[ method ] = function( url, data, callback, type ) {
-                       // shift arguments if data argument was omitted
-                       if ( jQuery.isFunction( data ) ) {
-                               type = type || callback;
-                               callback = data;
-                               data = undefined;
-                       }
+       // check for vendor prefixed names
+       var capName = name.charAt(0).toUpperCase() + name.slice(1),
+               origName = name,
+               i = cssPrefixes.length;
 
-                       return jQuery.ajax({
-                               type: method,
-                               url: url,
-                               data: data,
-                               success: callback,
-                               dataType: type
-                       });
-               };
-       });
+       while ( i-- ) {
+               name = cssPrefixes[ i ] + capName;
+               if ( name in style ) {
+                       return name;
+               }
+       }
 
-       jQuery.extend({
+       return origName;
+}
 
-               getScript: function( url, callback ) {
-                       return jQuery.get( url, undefined, callback, "script" );
-               },
+function isHidden( elem, el ) {
+       elem = el || elem;
+       return jQuery.css( elem, "display" ) === "none" || !jQuery.contains( elem.ownerDocument, elem );
+}
 
-               getJSON: function( url, data, callback ) {
-                       return jQuery.get( url, data, callback, "json" );
-               },
+function showHide( elements, show ) {
+       var elem, display,
+               values = [],
+               index = 0,
+               length = elements.length;
 
-               // Creates a full fledged settings object into target
-               // with both ajaxSettings and settings fields.
-               // If target is omitted, writes into ajaxSettings.
-               ajaxSetup: function( target, settings ) {
-                       if ( settings ) {
-                               // Building a settings object
-                               ajaxExtend( target, jQuery.ajaxSettings );
-                       } else {
-                               // Extending ajaxSettings
-                               settings = target;
-                               target = jQuery.ajaxSettings;
+       for ( ; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               values[ index ] = jQuery._data( elem, "olddisplay" );
+               if ( show ) {
+                       // Reset the inline display of this element to learn if it is
+                       // being hidden by cascaded rules or not
+                       if ( !values[ index ] && elem.style.display === "none" ) {
+                               elem.style.display = "";
                        }
-                       ajaxExtend( target, settings );
-                       return target;
-               },
-
-               ajaxSettings: {
-                       url: ajaxLocation,
-                       isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
-                       global: true,
-                       type: "GET",
-                       contentType: "application/x-www-form-urlencoded; charset=UTF-8",
-                       processData: true,
-                       async: true,
-                       /*
-                        timeout: 0,
-                        data: null,
-                        dataType: null,
-                        username: null,
-                        password: null,
-                        cache: null,
-                        traditional: false,
-                        headers: {},
-                        */
-
-                       accepts: {
-                               xml: "application/xml, text/xml",
-                               html: "text/html",
-                               text: "text/plain",
-                               json: "application/json, text/javascript",
-                               "*": allTypes
-                       },
 
-                       contents: {
-                               xml: /xml/,
-                               html: /html/,
-                               json: /json/
-                       },
+                       // Set elements which have been overridden with display: none
+                       // in a stylesheet to whatever the default browser style is
+                       // for such an element
+                       if ( elem.style.display === "" && isHidden( elem ) ) {
+                               values[ index ] = jQuery._data( elem, "olddisplay", css_defaultDisplay(elem.nodeName) );
+                       }
+               } else {
+                       display = curCSS( elem, "display" );
 
-                       responseFields: {
-                               xml: "responseXML",
-                               text: "responseText"
-                       },
+                       if ( !values[ index ] && display !== "none" ) {
+                               jQuery._data( elem, "olddisplay", display );
+                       }
+               }
+       }
 
-                       // List of data converters
-                       // 1) key format is "source_type destination_type" (a single space in-between)
-                       // 2) the catchall symbol "*" can be used for source_type
-                       converters: {
+       // Set the display of most of the elements in a second loop
+       // to avoid the constant reflow
+       for ( index = 0; index < length; index++ ) {
+               elem = elements[ index ];
+               if ( !elem.style ) {
+                       continue;
+               }
+               if ( !show || elem.style.display === "none" || elem.style.display === "" ) {
+                       elem.style.display = show ? values[ index ] || "" : "none";
+               }
+       }
 
-                               // Convert anything to text
-                               "* text": window.String,
+       return elements;
+}
 
-                               // Text to html (true = no transformation)
-                               "text html": true,
+jQuery.fn.extend({
+       css: function( name, value ) {
+               return jQuery.access( this, function( elem, name, value ) {
+                       return value !== undefined ?
+                               jQuery.style( elem, name, value ) :
+                               jQuery.css( elem, name );
+               }, name, value, arguments.length > 1 );
+       },
+       show: function() {
+               return showHide( this, true );
+       },
+       hide: function() {
+               return showHide( this );
+       },
+       toggle: function( state, fn2 ) {
+               var bool = typeof state === "boolean";
+
+               if ( jQuery.isFunction( state ) && jQuery.isFunction( fn2 ) ) {
+                       return eventsToggle.apply( this, arguments );
+               }
 
-                               // Evaluate text as a json expression
-                               "text json": jQuery.parseJSON,
+               return this.each(function() {
+                       if ( bool ? state : isHidden( this ) ) {
+                               jQuery( this ).show();
+                       } else {
+                               jQuery( this ).hide();
+                       }
+               });
+       }
+});
 
-                               // Parse text as xml
-                               "text xml": jQuery.parseXML
-                       },
+jQuery.extend({
+       // Add in style property hooks for overriding the default
+       // behavior of getting and setting a style property
+       cssHooks: {
+               opacity: {
+                       get: function( elem, computed ) {
+                               if ( computed ) {
+                                       // We should always get a number back from opacity
+                                       var ret = curCSS( elem, "opacity" );
+                                       return ret === "" ? "1" : ret;
 
-                       // For options that shouldn't be deep extended:
-                       // you can add your own custom options here if
-                       // and when you create one that shouldn't be
-                       // deep extended (see ajaxExtend)
-                       flatOptions: {
-                               context: true,
-                               url: true
+                               }
                        }
-               },
+               }
+       },
+
+       // Exclude the following css properties to add px
+       cssNumber: {
+               "fillOpacity": true,
+               "fontWeight": true,
+               "lineHeight": true,
+               "opacity": true,
+               "orphans": true,
+               "widows": true,
+               "zIndex": true,
+               "zoom": true
+       },
+
+       // Add in properties whose names you wish to fix before
+       // setting or getting the value
+       cssProps: {
+               // normalize float css property
+               "float": jQuery.support.cssFloat ? "cssFloat" : "styleFloat"
+       },
+
+       // Get and set the style property on a DOM Node
+       style: function( elem, name, value, extra ) {
+               // Don't set styles on text and comment nodes
+               if ( !elem || elem.nodeType === 3 || elem.nodeType === 8 || !elem.style ) {
+                       return;
+               }
 
-               ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
-               ajaxTransport: addToPrefiltersOrTransports( transports ),
+               // Make sure that we're working with the right name
+               var ret, type, hooks,
+                       origName = jQuery.camelCase( name ),
+                       style = elem.style;
 
-               // Main method
-               ajax: function( url, options ) {
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( style, origName ) );
 
-                       // If url is an object, simulate pre-1.5 signature
-                       if ( typeof url === "object" ) {
-                               options = url;
-                               url = undefined;
-                       }
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-                       // Force options to be an object
-                       options = options || {};
+               // Check if we're setting a value
+               if ( value !== undefined ) {
+                       type = typeof value;
 
-                       var // Create the final options object
-                               s = jQuery.ajaxSetup( {}, options ),
-                       // Callbacks context
-                               callbackContext = s.context || s,
-                       // Context for global events
-                       // It's the callbackContext if one was provided in the options
-                       // and if it's a DOM node or a jQuery collection
-                               globalEventContext = callbackContext !== s &&
-                                       ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
-                                       jQuery( callbackContext ) : jQuery.event,
-                       // Deferreds
-                               deferred = jQuery.Deferred(),
-                               completeDeferred = jQuery.Callbacks( "once memory" ),
-                       // Status-dependent callbacks
-                               statusCode = s.statusCode || {},
-                       // ifModified key
-                               ifModifiedKey,
-                       // Headers (they are sent all at once)
-                               requestHeaders = {},
-                               requestHeadersNames = {},
-                       // Response headers
-                               responseHeadersString,
-                               responseHeaders,
-                       // transport
-                               transport,
-                       // timeout handle
-                               timeoutTimer,
-                       // Cross-domain detection vars
-                               parts,
-                       // The jqXHR state
-                               state = 0,
-                       // To know if global events are to be dispatched
-                               fireGlobals,
-                       // Loop variable
-                               i,
-                       // Fake xhr
-                               jqXHR = {
+                       // convert relative number strings (+= or -=) to relative numbers. #7345
+                       if ( type === "string" && (ret = rrelNum.exec( value )) ) {
+                               value = ( ret[1] + 1 ) * ret[2] + parseFloat( jQuery.css( elem, name ) );
+                               // Fixes bug #9237
+                               type = "number";
+                       }
 
-                                       readyState: 0,
+                       // Make sure that NaN and null values aren't set. See: #7116
+                       if ( value == null || type === "number" && isNaN( value ) ) {
+                               return;
+                       }
 
-                                       // Caches the header
-                                       setRequestHeader: function( name, value ) {
-                                               if ( !state ) {
-                                                       var lname = name.toLowerCase();
-                                                       name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
-                                                       requestHeaders[ name ] = value;
-                                               }
-                                               return this;
-                                       },
-
-                                       // Raw string
-                                       getAllResponseHeaders: function() {
-                                               return state === 2 ? responseHeadersString : null;
-                                       },
-
-                                       // Builds headers hashtable if needed
-                                       getResponseHeader: function( key ) {
-                                               var match;
-                                               if ( state === 2 ) {
-                                                       if ( !responseHeaders ) {
-                                                               responseHeaders = {};
-                                                               while( ( match = rheaders.exec( responseHeadersString ) ) ) {
-                                                                       responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
-                                                               }
-                                                       }
-                                                       match = responseHeaders[ key.toLowerCase() ];
-                                               }
-                                               return match === undefined ? null : match;
-                                       },
+                       // If a number was passed in, add 'px' to the (except for certain CSS properties)
+                       if ( type === "number" && !jQuery.cssNumber[ origName ] ) {
+                               value += "px";
+                       }
 
-                                       // Overrides response content-type header
-                                       overrideMimeType: function( type ) {
-                                               if ( !state ) {
-                                                       s.mimeType = type;
-                                               }
-                                               return this;
-                                       },
-
-                                       // Cancel the request
-                                       abort: function( statusText ) {
-                                               statusText = statusText || "abort";
-                                               if ( transport ) {
-                                                       transport.abort( statusText );
-                                               }
-                                               done( 0, statusText );
-                                               return this;
-                                       }
-                               };
+                       // If a hook was provided, use that value, otherwise just set the specified value
+                       if ( !hooks || !("set" in hooks) || (value = hooks.set( elem, value, extra )) !== undefined ) {
+                               // Wrapped to prevent IE from throwing errors when 'invalid' values are provided
+                               // Fixes bug #5509
+                               try {
+                                       style[ name ] = value;
+                               } catch(e) {}
+                       }
 
-                       // Callback for when everything is done
-                       // It is defined here because jslint complains if it is declared
-                       // at the end of the function (which would be more logical and readable)
-                       function done( status, nativeStatusText, responses, headers ) {
+               } else {
+                       // If a hook was provided get the non-computed value from there
+                       if ( hooks && "get" in hooks && (ret = hooks.get( elem, false, extra )) !== undefined ) {
+                               return ret;
+                       }
 
-                               // Called once
-                               if ( state === 2 ) {
-                                       return;
-                               }
+                       // Otherwise just get the value from the style object
+                       return style[ name ];
+               }
+       },
 
-                               // State is "done" now
-                               state = 2;
+       css: function( elem, name, numeric, extra ) {
+               var val, num, hooks,
+                       origName = jQuery.camelCase( name );
 
-                               // Clear timeout if it exists
-                               if ( timeoutTimer ) {
-                                       clearTimeout( timeoutTimer );
-                               }
+               // Make sure that we're working with the right name
+               name = jQuery.cssProps[ origName ] || ( jQuery.cssProps[ origName ] = vendorPropName( elem.style, origName ) );
 
-                               // Dereference transport for early garbage collection
-                               // (no matter how long the jqXHR object will be used)
-                               transport = undefined;
+               // gets hook for the prefixed version
+               // followed by the unprefixed version
+               hooks = jQuery.cssHooks[ name ] || jQuery.cssHooks[ origName ];
 
-                               // Cache response headers
-                               responseHeadersString = headers || "";
+               // If a hook was provided get the computed value from there
+               if ( hooks && "get" in hooks ) {
+                       val = hooks.get( elem, true, extra );
+               }
 
-                               // Set readyState
-                               jqXHR.readyState = status > 0 ? 4 : 0;
+               // Otherwise, if a way to get the computed value exists, use that
+               if ( val === undefined ) {
+                       val = curCSS( elem, name );
+               }
 
-                               var isSuccess,
-                                       success,
-                                       error,
-                                       statusText = nativeStatusText,
-                                       response = responses ? ajaxHandleResponses( s, jqXHR, responses ) : undefined,
-                                       lastModified,
-                                       etag;
+               //convert "normal" to computed value
+               if ( val === "normal" && name in cssNormalTransform ) {
+                       val = cssNormalTransform[ name ];
+               }
 
-                               // If successful, handle type chaining
-                               if ( status >= 200 && status < 300 || status === 304 ) {
+               // Return, converting to number if forced or a qualifier was provided and val looks numeric
+               if ( numeric || extra !== undefined ) {
+                       num = parseFloat( val );
+                       return numeric || jQuery.isNumeric( num ) ? num || 0 : val;
+               }
+               return val;
+       },
+
+       // A method for quickly swapping in/out CSS properties to get correct calculations
+       swap: function( elem, options, callback ) {
+               var ret, name,
+                       old = {};
+
+               // Remember the old values, and insert the new ones
+               for ( name in options ) {
+                       old[ name ] = elem.style[ name ];
+                       elem.style[ name ] = options[ name ];
+               }
 
-                                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                                       if ( s.ifModified ) {
+               ret = callback.call( elem );
 
-                                               if ( ( lastModified = jqXHR.getResponseHeader( "Last-Modified" ) ) ) {
-                                                       jQuery.lastModified[ ifModifiedKey ] = lastModified;
-                                               }
-                                               if ( ( etag = jqXHR.getResponseHeader( "Etag" ) ) ) {
-                                                       jQuery.etag[ ifModifiedKey ] = etag;
-                                               }
-                                       }
+               // Revert the old values
+               for ( name in options ) {
+                       elem.style[ name ] = old[ name ];
+               }
 
-                                       // If not modified
-                                       if ( status === 304 ) {
+               return ret;
+       }
+});
 
-                                               statusText = "notmodified";
-                                               isSuccess = true;
+// NOTE: To any future maintainer, we've window.getComputedStyle
+// because jsdom on node.js will break without it.
+if ( window.getComputedStyle ) {
+       curCSS = function( elem, name ) {
+               var ret, width, minWidth, maxWidth,
+                       computed = window.getComputedStyle( elem, null ),
+                       style = elem.style;
 
-                                               // If we have data
-                                       } else {
+               if ( computed ) {
 
-                                               try {
-                                                       success = ajaxConvert( s, response );
-                                                       statusText = "success";
-                                                       isSuccess = true;
-                                               } catch(e) {
-                                                       // We have a parsererror
-                                                       statusText = "parsererror";
-                                                       error = e;
-                                               }
-                                       }
-                               } else {
-                                       // We extract error from statusText
-                                       // then normalize statusText and status for non-aborts
-                                       error = statusText;
-                                       if ( !statusText || status ) {
-                                               statusText = "error";
-                                               if ( status < 0 ) {
-                                                       status = 0;
-                                               }
-                                       }
-                               }
+                       ret = computed[ name ];
+                       if ( ret === "" && !jQuery.contains( elem.ownerDocument, elem ) ) {
+                               ret = jQuery.style( elem, name );
+                       }
+
+                       // A tribute to the "awesome hack by Dean Edwards"
+                       // Chrome < 17 and Safari 5.0 uses "computed value" instead of "used value" for margin-right
+                       // Safari 5.1.7 (at least) returns percentage for a larger set of values, but width seems to be reliably pixels
+                       // this is against the CSSOM draft spec: http://dev.w3.org/csswg/cssom/#resolved-values
+                       if ( rnumnonpx.test( ret ) && rmargin.test( name ) ) {
+                               width = style.width;
+                               minWidth = style.minWidth;
+                               maxWidth = style.maxWidth;
 
-                               // Set data for the fake xhr object
-                               jqXHR.status = status;
-                               jqXHR.statusText = "" + ( nativeStatusText || statusText );
+                               style.minWidth = style.maxWidth = style.width = ret;
+                               ret = computed.width;
 
-                               // Success/Error
-                               if ( isSuccess ) {
-                                       deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
-                               } else {
-                                       deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
-                               }
+                               style.width = width;
+                               style.minWidth = minWidth;
+                               style.maxWidth = maxWidth;
+                       }
+               }
+
+               return ret;
+       };
+} else if ( document.documentElement.currentStyle ) {
+       curCSS = function( elem, name ) {
+               var left, rsLeft,
+                       ret = elem.currentStyle && elem.currentStyle[ name ],
+                       style = elem.style;
+
+               // Avoid setting ret to empty string here
+               // so we don't default to auto
+               if ( ret == null && style && style[ name ] ) {
+                       ret = style[ name ];
+               }
 
-                               // Status-dependent callbacks
-                               jqXHR.statusCode( statusCode );
-                               statusCode = undefined;
+               // From the awesome hack by Dean Edwards
+               // http://erik.eae.net/archives/2007/07/27/18.54.15/#comment-102291
 
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
-                                               [ jqXHR, s, isSuccess ? success : error ] );
-                               }
+               // If we're not dealing with a regular pixel number
+               // but a number that has a weird ending, we need to convert it to pixels
+               // but not position css attributes, as those are proportional to the parent element instead
+               // and we can't measure the parent instead because it might trigger a "stacking dolls" problem
+               if ( rnumnonpx.test( ret ) && !rposition.test( name ) ) {
 
-                               // Complete
-                               completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
+                       // Remember the original values
+                       left = style.left;
+                       rsLeft = elem.runtimeStyle && elem.runtimeStyle.left;
 
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
-                                       // Handle the global AJAX counter
-                                       if ( !( --jQuery.active ) ) {
-                                               jQuery.event.trigger( "ajaxStop" );
-                                       }
-                               }
+                       // Put in the new values to get a computed value out
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = elem.currentStyle.left;
                        }
+                       style.left = name === "fontSize" ? "1em" : ret;
+                       ret = style.pixelLeft + "px";
 
-                       // Attach deferreds
-                       deferred.promise( jqXHR );
-                       jqXHR.success = jqXHR.done;
-                       jqXHR.error = jqXHR.fail;
-                       jqXHR.complete = completeDeferred.add;
+                       // Revert the changed values
+                       style.left = left;
+                       if ( rsLeft ) {
+                               elem.runtimeStyle.left = rsLeft;
+                       }
+               }
 
-                       // Status-dependent callbacks
-                       jqXHR.statusCode = function( map ) {
-                               if ( map ) {
-                                       var tmp;
-                                       if ( state < 2 ) {
-                                               for ( tmp in map ) {
-                                                       statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
-                                               }
-                                       } else {
-                                               tmp = map[ jqXHR.status ];
-                                               jqXHR.then( tmp, tmp );
-                                       }
-                               }
-                               return this;
-                       };
+               return ret === "" ? "auto" : ret;
+       };
+}
+
+function setPositiveNumber( elem, value, subtract ) {
+       var matches = rnumsplit.exec( value );
+       return matches ?
+                       Math.max( 0, matches[ 1 ] - ( subtract || 0 ) ) + ( matches[ 2 ] || "px" ) :
+                       value;
+}
+
+function augmentWidthOrHeight( elem, name, extra, isBorderBox ) {
+       var i = extra === ( isBorderBox ? "border" : "content" ) ?
+               // If we already have the right measurement, avoid augmentation
+               4 :
+               // Otherwise initialize for horizontal or vertical properties
+               name === "width" ? 1 : 0,
+
+               val = 0;
+
+       for ( ; i < 4; i += 2 ) {
+               // both box models exclude margin, so add it if we want it
+               if ( extra === "margin" ) {
+                       // we use jQuery.css instead of curCSS here
+                       // because of the reliableMarginRight CSS hook!
+                       val += jQuery.css( elem, extra + cssExpand[ i ], true );
+               }
 
-                       // Remove hash character (#7531: and string promotion)
-                       // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
-                       // We also use the url parameter if available
-                       s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
-
-                       // Extract dataTypes list
-                       s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( rspacesAjax );
-
-                       // Determine if a cross-domain request is in order
-                       if ( s.crossDomain == null ) {
-                               parts = rurl.exec( s.url.toLowerCase() );
-                               s.crossDomain = !!( parts &&
-                                       ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
-                                               ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
-                                                       ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
-                                       );
+               // From this point on we use curCSS for maximum performance (relevant in animations)
+               if ( isBorderBox ) {
+                       // border-box includes padding, so remove it if we want content
+                       if ( extra === "content" ) {
+                               val -= parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
                        }
 
-                       // Convert data if not already a string
-                       if ( s.data && s.processData && typeof s.data !== "string" ) {
-                               s.data = jQuery.param( s.data, s.traditional );
+                       // at this point, extra isn't border nor margin, so remove border
+                       if ( extra !== "margin" ) {
+                               val -= parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
+               } else {
+                       // at this point, extra isn't content, so add padding
+                       val += parseFloat( curCSS( elem, "padding" + cssExpand[ i ] ) ) || 0;
 
-                       // Apply prefilters
-                       inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
-
-                       // If request was aborted inside a prefilter, stop there
-                       if ( state === 2 ) {
-                               return false;
+                       // at this point, extra isn't content nor padding, so add border
+                       if ( extra !== "padding" ) {
+                               val += parseFloat( curCSS( elem, "border" + cssExpand[ i ] + "Width" ) ) || 0;
                        }
+               }
+       }
 
-                       // We can fire global events as of now if asked to
-                       fireGlobals = s.global;
+       return val;
+}
 
-                       // Uppercase the type
-                       s.type = s.type.toUpperCase();
+function getWidthOrHeight( elem, name, extra ) {
 
-                       // Determine if request has content
-                       s.hasContent = !rnoContent.test( s.type );
+       // Start with offset property, which is equivalent to the border-box value
+       var val = name === "width" ? elem.offsetWidth : elem.offsetHeight,
+               valueIsBorderBox = true,
+               isBorderBox = jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box";
 
-                       // Watch for a new set of requests
-                       if ( fireGlobals && jQuery.active++ === 0 ) {
-                               jQuery.event.trigger( "ajaxStart" );
-                       }
+       // some non-html elements return undefined for offsetWidth, so check for null/undefined
+       // svg - https://bugzilla.mozilla.org/show_bug.cgi?id=649285
+       // MathML - https://bugzilla.mozilla.org/show_bug.cgi?id=491668
+       if ( val <= 0 || val == null ) {
+               // Fall back to computed then uncomputed css if necessary
+               val = curCSS( elem, name );
+               if ( val < 0 || val == null ) {
+                       val = elem.style[ name ];
+               }
 
-                       // More options handling for requests with no content
-                       if ( !s.hasContent ) {
+               // Computed unit is not pixels. Stop here and return.
+               if ( rnumnonpx.test(val) ) {
+                       return val;
+               }
 
-                               // If data is available, append data to url
-                               if ( s.data ) {
-                                       s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
-                                       // #9682: remove data so that it's not used in an eventual retry
-                                       delete s.data;
-                               }
+               // we need the check for style in case a browser which returns unreliable values
+               // for getComputedStyle silently falls back to the reliable elem.style
+               valueIsBorderBox = isBorderBox && ( jQuery.support.boxSizingReliable || val === elem.style[ name ] );
 
-                               // Get ifModifiedKey before adding the anti-cache parameter
-                               ifModifiedKey = s.url;
+               // Normalize "", auto, and prepare for extra
+               val = parseFloat( val ) || 0;
+       }
 
-                               // Add anti-cache in url if needed
-                               if ( s.cache === false ) {
+       // use the active box-sizing model to add/subtract irrelevant styles
+       return ( val +
+               augmentWidthOrHeight(
+                       elem,
+                       name,
+                       extra || ( isBorderBox ? "border" : "content" ),
+                       valueIsBorderBox
+               )
+       ) + "px";
+}
+
+
+// Try to determine the default display value of an element
+function css_defaultDisplay( nodeName ) {
+       if ( elemdisplay[ nodeName ] ) {
+               return elemdisplay[ nodeName ];
+       }
 
-                                       var ts = jQuery.now(),
-                                       // try replacing _= if it is there
-                                               ret = s.url.replace( rts, "$1_=" + ts );
+       var elem = jQuery( "<" + nodeName + ">" ).appendTo( document.body ),
+               display = elem.css("display");
+       elem.remove();
+
+       // If the simple way fails,
+       // get element's real default display by attaching it to a temp iframe
+       if ( display === "none" || display === "" ) {
+               // Use the already-created iframe if possible
+               iframe = document.body.appendChild(
+                       iframe || jQuery.extend( document.createElement("iframe"), {
+                               frameBorder: 0,
+                               width: 0,
+                               height: 0
+                       })
+               );
+
+               // Create a cacheable copy of the iframe document on first call.
+               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
+               // document to it; WebKit & Firefox won't allow reusing the iframe document.
+               if ( !iframeDoc || !iframe.createElement ) {
+                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
+                       iframeDoc.write("<!doctype html><html><body>");
+                       iframeDoc.close();
+               }
 
-                                       // if nothing was replaced, add timestamp to the end
-                                       s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
-                               }
-                       }
+               elem = iframeDoc.body.appendChild( iframeDoc.createElement(nodeName) );
 
-                       // Set the correct header, if data is being sent
-                       if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
-                               jqXHR.setRequestHeader( "Content-Type", s.contentType );
-                       }
+               display = curCSS( elem, "display" );
+               document.body.removeChild( iframe );
+       }
 
-                       // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
-                       if ( s.ifModified ) {
-                               ifModifiedKey = ifModifiedKey || s.url;
-                               if ( jQuery.lastModified[ ifModifiedKey ] ) {
-                                       jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
-                               }
-                               if ( jQuery.etag[ ifModifiedKey ] ) {
-                                       jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+       // Store the correct default display
+       elemdisplay[ nodeName ] = display;
+
+       return display;
+}
+
+jQuery.each([ "height", "width" ], function( i, name ) {
+       jQuery.cssHooks[ name ] = {
+               get: function( elem, computed, extra ) {
+                       if ( computed ) {
+                               // certain elements can have dimension info if we invisibly show them
+                               // however, it must have a current display style that would benefit from this
+                               if ( elem.offsetWidth === 0 && rdisplayswap.test( curCSS( elem, "display" ) ) ) {
+                                       return jQuery.swap( elem, cssShow, function() {
+                                               return getWidthOrHeight( elem, name, extra );
+                                       });
+                               } else {
+                                       return getWidthOrHeight( elem, name, extra );
                                }
                        }
+               },
 
-                       // Set the Accepts header for the server, depending on the dataType
-                       jqXHR.setRequestHeader(
-                               "Accept",
-                               s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
-                                       s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
-                                       s.accepts[ "*" ]
+               set: function( elem, value, extra ) {
+                       return setPositiveNumber( elem, value, extra ?
+                               augmentWidthOrHeight(
+                                       elem,
+                                       name,
+                                       extra,
+                                       jQuery.support.boxSizing && jQuery.css( elem, "boxSizing" ) === "border-box"
+                               ) : 0
                        );
+               }
+       };
+});
+
+if ( !jQuery.support.opacity ) {
+       jQuery.cssHooks.opacity = {
+               get: function( elem, computed ) {
+                       // IE uses filters for opacity
+                       return ropacity.test( (computed && elem.currentStyle ? elem.currentStyle.filter : elem.style.filter) || "" ) ?
+                               ( 0.01 * parseFloat( RegExp.$1 ) ) + "" :
+                               computed ? "1" : "";
+               },
 
-                       // Check for headers option
-                       for ( i in s.headers ) {
-                               jqXHR.setRequestHeader( i, s.headers[ i ] );
-                       }
+               set: function( elem, value ) {
+                       var style = elem.style,
+                               currentStyle = elem.currentStyle,
+                               opacity = jQuery.isNumeric( value ) ? "alpha(opacity=" + value * 100 + ")" : "",
+                               filter = currentStyle && currentStyle.filter || style.filter || "";
 
-                       // Allow custom headers/mimetypes and early abort
-                       if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
-                               // Abort if not done already
-                               jqXHR.abort();
-                               return false;
+                       // IE has trouble with opacity if it does not have layout
+                       // Force it by setting the zoom level
+                       style.zoom = 1;
 
-                       }
+                       // if setting opacity to 1, and no other filters exist - attempt to remove filter attribute #6652
+                       if ( value >= 1 && jQuery.trim( filter.replace( ralpha, "" ) ) === "" &&
+                               style.removeAttribute ) {
 
-                       // Install callbacks on deferreds
-                       for ( i in { success: 1, error: 1, complete: 1 } ) {
-                               jqXHR[ i ]( s[ i ] );
+                               // Setting style.filter to null, "" & " " still leave "filter:" in the cssText
+                               // if "filter:" is present at all, clearType is disabled, we want to avoid this
+                               // style.removeAttribute is IE Only, but so apparently is this code path...
+                               style.removeAttribute( "filter" );
+
+                               // if there there is no filter style applied in a css rule, we are done
+                               if ( currentStyle && !currentStyle.filter ) {
+                                       return;
+                               }
                        }
 
-                       // Get transport
-                       transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
+                       // otherwise, set new filter values
+                       style.filter = ralpha.test( filter ) ?
+                               filter.replace( ralpha, opacity ) :
+                               filter + " " + opacity;
+               }
+       };
+}
 
-                       // If no transport, we auto-abort
-                       if ( !transport ) {
-                               done( -1, "No Transport" );
-                       } else {
-                               jqXHR.readyState = 1;
-                               // Send global event
-                               if ( fireGlobals ) {
-                                       globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
-                               }
-                               // Timeout
-                               if ( s.async && s.timeout > 0 ) {
-                                       timeoutTimer = setTimeout( function(){
-                                               jqXHR.abort( "timeout" );
-                                       }, s.timeout );
-                               }
+// These hooks cannot be added until DOM ready because the support test
+// for it is not run until after DOM ready
+jQuery(function() {
+       if ( !jQuery.support.reliableMarginRight ) {
+               jQuery.cssHooks.marginRight = {
+                       get: function( elem, computed ) {
+                               // WebKit Bug 13343 - getComputedStyle returns wrong value for margin-right
+                               // Work around by temporarily setting element display to inline-block
+                               return jQuery.swap( elem, { "display": "inline-block" }, function() {
+                                       if ( computed ) {
+                                               return curCSS( elem, "marginRight" );
+                                       }
+                               });
+                       }
+               };
+       }
 
-                               try {
-                                       state = 1;
-                                       transport.send( requestHeaders, done );
-                               } catch (e) {
-                                       // Propagate exception as error if not done
-                                       if ( state < 2 ) {
-                                               done( -1, e );
-                                               // Simply rethrow otherwise
-                                       } else {
-                                               throw e;
+       // Webkit bug: https://bugs.webkit.org/show_bug.cgi?id=29084
+       // getComputedStyle returns percent when specified for top/left/bottom/right
+       // rather than make the css module depend on the offset module, we just check for it here
+       if ( !jQuery.support.pixelPosition && jQuery.fn.position ) {
+               jQuery.each( [ "top", "left" ], function( i, prop ) {
+                       jQuery.cssHooks[ prop ] = {
+                               get: function( elem, computed ) {
+                                       if ( computed ) {
+                                               var ret = curCSS( elem, prop );
+                                               // if curCSS returns percentage, fallback to offset
+                                               return rnumnonpx.test( ret ) ? jQuery( elem ).position()[ prop ] + "px" : ret;
                                        }
                                }
-                       }
+                       };
+               });
+       }
 
-                       return jqXHR;
-               },
+});
 
-               // Serialize an array of form elements or a set of
-               // key/values into a query string
-               param: function( a, traditional ) {
-                       var s = [],
-                               add = function( key, value ) {
-                                       // If value is a function, invoke it and return its value
-                                       value = jQuery.isFunction( value ) ? value() : value;
-                                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
-                               };
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.hidden = function( elem ) {
+               return ( elem.offsetWidth === 0 && elem.offsetHeight === 0 ) || (!jQuery.support.reliableHiddenOffsets && ((elem.style && elem.style.display) || curCSS( elem, "display" )) === "none");
+       };
 
-                       // Set traditional to true for jQuery <= 1.3.2 behavior.
-                       if ( traditional === undefined ) {
-                               traditional = jQuery.ajaxSettings.traditional;
-                       }
+       jQuery.expr.filters.visible = function( elem ) {
+               return !jQuery.expr.filters.hidden( elem );
+       };
+}
 
-                       // If an array was passed in, assume that it is an array of form elements.
-                       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
-                               // Serialize the form elements
-                               jQuery.each( a, function() {
-                                       add( this.name, this.value );
-                               });
+// These hooks are used by animate to expand properties
+jQuery.each({
+       margin: "",
+       padding: "",
+       border: "Width"
+}, function( prefix, suffix ) {
+       jQuery.cssHooks[ prefix + suffix ] = {
+               expand: function( value ) {
+                       var i,
 
-                       } else {
-                               // If traditional, encode the "old" way (the way 1.3.2 or older
-                               // did it), otherwise encode params recursively.
-                               for ( var prefix in a ) {
-                                       buildParams( prefix, a[ prefix ], traditional, add );
-                               }
+                               // assumes a single number if not a string
+                               parts = typeof value === "string" ? value.split(" ") : [ value ],
+                               expanded = {};
+
+                       for ( i = 0; i < 4; i++ ) {
+                               expanded[ prefix + cssExpand[ i ] + suffix ] =
+                                       parts[ i ] || parts[ i - 2 ] || parts[ 0 ];
                        }
 
-                       // Return the resulting serialization
-                       return s.join( "&" ).replace( r20, "+" );
+                       return expanded;
                }
-       });
+       };
 
-       function buildParams( prefix, obj, traditional, add ) {
-               if ( jQuery.isArray( obj ) ) {
-                       // Serialize array item.
-                       jQuery.each( obj, function( i, v ) {
-                               if ( traditional || rbracket.test( prefix ) ) {
-                                       // Treat each array item as a scalar.
-                                       add( prefix, v );
+       if ( !rmargin.test( prefix ) ) {
+               jQuery.cssHooks[ prefix + suffix ].set = setPositiveNumber;
+       }
+});
+var r20 = /%20/g,
+       rbracket = /\[\]$/,
+       rCRLF = /\r?\n/g,
+       rinput = /^(?:color|date|datetime|datetime-local|email|hidden|month|number|password|range|search|tel|text|time|url|week)$/i,
+       rselectTextarea = /^(?:select|textarea)/i;
+
+jQuery.fn.extend({
+       serialize: function() {
+               return jQuery.param( this.serializeArray() );
+       },
+       serializeArray: function() {
+               return this.map(function(){
+                       return this.elements ? jQuery.makeArray( this.elements ) : this;
+               })
+               .filter(function(){
+                       return this.name && !this.disabled &&
+                               ( this.checked || rselectTextarea.test( this.nodeName ) ||
+                                       rinput.test( this.type ) );
+               })
+               .map(function( i, elem ){
+                       var val = jQuery( this ).val();
+
+                       return val == null ?
+                               null :
+                               jQuery.isArray( val ) ?
+                                       jQuery.map( val, function( val, i ){
+                                               return { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+                                       }) :
+                                       { name: elem.name, value: val.replace( rCRLF, "\r\n" ) };
+               }).get();
+       }
+});
+
+//Serialize an array of form elements or a set of
+//key/values into a query string
+jQuery.param = function( a, traditional ) {
+       var prefix,
+               s = [],
+               add = function( key, value ) {
+                       // If value is a function, invoke it and return its value
+                       value = jQuery.isFunction( value ) ? value() : ( value == null ? "" : value );
+                       s[ s.length ] = encodeURIComponent( key ) + "=" + encodeURIComponent( value );
+               };
 
-                               } else {
-                                       // If array item is non-scalar (array or object), encode its
-                                       // numeric index to resolve deserialization ambiguity issues.
-                                       // Note that rack (as of 1.0.0) can't currently deserialize
-                                       // nested arrays properly, and attempting to do so may cause
-                                       // a server error. Possible fixes are to modify rack's
-                                       // deserialization algorithm or to provide an option or flag
-                                       // to force array serialization to be shallow.
-                                       buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
-                               }
-                       });
+       // Set traditional to true for jQuery <= 1.3.2 behavior.
+       if ( traditional === undefined ) {
+               traditional = jQuery.ajaxSettings && jQuery.ajaxSettings.traditional;
+       }
 
-               } else if ( !traditional && jQuery.type( obj ) === "object" ) {
-                       // Serialize object item.
-                       for ( var name in obj ) {
-                               buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
-                       }
+       // If an array was passed in, assume that it is an array of form elements.
+       if ( jQuery.isArray( a ) || ( a.jquery && !jQuery.isPlainObject( a ) ) ) {
+               // Serialize the form elements
+               jQuery.each( a, function() {
+                       add( this.name, this.value );
+               });
 
-               } else {
-                       // Serialize scalar item.
-                       add( prefix, obj );
+       } else {
+               // If traditional, encode the "old" way (the way 1.3.2 or older
+               // did it), otherwise encode params recursively.
+               for ( prefix in a ) {
+                       buildParams( prefix, a[ prefix ], traditional, add );
                }
        }
 
-// This is still on the jQuery object... for now
-// Want to move this to jQuery.ajax some day
-       jQuery.extend({
+       // Return the resulting serialization
+       return s.join( "&" ).replace( r20, "+" );
+};
 
-               // Counter for holding the number of active queries
-               active: 0,
+function buildParams( prefix, obj, traditional, add ) {
+       var name;
 
-               // Last-Modified header cache for next request
-               lastModified: {},
-               etag: {}
+       if ( jQuery.isArray( obj ) ) {
+               // Serialize array item.
+               jQuery.each( obj, function( i, v ) {
+                       if ( traditional || rbracket.test( prefix ) ) {
+                               // Treat each array item as a scalar.
+                               add( prefix, v );
 
-       });
+                       } else {
+                               // If array item is non-scalar (array or object), encode its
+                               // numeric index to resolve deserialization ambiguity issues.
+                               // Note that rack (as of 1.0.0) can't currently deserialize
+                               // nested arrays properly, and attempting to do so may cause
+                               // a server error. Possible fixes are to modify rack's
+                               // deserialization algorithm or to provide an option or flag
+                               // to force array serialization to be shallow.
+                               buildParams( prefix + "[" + ( typeof v === "object" ? i : "" ) + "]", v, traditional, add );
+                       }
+               });
+
+       } else if ( !traditional && jQuery.type( obj ) === "object" ) {
+               // Serialize object item.
+               for ( name in obj ) {
+                       buildParams( prefix + "[" + name + "]", obj[ name ], traditional, add );
+               }
+
+       } else {
+               // Serialize scalar item.
+               add( prefix, obj );
+       }
+}
+var // Document location
+       ajaxLocation,
+       // Document location segments
+       ajaxLocParts,
+
+       rhash = /#.*$/,
+       rheaders = /^(.*?):[ \t]*([^\r\n]*)\r?$/mg, // IE leaves an \r character at EOL
+       // #7653, #8125, #8152: local protocol detection
+       rlocalProtocol = /^(?:about|app|app\-storage|.+\-extension|file|res|widget):$/,
+       rnoContent = /^(?:GET|HEAD)$/,
+       rprotocol = /^\/\//,
+       rquery = /\?/,
+       rscript = /<script\b[^<]*(?:(?!<\/script>)<[^<]*)*<\/script>/gi,
+       rts = /([?&])_=[^&]*/,
+       rurl = /^([\w\+\.\-]+:)(?:\/\/([^\/?#:]*)(?::(\d+)|)|)/,
 
-       /* Handles responses to an ajax request:
-        * - sets all responseXXX fields accordingly
-        * - finds the right dataType (mediates between content-type and expected dataType)
-        * - returns the corresponding response
+       // Keep a copy of the old load method
+       _load = jQuery.fn.load,
+
+       /* Prefilters
+        * 1) They are useful to introduce custom dataTypes (see ajax/jsonp.js for an example)
+        * 2) These are called:
+        *    - BEFORE asking for a transport
+        *    - AFTER param serialization (s.data is a string if s.processData is true)
+        * 3) key is the dataType
+        * 4) the catchall symbol "*" can be used
+        * 5) execution will start with transport dataType and THEN continue down to "*" if needed
         */
-       function ajaxHandleResponses( s, jqXHR, responses ) {
+       prefilters = {},
 
-               var contents = s.contents,
-                       dataTypes = s.dataTypes,
-                       responseFields = s.responseFields,
-                       ct,
-                       type,
-                       finalDataType,
-                       firstDataType;
+       /* Transports bindings
+        * 1) key is the dataType
+        * 2) the catchall symbol "*" can be used
+        * 3) selection will start with transport dataType and THEN go to "*" if needed
+        */
+       transports = {},
 
-               // Fill responseXXX fields
-               for ( type in responseFields ) {
-                       if ( type in responses ) {
-                               jqXHR[ responseFields[type] ] = responses[ type ];
-                       }
-               }
+       // Avoid comment-prolog char sequence (#10098); must appease lint and evade compression
+       allTypes = ["*/"] + ["*"];
 
-               // Remove auto dataType and get content-type in the process
-               while( dataTypes[ 0 ] === "*" ) {
-                       dataTypes.shift();
-                       if ( ct === undefined ) {
-                               ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
-                       }
-               }
+// #8138, IE may throw an exception when accessing
+// a field from window.location if document.domain has been set
+try {
+       ajaxLocation = location.href;
+} catch( e ) {
+       // Use the href attribute of an A element
+       // since IE will modify it given document.location
+       ajaxLocation = document.createElement( "a" );
+       ajaxLocation.href = "";
+       ajaxLocation = ajaxLocation.href;
+}
 
-               // Check if we're dealing with a known content-type
-               if ( ct ) {
-                       for ( type in contents ) {
-                               if ( contents[ type ] && contents[ type ].test( ct ) ) {
-                                       dataTypes.unshift( type );
-                                       break;
-                               }
-                       }
+// Segment location into parts
+ajaxLocParts = rurl.exec( ajaxLocation.toLowerCase() ) || [];
+
+// Base "constructor" for jQuery.ajaxPrefilter and jQuery.ajaxTransport
+function addToPrefiltersOrTransports( structure ) {
+
+       // dataTypeExpression is optional and defaults to "*"
+       return function( dataTypeExpression, func ) {
+
+               if ( typeof dataTypeExpression !== "string" ) {
+                       func = dataTypeExpression;
+                       dataTypeExpression = "*";
                }
 
-               // Check to see if we have a response for the expected dataType
-               if ( dataTypes[ 0 ] in responses ) {
-                       finalDataType = dataTypes[ 0 ];
-               } else {
-                       // Try convertible dataTypes
-                       for ( type in responses ) {
-                               if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
-                                       finalDataType = type;
-                                       break;
-                               }
-                               if ( !firstDataType ) {
-                                       firstDataType = type;
+               var dataType, list, placeBefore,
+                       dataTypes = dataTypeExpression.toLowerCase().split( core_rspace ),
+                       i = 0,
+                       length = dataTypes.length;
+
+               if ( jQuery.isFunction( func ) ) {
+                       // For each dataType in the dataTypeExpression
+                       for ( ; i < length; i++ ) {
+                               dataType = dataTypes[ i ];
+                               // We control if we're asked to add before
+                               // any existing element
+                               placeBefore = /^\+/.test( dataType );
+                               if ( placeBefore ) {
+                                       dataType = dataType.substr( 1 ) || "*";
                                }
+                               list = structure[ dataType ] = structure[ dataType ] || [];
+                               // then we add to the structure accordingly
+                               list[ placeBefore ? "unshift" : "push" ]( func );
                        }
-                       // Or just use first one
-                       finalDataType = finalDataType || firstDataType;
                }
+       };
+}
 
-               // If we found a dataType
-               // We add the dataType to the list if needed
-               // and return the corresponding response
-               if ( finalDataType ) {
-                       if ( finalDataType !== dataTypes[ 0 ] ) {
-                               dataTypes.unshift( finalDataType );
+// Base inspection function for prefilters and transports
+function inspectPrefiltersOrTransports( structure, options, originalOptions, jqXHR,
+               dataType /* internal */, inspected /* internal */ ) {
+
+       dataType = dataType || options.dataTypes[ 0 ];
+       inspected = inspected || {};
+
+       inspected[ dataType ] = true;
+
+       var selection,
+               list = structure[ dataType ],
+               i = 0,
+               length = list ? list.length : 0,
+               executeOnly = ( structure === prefilters );
+
+       for ( ; i < length && ( executeOnly || !selection ); i++ ) {
+               selection = list[ i ]( options, originalOptions, jqXHR );
+               // If we got redirected to another dataType
+               // we try there if executing only and not done already
+               if ( typeof selection === "string" ) {
+                       if ( !executeOnly || inspected[ selection ] ) {
+                               selection = undefined;
+                       } else {
+                               options.dataTypes.unshift( selection );
+                               selection = inspectPrefiltersOrTransports(
+                                               structure, options, originalOptions, jqXHR, selection, inspected );
                        }
-                       return responses[ finalDataType ];
                }
        }
+       // If we're only executing or nothing was selected
+       // we try the catchall dataType if not done already
+       if ( ( executeOnly || !selection ) && !inspected[ "*" ] ) {
+               selection = inspectPrefiltersOrTransports(
+                               structure, options, originalOptions, jqXHR, "*", inspected );
+       }
+       // unnecessary when only executing (prefilters)
+       // but it'll be ignored by the caller in that case
+       return selection;
+}
 
-// Chain conversions given the request and the original response
-       function ajaxConvert( s, response ) {
-
-               // Apply the dataFilter if provided
-               if ( s.dataFilter ) {
-                       response = s.dataFilter( response, s.dataType );
+// A special extend for ajax options
+// that takes "flat" options (not to be deep extended)
+// Fixes #9887
+function ajaxExtend( target, src ) {
+       var key, deep,
+               flatOptions = jQuery.ajaxSettings.flatOptions || {};
+       for ( key in src ) {
+               if ( src[ key ] !== undefined ) {
+                       ( flatOptions[ key ] ? target : ( deep || ( deep = {} ) ) )[ key ] = src[ key ];
                }
+       }
+       if ( deep ) {
+               jQuery.extend( true, target, deep );
+       }
+}
 
-               var dataTypes = s.dataTypes,
-                       converters = {},
-                       i,
-                       key,
-                       length = dataTypes.length,
-                       tmp,
-               // Current and previous dataTypes
-                       current = dataTypes[ 0 ],
-                       prev,
-               // Conversion expression
-                       conversion,
-               // Conversion function
-                       conv,
-               // Conversion functions (transitive conversion)
-                       conv1,
-                       conv2;
-
-               // For each dataType in the chain
-               for ( i = 1; i < length; i++ ) {
-
-                       // Create converters map
-                       // with lowercased keys
-                       if ( i === 1 ) {
-                               for ( key in s.converters ) {
-                                       if ( typeof key === "string" ) {
-                                               converters[ key.toLowerCase() ] = s.converters[ key ];
-                                       }
-                               }
-                       }
-
-                       // Get the dataTypes
-                       prev = current;
-                       current = dataTypes[ i ];
+jQuery.fn.load = function( url, params, callback ) {
+       if ( typeof url !== "string" && _load ) {
+               return _load.apply( this, arguments );
+       }
 
-                       // If current is auto dataType, update it to prev
-                       if ( current === "*" ) {
-                               current = prev;
-                               // If no auto and dataTypes are actually different
-                       } else if ( prev !== "*" && prev !== current ) {
+       // Don't do a request if no elements are being requested
+       if ( !this.length ) {
+               return this;
+       }
 
-                               // Get the converter
-                               conversion = prev + " " + current;
-                               conv = converters[ conversion ] || converters[ "* " + current ];
+       var selector, type, response,
+               self = this,
+               off = url.indexOf(" ");
 
-                               // If there is no direct converter, search transitively
-                               if ( !conv ) {
-                                       conv2 = undefined;
-                                       for ( conv1 in converters ) {
-                                               tmp = conv1.split( " " );
-                                               if ( tmp[ 0 ] === prev || tmp[ 0 ] === "*" ) {
-                                                       conv2 = converters[ tmp[1] + " " + current ];
-                                                       if ( conv2 ) {
-                                                               conv1 = converters[ conv1 ];
-                                                               if ( conv1 === true ) {
-                                                                       conv = conv2;
-                                                               } else if ( conv2 === true ) {
-                                                                       conv = conv1;
-                                                               }
-                                                               break;
-                                                       }
-                                               }
-                                       }
-                               }
-                               // If we found no converter, dispatch an error
-                               if ( !( conv || conv2 ) ) {
-                                       jQuery.error( "No conversion from " + conversion.replace(" "," to ") );
-                               }
-                               // If found converter is not an equivalence
-                               if ( conv !== true ) {
-                                       // Convert with 1 or 2 converters accordingly
-                                       response = conv ? conv( response ) : conv2( conv1(response) );
-                               }
-                       }
-               }
-               return response;
+       if ( off >= 0 ) {
+               selector = url.slice( off, url.length );
+               url = url.slice( 0, off );
        }
 
+       // If it's a function
+       if ( jQuery.isFunction( params ) ) {
 
+               // We assume that it's the callback
+               callback = params;
+               params = undefined;
 
+       // Otherwise, build a param string
+       } else if ( params && typeof params === "object" ) {
+               type = "POST";
+       }
 
-       var jsc = jQuery.now(),
-               jsre = /(\=)\?(&|$)|\?\?/i;
+       // Request the remote document
+       jQuery.ajax({
+               url: url,
 
-// Default jsonp settings
-       jQuery.ajaxSetup({
-               jsonp: "callback",
-               jsonpCallback: function() {
-                       return jQuery.expando + "_" + ( jsc++ );
+               // if "type" variable is undefined, then "GET" method will be used
+               type: type,
+               dataType: "html",
+               data: params,
+               complete: function( jqXHR, status ) {
+                       if ( callback ) {
+                               self.each( callback, response || [ jqXHR.responseText, status, jqXHR ] );
+                       }
                }
-       });
+       }).done(function( responseText ) {
 
-// Detect, normalize options and install callbacks for jsonp requests
-       jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
-
-               var inspectData = ( typeof s.data === "string" ) && /^application\/x\-www\-form\-urlencoded/.test( s.contentType );
-
-               if ( s.dataTypes[ 0 ] === "jsonp" ||
-                       s.jsonp !== false && ( jsre.test( s.url ) ||
-                               inspectData && jsre.test( s.data ) ) ) {
-
-                       var responseContainer,
-                               jsonpCallback = s.jsonpCallback =
-                                       jQuery.isFunction( s.jsonpCallback ) ? s.jsonpCallback() : s.jsonpCallback,
-                               previous = window[ jsonpCallback ],
-                               url = s.url,
-                               data = s.data,
-                               replace = "$1" + jsonpCallback + "$2";
-
-                       if ( s.jsonp !== false ) {
-                               url = url.replace( jsre, replace );
-                               if ( s.url === url ) {
-                                       if ( inspectData ) {
-                                               data = data.replace( jsre, replace );
-                                       }
-                                       if ( s.data === data ) {
-                                               // Add callback manually
-                                               url += (/\?/.test( url ) ? "&" : "?") + s.jsonp + "=" + jsonpCallback;
-                                       }
-                               }
-                       }
+               // Save response for use in complete callback
+               response = arguments;
 
-                       s.url = url;
-                       s.data = data;
+               // See if a selector was specified
+               self.html( selector ?
 
-                       // Install callback
-                       window[ jsonpCallback ] = function( response ) {
-                               responseContainer = [ response ];
-                       };
+                       // Create a dummy div to hold the results
+                       jQuery("<div>")
 
-                       // Clean-up function
-                       jqXHR.always(function() {
-                               // Set callback back to previous value
-                               window[ jsonpCallback ] = previous;
-                               // Call if it was a function and we have a response
-                               if ( responseContainer && jQuery.isFunction( previous ) ) {
-                                       window[ jsonpCallback ]( responseContainer[ 0 ] );
-                               }
-                       });
+                               // inject the contents of the document in, removing the scripts
+                               // to avoid any 'Permission Denied' errors in IE
+                               .append( responseText.replace( rscript, "" ) )
 
-                       // Use data converter to retrieve json after script execution
-                       s.converters["script json"] = function() {
-                               if ( !responseContainer ) {
-                                       jQuery.error( jsonpCallback + " was not called" );
-                               }
-                               return responseContainer[ 0 ];
-                       };
+                               // Locate the specified elements
+                               .find( selector ) :
 
-                       // force json dataType
-                       s.dataTypes[ 0 ] = "json";
+                       // If not, just inject the full result
+                       responseText );
 
-                       // Delegate to script
-                       return "script";
-               }
        });
 
+       return this;
+};
+
+// Attach a bunch of functions for handling common AJAX events
+jQuery.each( "ajaxStart ajaxStop ajaxComplete ajaxError ajaxSuccess ajaxSend".split( " " ), function( i, o ){
+       jQuery.fn[ o ] = function( f ){
+               return this.on( o, f );
+       };
+});
+
+jQuery.each( [ "get", "post" ], function( i, method ) {
+       jQuery[ method ] = function( url, data, callback, type ) {
+               // shift arguments if data argument was omitted
+               if ( jQuery.isFunction( data ) ) {
+                       type = type || callback;
+                       callback = data;
+                       data = undefined;
+               }
+
+               return jQuery.ajax({
+                       type: method,
+                       url: url,
+                       data: data,
+                       success: callback,
+                       dataType: type
+               });
+       };
+});
 
+jQuery.extend({
 
+       getScript: function( url, callback ) {
+               return jQuery.get( url, undefined, callback, "script" );
+       },
+
+       getJSON: function( url, data, callback ) {
+               return jQuery.get( url, data, callback, "json" );
+       },
+
+       // Creates a full fledged settings object into target
+       // with both ajaxSettings and settings fields.
+       // If target is omitted, writes into ajaxSettings.
+       ajaxSetup: function( target, settings ) {
+               if ( settings ) {
+                       // Building a settings object
+                       ajaxExtend( target, jQuery.ajaxSettings );
+               } else {
+                       // Extending ajaxSettings
+                       settings = target;
+                       target = jQuery.ajaxSettings;
+               }
+               ajaxExtend( target, settings );
+               return target;
+       },
+
+       ajaxSettings: {
+               url: ajaxLocation,
+               isLocal: rlocalProtocol.test( ajaxLocParts[ 1 ] ),
+               global: true,
+               type: "GET",
+               contentType: "application/x-www-form-urlencoded; charset=UTF-8",
+               processData: true,
+               async: true,
+               /*
+               timeout: 0,
+               data: null,
+               dataType: null,
+               username: null,
+               password: null,
+               cache: null,
+               throws: false,
+               traditional: false,
+               headers: {},
+               */
 
-// Install script dataType
-       jQuery.ajaxSetup({
                accepts: {
-                       script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+                       xml: "application/xml, text/xml",
+                       html: "text/html",
+                       text: "text/plain",
+                       json: "application/json, text/javascript",
+                       "*": allTypes
                },
+
                contents: {
-                       script: /javascript|ecmascript/
+                       xml: /xml/,
+                       html: /html/,
+                       json: /json/
+               },
+
+               responseFields: {
+                       xml: "responseXML",
+                       text: "responseText"
                },
+
+               // List of data converters
+               // 1) key format is "source_type destination_type" (a single space in-between)
+               // 2) the catchall symbol "*" can be used for source_type
                converters: {
-                       "text script": function( text ) {
-                               jQuery.globalEval( text );
-                               return text;
-                       }
-               }
-       });
 
-// Handle cache's special case and global
-       jQuery.ajaxPrefilter( "script", function( s ) {
-               if ( s.cache === undefined ) {
-                       s.cache = false;
-               }
-               if ( s.crossDomain ) {
-                       s.type = "GET";
-                       s.global = false;
-               }
-       });
+                       // Convert anything to text
+                       "* text": window.String,
 
-// Bind script tag hack transport
-       jQuery.ajaxTransport( "script", function(s) {
+                       // Text to html (true = no transformation)
+                       "text html": true,
 
-               // This transport only deals with cross domain requests
-               if ( s.crossDomain ) {
+                       // Evaluate text as a json expression
+                       "text json": jQuery.parseJSON,
 
-                       var script,
-                               head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
+                       // Parse text as xml
+                       "text xml": jQuery.parseXML
+               },
 
-                       return {
+               // For options that shouldn't be deep extended:
+               // you can add your own custom options here if
+               // and when you create one that shouldn't be
+               // deep extended (see ajaxExtend)
+               flatOptions: {
+                       context: true,
+                       url: true
+               }
+       },
+
+       ajaxPrefilter: addToPrefiltersOrTransports( prefilters ),
+       ajaxTransport: addToPrefiltersOrTransports( transports ),
 
-                               send: function( _, callback ) {
+       // Main method
+       ajax: function( url, options ) {
 
-                                       script = document.createElement( "script" );
+               // If url is an object, simulate pre-1.5 signature
+               if ( typeof url === "object" ) {
+                       options = url;
+                       url = undefined;
+               }
+
+               // Force options to be an object
+               options = options || {};
+
+               var // ifModified key
+                       ifModifiedKey,
+                       // Response headers
+                       responseHeadersString,
+                       responseHeaders,
+                       // transport
+                       transport,
+                       // timeout handle
+                       timeoutTimer,
+                       // Cross-domain detection vars
+                       parts,
+                       // To know if global events are to be dispatched
+                       fireGlobals,
+                       // Loop variable
+                       i,
+                       // Create the final options object
+                       s = jQuery.ajaxSetup( {}, options ),
+                       // Callbacks context
+                       callbackContext = s.context || s,
+                       // Context for global events
+                       // It's the callbackContext if one was provided in the options
+                       // and if it's a DOM node or a jQuery collection
+                       globalEventContext = callbackContext !== s &&
+                               ( callbackContext.nodeType || callbackContext instanceof jQuery ) ?
+                                               jQuery( callbackContext ) : jQuery.event,
+                       // Deferreds
+                       deferred = jQuery.Deferred(),
+                       completeDeferred = jQuery.Callbacks( "once memory" ),
+                       // Status-dependent callbacks
+                       statusCode = s.statusCode || {},
+                       // Headers (they are sent all at once)
+                       requestHeaders = {},
+                       requestHeadersNames = {},
+                       // The jqXHR state
+                       state = 0,
+                       // Default abort message
+                       strAbort = "canceled",
+                       // Fake xhr
+                       jqXHR = {
 
-                                       script.async = "async";
+                               readyState: 0,
 
-                                       if ( s.scriptCharset ) {
-                                               script.charset = s.scriptCharset;
+                               // Caches the header
+                               setRequestHeader: function( name, value ) {
+                                       if ( !state ) {
+                                               var lname = name.toLowerCase();
+                                               name = requestHeadersNames[ lname ] = requestHeadersNames[ lname ] || name;
+                                               requestHeaders[ name ] = value;
                                        }
+                                       return this;
+                               },
 
-                                       script.src = s.url;
-
-                                       // Attach handlers for all browsers
-                                       script.onload = script.onreadystatechange = function( _, isAbort ) {
-
-                                               if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
-
-                                                       // Handle memory leak in IE
-                                                       script.onload = script.onreadystatechange = null;
-
-                                                       // Remove the script
-                                                       if ( head && script.parentNode ) {
-                                                               head.removeChild( script );
-                                                       }
-
-                                                       // Dereference the script
-                                                       script = undefined;
+                               // Raw string
+                               getAllResponseHeaders: function() {
+                                       return state === 2 ? responseHeadersString : null;
+                               },
 
-                                                       // Callback if not abort
-                                                       if ( !isAbort ) {
-                                                               callback( 200, "success" );
+                               // Builds headers hashtable if needed
+                               getResponseHeader: function( key ) {
+                                       var match;
+                                       if ( state === 2 ) {
+                                               if ( !responseHeaders ) {
+                                                       responseHeaders = {};
+                                                       while( ( match = rheaders.exec( responseHeadersString ) ) ) {
+                                                               responseHeaders[ match[1].toLowerCase() ] = match[ 2 ];
                                                        }
                                                }
-                                       };
-                                       // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
-                                       // This arises when a base node is used (#2709 and #4378).
-                                       head.insertBefore( script, head.firstChild );
+                                               match = responseHeaders[ key.toLowerCase() ];
+                                       }
+                                       return match === undefined ? null : match;
                                },
 
-                               abort: function() {
-                                       if ( script ) {
-                                               script.onload( 0, 1 );
+                               // Overrides response content-type header
+                               overrideMimeType: function( type ) {
+                                       if ( !state ) {
+                                               s.mimeType = type;
                                        }
+                                       return this;
+                               },
+
+                               // Cancel the request
+                               abort: function( statusText ) {
+                                       statusText = statusText || strAbort;
+                                       if ( transport ) {
+                                               transport.abort( statusText );
+                                       }
+                                       done( 0, statusText );
+                                       return this;
                                }
                        };
-               }
-       });
 
+               // Callback for when everything is done
+               // It is defined here because jslint complains if it is declared
+               // at the end of the function (which would be more logical and readable)
+               function done( status, nativeStatusText, responses, headers ) {
+                       var isSuccess, success, error, response, modified,
+                               statusText = nativeStatusText;
 
+                       // Called once
+                       if ( state === 2 ) {
+                               return;
+                       }
 
+                       // State is "done" now
+                       state = 2;
 
-       var // #5280: Internet Explorer will keep connections alive if we don't abort on unload
-               xhrOnUnloadAbort = window.ActiveXObject ? function() {
-                       // Abort all pending requests
-                       for ( var key in xhrCallbacks ) {
-                               xhrCallbacks[ key ]( 0, 1 );
+                       // Clear timeout if it exists
+                       if ( timeoutTimer ) {
+                               clearTimeout( timeoutTimer );
                        }
-               } : false,
-               xhrId = 0,
-               xhrCallbacks;
 
-// Functions to create xhrs
-       function createStandardXHR() {
-               try {
-                       return new window.XMLHttpRequest();
-               } catch( e ) {}
-       }
+                       // Dereference transport for early garbage collection
+                       // (no matter how long the jqXHR object will be used)
+                       transport = undefined;
 
-       function createActiveXHR() {
-               try {
-                       return new window.ActiveXObject( "Microsoft.XMLHTTP" );
-               } catch( e ) {}
-       }
+                       // Cache response headers
+                       responseHeadersString = headers || "";
 
-// Create the request object
-// (This is still attached to ajaxSettings for backward compatibility)
-       jQuery.ajaxSettings.xhr = window.ActiveXObject ?
-               /* Microsoft failed to properly
-                * implement the XMLHttpRequest in IE7 (can't request local files),
-                * so we use the ActiveXObject when it is available
-                * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
-                * we need a fallback.
-                */
-               function() {
-                       return !this.isLocal && createStandardXHR() || createActiveXHR();
-               } :
-               // For all other browsers, use the standard XMLHttpRequest object
-               createStandardXHR;
+                       // Set readyState
+                       jqXHR.readyState = status > 0 ? 4 : 0;
 
-// Determine support properties
-       (function( xhr ) {
-               jQuery.extend( jQuery.support, {
-                       ajax: !!xhr,
-                       cors: !!xhr && ( "withCredentials" in xhr )
-               });
-       })( jQuery.ajaxSettings.xhr() );
+                       // Get response data
+                       if ( responses ) {
+                               response = ajaxHandleResponses( s, jqXHR, responses );
+                       }
 
-// Create transport if the browser can provide an xhr
-       if ( jQuery.support.ajax ) {
+                       // If successful, handle type chaining
+                       if ( status >= 200 && status < 300 || status === 304 ) {
 
-               jQuery.ajaxTransport(function( s ) {
-                       // Cross domain only allowed if supported through XMLHttpRequest
-                       if ( !s.crossDomain || jQuery.support.cors ) {
+                               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+                               if ( s.ifModified ) {
 
-                               var callback;
+                                       modified = jqXHR.getResponseHeader("Last-Modified");
+                                       if ( modified ) {
+                                               jQuery.lastModified[ ifModifiedKey ] = modified;
+                                       }
+                                       modified = jqXHR.getResponseHeader("Etag");
+                                       if ( modified ) {
+                                               jQuery.etag[ ifModifiedKey ] = modified;
+                                       }
+                               }
 
-                               return {
-                                       send: function( headers, complete ) {
+                               // If not modified
+                               if ( status === 304 ) {
 
-                                               // Get a new xhr
-                                               var xhr = s.xhr(),
-                                                       handle,
-                                                       i;
+                                       statusText = "notmodified";
+                                       isSuccess = true;
 
-                                               // Open the socket
-                                               // Passing null username, generates a login popup on Opera (#2865)
-                                               if ( s.username ) {
-                                                       xhr.open( s.type, s.url, s.async, s.username, s.password );
-                                               } else {
-                                                       xhr.open( s.type, s.url, s.async );
-                                               }
+                               // If we have data
+                               } else {
 
-                                               // Apply custom fields if provided
-                                               if ( s.xhrFields ) {
-                                                       for ( i in s.xhrFields ) {
-                                                               xhr[ i ] = s.xhrFields[ i ];
-                                                       }
-                                               }
+                                       isSuccess = ajaxConvert( s, response );
+                                       statusText = isSuccess.state;
+                                       success = isSuccess.data;
+                                       error = isSuccess.error;
+                                       isSuccess = !error;
+                               }
+                       } else {
+                               // We extract error from statusText
+                               // then normalize statusText and status for non-aborts
+                               error = statusText;
+                               if ( !statusText || status ) {
+                                       statusText = "error";
+                                       if ( status < 0 ) {
+                                               status = 0;
+                                       }
+                               }
+                       }
 
-                                               // Override mime type if needed
-                                               if ( s.mimeType && xhr.overrideMimeType ) {
-                                                       xhr.overrideMimeType( s.mimeType );
-                                               }
+                       // Set data for the fake xhr object
+                       jqXHR.status = status;
+                       jqXHR.statusText = "" + ( nativeStatusText || statusText );
 
-                                               // X-Requested-With header
-                                               // For cross-domain requests, seeing as conditions for a preflight are
-                                               // akin to a jigsaw puzzle, we simply never set it to be sure.
-                                               // (it can always be set on a per-request basis or even using ajaxSetup)
-                                               // For same-domain requests, won't change header if already provided.
-                                               if ( !s.crossDomain && !headers["X-Requested-With"] ) {
-                                                       headers[ "X-Requested-With" ] = "XMLHttpRequest";
-                                               }
+                       // Success/Error
+                       if ( isSuccess ) {
+                               deferred.resolveWith( callbackContext, [ success, statusText, jqXHR ] );
+                       } else {
+                               deferred.rejectWith( callbackContext, [ jqXHR, statusText, error ] );
+                       }
 
-                                               // Need an extra try/catch for cross domain requests in Firefox 3
-                                               try {
-                                                       for ( i in headers ) {
-                                                               xhr.setRequestHeader( i, headers[ i ] );
-                                                       }
-                                               } catch( _ ) {}
-
-                                               // Do send the request
-                                               // This may raise an exception which is actually
-                                               // handled in jQuery.ajax (so no try/catch here)
-                                               xhr.send( ( s.hasContent && s.data ) || null );
-
-                                               // Listener
-                                               callback = function( _, isAbort ) {
-
-                                                       var status,
-                                                               statusText,
-                                                               responseHeaders,
-                                                               responses,
-                                                               xml;
-
-                                                       // Firefox throws exceptions when accessing properties
-                                                       // of an xhr when a network error occured
-                                                       // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
-                                                       try {
-
-                                                               // Was never called and is aborted or complete
-                                                               if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
-
-                                                                       // Only called once
-                                                                       callback = undefined;
-
-                                                                       // Do not keep as active anymore
-                                                                       if ( handle ) {
-                                                                               xhr.onreadystatechange = jQuery.noop;
-                                                                               if ( xhrOnUnloadAbort ) {
-                                                                                       delete xhrCallbacks[ handle ];
-                                                                               }
-                                                                       }
+                       // Status-dependent callbacks
+                       jqXHR.statusCode( statusCode );
+                       statusCode = undefined;
 
-                                                                       // If it's an abort
-                                                                       if ( isAbort ) {
-                                                                               // Abort it manually if needed
-                                                                               if ( xhr.readyState !== 4 ) {
-                                                                                       xhr.abort();
-                                                                               }
-                                                                       } else {
-                                                                               status = xhr.status;
-                                                                               responseHeaders = xhr.getAllResponseHeaders();
-                                                                               responses = {};
-                                                                               xml = xhr.responseXML;
-
-                                                                               // Construct response list
-                                                                               if ( xml && xml.documentElement /* #4958 */ ) {
-                                                                                       responses.xml = xml;
-                                                                               }
-
-                                                                               // When requesting binary data, IE6-9 will throw an exception
-                                                                               // on any attempt to access responseText (#11426)
-                                                                               try {
-                                                                                       responses.text = xhr.responseText;
-                                                                               } catch( _ ) {
-                                                                               }
-
-                                                                               // Firefox throws an exception when accessing
-                                                                               // statusText for faulty cross-domain requests
-                                                                               try {
-                                                                                       statusText = xhr.statusText;
-                                                                               } catch( e ) {
-                                                                                       // We normalize with Webkit giving an empty statusText
-                                                                                       statusText = "";
-                                                                               }
-
-                                                                               // Filter status for non standard behaviors
-
-                                                                               // If the request is local and we have data: assume a success
-                                                                               // (success with no data won't get notified, that's the best we
-                                                                               // can do given current implementations)
-                                                                               if ( !status && s.isLocal && !s.crossDomain ) {
-                                                                                       status = responses.text ? 200 : 404;
-                                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
-                                                                               } else if ( status === 1223 ) {
-                                                                                       status = 204;
-                                                                               }
-                                                                       }
-                                                               }
-                                                       } catch( firefoxAccessException ) {
-                                                               if ( !isAbort ) {
-                                                                       complete( -1, firefoxAccessException );
-                                                               }
-                                                       }
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajax" + ( isSuccess ? "Success" : "Error" ),
+                                               [ jqXHR, s, isSuccess ? success : error ] );
+                       }
 
-                                                       // Call complete if needed
-                                                       if ( responses ) {
-                                                               complete( status, statusText, responses, responseHeaders );
-                                                       }
-                                               };
+                       // Complete
+                       completeDeferred.fireWith( callbackContext, [ jqXHR, statusText ] );
 
-                                               // if we're in sync mode or it's in cache
-                                               // and has been retrieved directly (IE6 & IE7)
-                                               // we need to manually fire the callback
-                                               if ( !s.async || xhr.readyState === 4 ) {
-                                                       callback();
-                                               } else {
-                                                       handle = ++xhrId;
-                                                       if ( xhrOnUnloadAbort ) {
-                                                               // Create the active xhrs callbacks list if needed
-                                                               // and attach the unload handler
-                                                               if ( !xhrCallbacks ) {
-                                                                       xhrCallbacks = {};
-                                                                       jQuery( window ).unload( xhrOnUnloadAbort );
-                                                               }
-                                                               // Add to list of active xhrs callbacks
-                                                               xhrCallbacks[ handle ] = callback;
-                                                       }
-                                                       xhr.onreadystatechange = callback;
-                                               }
-                                       },
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxComplete", [ jqXHR, s ] );
+                               // Handle the global AJAX counter
+                               if ( !( --jQuery.active ) ) {
+                                       jQuery.event.trigger( "ajaxStop" );
+                               }
+                       }
+               }
 
-                                       abort: function() {
-                                               if ( callback ) {
-                                                       callback(0,1);
-                                               }
+               // Attach deferreds
+               deferred.promise( jqXHR );
+               jqXHR.success = jqXHR.done;
+               jqXHR.error = jqXHR.fail;
+               jqXHR.complete = completeDeferred.add;
+
+               // Status-dependent callbacks
+               jqXHR.statusCode = function( map ) {
+                       if ( map ) {
+                               var tmp;
+                               if ( state < 2 ) {
+                                       for ( tmp in map ) {
+                                               statusCode[ tmp ] = [ statusCode[tmp], map[tmp] ];
                                        }
-                               };
+                               } else {
+                                       tmp = map[ jqXHR.status ];
+                                       jqXHR.always( tmp );
+                               }
                        }
-               });
-       }
+                       return this;
+               };
 
+               // Remove hash character (#7531: and string promotion)
+               // Add protocol if not provided (#5866: IE7 issue with protocol-less urls)
+               // We also use the url parameter if available
+               s.url = ( ( url || s.url ) + "" ).replace( rhash, "" ).replace( rprotocol, ajaxLocParts[ 1 ] + "//" );
+
+               // Extract dataTypes list
+               s.dataTypes = jQuery.trim( s.dataType || "*" ).toLowerCase().split( core_rspace );
+
+               // Determine if a cross-domain request is in order
+               if ( s.crossDomain == null ) {
+                       parts = rurl.exec( s.url.toLowerCase() );
+                       s.crossDomain = !!( parts &&
+                               ( parts[ 1 ] != ajaxLocParts[ 1 ] || parts[ 2 ] != ajaxLocParts[ 2 ] ||
+                                       ( parts[ 3 ] || ( parts[ 1 ] === "http:" ? 80 : 443 ) ) !=
+                                               ( ajaxLocParts[ 3 ] || ( ajaxLocParts[ 1 ] === "http:" ? 80 : 443 ) ) )
+                       );
+               }
 
+               // Convert data if not already a string
+               if ( s.data && s.processData && typeof s.data !== "string" ) {
+                       s.data = jQuery.param( s.data, s.traditional );
+               }
 
+               // Apply prefilters
+               inspectPrefiltersOrTransports( prefilters, s, options, jqXHR );
 
-       var elemdisplay = {},
-               iframe, iframeDoc,
-               rfxtypes = /^(?:toggle|show|hide)$/,
-               rfxnum = /^([+\-]=)?([\d+.\-]+)([a-z%]*)$/i,
-               timerId,
-               fxAttrs = [
-                       // height animations
-                       [ "height", "marginTop", "marginBottom", "paddingTop", "paddingBottom" ],
-                       // width animations
-                       [ "width", "marginLeft", "marginRight", "paddingLeft", "paddingRight" ],
-                       // opacity animations
-                       [ "opacity" ]
-               ],
-               fxNow;
+               // If request was aborted inside a prefilter, stop there
+               if ( state === 2 ) {
+                       return jqXHR;
+               }
 
-       jQuery.fn.extend({
-               show: function( speed, easing, callback ) {
-                       var elem, display;
+               // We can fire global events as of now if asked to
+               fireGlobals = s.global;
 
-                       if ( speed || speed === 0 ) {
-                               return this.animate( genFx("show", 3), speed, easing, callback );
+               // Uppercase the type
+               s.type = s.type.toUpperCase();
 
-                       } else {
-                               for ( var i = 0, j = this.length; i < j; i++ ) {
-                                       elem = this[ i ];
+               // Determine if request has content
+               s.hasContent = !rnoContent.test( s.type );
 
-                                       if ( elem.style ) {
-                                               display = elem.style.display;
+               // Watch for a new set of requests
+               if ( fireGlobals && jQuery.active++ === 0 ) {
+                       jQuery.event.trigger( "ajaxStart" );
+               }
 
-                                               // Reset the inline display of this element to learn if it is
-                                               // being hidden by cascaded rules or not
-                                               if ( !jQuery._data(elem, "olddisplay") && display === "none" ) {
-                                                       display = elem.style.display = "";
-                                               }
+               // More options handling for requests with no content
+               if ( !s.hasContent ) {
 
-                                               // Set elements which have been overridden with display: none
-                                               // in a stylesheet to whatever the default browser style is
-                                               // for such an element
-                                               if ( (display === "" && jQuery.css(elem, "display") === "none") ||
-                                                       !jQuery.contains( elem.ownerDocument.documentElement, elem ) ) {
-                                                       jQuery._data( elem, "olddisplay", defaultDisplay(elem.nodeName) );
-                                               }
-                                       }
-                               }
+                       // If data is available, append data to url
+                       if ( s.data ) {
+                               s.url += ( rquery.test( s.url ) ? "&" : "?" ) + s.data;
+                               // #9682: remove data so that it's not used in an eventual retry
+                               delete s.data;
+                       }
 
-                               // Set the display of most of the elements in a second loop
-                               // to avoid the constant reflow
-                               for ( i = 0; i < j; i++ ) {
-                                       elem = this[ i ];
+                       // Get ifModifiedKey before adding the anti-cache parameter
+                       ifModifiedKey = s.url;
 
-                                       if ( elem.style ) {
-                                               display = elem.style.display;
+                       // Add anti-cache in url if needed
+                       if ( s.cache === false ) {
 
-                                               if ( display === "" || display === "none" ) {
-                                                       elem.style.display = jQuery._data( elem, "olddisplay" ) || "";
-                                               }
-                                       }
-                               }
+                               var ts = jQuery.now(),
+                                       // try replacing _= if it is there
+                                       ret = s.url.replace( rts, "$1_=" + ts );
 
-                               return this;
+                               // if nothing was replaced, add timestamp to the end
+                               s.url = ret + ( ( ret === s.url ) ? ( rquery.test( s.url ) ? "&" : "?" ) + "_=" + ts : "" );
                        }
-               },
-
-               hide: function( speed, easing, callback ) {
-                       if ( speed || speed === 0 ) {
-                               return this.animate( genFx("hide", 3), speed, easing, callback);
+               }
 
-                       } else {
-                               var elem, display,
-                                       i = 0,
-                                       j = this.length;
+               // Set the correct header, if data is being sent
+               if ( s.data && s.hasContent && s.contentType !== false || options.contentType ) {
+                       jqXHR.setRequestHeader( "Content-Type", s.contentType );
+               }
 
-                               for ( ; i < j; i++ ) {
-                                       elem = this[i];
-                                       if ( elem.style ) {
-                                               display = jQuery.css( elem, "display" );
+               // Set the If-Modified-Since and/or If-None-Match header, if in ifModified mode.
+               if ( s.ifModified ) {
+                       ifModifiedKey = ifModifiedKey || s.url;
+                       if ( jQuery.lastModified[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-Modified-Since", jQuery.lastModified[ ifModifiedKey ] );
+                       }
+                       if ( jQuery.etag[ ifModifiedKey ] ) {
+                               jqXHR.setRequestHeader( "If-None-Match", jQuery.etag[ ifModifiedKey ] );
+                       }
+               }
 
-                                               if ( display !== "none" && !jQuery._data( elem, "olddisplay" ) ) {
-                                                       jQuery._data( elem, "olddisplay", display );
-                                               }
-                                       }
-                               }
+               // Set the Accepts header for the server, depending on the dataType
+               jqXHR.setRequestHeader(
+                       "Accept",
+                       s.dataTypes[ 0 ] && s.accepts[ s.dataTypes[0] ] ?
+                               s.accepts[ s.dataTypes[0] ] + ( s.dataTypes[ 0 ] !== "*" ? ", " + allTypes + "; q=0.01" : "" ) :
+                               s.accepts[ "*" ]
+               );
+
+               // Check for headers option
+               for ( i in s.headers ) {
+                       jqXHR.setRequestHeader( i, s.headers[ i ] );
+               }
 
-                               // Set the display of the elements in a second loop
-                               // to avoid the constant reflow
-                               for ( i = 0; i < j; i++ ) {
-                                       if ( this[i].style ) {
-                                               this[i].style.display = "none";
-                                       }
-                               }
+               // Allow custom headers/mimetypes and early abort
+               if ( s.beforeSend && ( s.beforeSend.call( callbackContext, jqXHR, s ) === false || state === 2 ) ) {
+                               // Abort if not done already and return
+                               return jqXHR.abort();
 
-                               return this;
-                       }
-               },
+               }
 
-               // Save the old toggle function
-               _toggle: jQuery.fn.toggle,
+               // aborting is no longer a cancellation
+               strAbort = "abort";
 
-               toggle: function( fn, fn2, callback ) {
-                       var bool = typeof fn === "boolean";
+               // Install callbacks on deferreds
+               for ( i in { success: 1, error: 1, complete: 1 } ) {
+                       jqXHR[ i ]( s[ i ] );
+               }
 
-                       if ( jQuery.isFunction(fn) && jQuery.isFunction(fn2) ) {
-                               this._toggle.apply( this, arguments );
+               // Get transport
+               transport = inspectPrefiltersOrTransports( transports, s, options, jqXHR );
 
-                       } else if ( fn == null || bool ) {
-                               this.each(function() {
-                                       var state = bool ? fn : jQuery(this).is(":hidden");
-                                       jQuery(this)[ state ? "show" : "hide" ]();
-                               });
+               // If no transport, we auto-abort
+               if ( !transport ) {
+                       done( -1, "No Transport" );
+               } else {
+                       jqXHR.readyState = 1;
+                       // Send global event
+                       if ( fireGlobals ) {
+                               globalEventContext.trigger( "ajaxSend", [ jqXHR, s ] );
+                       }
+                       // Timeout
+                       if ( s.async && s.timeout > 0 ) {
+                               timeoutTimer = setTimeout( function(){
+                                       jqXHR.abort( "timeout" );
+                               }, s.timeout );
+                       }
 
-                       } else {
-                               this.animate(genFx("toggle", 3), fn, fn2, callback);
+                       try {
+                               state = 1;
+                               transport.send( requestHeaders, done );
+                       } catch (e) {
+                               // Propagate exception as error if not done
+                               if ( state < 2 ) {
+                                       done( -1, e );
+                               // Simply rethrow otherwise
+                               } else {
+                                       throw e;
+                               }
                        }
+               }
 
-                       return this;
-               },
+               return jqXHR;
+       },
 
-               fadeTo: function( speed, to, easing, callback ) {
-                       return this.filter(":hidden").css("opacity", 0).show().end()
-                               .animate({opacity: to}, speed, easing, callback);
-               },
+       // Counter for holding the number of active queries
+       active: 0,
 
-               animate: function( prop, speed, easing, callback ) {
-                       var optall = jQuery.speed( speed, easing, callback );
+       // Last-Modified header cache for next request
+       lastModified: {},
+       etag: {}
 
-                       if ( jQuery.isEmptyObject( prop ) ) {
-                               return this.each( optall.complete, [ false ] );
-                       }
+});
 
-                       // Do not change referenced properties as per-property easing will be lost
-                       prop = jQuery.extend( {}, prop );
+/* Handles responses to an ajax request:
+ * - sets all responseXXX fields accordingly
+ * - finds the right dataType (mediates between content-type and expected dataType)
+ * - returns the corresponding response
+ */
+function ajaxHandleResponses( s, jqXHR, responses ) {
 
-                       function doAnimation() {
-                               // XXX 'this' does not always have a nodeName when running the
-                               // test suite
+       var ct, type, finalDataType, firstDataType,
+               contents = s.contents,
+               dataTypes = s.dataTypes,
+               responseFields = s.responseFields;
 
-                               if ( optall.queue === false ) {
-                                       jQuery._mark( this );
-                               }
+       // Fill responseXXX fields
+       for ( type in responseFields ) {
+               if ( type in responses ) {
+                       jqXHR[ responseFields[type] ] = responses[ type ];
+               }
+       }
 
-                               var opt = jQuery.extend( {}, optall ),
-                                       isElement = this.nodeType === 1,
-                                       hidden = isElement && jQuery(this).is(":hidden"),
-                                       name, val, p, e, hooks, replace,
-                                       parts, start, end, unit,
-                                       method;
-
-                               // will store per property easing and be used to determine when an animation is complete
-                               opt.animatedProperties = {};
-
-                               // first pass over propertys to expand / normalize
-                               for ( p in prop ) {
-                                       name = jQuery.camelCase( p );
-                                       if ( p !== name ) {
-                                               prop[ name ] = prop[ p ];
-                                               delete prop[ p ];
-                                       }
+       // Remove auto dataType and get content-type in the process
+       while( dataTypes[ 0 ] === "*" ) {
+               dataTypes.shift();
+               if ( ct === undefined ) {
+                       ct = s.mimeType || jqXHR.getResponseHeader( "content-type" );
+               }
+       }
 
-                                       if ( ( hooks = jQuery.cssHooks[ name ] ) && "expand" in hooks ) {
-                                               replace = hooks.expand( prop[ name ] );
-                                               delete prop[ name ];
+       // Check if we're dealing with a known content-type
+       if ( ct ) {
+               for ( type in contents ) {
+                       if ( contents[ type ] && contents[ type ].test( ct ) ) {
+                               dataTypes.unshift( type );
+                               break;
+                       }
+               }
+       }
 
-                                               // not quite $.extend, this wont overwrite keys already present.
-                                               // also - reusing 'p' from above because we have the correct "name"
-                                               for ( p in replace ) {
-                                                       if ( ! ( p in prop ) ) {
-                                                               prop[ p ] = replace[ p ];
-                                                       }
-                                               }
-                                       }
-                               }
+       // Check to see if we have a response for the expected dataType
+       if ( dataTypes[ 0 ] in responses ) {
+               finalDataType = dataTypes[ 0 ];
+       } else {
+               // Try convertible dataTypes
+               for ( type in responses ) {
+                       if ( !dataTypes[ 0 ] || s.converters[ type + " " + dataTypes[0] ] ) {
+                               finalDataType = type;
+                               break;
+                       }
+                       if ( !firstDataType ) {
+                               firstDataType = type;
+                       }
+               }
+               // Or just use first one
+               finalDataType = finalDataType || firstDataType;
+       }
 
-                               for ( name in prop ) {
-                                       val = prop[ name ];
-                                       // easing resolution: per property > opt.specialEasing > opt.easing > 'swing' (default)
-                                       if ( jQuery.isArray( val ) ) {
-                                               opt.animatedProperties[ name ] = val[ 1 ];
-                                               val = prop[ name ] = val[ 0 ];
-                                       } else {
-                                               opt.animatedProperties[ name ] = opt.specialEasing && opt.specialEasing[ name ] || opt.easing || 'swing';
-                                       }
+       // If we found a dataType
+       // We add the dataType to the list if needed
+       // and return the corresponding response
+       if ( finalDataType ) {
+               if ( finalDataType !== dataTypes[ 0 ] ) {
+                       dataTypes.unshift( finalDataType );
+               }
+               return responses[ finalDataType ];
+       }
+}
 
-                                       if ( val === "hide" && hidden || val === "show" && !hidden ) {
-                                               return opt.complete.call( this );
-                                       }
+// Chain conversions given the request and the original response
+function ajaxConvert( s, response ) {
+
+       var conv, conv2, current, tmp,
+               // Work with a copy of dataTypes in case we need to modify it for conversion
+               dataTypes = s.dataTypes.slice(),
+               prev = dataTypes[ 0 ],
+               converters = {},
+               i = 0;
+
+       // Apply the dataFilter if provided
+       if ( s.dataFilter ) {
+               response = s.dataFilter( response, s.dataType );
+       }
+
+       // Create converters map with lowercased keys
+       if ( dataTypes[ 1 ] ) {
+               for ( conv in s.converters ) {
+                       converters[ conv.toLowerCase() ] = s.converters[ conv ];
+               }
+       }
 
-                                       if ( isElement && ( name === "height" || name === "width" ) ) {
-                                               // Make sure that nothing sneaks out
-                                               // Record all 3 overflow attributes because IE does not
-                                               // change the overflow attribute when overflowX and
-                                               // overflowY are set to the same value
-                                               opt.overflow = [ this.style.overflow, this.style.overflowX, this.style.overflowY ];
+       // Convert to each sequential dataType, tolerating list modification
+       for ( ; (current = dataTypes[++i]); ) {
 
-                                               // Set display property to inline-block for height/width
-                                               // animations on inline elements that are having width/height animated
-                                               if ( jQuery.css( this, "display" ) === "inline" &&
-                                                       jQuery.css( this, "float" ) === "none" ) {
+               // There's only work to do if current dataType is non-auto
+               if ( current !== "*" ) {
 
-                                                       // inline-level elements accept inline-block;
-                                                       // block-level elements need to be inline with layout
-                                                       if ( !jQuery.support.inlineBlockNeedsLayout || defaultDisplay( this.nodeName ) === "inline" ) {
-                                                               this.style.display = "inline-block";
+                       // Convert response if prev dataType is non-auto and differs from current
+                       if ( prev !== "*" && prev !== current ) {
 
-                                                       } else {
-                                                               this.style.zoom = 1;
+                               // Seek a direct converter
+                               conv = converters[ prev + " " + current ] || converters[ "* " + current ];
+
+                               // If none found, seek a pair
+                               if ( !conv ) {
+                                       for ( conv2 in converters ) {
+
+                                               // If conv2 outputs current
+                                               tmp = conv2.split(" ");
+                                               if ( tmp[ 1 ] === current ) {
+
+                                                       // If prev can be converted to accepted input
+                                                       conv = converters[ prev + " " + tmp[ 0 ] ] ||
+                                                               converters[ "* " + tmp[ 0 ] ];
+                                                       if ( conv ) {
+                                                               // Condense equivalence converters
+                                                               if ( conv === true ) {
+                                                                       conv = converters[ conv2 ];
+
+                                                               // Otherwise, insert the intermediate dataType
+                                                               } else if ( converters[ conv2 ] !== true ) {
+                                                                       current = tmp[ 0 ];
+                                                                       dataTypes.splice( i--, 0, current );
+                                                               }
+
+                                                               break;
                                                        }
                                                }
                                        }
                                }
 
-                               if ( opt.overflow != null ) {
-                                       this.style.overflow = "hidden";
+                               // Apply converter (if not an equivalence)
+                               if ( conv !== true ) {
+
+                                       // Unless errors are allowed to bubble, catch and return them
+                                       if ( conv && s["throws"] ) {
+                                               response = conv( response );
+                                       } else {
+                                               try {
+                                                       response = conv( response );
+                                               } catch ( e ) {
+                                                       return { state: "parsererror", error: conv ? e : "No conversion from " + prev + " to " + current };
+                                               }
+                                       }
                                }
+                       }
 
-                               for ( p in prop ) {
-                                       e = new jQuery.fx( this, opt, p );
-                                       val = prop[ p ];
+                       // Update prev for next iteration
+                       prev = current;
+               }
+       }
 
-                                       if ( rfxtypes.test( val ) ) {
+       return { state: "success", data: response };
+}
+var oldCallbacks = [],
+       rquestion = /\?/,
+       rjsonp = /(=)\?(?=&|$)|\?\?/,
+       nonce = jQuery.now();
 
-                                               // Tracks whether to show or hide based on private
-                                               // data attached to the element
-                                               method = jQuery._data( this, "toggle" + p ) || ( val === "toggle" ? hidden ? "show" : "hide" : 0 );
-                                               if ( method ) {
-                                                       jQuery._data( this, "toggle" + p, method === "show" ? "hide" : "show" );
-                                                       e[ method ]();
-                                               } else {
-                                                       e[ val ]();
-                                               }
+// Default jsonp settings
+jQuery.ajaxSetup({
+       jsonp: "callback",
+       jsonpCallback: function() {
+               var callback = oldCallbacks.pop() || ( jQuery.expando + "_" + ( nonce++ ) );
+               this[ callback ] = true;
+               return callback;
+       }
+});
 
-                                       } else {
-                                               parts = rfxnum.exec( val );
-                                               start = e.cur();
-
-                                               if ( parts ) {
-                                                       end = parseFloat( parts[2] );
-                                                       unit = parts[3] || ( jQuery.cssNumber[ p ] ? "" : "px" );
-
-                                                       // We need to compute starting value
-                                                       if ( unit !== "px" ) {
-                                                               jQuery.style( this, p, (end || 1) + unit);
-                                                               start = ( (end || 1) / e.cur() ) * start;
-                                                               jQuery.style( this, p, start + unit);
-                                                       }
+// Detect, normalize options and install callbacks for jsonp requests
+jQuery.ajaxPrefilter( "json jsonp", function( s, originalSettings, jqXHR ) {
+
+       var callbackName, overwritten, responseContainer,
+               data = s.data,
+               url = s.url,
+               hasCallback = s.jsonp !== false,
+               replaceInUrl = hasCallback && rjsonp.test( url ),
+               replaceInData = hasCallback && !replaceInUrl && typeof data === "string" &&
+                       !( s.contentType || "" ).indexOf("application/x-www-form-urlencoded") &&
+                       rjsonp.test( data );
+
+       // Handle iff the expected data type is "jsonp" or we have a parameter to set
+       if ( s.dataTypes[ 0 ] === "jsonp" || replaceInUrl || replaceInData ) {
+
+               // Get callback name, remembering preexisting value associated with it
+               callbackName = s.jsonpCallback = jQuery.isFunction( s.jsonpCallback ) ?
+                       s.jsonpCallback() :
+                       s.jsonpCallback;
+               overwritten = window[ callbackName ];
+
+               // Insert callback into url or form data
+               if ( replaceInUrl ) {
+                       s.url = url.replace( rjsonp, "$1" + callbackName );
+               } else if ( replaceInData ) {
+                       s.data = data.replace( rjsonp, "$1" + callbackName );
+               } else if ( hasCallback ) {
+                       s.url += ( rquestion.test( url ) ? "&" : "?" ) + s.jsonp + "=" + callbackName;
+               }
 
-                                                       // If a +=/-= token was provided, we're doing a relative animation
-                                                       if ( parts[1] ) {
-                                                               end = ( (parts[ 1 ] === "-=" ? -1 : 1) * end ) + start;
-                                                       }
+               // Use data converter to retrieve json after script execution
+               s.converters["script json"] = function() {
+                       if ( !responseContainer ) {
+                               jQuery.error( callbackName + " was not called" );
+                       }
+                       return responseContainer[ 0 ];
+               };
 
-                                                       e.custom( start, end, unit );
+               // force json dataType
+               s.dataTypes[ 0 ] = "json";
 
-                                               } else {
-                                                       e.custom( start, val, "" );
-                                               }
-                                       }
-                               }
+               // Install callback
+               window[ callbackName ] = function() {
+                       responseContainer = arguments;
+               };
 
-                               // For JS strict compliance
-                               return true;
-                       }
+               // Clean-up function (fires after converters)
+               jqXHR.always(function() {
+                       // Restore preexisting value
+                       window[ callbackName ] = overwritten;
 
-                       return optall.queue === false ?
-                               this.each( doAnimation ) :
-                               this.queue( optall.queue, doAnimation );
-               },
+                       // Save back as free
+                       if ( s[ callbackName ] ) {
+                               // make sure that re-using the options doesn't screw things around
+                               s.jsonpCallback = originalSettings.jsonpCallback;
 
-               stop: function( type, clearQueue, gotoEnd ) {
-                       if ( typeof type !== "string" ) {
-                               gotoEnd = clearQueue;
-                               clearQueue = type;
-                               type = undefined;
+                               // save the callback name for future use
+                               oldCallbacks.push( callbackName );
                        }
-                       if ( clearQueue && type !== false ) {
-                               this.queue( type || "fx", [] );
+
+                       // Call if it was a function and we have a response
+                       if ( responseContainer && jQuery.isFunction( overwritten ) ) {
+                               overwritten( responseContainer[ 0 ] );
                        }
 
-                       return this.each(function() {
-                               var index,
-                                       hadTimers = false,
-                                       timers = jQuery.timers,
-                                       data = jQuery._data( this );
-
-                               // clear marker counters if we know they won't be
-                               if ( !gotoEnd ) {
-                                       jQuery._unmark( true, this );
-                               }
+                       responseContainer = overwritten = undefined;
+               });
 
-                               function stopQueue( elem, data, index ) {
-                                       var hooks = data[ index ];
-                                       jQuery.removeData( elem, index, true );
-                                       hooks.stop( gotoEnd );
-                               }
+               // Delegate to script
+               return "script";
+       }
+});
+// Install script dataType
+jQuery.ajaxSetup({
+       accepts: {
+               script: "text/javascript, application/javascript, application/ecmascript, application/x-ecmascript"
+       },
+       contents: {
+               script: /javascript|ecmascript/
+       },
+       converters: {
+               "text script": function( text ) {
+                       jQuery.globalEval( text );
+                       return text;
+               }
+       }
+});
 
-                               if ( type == null ) {
-                                       for ( index in data ) {
-                                               if ( data[ index ] && data[ index ].stop && index.indexOf(".run") === index.length - 4 ) {
-                                                       stopQueue( this, data, index );
-                                               }
-                                       }
-                               } else if ( data[ index = type + ".run" ] && data[ index ].stop ){
-                                       stopQueue( this, data, index );
-                               }
+// Handle cache's special case and global
+jQuery.ajaxPrefilter( "script", function( s ) {
+       if ( s.cache === undefined ) {
+               s.cache = false;
+       }
+       if ( s.crossDomain ) {
+               s.type = "GET";
+               s.global = false;
+       }
+});
 
-                               for ( index = timers.length; index--; ) {
-                                       if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
-                                               if ( gotoEnd ) {
+// Bind script tag hack transport
+jQuery.ajaxTransport( "script", function(s) {
 
-                                                       // force the next step to be the last
-                                                       timers[ index ]( true );
-                                               } else {
-                                                       timers[ index ].saveState();
-                                               }
-                                               hadTimers = true;
-                                               timers.splice( index, 1 );
-                                       }
-                               }
+       // This transport only deals with cross domain requests
+       if ( s.crossDomain ) {
 
-                               // start the next in the queue if the last step wasn't forced
-                               // timers currently will call their complete callbacks, which will dequeue
-                               // but only if they were gotoEnd
-                               if ( !( gotoEnd && hadTimers ) ) {
-                                       jQuery.dequeue( this, type );
-                               }
-                       });
-               }
+               var script,
+                       head = document.head || document.getElementsByTagName( "head" )[0] || document.documentElement;
 
-       });
+               return {
 
-// Animations created synchronously will run synchronously
-       function createFxNow() {
-               setTimeout( clearFxNow, 0 );
-               return ( fxNow = jQuery.now() );
-       }
+                       send: function( _, callback ) {
 
-       function clearFxNow() {
-               fxNow = undefined;
-       }
+                               script = document.createElement( "script" );
 
-// Generate parameters to create a standard animation
-       function genFx( type, num ) {
-               var obj = {};
+                               script.async = "async";
 
-               jQuery.each( fxAttrs.concat.apply([], fxAttrs.slice( 0, num )), function() {
-                       obj[ this ] = type;
-               });
+                               if ( s.scriptCharset ) {
+                                       script.charset = s.scriptCharset;
+                               }
 
-               return obj;
-       }
+                               script.src = s.url;
 
-// Generate shortcuts for custom animations
-       jQuery.each({
-               slideDown: genFx( "show", 1 ),
-               slideUp: genFx( "hide", 1 ),
-               slideToggle: genFx( "toggle", 1 ),
-               fadeIn: { opacity: "show" },
-               fadeOut: { opacity: "hide" },
-               fadeToggle: { opacity: "toggle" }
-       }, function( name, props ) {
-               jQuery.fn[ name ] = function( speed, easing, callback ) {
-                       return this.animate( props, speed, easing, callback );
-               };
-       });
+                               // Attach handlers for all browsers
+                               script.onload = script.onreadystatechange = function( _, isAbort ) {
 
-       jQuery.extend({
-               speed: function( speed, easing, fn ) {
-                       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
-                               complete: fn || !fn && easing ||
-                                       jQuery.isFunction( speed ) && speed,
-                               duration: speed,
-                               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
-                       };
+                                       if ( isAbort || !script.readyState || /loaded|complete/.test( script.readyState ) ) {
 
-                       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
-                               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
+                                               // Handle memory leak in IE
+                                               script.onload = script.onreadystatechange = null;
 
-                       // normalize opt.queue - true/undefined/null -> "fx"
-                       if ( opt.queue == null || opt.queue === true ) {
-                               opt.queue = "fx";
-                       }
+                                               // Remove the script
+                                               if ( head && script.parentNode ) {
+                                                       head.removeChild( script );
+                                               }
 
-                       // Queueing
-                       opt.old = opt.complete;
+                                               // Dereference the script
+                                               script = undefined;
 
-                       opt.complete = function( noUnmark ) {
-                               if ( jQuery.isFunction( opt.old ) ) {
-                                       opt.old.call( this );
-                               }
+                                               // Callback if not abort
+                                               if ( !isAbort ) {
+                                                       callback( 200, "success" );
+                                               }
+                                       }
+                               };
+                               // Use insertBefore instead of appendChild  to circumvent an IE6 bug.
+                               // This arises when a base node is used (#2709 and #4378).
+                               head.insertBefore( script, head.firstChild );
+                       },
 
-                               if ( opt.queue ) {
-                                       jQuery.dequeue( this, opt.queue );
-                               } else if ( noUnmark !== false ) {
-                                       jQuery._unmark( this );
+                       abort: function() {
+                               if ( script ) {
+                                       script.onload( 0, 1 );
                                }
-                       };
+                       }
+               };
+       }
+});
+var xhrCallbacks,
+       // #5280: Internet Explorer will keep connections alive if we don't abort on unload
+       xhrOnUnloadAbort = window.ActiveXObject ? function() {
+               // Abort all pending requests
+               for ( var key in xhrCallbacks ) {
+                       xhrCallbacks[ key ]( 0, 1 );
+               }
+       } : false,
+       xhrId = 0;
 
-                       return opt;
-               },
+// Functions to create xhrs
+function createStandardXHR() {
+       try {
+               return new window.XMLHttpRequest();
+       } catch( e ) {}
+}
 
-               easing: {
-                       linear: function( p ) {
-                               return p;
-                       },
-                       swing: function( p ) {
-                               return ( -Math.cos( p*Math.PI ) / 2 ) + 0.5;
-                       }
-               },
+function createActiveXHR() {
+       try {
+               return new window.ActiveXObject( "Microsoft.XMLHTTP" );
+       } catch( e ) {}
+}
 
-               timers: [],
+// Create the request object
+// (This is still attached to ajaxSettings for backward compatibility)
+jQuery.ajaxSettings.xhr = window.ActiveXObject ?
+       /* Microsoft failed to properly
+        * implement the XMLHttpRequest in IE7 (can't request local files),
+        * so we use the ActiveXObject when it is available
+        * Additionally XMLHttpRequest can be disabled in IE7/IE8 so
+        * we need a fallback.
+        */
+       function() {
+               return !this.isLocal && createStandardXHR() || createActiveXHR();
+       } :
+       // For all other browsers, use the standard XMLHttpRequest object
+       createStandardXHR;
 
-               fx: function( elem, options, prop ) {
-                       this.options = options;
-                       this.elem = elem;
-                       this.prop = prop;
+// Determine support properties
+(function( xhr ) {
+       jQuery.extend( jQuery.support, {
+               ajax: !!xhr,
+               cors: !!xhr && ( "withCredentials" in xhr )
+       });
+})( jQuery.ajaxSettings.xhr() );
 
-                       options.orig = options.orig || {};
-               }
+// Create transport if the browser can provide an xhr
+if ( jQuery.support.ajax ) {
 
-       });
+       jQuery.ajaxTransport(function( s ) {
+               // Cross domain only allowed if supported through XMLHttpRequest
+               if ( !s.crossDomain || jQuery.support.cors ) {
 
-       jQuery.fx.prototype = {
-               // Simple function for setting a style value
-               update: function() {
-                       if ( this.options.step ) {
-                               this.options.step.call( this.elem, this.now, this );
-                       }
+                       var callback;
 
-                       ( jQuery.fx.step[ this.prop ] || jQuery.fx.step._default )( this );
-               },
+                       return {
+                               send: function( headers, complete ) {
 
-               // Get the current size
-               cur: function() {
-                       if ( this.elem[ this.prop ] != null && (!this.elem.style || this.elem.style[ this.prop ] == null) ) {
-                               return this.elem[ this.prop ];
-                       }
+                                       // Get a new xhr
+                                       var handle, i,
+                                               xhr = s.xhr();
 
-                       var parsed,
-                               r = jQuery.css( this.elem, this.prop );
-                       // Empty strings, null, undefined and "auto" are converted to 0,
-                       // complex values such as "rotate(1rad)" are returned as is,
-                       // simple values such as "10px" are parsed to Float.
-                       return isNaN( parsed = parseFloat( r ) ) ? !r || r === "auto" ? 0 : r : parsed;
-               },
+                                       // Open the socket
+                                       // Passing null username, generates a login popup on Opera (#2865)
+                                       if ( s.username ) {
+                                               xhr.open( s.type, s.url, s.async, s.username, s.password );
+                                       } else {
+                                               xhr.open( s.type, s.url, s.async );
+                                       }
 
-               // Start an animation from one number to another
-               custom: function( from, to, unit ) {
-                       var self = this,
-                               fx = jQuery.fx;
-
-                       this.startTime = fxNow || createFxNow();
-                       this.end = to;
-                       this.now = this.start = from;
-                       this.pos = this.state = 0;
-                       this.unit = unit || this.unit || ( jQuery.cssNumber[ this.prop ] ? "" : "px" );
-
-                       function t( gotoEnd ) {
-                               return self.step( gotoEnd );
-                       }
-
-                       t.queue = this.options.queue;
-                       t.elem = this.elem;
-                       t.saveState = function() {
-                               if ( jQuery._data( self.elem, "fxshow" + self.prop ) === undefined ) {
-                                       if ( self.options.hide ) {
-                                               jQuery._data( self.elem, "fxshow" + self.prop, self.start );
-                                       } else if ( self.options.show ) {
-                                               jQuery._data( self.elem, "fxshow" + self.prop, self.end );
+                                       // Apply custom fields if provided
+                                       if ( s.xhrFields ) {
+                                               for ( i in s.xhrFields ) {
+                                                       xhr[ i ] = s.xhrFields[ i ];
+                                               }
                                        }
-                               }
-                       };
 
-                       if ( t() && jQuery.timers.push(t) && !timerId ) {
-                               timerId = setInterval( fx.tick, fx.interval );
-                       }
-               },
+                                       // Override mime type if needed
+                                       if ( s.mimeType && xhr.overrideMimeType ) {
+                                               xhr.overrideMimeType( s.mimeType );
+                                       }
 
-               // Simple 'show' function
-               show: function() {
-                       var dataShow = jQuery._data( this.elem, "fxshow" + this.prop );
+                                       // X-Requested-With header
+                                       // For cross-domain requests, seeing as conditions for a preflight are
+                                       // akin to a jigsaw puzzle, we simply never set it to be sure.
+                                       // (it can always be set on a per-request basis or even using ajaxSetup)
+                                       // For same-domain requests, won't change header if already provided.
+                                       if ( !s.crossDomain && !headers["X-Requested-With"] ) {
+                                               headers[ "X-Requested-With" ] = "XMLHttpRequest";
+                                       }
 
-                       // Remember where we started, so that we can go back to it later
-                       this.options.orig[ this.prop ] = dataShow || jQuery.style( this.elem, this.prop );
-                       this.options.show = true;
+                                       // Need an extra try/catch for cross domain requests in Firefox 3
+                                       try {
+                                               for ( i in headers ) {
+                                                       xhr.setRequestHeader( i, headers[ i ] );
+                                               }
+                                       } catch( _ ) {}
 
-                       // Begin the animation
-                       // Make sure that we start at a small width/height to avoid any flash of content
-                       if ( dataShow !== undefined ) {
-                               // This show is picking up where a previous hide or show left off
-                               this.custom( this.cur(), dataShow );
-                       } else {
-                               this.custom( this.prop === "width" || this.prop === "height" ? 1 : 0, this.cur() );
-                       }
+                                       // Do send the request
+                                       // This may raise an exception which is actually
+                                       // handled in jQuery.ajax (so no try/catch here)
+                                       xhr.send( ( s.hasContent && s.data ) || null );
 
-                       // Start by showing the element
-                       jQuery( this.elem ).show();
-               },
+                                       // Listener
+                                       callback = function( _, isAbort ) {
 
-               // Simple 'hide' function
-               hide: function() {
-                       // Remember where we started, so that we can go back to it later
-                       this.options.orig[ this.prop ] = jQuery._data( this.elem, "fxshow" + this.prop ) || jQuery.style( this.elem, this.prop );
-                       this.options.hide = true;
+                                               var status,
+                                                       statusText,
+                                                       responseHeaders,
+                                                       responses,
+                                                       xml;
 
-                       // Begin the animation
-                       this.custom( this.cur(), 0 );
-               },
+                                               // Firefox throws exceptions when accessing properties
+                                               // of an xhr when a network error occurred
+                                               // http://helpful.knobs-dials.com/index.php/Component_returned_failure_code:_0x80040111_(NS_ERROR_NOT_AVAILABLE)
+                                               try {
 
-               // Each step of an animation
-               step: function( gotoEnd ) {
-                       var p, n, complete,
-                               t = fxNow || createFxNow(),
-                               done = true,
-                               elem = this.elem,
-                               options = this.options;
+                                                       // Was never called and is aborted or complete
+                                                       if ( callback && ( isAbort || xhr.readyState === 4 ) ) {
 
-                       if ( gotoEnd || t >= options.duration + this.startTime ) {
-                               this.now = this.end;
-                               this.pos = this.state = 1;
-                               this.update();
+                                                               // Only called once
+                                                               callback = undefined;
 
-                               options.animatedProperties[ this.prop ] = true;
+                                                               // Do not keep as active anymore
+                                                               if ( handle ) {
+                                                                       xhr.onreadystatechange = jQuery.noop;
+                                                                       if ( xhrOnUnloadAbort ) {
+                                                                               delete xhrCallbacks[ handle ];
+                                                                       }
+                                                               }
 
-                               for ( p in options.animatedProperties ) {
-                                       if ( options.animatedProperties[ p ] !== true ) {
-                                               done = false;
-                                       }
-                               }
+                                                               // If it's an abort
+                                                               if ( isAbort ) {
+                                                                       // Abort it manually if needed
+                                                                       if ( xhr.readyState !== 4 ) {
+                                                                               xhr.abort();
+                                                                       }
+                                                               } else {
+                                                                       status = xhr.status;
+                                                                       responseHeaders = xhr.getAllResponseHeaders();
+                                                                       responses = {};
+                                                                       xml = xhr.responseXML;
+
+                                                                       // Construct response list
+                                                                       if ( xml && xml.documentElement /* #4958 */ ) {
+                                                                               responses.xml = xml;
+                                                                       }
 
-                               if ( done ) {
-                                       // Reset the overflow
-                                       if ( options.overflow != null && !jQuery.support.shrinkWrapBlocks ) {
+                                                                       // When requesting binary data, IE6-9 will throw an exception
+                                                                       // on any attempt to access responseText (#11426)
+                                                                       try {
+                                                                               responses.text = xhr.responseText;
+                                                                       } catch( _ ) {
+                                                                       }
 
-                                               jQuery.each( [ "", "X", "Y" ], function( index, value ) {
-                                                       elem.style[ "overflow" + value ] = options.overflow[ index ];
-                                               });
-                                       }
+                                                                       // Firefox throws an exception when accessing
+                                                                       // statusText for faulty cross-domain requests
+                                                                       try {
+                                                                               statusText = xhr.statusText;
+                                                                       } catch( e ) {
+                                                                               // We normalize with Webkit giving an empty statusText
+                                                                               statusText = "";
+                                                                       }
 
-                                       // Hide the element if the "hide" operation was done
-                                       if ( options.hide ) {
-                                               jQuery( elem ).hide();
-                                       }
+                                                                       // Filter status for non standard behaviors
 
-                                       // Reset the properties, if the item has been hidden or shown
-                                       if ( options.hide || options.show ) {
-                                               for ( p in options.animatedProperties ) {
-                                                       jQuery.style( elem, p, options.orig[ p ] );
-                                                       jQuery.removeData( elem, "fxshow" + p, true );
-                                                       // Toggle data is no longer needed
-                                                       jQuery.removeData( elem, "toggle" + p, true );
+                                                                       // If the request is local and we have data: assume a success
+                                                                       // (success with no data won't get notified, that's the best we
+                                                                       // can do given current implementations)
+                                                                       if ( !status && s.isLocal && !s.crossDomain ) {
+                                                                               status = responses.text ? 200 : 404;
+                                                                       // IE - #1450: sometimes returns 1223 when it should be 204
+                                                                       } else if ( status === 1223 ) {
+                                                                               status = 204;
+                                                                       }
+                                                               }
+                                                       }
+                                               } catch( firefoxAccessException ) {
+                                                       if ( !isAbort ) {
+                                                               complete( -1, firefoxAccessException );
+                                                       }
                                                }
-                                       }
 
-                                       // Execute the complete function
-                                       // in the event that the complete function throws an exception
-                                       // we must ensure it won't be called twice. #5684
+                                               // Call complete if needed
+                                               if ( responses ) {
+                                                       complete( status, statusText, responses, responseHeaders );
+                                               }
+                                       };
 
-                                       complete = options.complete;
-                                       if ( complete ) {
+                                       if ( !s.async ) {
+                                               // if we're in sync mode we fire the callback
+                                               callback();
+                                       } else if ( xhr.readyState === 4 ) {
+                                               // (IE6 & IE7) if it's in cache and has been
+                                               // retrieved directly we need to fire the callback
+                                               setTimeout( callback, 0 );
+                                       } else {
+                                               handle = ++xhrId;
+                                               if ( xhrOnUnloadAbort ) {
+                                                       // Create the active xhrs callbacks list if needed
+                                                       // and attach the unload handler
+                                                       if ( !xhrCallbacks ) {
+                                                               xhrCallbacks = {};
+                                                               jQuery( window ).unload( xhrOnUnloadAbort );
+                                                       }
+                                                       // Add to list of active xhrs callbacks
+                                                       xhrCallbacks[ handle ] = callback;
+                                               }
+                                               xhr.onreadystatechange = callback;
+                                       }
+                               },
 
-                                               options.complete = false;
-                                               complete.call( elem );
+                               abort: function() {
+                                       if ( callback ) {
+                                               callback(0,1);
                                        }
                                }
+                       };
+               }
+       });
+}
+var fxNow, timerId,
+       rfxtypes = /^(?:toggle|show|hide)$/,
+       rfxnum = new RegExp( "^(?:([-+])=|)(" + core_pnum + ")([a-z%]*)$", "i" ),
+       rrun = /queueHooks$/,
+       animationPrefilters = [ defaultPrefilter ],
+       tweeners = {
+               "*": [function( prop, value ) {
+                       var end, unit, prevScale,
+                               tween = this.createTween( prop, value ),
+                               parts = rfxnum.exec( value ),
+                               target = tween.cur(),
+                               start = +target || 0,
+                               scale = 1;
+
+                       if ( parts ) {
+                               end = +parts[2];
+                               unit = parts[3] || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+
+                               // We need to compute starting value
+                               if ( unit !== "px" && start ) {
+                                       // Iteratively approximate from a nonzero starting point
+                                       // Prefer the current property, because this process will be trivial if it uses the same units
+                                       // Fallback to end or a simple constant
+                                       start = jQuery.css( tween.elem, prop, true ) || end || 1;
+
+                                       do {
+                                               // If previous iteration zeroed out, double until we get *something*
+                                               // Use a string for doubling factor so we don't accidentally see scale as unchanged below
+                                               prevScale = scale = scale || ".5";
+
+                                               // Adjust and apply
+                                               start = start / scale;
+                                               jQuery.style( tween.elem, prop, start + unit );
+
+                                               // Update scale, tolerating zeroes from tween.cur()
+                                               scale = tween.cur() / target;
+
+                                       // Stop looping if we've hit the mark or scale is unchanged
+                                       } while ( scale !== 1 && scale !== prevScale );
+                               }
+
+                               tween.unit = unit;
+                               tween.start = start;
+                               // If a +=/-= token was provided, we're doing a relative animation
+                               tween.end = parts[1] ? start + ( parts[1] + 1 ) * end : end;
+                       }
+                       return tween;
+               }]
+       };
 
+// Animations created synchronously will run synchronously
+function createFxNow() {
+       setTimeout(function() {
+               fxNow = undefined;
+       }, 0 );
+       return ( fxNow = jQuery.now() );
+}
+
+function createTweens( animation, props ) {
+       jQuery.each( props, function( prop, value ) {
+               var collection = ( tweeners[ prop ] || [] ).concat( tweeners[ "*" ] ),
+                       index = 0,
+                       length = collection.length;
+               for ( ; index < length; index++ ) {
+                       if ( collection[ index ].call( animation, prop, value ) ) {
+
+                               // we're done with this property
+                               return;
+                       }
+               }
+       });
+}
+
+function Animation( elem, properties, options ) {
+       var result,
+               index = 0,
+               tweenerIndex = 0,
+               length = animationPrefilters.length,
+               deferred = jQuery.Deferred().always( function() {
+                       // don't match elem in the :animated selector
+                       delete tick.elem;
+               }),
+               tick = function() {
+                       var currentTime = fxNow || createFxNow(),
+                               remaining = Math.max( 0, animation.startTime + animation.duration - currentTime ),
+                               percent = 1 - ( remaining / animation.duration || 0 ),
+                               index = 0,
+                               length = animation.tweens.length;
+
+                       for ( ; index < length ; index++ ) {
+                               animation.tweens[ index ].run( percent );
+                       }
+
+                       deferred.notifyWith( elem, [ animation, percent, remaining ]);
+
+                       if ( percent < 1 && length ) {
+                               return remaining;
+                       } else {
+                               deferred.resolveWith( elem, [ animation ] );
                                return false;
+                       }
+               },
+               animation = deferred.promise({
+                       elem: elem,
+                       props: jQuery.extend( {}, properties ),
+                       opts: jQuery.extend( true, { specialEasing: {} }, options ),
+                       originalProperties: properties,
+                       originalOptions: options,
+                       startTime: fxNow || createFxNow(),
+                       duration: options.duration,
+                       tweens: [],
+                       createTween: function( prop, end, easing ) {
+                               var tween = jQuery.Tween( elem, animation.opts, prop, end,
+                                               animation.opts.specialEasing[ prop ] || animation.opts.easing );
+                               animation.tweens.push( tween );
+                               return tween;
+                       },
+                       stop: function( gotoEnd ) {
+                               var index = 0,
+                                       // if we are going to the end, we want to run all the tweens
+                                       // otherwise we skip this part
+                                       length = gotoEnd ? animation.tweens.length : 0;
 
-                       } else {
-                               // classical easing cannot be used with an Infinity duration
-                               if ( options.duration == Infinity ) {
-                                       this.now = t;
-                               } else {
-                                       n = t - this.startTime;
-                                       this.state = n / options.duration;
+                               for ( ; index < length ; index++ ) {
+                                       animation.tweens[ index ].run( 1 );
+                               }
 
-                                       // Perform the easing function, defaults to swing
-                                       this.pos = jQuery.easing[ options.animatedProperties[this.prop] ]( this.state, n, 0, 1, options.duration );
-                                       this.now = this.start + ( (this.end - this.start) * this.pos );
+                               // resolve when we played the last frame
+                               // otherwise, reject
+                               if ( gotoEnd ) {
+                                       deferred.resolveWith( elem, [ animation, gotoEnd ] );
+                               } else {
+                                       deferred.rejectWith( elem, [ animation, gotoEnd ] );
                                }
-                               // Perform the next step of the animation
-                               this.update();
+                               return this;
                        }
+               }),
+               props = animation.props;
 
-                       return true;
-               }
-       };
-
-       jQuery.extend( jQuery.fx, {
-               tick: function() {
-                       var timer,
-                               timers = jQuery.timers,
-                               i = 0;
+       propFilter( props, animation.opts.specialEasing );
 
-                       for ( ; i < timers.length; i++ ) {
-                               timer = timers[ i ];
-                               // Checks the timer has not already been removed
-                               if ( !timer() && timers[ i ] === timer ) {
-                                       timers.splice( i--, 1 );
-                               }
-                       }
+       for ( ; index < length ; index++ ) {
+               result = animationPrefilters[ index ].call( animation, elem, props, animation.opts );
+               if ( result ) {
+                       return result;
+               }
+       }
 
-                       if ( !timers.length ) {
-                               jQuery.fx.stop();
-                       }
-               },
+       createTweens( animation, props );
 
-               interval: 13,
+       if ( jQuery.isFunction( animation.opts.start ) ) {
+               animation.opts.start.call( elem, animation );
+       }
 
-               stop: function() {
-                       clearInterval( timerId );
-                       timerId = null;
-               },
+       jQuery.fx.timer(
+               jQuery.extend( tick, {
+                       anim: animation,
+                       queue: animation.opts.queue,
+                       elem: elem
+               })
+       );
+
+       // attach callbacks from options
+       return animation.progress( animation.opts.progress )
+               .done( animation.opts.done, animation.opts.complete )
+               .fail( animation.opts.fail )
+               .always( animation.opts.always );
+}
+
+function propFilter( props, specialEasing ) {
+       var index, name, easing, value, hooks;
+
+       // camelCase, specialEasing and expand cssHook pass
+       for ( index in props ) {
+               name = jQuery.camelCase( index );
+               easing = specialEasing[ name ];
+               value = props[ index ];
+               if ( jQuery.isArray( value ) ) {
+                       easing = value[ 1 ];
+                       value = props[ index ] = value[ 0 ];
+               }
 
-               speeds: {
-                       slow: 600,
-                       fast: 200,
-                       // Default speed
-                       _default: 400
-               },
+               if ( index !== name ) {
+                       props[ name ] = value;
+                       delete props[ index ];
+               }
 
-               step: {
-                       opacity: function( fx ) {
-                               jQuery.style( fx.elem, "opacity", fx.now );
-                       },
+               hooks = jQuery.cssHooks[ name ];
+               if ( hooks && "expand" in hooks ) {
+                       value = hooks.expand( value );
+                       delete props[ name ];
 
-                       _default: function( fx ) {
-                               if ( fx.elem.style && fx.elem.style[ fx.prop ] != null ) {
-                                       fx.elem.style[ fx.prop ] = fx.now + fx.unit;
-                               } else {
-                                       fx.elem[ fx.prop ] = fx.now;
+                       // not quite $.extend, this wont overwrite keys already present.
+                       // also - reusing 'index' from above because we have the correct "name"
+                       for ( index in value ) {
+                               if ( !( index in props ) ) {
+                                       props[ index ] = value[ index ];
+                                       specialEasing[ index ] = easing;
                                }
                        }
+               } else {
+                       specialEasing[ name ] = easing;
                }
-       });
+       }
+}
+
+jQuery.Animation = jQuery.extend( Animation, {
+
+       tweener: function( props, callback ) {
+               if ( jQuery.isFunction( props ) ) {
+                       callback = props;
+                       props = [ "*" ];
+               } else {
+                       props = props.split(" ");
+               }
+
+               var prop,
+                       index = 0,
+                       length = props.length;
+
+               for ( ; index < length ; index++ ) {
+                       prop = props[ index ];
+                       tweeners[ prop ] = tweeners[ prop ] || [];
+                       tweeners[ prop ].unshift( callback );
+               }
+       },
 
-// Ensure props that can't be negative don't go there on undershoot easing
-       jQuery.each( fxAttrs.concat.apply( [], fxAttrs ), function( i, prop ) {
-               // exclude marginTop, marginLeft, marginBottom and marginRight from this list
-               if ( prop.indexOf( "margin" ) ) {
-                       jQuery.fx.step[ prop ] = function( fx ) {
-                               jQuery.style( fx.elem, prop, Math.max(0, fx.now) + fx.unit );
+       prefilter: function( callback, prepend ) {
+               if ( prepend ) {
+                       animationPrefilters.unshift( callback );
+               } else {
+                       animationPrefilters.push( callback );
+               }
+       }
+});
+
+function defaultPrefilter( elem, props, opts ) {
+       var index, prop, value, length, dataShow, tween, hooks, oldfire,
+               anim = this,
+               style = elem.style,
+               orig = {},
+               handled = [],
+               hidden = elem.nodeType && isHidden( elem );
+
+       // handle queue: false promises
+       if ( !opts.queue ) {
+               hooks = jQuery._queueHooks( elem, "fx" );
+               if ( hooks.unqueued == null ) {
+                       hooks.unqueued = 0;
+                       oldfire = hooks.empty.fire;
+                       hooks.empty.fire = function() {
+                               if ( !hooks.unqueued ) {
+                                       oldfire();
+                               }
                        };
                }
-       });
+               hooks.unqueued++;
 
-       if ( jQuery.expr && jQuery.expr.filters ) {
-               jQuery.expr.filters.animated = function( elem ) {
-                       return jQuery.grep(jQuery.timers, function( fn ) {
-                               return elem === fn.elem;
-                       }).length;
-               };
+               anim.always(function() {
+                       // doing this makes sure that the complete handler will be called
+                       // before this completes
+                       anim.always(function() {
+                               hooks.unqueued--;
+                               if ( !jQuery.queue( elem, "fx" ).length ) {
+                                       hooks.empty.fire();
+                               }
+                       });
+               });
        }
 
-// Try to restore the default display value of an element
-       function defaultDisplay( nodeName ) {
+       // height/width overflow pass
+       if ( elem.nodeType === 1 && ( "height" in props || "width" in props ) ) {
+               // Make sure that nothing sneaks out
+               // Record all 3 overflow attributes because IE does not
+               // change the overflow attribute when overflowX and
+               // overflowY are set to the same value
+               opts.overflow = [ style.overflow, style.overflowX, style.overflowY ];
 
-               if ( !elemdisplay[ nodeName ] ) {
+               // Set display property to inline-block for height/width
+               // animations on inline elements that are having width/height animated
+               if ( jQuery.css( elem, "display" ) === "inline" &&
+                               jQuery.css( elem, "float" ) === "none" ) {
 
-                       var body = document.body,
-                               elem = jQuery( "<" + nodeName + ">" ).appendTo( body ),
-                               display = elem.css( "display" );
-                       elem.remove();
+                       // inline-level elements accept inline-block;
+                       // block-level elements need to be inline with layout
+                       if ( !jQuery.support.inlineBlockNeedsLayout || css_defaultDisplay( elem.nodeName ) === "inline" ) {
+                               style.display = "inline-block";
 
-                       // If the simple way fails,
-                       // get element's real default display by attaching it to a temp iframe
-                       if ( display === "none" || display === "" ) {
-                               // No iframe to use yet, so create it
-                               if ( !iframe ) {
-                                       iframe = document.createElement( "iframe" );
-                                       iframe.frameBorder = iframe.width = iframe.height = 0;
-                               }
+                       } else {
+                               style.zoom = 1;
+                       }
+               }
+       }
 
-                               body.appendChild( iframe );
+       if ( opts.overflow ) {
+               style.overflow = "hidden";
+               if ( !jQuery.support.shrinkWrapBlocks ) {
+                       anim.done(function() {
+                               style.overflow = opts.overflow[ 0 ];
+                               style.overflowX = opts.overflow[ 1 ];
+                               style.overflowY = opts.overflow[ 2 ];
+                       });
+               }
+       }
 
-                               // Create a cacheable copy of the iframe document on first call.
-                               // IE and Opera will allow us to reuse the iframeDoc without re-writing the fake HTML
-                               // document to it; WebKit & Firefox won't allow reusing the iframe document.
-                               if ( !iframeDoc || !iframe.createElement ) {
-                                       iframeDoc = ( iframe.contentWindow || iframe.contentDocument ).document;
-                                       iframeDoc.write( ( jQuery.support.boxModel ? "<!doctype html>" : "" ) + "<html><body>" );
-                                       iframeDoc.close();
-                               }
 
-                               elem = iframeDoc.createElement( nodeName );
+       // show/hide pass
+       for ( index in props ) {
+               value = props[ index ];
+               if ( rfxtypes.exec( value ) ) {
+                       delete props[ index ];
+                       if ( value === ( hidden ? "hide" : "show" ) ) {
+                               continue;
+                       }
+                       handled.push( index );
+               }
+       }
 
-                               iframeDoc.body.appendChild( elem );
+       length = handled.length;
+       if ( length ) {
+               dataShow = jQuery._data( elem, "fxshow" ) || jQuery._data( elem, "fxshow", {} );
+               if ( hidden ) {
+                       jQuery( elem ).show();
+               } else {
+                       anim.done(function() {
+                               jQuery( elem ).hide();
+                       });
+               }
+               anim.done(function() {
+                       var prop;
+                       jQuery.removeData( elem, "fxshow", true );
+                       for ( prop in orig ) {
+                               jQuery.style( elem, prop, orig[ prop ] );
+                       }
+               });
+               for ( index = 0 ; index < length ; index++ ) {
+                       prop = handled[ index ];
+                       tween = anim.createTween( prop, hidden ? dataShow[ prop ] : 0 );
+                       orig[ prop ] = dataShow[ prop ] || jQuery.style( elem, prop );
 
-                               display = jQuery.css( elem, "display" );
-                               body.removeChild( iframe );
+                       if ( !( prop in dataShow ) ) {
+                               dataShow[ prop ] = tween.start;
+                               if ( hidden ) {
+                                       tween.end = tween.start;
+                                       tween.start = prop === "width" || prop === "height" ? 1 : 0;
+                               }
                        }
+               }
+       }
+}
+
+function Tween( elem, options, prop, end, easing ) {
+       return new Tween.prototype.init( elem, options, prop, end, easing );
+}
+jQuery.Tween = Tween;
+
+Tween.prototype = {
+       constructor: Tween,
+       init: function( elem, options, prop, end, easing, unit ) {
+               this.elem = elem;
+               this.prop = prop;
+               this.easing = easing || "swing";
+               this.options = options;
+               this.start = this.now = this.cur();
+               this.end = end;
+               this.unit = unit || ( jQuery.cssNumber[ prop ] ? "" : "px" );
+       },
+       cur: function() {
+               var hooks = Tween.propHooks[ this.prop ];
+
+               return hooks && hooks.get ?
+                       hooks.get( this ) :
+                       Tween.propHooks._default.get( this );
+       },
+       run: function( percent ) {
+               var eased,
+                       hooks = Tween.propHooks[ this.prop ];
+
+               if ( this.options.duration ) {
+                       this.pos = eased = jQuery.easing[ this.easing ](
+                               percent, this.options.duration * percent, 0, 1, this.options.duration
+                       );
+               } else {
+                       this.pos = eased = percent;
+               }
+               this.now = ( this.end - this.start ) * eased + this.start;
 
-                       // Store the correct default display
-                       elemdisplay[ nodeName ] = display;
+               if ( this.options.step ) {
+                       this.options.step.call( this.elem, this.now, this );
                }
 
-               return elemdisplay[ nodeName ];
+               if ( hooks && hooks.set ) {
+                       hooks.set( this );
+               } else {
+                       Tween.propHooks._default.set( this );
+               }
+               return this;
        }
+};
 
+Tween.prototype.init.prototype = Tween.prototype;
 
+Tween.propHooks = {
+       _default: {
+               get: function( tween ) {
+                       var result;
 
+                       if ( tween.elem[ tween.prop ] != null &&
+                               (!tween.elem.style || tween.elem.style[ tween.prop ] == null) ) {
+                               return tween.elem[ tween.prop ];
+                       }
 
-       var getOffset,
-               rtable = /^t(?:able|d|h)$/i,
-               rroot = /^(?:body|html)$/i;
+                       // passing any value as a 4th parameter to .css will automatically
+                       // attempt a parseFloat and fallback to a string if the parse fails
+                       // so, simple values such as "10px" are parsed to Float.
+                       // complex values such as "rotate(1rad)" are returned as is.
+                       result = jQuery.css( tween.elem, tween.prop, false, "" );
+                       // Empty strings, null, undefined and "auto" are converted to 0.
+                       return !result || result === "auto" ? 0 : result;
+               },
+               set: function( tween ) {
+                       // use step hook for back compat - use cssHook if its there - use .style if its
+                       // available and use plain properties where available
+                       if ( jQuery.fx.step[ tween.prop ] ) {
+                               jQuery.fx.step[ tween.prop ]( tween );
+                       } else if ( tween.elem.style && ( tween.elem.style[ jQuery.cssProps[ tween.prop ] ] != null || jQuery.cssHooks[ tween.prop ] ) ) {
+                               jQuery.style( tween.elem, tween.prop, tween.now + tween.unit );
+                       } else {
+                               tween.elem[ tween.prop ] = tween.now;
+                       }
+               }
+       }
+};
 
-       if ( "getBoundingClientRect" in document.documentElement ) {
-               getOffset = function( elem, doc, docElem, box ) {
-                       try {
-                               box = elem.getBoundingClientRect();
-                       } catch(e) {}
+// Remove in 2.0 - this supports IE8's panic based approach
+// to setting things on disconnected nodes
 
-                       // Make sure we're not dealing with a disconnected DOM node
-                       if ( !box || !jQuery.contains( docElem, elem ) ) {
-                               return box ? { top: box.top, left: box.left } : { top: 0, left: 0 };
-                       }
+Tween.propHooks.scrollTop = Tween.propHooks.scrollLeft = {
+       set: function( tween ) {
+               if ( tween.elem.nodeType && tween.elem.parentNode ) {
+                       tween.elem[ tween.prop ] = tween.now;
+               }
+       }
+};
+
+jQuery.each([ "toggle", "show", "hide" ], function( i, name ) {
+       var cssFn = jQuery.fn[ name ];
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return speed == null || typeof speed === "boolean" ||
+                       // special check for .toggle( handler, handler, ... )
+                       ( !i && jQuery.isFunction( speed ) && jQuery.isFunction( easing ) ) ?
+                       cssFn.apply( this, arguments ) :
+                       this.animate( genFx( name, true ), speed, easing, callback );
+       };
+});
 
-                       var body = doc.body,
-                               win = getWindow( doc ),
-                               clientTop  = docElem.clientTop  || body.clientTop  || 0,
-                               clientLeft = docElem.clientLeft || body.clientLeft || 0,
-                               scrollTop  = win.pageYOffset || jQuery.support.boxModel && docElem.scrollTop  || body.scrollTop,
-                               scrollLeft = win.pageXOffset || jQuery.support.boxModel && docElem.scrollLeft || body.scrollLeft,
-                               top  = box.top  + scrollTop  - clientTop,
-                               left = box.left + scrollLeft - clientLeft;
+jQuery.fn.extend({
+       fadeTo: function( speed, to, easing, callback ) {
 
-                       return { top: top, left: left };
-               };
+               // show any hidden elements after setting opacity to 0
+               return this.filter( isHidden ).css( "opacity", 0 ).show()
 
-       } else {
-               getOffset = function( elem, doc, docElem ) {
-                       var computedStyle,
-                               offsetParent = elem.offsetParent,
-                               prevOffsetParent = elem,
-                               body = doc.body,
-                               defaultView = doc.defaultView,
-                               prevComputedStyle = defaultView ? defaultView.getComputedStyle( elem, null ) : elem.currentStyle,
-                               top = elem.offsetTop,
-                               left = elem.offsetLeft;
-
-                       while ( (elem = elem.parentNode) && elem !== body && elem !== docElem ) {
-                               if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                                       break;
+                       // animate to the value specified
+                       .end().animate({ opacity: to }, speed, easing, callback );
+       },
+       animate: function( prop, speed, easing, callback ) {
+               var empty = jQuery.isEmptyObject( prop ),
+                       optall = jQuery.speed( speed, easing, callback ),
+                       doAnimation = function() {
+                               // Operate on a copy of prop so per-property easing won't be lost
+                               var anim = Animation( this, jQuery.extend( {}, prop ), optall );
+
+                               // Empty animations resolve immediately
+                               if ( empty ) {
+                                       anim.stop( true );
                                }
+                       };
 
-                               computedStyle = defaultView ? defaultView.getComputedStyle(elem, null) : elem.currentStyle;
-                               top  -= elem.scrollTop;
-                               left -= elem.scrollLeft;
+               return empty || optall.queue === false ?
+                       this.each( doAnimation ) :
+                       this.queue( optall.queue, doAnimation );
+       },
+       stop: function( type, clearQueue, gotoEnd ) {
+               var stopQueue = function( hooks ) {
+                       var stop = hooks.stop;
+                       delete hooks.stop;
+                       stop( gotoEnd );
+               };
 
-                               if ( elem === offsetParent ) {
-                                       top  += elem.offsetTop;
-                                       left += elem.offsetLeft;
+               if ( typeof type !== "string" ) {
+                       gotoEnd = clearQueue;
+                       clearQueue = type;
+                       type = undefined;
+               }
+               if ( clearQueue && type !== false ) {
+                       this.queue( type || "fx", [] );
+               }
 
-                                       if ( jQuery.support.doesNotAddBorder && !(jQuery.support.doesAddBorderForTableAndCells && rtable.test(elem.nodeName)) ) {
-                                               top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                                               left += parseFloat( computedStyle.borderLeftWidth ) || 0;
-                                       }
+               return this.each(function() {
+                       var dequeue = true,
+                               index = type != null && type + "queueHooks",
+                               timers = jQuery.timers,
+                               data = jQuery._data( this );
 
-                                       prevOffsetParent = offsetParent;
-                                       offsetParent = elem.offsetParent;
+                       if ( index ) {
+                               if ( data[ index ] && data[ index ].stop ) {
+                                       stopQueue( data[ index ] );
                                }
-
-                               if ( jQuery.support.subtractsBorderForOverflowNotVisible && computedStyle.overflow !== "visible" ) {
-                                       top  += parseFloat( computedStyle.borderTopWidth  ) || 0;
-                                       left += parseFloat( computedStyle.borderLeftWidth ) || 0;
+                       } else {
+                               for ( index in data ) {
+                                       if ( data[ index ] && data[ index ].stop && rrun.test( index ) ) {
+                                               stopQueue( data[ index ] );
+                                       }
                                }
-
-                               prevComputedStyle = computedStyle;
                        }
 
-                       if ( prevComputedStyle.position === "relative" || prevComputedStyle.position === "static" ) {
-                               top  += body.offsetTop;
-                               left += body.offsetLeft;
+                       for ( index = timers.length; index--; ) {
+                               if ( timers[ index ].elem === this && (type == null || timers[ index ].queue === type) ) {
+                                       timers[ index ].anim.stop( gotoEnd );
+                                       dequeue = false;
+                                       timers.splice( index, 1 );
+                               }
                        }
 
-                       if ( jQuery.support.fixedPosition && prevComputedStyle.position === "fixed" ) {
-                               top  += Math.max( docElem.scrollTop, body.scrollTop );
-                               left += Math.max( docElem.scrollLeft, body.scrollLeft );
+                       // start the next in the queue if the last step wasn't forced
+                       // timers currently will call their complete callbacks, which will dequeue
+                       // but only if they were gotoEnd
+                       if ( dequeue || !gotoEnd ) {
+                               jQuery.dequeue( this, type );
                        }
+               });
+       }
+});
 
-                       return { top: top, left: left };
-               };
+// Generate parameters to create a standard animation
+function genFx( type, includeWidth ) {
+       var which,
+               attrs = { height: type },
+               i = 0;
+
+       // if we include width, step value is 1 to do all cssExpand values,
+       // if we don't include width, step value is 2 to skip over Left and Right
+       includeWidth = includeWidth? 1 : 0;
+       for( ; i < 4 ; i += 2 - includeWidth ) {
+               which = cssExpand[ i ];
+               attrs[ "margin" + which ] = attrs[ "padding" + which ] = type;
        }
 
-       jQuery.fn.offset = function( options ) {
-               if ( arguments.length ) {
-                       return options === undefined ?
-                               this :
-                               this.each(function( i ) {
-                                       jQuery.offset.setOffset( this, options, i );
-                               });
-               }
+       if ( includeWidth ) {
+               attrs.opacity = attrs.width = type;
+       }
 
-               var elem = this[0],
-                       doc = elem && elem.ownerDocument;
+       return attrs;
+}
 
-               if ( !doc ) {
-                       return null;
-               }
+// Generate shortcuts for custom animations
+jQuery.each({
+       slideDown: genFx("show"),
+       slideUp: genFx("hide"),
+       slideToggle: genFx("toggle"),
+       fadeIn: { opacity: "show" },
+       fadeOut: { opacity: "hide" },
+       fadeToggle: { opacity: "toggle" }
+}, function( name, props ) {
+       jQuery.fn[ name ] = function( speed, easing, callback ) {
+               return this.animate( props, speed, easing, callback );
+       };
+});
+
+jQuery.speed = function( speed, easing, fn ) {
+       var opt = speed && typeof speed === "object" ? jQuery.extend( {}, speed ) : {
+               complete: fn || !fn && easing ||
+                       jQuery.isFunction( speed ) && speed,
+               duration: speed,
+               easing: fn && easing || easing && !jQuery.isFunction( easing ) && easing
+       };
+
+       opt.duration = jQuery.fx.off ? 0 : typeof opt.duration === "number" ? opt.duration :
+               opt.duration in jQuery.fx.speeds ? jQuery.fx.speeds[ opt.duration ] : jQuery.fx.speeds._default;
 
-               if ( elem === doc.body ) {
-                       return jQuery.offset.bodyOffset( elem );
+       // normalize opt.queue - true/undefined/null -> "fx"
+       if ( opt.queue == null || opt.queue === true ) {
+               opt.queue = "fx";
+       }
+
+       // Queueing
+       opt.old = opt.complete;
+
+       opt.complete = function() {
+               if ( jQuery.isFunction( opt.old ) ) {
+                       opt.old.call( this );
                }
 
-               return getOffset( elem, doc, doc.documentElement );
+               if ( opt.queue ) {
+                       jQuery.dequeue( this, opt.queue );
+               }
        };
 
-       jQuery.offset = {
+       return opt;
+};
 
-               bodyOffset: function( body ) {
-                       var top = body.offsetTop,
-                               left = body.offsetLeft;
+jQuery.easing = {
+       linear: function( p ) {
+               return p;
+       },
+       swing: function( p ) {
+               return 0.5 - Math.cos( p*Math.PI ) / 2;
+       }
+};
+
+jQuery.timers = [];
+jQuery.fx = Tween.prototype.init;
+jQuery.fx.tick = function() {
+       var timer,
+               timers = jQuery.timers,
+               i = 0;
+
+       for ( ; i < timers.length; i++ ) {
+               timer = timers[ i ];
+               // Checks the timer has not already been removed
+               if ( !timer() && timers[ i ] === timer ) {
+                       timers.splice( i--, 1 );
+               }
+       }
 
-                       if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
-                               top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
-                               left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
-                       }
+       if ( !timers.length ) {
+               jQuery.fx.stop();
+       }
+};
 
-                       return { top: top, left: left };
-               },
+jQuery.fx.timer = function( timer ) {
+       if ( timer() && jQuery.timers.push( timer ) && !timerId ) {
+               timerId = setInterval( jQuery.fx.tick, jQuery.fx.interval );
+       }
+};
+
+jQuery.fx.interval = 13;
+
+jQuery.fx.stop = function() {
+       clearInterval( timerId );
+       timerId = null;
+};
+
+jQuery.fx.speeds = {
+       slow: 600,
+       fast: 200,
+       // Default speed
+       _default: 400
+};
+
+// Back Compat <1.8 extension point
+jQuery.fx.step = {};
+
+if ( jQuery.expr && jQuery.expr.filters ) {
+       jQuery.expr.filters.animated = function( elem ) {
+               return jQuery.grep(jQuery.timers, function( fn ) {
+                       return elem === fn.elem;
+               }).length;
+       };
+}
+var rroot = /^(?:body|html)$/i;
+
+jQuery.fn.offset = function( options ) {
+       if ( arguments.length ) {
+               return options === undefined ?
+                       this :
+                       this.each(function( i ) {
+                               jQuery.offset.setOffset( this, options, i );
+                       });
+       }
 
-               setOffset: function( elem, options, i ) {
-                       var position = jQuery.css( elem, "position" );
+       var box, docElem, body, win, clientTop, clientLeft, scrollTop, scrollLeft, top, left,
+               elem = this[ 0 ],
+               doc = elem && elem.ownerDocument;
 
-                       // set position first, in-case top/left are set even on static elem
-                       if ( position === "static" ) {
-                               elem.style.position = "relative";
-                       }
+       if ( !doc ) {
+               return;
+       }
 
-                       var curElem = jQuery( elem ),
-                               curOffset = curElem.offset(),
-                               curCSSTop = jQuery.css( elem, "top" ),
-                               curCSSLeft = jQuery.css( elem, "left" ),
-                               calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
-                               props = {}, curPosition = {}, curTop, curLeft;
+       if ( (body = doc.body) === elem ) {
+               return jQuery.offset.bodyOffset( elem );
+       }
 
-                       // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
-                       if ( calculatePosition ) {
-                               curPosition = curElem.position();
-                               curTop = curPosition.top;
-                               curLeft = curPosition.left;
-                       } else {
-                               curTop = parseFloat( curCSSTop ) || 0;
-                               curLeft = parseFloat( curCSSLeft ) || 0;
-                       }
+       docElem = doc.documentElement;
 
-                       if ( jQuery.isFunction( options ) ) {
-                               options = options.call( elem, i, curOffset );
-                       }
+       // Make sure we're not dealing with a disconnected DOM node
+       if ( !jQuery.contains( docElem, elem ) ) {
+               return { top: 0, left: 0 };
+       }
 
-                       if ( options.top != null ) {
-                               props.top = ( options.top - curOffset.top ) + curTop;
-                       }
-                       if ( options.left != null ) {
-                               props.left = ( options.left - curOffset.left ) + curLeft;
-                       }
+       box = elem.getBoundingClientRect();
+       win = getWindow( doc );
+       clientTop  = docElem.clientTop  || body.clientTop  || 0;
+       clientLeft = docElem.clientLeft || body.clientLeft || 0;
+       scrollTop  = win.pageYOffset || docElem.scrollTop;
+       scrollLeft = win.pageXOffset || docElem.scrollLeft;
+       top  = box.top  + scrollTop  - clientTop;
+       left = box.left + scrollLeft - clientLeft;
 
-                       if ( "using" in options ) {
-                               options.using.call( elem, props );
-                       } else {
-                               curElem.css( props );
-                       }
+       return { top: top, left: left };
+};
+
+jQuery.offset = {
+
+       bodyOffset: function( body ) {
+               var top = body.offsetTop,
+                       left = body.offsetLeft;
+
+               if ( jQuery.support.doesNotIncludeMarginInBodyOffset ) {
+                       top  += parseFloat( jQuery.css(body, "marginTop") ) || 0;
+                       left += parseFloat( jQuery.css(body, "marginLeft") ) || 0;
                }
-       };
 
+               return { top: top, left: left };
+       },
 
-       jQuery.fn.extend({
+       setOffset: function( elem, options, i ) {
+               var position = jQuery.css( elem, "position" );
 
-               position: function() {
-                       if ( !this[0] ) {
-                               return null;
-                       }
+               // set position first, in-case top/left are set even on static elem
+               if ( position === "static" ) {
+                       elem.style.position = "relative";
+               }
 
-                       var elem = this[0],
+               var curElem = jQuery( elem ),
+                       curOffset = curElem.offset(),
+                       curCSSTop = jQuery.css( elem, "top" ),
+                       curCSSLeft = jQuery.css( elem, "left" ),
+                       calculatePosition = ( position === "absolute" || position === "fixed" ) && jQuery.inArray("auto", [curCSSTop, curCSSLeft]) > -1,
+                       props = {}, curPosition = {}, curTop, curLeft;
+
+               // need to be able to calculate position if either top or left is auto and position is either absolute or fixed
+               if ( calculatePosition ) {
+                       curPosition = curElem.position();
+                       curTop = curPosition.top;
+                       curLeft = curPosition.left;
+               } else {
+                       curTop = parseFloat( curCSSTop ) || 0;
+                       curLeft = parseFloat( curCSSLeft ) || 0;
+               }
 
-                       // Get *real* offsetParent
-                               offsetParent = this.offsetParent(),
+               if ( jQuery.isFunction( options ) ) {
+                       options = options.call( elem, i, curOffset );
+               }
 
-                       // Get correct offsets
-                               offset       = this.offset(),
-                               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
+               if ( options.top != null ) {
+                       props.top = ( options.top - curOffset.top ) + curTop;
+               }
+               if ( options.left != null ) {
+                       props.left = ( options.left - curOffset.left ) + curLeft;
+               }
 
-                       // Subtract element margins
-                       // note: when an element has margin: auto the offsetLeft and marginLeft
-                       // are the same in Safari causing offset.left to incorrectly be 0
-                       offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
-                       offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+               if ( "using" in options ) {
+                       options.using.call( elem, props );
+               } else {
+                       curElem.css( props );
+               }
+       }
+};
 
-                       // Add offsetParent borders
-                       parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
-                       parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
 
-                       // Subtract the two offsets
-                       return {
-                               top:  offset.top  - parentOffset.top,
-                               left: offset.left - parentOffset.left
-                       };
-               },
+jQuery.fn.extend({
 
-               offsetParent: function() {
-                       return this.map(function() {
-                               var offsetParent = this.offsetParent || document.body;
-                               while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
-                                       offsetParent = offsetParent.offsetParent;
-                               }
-                               return offsetParent;
-                       });
+       position: function() {
+               if ( !this[0] ) {
+                       return;
                }
-       });
 
+               var elem = this[0],
 
-// Create scrollLeft and scrollTop methods
-       jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
-               var top = /Y/.test( prop );
-
-               jQuery.fn[ method ] = function( val ) {
-                       return jQuery.access( this, function( elem, method, val ) {
-                               var win = getWindow( elem );
-
-                               if ( val === undefined ) {
-                                       return win ? (prop in win) ? win[ prop ] :
-                                               jQuery.support.boxModel && win.document.documentElement[ method ] ||
-                                                       win.document.body[ method ] :
-                                               elem[ method ];
-                               }
+               // Get *real* offsetParent
+               offsetParent = this.offsetParent(),
 
-                               if ( win ) {
-                                       win.scrollTo(
-                                               !top ? val : jQuery( win ).scrollLeft(),
-                                               top ? val : jQuery( win ).scrollTop()
-                                       );
+               // Get correct offsets
+               offset       = this.offset(),
+               parentOffset = rroot.test(offsetParent[0].nodeName) ? { top: 0, left: 0 } : offsetParent.offset();
 
-                               } else {
-                                       elem[ method ] = val;
-                               }
-                       }, method, val, arguments.length, null );
+               // Subtract element margins
+               // note: when an element has margin: auto the offsetLeft and marginLeft
+               // are the same in Safari causing offset.left to incorrectly be 0
+               offset.top  -= parseFloat( jQuery.css(elem, "marginTop") ) || 0;
+               offset.left -= parseFloat( jQuery.css(elem, "marginLeft") ) || 0;
+
+               // Add offsetParent borders
+               parentOffset.top  += parseFloat( jQuery.css(offsetParent[0], "borderTopWidth") ) || 0;
+               parentOffset.left += parseFloat( jQuery.css(offsetParent[0], "borderLeftWidth") ) || 0;
+
+               // Subtract the two offsets
+               return {
+                       top:  offset.top  - parentOffset.top,
+                       left: offset.left - parentOffset.left
                };
-       });
+       },
 
-       function getWindow( elem ) {
-               return jQuery.isWindow( elem ) ?
-                       elem :
-                       elem.nodeType === 9 ?
-                               elem.defaultView || elem.parentWindow :
-                               false;
+       offsetParent: function() {
+               return this.map(function() {
+                       var offsetParent = this.offsetParent || document.body;
+                       while ( offsetParent && (!rroot.test(offsetParent.nodeName) && jQuery.css(offsetParent, "position") === "static") ) {
+                               offsetParent = offsetParent.offsetParent;
+                       }
+                       return offsetParent || document.body;
+               });
        }
+});
 
 
+// Create scrollLeft and scrollTop methods
+jQuery.each( {scrollLeft: "pageXOffset", scrollTop: "pageYOffset"}, function( method, prop ) {
+       var top = /Y/.test( prop );
 
+       jQuery.fn[ method ] = function( val ) {
+               return jQuery.access( this, function( elem, method, val ) {
+                       var win = getWindow( elem );
 
-// Create width, height, innerHeight, innerWidth, outerHeight and outerWidth methods
-       jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
-               var clientProp = "client" + name,
-                       scrollProp = "scroll" + name,
-                       offsetProp = "offset" + name;
+                       if ( val === undefined ) {
+                               return win ? (prop in win) ? win[ prop ] :
+                                       win.document.documentElement[ method ] :
+                                       elem[ method ];
+                       }
 
-               // innerHeight and innerWidth
-               jQuery.fn[ "inner" + name ] = function() {
-                       var elem = this[0];
-                       return elem ?
-                               elem.style ?
-                                       parseFloat( jQuery.css( elem, type, "padding" ) ) :
-                                       this[ type ]() :
-                               null;
-               };
+                       if ( win ) {
+                               win.scrollTo(
+                                       !top ? val : jQuery( win ).scrollLeft(),
+                                        top ? val : jQuery( win ).scrollTop()
+                               );
 
-               // outerHeight and outerWidth
-               jQuery.fn[ "outer" + name ] = function( margin ) {
-                       var elem = this[0];
-                       return elem ?
-                               elem.style ?
-                                       parseFloat( jQuery.css( elem, type, margin ? "margin" : "border" ) ) :
-                                       this[ type ]() :
-                               null;
-               };
+                       } else {
+                               elem[ method ] = val;
+                       }
+               }, method, val, arguments.length, null );
+       };
+});
+
+function getWindow( elem ) {
+       return jQuery.isWindow( elem ) ?
+               elem :
+               elem.nodeType === 9 ?
+                       elem.defaultView || elem.parentWindow :
+                       false;
+}
+// Create innerHeight, innerWidth, height, width, outerHeight and outerWidth methods
+jQuery.each( { Height: "height", Width: "width" }, function( name, type ) {
+       jQuery.each( { padding: "inner" + name, content: type, "": "outer" + name }, function( defaultExtra, funcName ) {
+               // margin is only for outerHeight, outerWidth
+               jQuery.fn[ funcName ] = function( margin, value ) {
+                       var chainable = arguments.length && ( defaultExtra || typeof margin !== "boolean" ),
+                               extra = defaultExtra || ( margin === true || value === true ? "margin" : "border" );
 
-               jQuery.fn[ type ] = function( value ) {
                        return jQuery.access( this, function( elem, type, value ) {
-                               var doc, docElemProp, orig, ret;
+                               var doc;
 
                                if ( jQuery.isWindow( elem ) ) {
-                                       // 3rd condition allows Nokia support, as it supports the docElem prop but not CSS1Compat
-                                       doc = elem.document;
-                                       docElemProp = doc.documentElement[ clientProp ];
-                                       return jQuery.support.boxModel && docElemProp ||
-                                               doc.body && doc.body[ clientProp ] || docElemProp;
+                                       // As of 5/8/2012 this will yield incorrect results for Mobile Safari, but there
+                                       // isn't a whole lot we can do. See pull request at this URL for discussion:
+                                       // https://github.com/jquery/jquery/pull/764
+                                       return elem.document.documentElement[ "client" + name ];
                                }
 
                                // Get document width or height
                                if ( elem.nodeType === 9 ) {
-                                       // Either scroll[Width/Height] or offset[Width/Height], whichever is greater
                                        doc = elem.documentElement;
 
-                                       // when a window > document, IE6 reports a offset[Width/Height] > client[Width/Height]
-                                       // so we can't use max, as it'll choose the incorrect offset[Width/Height]
-                                       // instead we use the correct client[Width/Height]
-                                       // support:IE6
-                                       if ( doc[ clientProp ] >= doc[ scrollProp ] ) {
-                                               return doc[ clientProp ];
-                                       }
-
+                                       // Either scroll[Width/Height] or offset[Width/Height] or client[Width/Height], whichever is greatest
+                                       // unfortunately, this causes bug #3838 in IE6/8 only, but there is currently no good, small way to fix it.
                                        return Math.max(
-                                               elem.body[ scrollProp ], doc[ scrollProp ],
-                                               elem.body[ offsetProp ], doc[ offsetProp ]
+                                               elem.body[ "scroll" + name ], doc[ "scroll" + name ],
+                                               elem.body[ "offset" + name ], doc[ "offset" + name ],
+                                               doc[ "client" + name ]
                                        );
                                }
 
-                               // Get width or height on the element
-                               if ( value === undefined ) {
-                                       orig = jQuery.css( elem, type );
-                                       ret = parseFloat( orig );
-                                       return jQuery.isNumeric( ret ) ? ret : orig;
-                               }
+                               return value === undefined ?
+                                       // Get width or height on the element, requesting but not forcing parseFloat
+                                       jQuery.css( elem, type, value, extra ) :
 
-                               // Set the width or height on the element
-                               jQuery( elem ).css( type, value );
-                       }, type, value, arguments.length, null );
+                                       // Set width or height on the element
+                                       jQuery.style( elem, type, value, extra );
+                       }, type, chainable ? margin : undefined, chainable, null );
                };
        });
-
-
-
-
+});
 // Expose jQuery to the global object
-       window.jQuery = window.$ = jQuery;
+window.jQuery = window.$ = jQuery;
 
 // Expose jQuery as an AMD module, but only for AMD loaders that
 // understand the issues with loading multiple versions of jQuery
 // file names, and jQuery is normally delivered in a lowercase file name.
 // Do this after creating the global so that if an AMD module wants to call
 // noConflict to hide this version of jQuery, it will work.
-       if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
-               define( "jquery", [], function () { return jQuery; } );
-       }
-
-
+if ( typeof define === "function" && define.amd && define.amd.jQuery ) {
+       define( "jquery", [], function () { return jQuery; } );
+}
 
 })( window );
index 33f8752..0a4d364 100644 (file)
 $.fn.makeCollapsible = function () {
 
        return this.each(function () {
-               var lpx = 'jquery.makeCollapsible> ';
 
                // Define reused variables and functions
                var $toggle,
+                       lpx = 'jquery.makeCollapsible> ',
                        $that = $(this).addClass( 'mw-collapsible' ), // case: $( '#myAJAXelement' ).makeCollapsible()
                        that = this,
                        collapsetext = $(this).attr( 'data-collapsetext' ),
@@ -230,7 +230,7 @@ $.fn.makeCollapsible = function () {
                                .parent()
                                .prepend( '&nbsp;[' )
                                .append( ']&nbsp;' )
-                               .bind( 'click.mw-collapse', function (e) {
+                               .on( 'click.mw-collapse', function ( e ) {
                                        toggleLinkDefault( this, e );
                                } );
 
@@ -252,7 +252,7 @@ $.fn.makeCollapsible = function () {
 
                        // Double check that there is actually a customtoggle link
                        if ( $customTogglers.length ) {
-                               $customTogglers.bind( 'click.mw-collapse', function ( e ) {
+                               $customTogglers.on( 'click.mw-collapse', function ( e ) {
                                        toggleLinkCustom( $(this), e, $that );
                                } );
                        } else {
@@ -279,7 +279,7 @@ $.fn.makeCollapsible = function () {
                                if ( !$toggle.length ) {
                                        $firstRowCells.eq(-1).prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -300,7 +300,7 @@ $.fn.makeCollapsible = function () {
                                        }
                                        $that.prepend( $toggleLink.wrap( '<li class="mw-collapsible-toggle-li"></li>' ).parent() );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
@@ -319,7 +319,7 @@ $.fn.makeCollapsible = function () {
                                if ( !$toggle.length ) {
                                        $that.prepend( $toggleLink );
                                } else {
-                                       $toggleLink = $toggle.unbind( 'click.mw-collapse' ).bind( 'click.mw-collapse', function ( e ) {
+                                       $toggleLink = $toggle.off( 'click.mw-collapse' ).on( 'click.mw-collapse', function ( e ) {
                                                toggleLinkPremade( $toggle, e );
                                        } );
                                }
index aa356c4..7badb11 100644 (file)
@@ -40,7 +40,7 @@
                                // Hide on focus
                                // Also listen for other events in case $input was
                                // already focused when the events were bound
-                               .bind( 'focus drop keydown paste', function ( e ) {
+                               .on( 'focus drop keydown paste', function ( e ) {
                                        if ( $input.hasClass( 'placeholder' ) ) {
                                                if ( e.type === 'drop' && e.originalEvent.dataTransfer ) {
                                                        // Support for drag&drop. Instead of inserting the dropped
index 150a51b..4a77528 100644 (file)
@@ -1,12 +1,40 @@
 .mw-spinner {
+       background-color: transparent;
+       background-position: center center;
+       background-repeat: no-repeat;
+}
+
+.mw-spinner-small {
        /* @embed */
-       background: transparent url(images/spinner.gif);
+       background-image: url(images/spinner.gif);
        height: 20px;
        width: 20px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 20px;
+}
+
+.mw-spinner-large {
+       /* @embed */
+       background-image: url(images/spinner-large.gif);
+       height: 32px;
+       width: 32px;
+       /* Avoid issues with .mw-spinner-block when floated without width. */
+       min-width: 32px;
+}
+
+.mw-spinner-block {
+       display: block;
+       /* This overrides width from .mw-spinner-large / .mw-spinner-small,
+        * This is where the min-width kicks in.
+        */
+       width: 100%;
+}
+
+.mw-spinner-inline {
        display: inline-block;
        vertical-align: middle;
        
-       /* IE < 8 Hacks */
+       /* IE < 8 */
        zoom: 1;
        *display: inline;
-}
\ No newline at end of file
+}
index e8b683e..4a6ec3b 100644 (file)
@@ -5,40 +5,91 @@
  */
 ( function ( $ ) {
 
-       $.extend( {
+       // Default options for new spinners,
+       // stored outside the function to share between calls.
+       var defaults = {
+               id: undefined,
+               size: 'small',
+               type: 'inline'
+       };
+
+       $.extend({
                /**
                 * Creates a spinner element.
                 *
-                * @param id {String} id of the spinner
-                * @return {jQuery} spinner
+                * The argument is an object with options used to construct the spinner. These can be:
+                *
+                * It is a good practice to keep a reference to the created spinner to be able to remove it later.
+                * Alternatively one can use the id option and removeSpinner() (but make sure to choose an id
+                * that's unlikely to cause conflicts, e.g. with extensions, gadgets or user scripts).
+                *
+                * CSS classes used:
+                *   .mw-spinner for every spinner
+                *   .mw-spinner-small / .mw-spinner-large for size
+                *   .mw-spinner-block / .mw-spinner-inline for display types
+                *
+                * @example
+                *   // Create a large spinner reserving all available horizontal space.
+                *   var $spinner = $.createSpinner({ size: 'large', type: 'block' });
+                *   // Insert above page content.
+                *   $( '#mw-content-text' ).prepend( $spinner );
+                * @example
+                *   // Place a small inline spinner next to the "Save" button
+                *   var $spinner = $.createSpinner({ size: 'small', type: 'inline' });
+                *   // Alternatively, just `$.createSpinner();` as these are the default options.
+                *   $( '#wpSave' ).after( $spinner );
+                * @example
+                *   // The following two are equivalent:
+                *   $.createSpinner( 'magic' );
+                *   $.createSpinner({ id: 'magic' });
+                *
+                * @param {Object|String} opts [optional] ID string or options:
+                *  - id: If given, spinner will be given an id of "mw-spinner-<id>"
+                *  - size: 'small' (default) or 'large' for a 20-pixel or 32-pixel spinner
+                *  - type: 'inline' (default) or 'block'. Inline creates an inline-block with width and
+                *    height equal to spinner size. Block is a block-level element with width 100%, height
+                *    equal to spinner size.
+                * @return {jQuery}
                 */
-               createSpinner: function ( id ) {
-                       return $( '<div>' ).attr( {
-                               id: 'mw-spinner-' + id,
-                               'class': 'mw-spinner',
-                               title: '...'
-                       } );
+               createSpinner: function ( opts ) {
+                       if ( opts !== undefined && $.type( opts ) !== 'object' ) {
+                               opts = {
+                                       id: opts
+                               };
+                       }
+
+                       opts = $.extend( {}, defaults, opts );
+
+                       var $spinner = $( '<div>', { 'class': 'mw-spinner', 'title': '...' } );
+                       if ( opts.id !== undefined ) {
+                               $spinner.attr( 'id', 'mw-spinner-' + opts.id );
+                       }
+
+                       $spinner.addClass( opts.size === 'large' ? 'mw-spinner-large' : 'mw-spinner-small' );
+                       $spinner.addClass( opts.type === 'block' ? 'mw-spinner-block' : 'mw-spinner-inline' );
+
+                       return $spinner;
                },
 
                /**
                 * Removes a spinner element.
                 *
-                * @param id {String}
-                * @return {jQuery} spinner
+                * @param {String} id [optional] Id of the spinner, as passed to createSpinner.
+                * @return {jQuery} The (now detached) spinner.
                 */
                removeSpinner: function ( id ) {
                        return $( '#mw-spinner-' + id ).remove();
                }
-       } );
+       });
 
        /**
-        * Injects a spinner after the elements in the jQuery collection.
+        * Injects a spinner after the elements in the jQuery collection
+        * (as siblings, not children). Collection contents remain unchanged.
         *
-        * @param id String id of the spinner
+        * @param {Object} opts See createSpinner() for description.
         * @return {jQuery}
         */
-       $.fn.injectSpinner = function ( id ) {
-               return this.after( $.createSpinner( id ) );
+       $.fn.injectSpinner = function ( opts ) {
+               return this.after( $.createSpinner( opts ) );
        };
-
 }( jQuery ) );
index caf9a9f..d02d432 100644 (file)
@@ -1,24 +1,30 @@
 /*
- * JavaScript to enable right click edit functionality
+ * JavaScript to enable right click edit functionality.
+ * When the user right-clicks in a heading, it will open the
+ * edit screen.
  */
-jQuery( function( $ ) {
+jQuery( function ( $ ) {
        // Select all h1-h6 elements that contain editsection links
-       $( 'h1:has(.editsection a), ' +
-               'h2:has(.editsection a), ' +
-               'h3:has(.editsection a), ' +
-               'h4:has(.editsection a), ' +
-               'h5:has(.editsection a), ' +
-               'h6:has(.editsection a)'
-       ).live( 'contextmenu', function( e ) {
-               // Get href of the [edit] link
-               var href = $(this).find( '.editsection a' ).attr( 'href' );
-               // Check if target is the anchor link itself. If so, don't suppress the context menu; this
-               // way the reader can still do things like copy URL, open in new tab etc.
-               var $target = $( e.target );
-               if ( !$target.is( 'a' ) && !$target.parent().is( '.editsection' ) ){
+       // Don't use the ":has:(.editsection a)" selector because it performs very bad.
+       // http://jsperf.com/jq-1-7-2-vs-jq-1-8-1-performance-of-mw-has/2
+       $( document ).on( 'contextmenu', 'h1, h2, h3, h4, h5, h6', function ( e ) {
+               var $edit, href;
+
+               $edit = $( this ).find( '.editsection a' );
+               if ( !$edit.length ) {
+                       return;
+               }
+
+               // Get href of the editsection link
+               href = $edit.prop( 'href' );
+
+               // Headings can contain rich text.
+               // Make sure to not block contextmenu events on (other) anchor tags
+               // inside the heading (e.g. to do things like copy URL, open in new tab, ..).
+               // e.target can be the heading, but it can also be anything inside the heading.
+               if ( href && e.target.nodeName.toLowerCase() !== 'a' ) {
                        window.location = href;
                        e.preventDefault();
-                       return false;
                }
        } );
 } );
index df62105..a4753b9 100644 (file)
@@ -31,8 +31,8 @@ $.fn.goOut = function ( instantToggle ) {
 
 /**
  * Bind a function to the jQuery object via live(), and also immediately trigger
- * the function on the objects with an 'instant' paramter set to true
- * @param callback function taking one paramter, which is Bool true when the event
+ * the function on the objects with an 'instant' parameter set to true
+ * @param callback function taking one parameter, which is Bool true when the event
  *     is called immediately, and the EventArgs object when triggered from an event
  */
 $.fn.liveAndTestAtStart = function ( callback ){
index cf602ea..48dd943 100644 (file)
@@ -319,7 +319,7 @@ td.diff-context {
  */
 table.wikitable,
 table.mw_metadata {
-       margin: 1em 1em 1em 0;
+       margin: 1em 0;
        border: 1px #aaa solid;
        background: white;
        border-collapse: collapse;
index 23f7302..b1e28ab 100644 (file)
@@ -1,6 +1,17 @@
-(function( $ ) {
-       $( document ).ready( function() {
+( function ( $ ) {
+       $( document ).ready( function () {
+               var $label, labelText;
 
+               function syncText() {
+                       var value = $(this).val()
+                               .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
+                               .replace( /&/, '&amp;' )
+                               .replace( /__+/g, '_' )
+                               .replace( /^_+/, '' )
+                               .replace( /_+$/, '' );
+                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
+                       $label.text( labelText.replace( '$1', value ) );
+               }
 
                // Set up the help system
                $( '.mw-help-field-data' )
@@ -8,7 +19,7 @@
                        .closest( '.mw-help-field-container' )
                                .find( '.mw-help-field-hint' )
                                        .show()
-                                       .click( function() {
+                                       .click( function () {
                                                $(this)
                                                        .closest( '.mw-help-field-container' )
                                                                .find( '.mw-help-field-data' )
                
                // Show/hide code for DB-specific options
                // FIXME: Do we want slow, fast, or even non-animated (instantaneous) showing/hiding here?
-               $( '.dbRadio' ).each( function() { $( '#' + $(this).attr( 'rel' ) ).hide(); } );
-               $( '#' + $( '.dbRadio:checked' ).attr( 'rel' ) ).show();
-               $( '.dbRadio' ).click( function() {
-                       var $checked = $( '.dbRadio:checked' );
-                       var $wrapper = $( '#' + $checked.attr( 'rel' ) );
-                       if ( !$wrapper.is( ':visible' ) ) {
+               $( '.dbRadio' ).each( function () {
+                       $( document.getElementById( $(this).attr( 'rel' ) ) ).hide();
+               } );
+               $( document.getElementById( $( '.dbRadio:checked' ).attr( 'rel' ) ) ).show();
+               $( '.dbRadio' ).click( function () {
+                       var $checked = $( '.dbRadio:checked' ),
+                               $wrapper = $( document.getElementById( $checked.attr( 'rel' ) ) );
+                       if ( $wrapper.is( ':hidden' ) ) {
                                $( '.dbWrapper' ).hide( 'slow' );
                                $wrapper.show( 'slow' );
                        }
                } );
                
                // Scroll to the bottom of upgrade log
-               $( '#config-live-log' ).find( '> textarea' ).each( function() { this.scrollTop = this.scrollHeight; } );
+               $( '#config-live-log' ).children( 'textarea' ).each( function () {
+                       this.scrollTop = this.scrollHeight;
+               } );
                
                // Show/hide Creative Commons thingy
-               $( '.licenseRadio' ).click( function() {
+               $( '.licenseRadio' ).click( function () {
                        var $wrapper = $( '#config-cc-wrapper' );
                        if ( $( '#config__LicenseCode_cc-choose' ).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
@@ -42,7 +57,7 @@
                } );
                
                // Show/hide random stuff (email, upload)
-               $( '.showHideRadio' ).click( function() {
+               $( '.showHideRadio' ).click( function () {
                        var $wrapper = $( '#' + $(this).attr( 'rel' ) );
                        if ( $(this).is( ':checked' ) ) {
                                $wrapper.show( 'slow' );
@@ -50,7 +65,7 @@
                                $wrapper.hide( 'slow' );
                        }
                } );
-               $( '.hideShowRadio' ).click( function() {
+               $( '.hideShowRadio' ).click( function () {
                        var $wrapper = $( '#' + $(this).attr( 'rel' ) );
                        if ( $(this).is( ':checked' ) ) {
                                $wrapper.hide( 'slow' );
                $( '.enabledByOther' ).closest( '.config-block' ).hide();
 
                // Enable/disable "other" textboxes
-               $( '.enableForOther' ).click( function() {
-                       var $textbox = $( '#' + $(this).attr( 'rel' ) );
-                       if ( $(this).val() == 'other' ) { // FIXME: Ugh, this is ugly
+               $( '.enableForOther' ).click( function () {
+                       var $textbox = $( document.getElementById( $(this).attr( 'rel' ) ) );
+                       // FIXME: Ugh, this is ugly
+                       if ( $(this).val() === 'other' ) {
                                $textbox.removeProp( 'readonly' ).closest( '.config-block' ).slideDown( 'fast' );
                        } else {
                                $textbox.prop( 'readonly', true ).closest( '.config-block' ).slideUp( 'fast' );
                $label = $( 'label[for=config__NamespaceType_site-name]' );
                labelText = $label.text();
                $label.text( labelText.replace( '$1', '' ) );
-               $( '#config_wgSitename' ).bind( 'keyup change', syncText ).each( syncText );
-               function syncText() {
-                       var value = $(this).val()
-                               .replace( /[\[\]\{\}|#<>%+? ]/g, '_' )
-                               .replace( /&/, '&amp;' )
-                               .replace( /__+/g, '_' )
-                               .replace( /^_+/, '' )
-                               .replace( /_+$/, '' );
-                       value = value.substr( 0, 1 ).toUpperCase() + value.substr( 1 );
-                       $label.text( labelText.replace( '$1', value ) );
-               }
+               $( '#config_wgSitename' ).on( 'keyup change', syncText ).each( syncText );
 
                // Show/Hide memcached servers when needed
-               $("input[name$='config_wgMainCacheType']").change( function() {
+               $( 'input[name$="config_wgMainCacheType"]' ).change( function () {
                        var $memc = $( "#config-memcachewrapper" );
-                       if( $( "input[name$='config_wgMainCacheType']:checked" ).val() == 'memcached' ) {
+                       if( $( 'input[name$="config_wgMainCacheType"]:checked' ).val() === 'memcached' ) {
                                $memc.show( 'slow' );
                        } else {
                                $memc.hide( 'slow' );
                        }
                } );
        } );
-})(jQuery);
+}( jQuery ) );
index 4cc0ad3..8f771e9 100644 (file)
@@ -250,7 +250,7 @@ tr.mw-htmlform-vertical-label td.mw-label {
 
 input#wpSummary {
        width: 80%;
-       margin: 1em 0;
+       margin-bottom: 1em;
 }
 
 /**
@@ -473,7 +473,7 @@ a.feedlink {
  * keep in sync with commonPrint.css
  */
 table.wikitable {
-       margin: 1em 1em 1em 0;
+       margin: 1em 0;
        background-color: #f9f9f9;
        border: 1px #aaa solid;
        border-collapse: collapse;
index 92c36d6..840da96 100644 (file)
@@ -8,13 +8,13 @@
  * which can be used with the JasmineBDD framework. This specification can then be used by simply including it into
  * the SpecRunner.html file.
  *
- * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the 
+ * This is similar to Michael Dale (mdale@mediawiki.org)'s parser tests, except that it doesn't look up the
  * API results while doing the test, so the Jasmine run is much faster(at the cost of being out of date in rare
  * circumstances. But mostly the parsing that we are doing in Javascript doesn't change much.)
  *
- */ 
+ */
 
-$maintenanceDir = dirname( dirname( dirname( dirname( __DIR__ ) ) ) ) . '/maintenance';
+$maintenanceDir = dirname( dirname( dirname( __DIR__ ) ) ) . '/maintenance';
 
 require( "$maintenanceDir/Maintenance.php" );
 
index 6d82d0c..8a7face 100644 (file)
@@ -5,6 +5,9 @@
  *
  * @group Database
  * ^--- important, causes temporary tables to be used instead of the real database
+ *
+ * @group medium
+ * ^--- important, causes tests not to fail with timeout
  */
 class RevisionStorageTest extends MediaWikiTestCase {
 
@@ -306,4 +309,100 @@ class RevisionStorageTest extends MediaWikiTestCase {
                $this->assertEquals( $orig->getTextId(), $rev->getTextId(), 'new null revision shold have the same text id as the original revision' );
                $this->assertEquals( 'some testing text', $rev->getText() );
        }
+
+       public function dataUserWasLastToEdit() {
+               return array(
+                       array( #0
+                               3, true, # actually the last edit
+                       ),
+                       array( #1
+                               2, true, # not the current edit, but still by this user
+                       ),
+                       array( #2
+                               1, false, # edit by another user
+                       ),
+                       array( #3
+                               0, false, # first edit, by this user, but another user edited in the mean time
+                       ),
+               );
+       }
+
+       /**
+        * @dataProvider dataUserWasLastToEdit
+        */
+       public function testUserWasLastToEdit( $sinceIdx, $expectedLast ) {
+               $userA = \User::newFromName( "RevisionStorageTest_userA" );
+               $userB = \User::newFromName( "RevisionStorageTest_userB" );
+
+               if ( $userA->getId() === 0 ) {
+                       $userA = \User::createNew( $userA->getName() );
+               }
+
+               if ( $userB->getId() === 0 ) {
+                       $userB = \User::createNew( $userB->getName() );
+               }
+
+               $dbw = wfGetDB( DB_MASTER );
+               $revisions = array();
+
+               // create revisions -----------------------------
+               $page = WikiPage::factory( Title::newFromText( 'RevisionStorageTest_testUserWasLastToEdit' ) );
+
+               # zero
+               $revisions[0] = new Revision( array(
+                       'page' => $page->getId(),
+                       'timestamp' => '20120101000000',
+                       'user' => $userA->getId(),
+                       'text' => 'zero',
+                       'summary' => 'edit zero'
+               ) );
+               $revisions[0]->insertOn( $dbw );
+
+               # one
+               $revisions[1] = new Revision( array(
+                       'page' => $page->getId(),
+                       'timestamp' => '20120101000100',
+                       'user' => $userA->getId(),
+                       'text' => 'one',
+                       'summary' => 'edit one'
+               ) );
+               $revisions[1]->insertOn( $dbw );
+
+               # two
+               $revisions[2] = new Revision( array(
+                       'page' => $page->getId(),
+                       'timestamp' => '20120101000200',
+                       'user' => $userB->getId(),
+                       'text' => 'two',
+                       'summary' => 'edit two'
+               ) );
+               $revisions[2]->insertOn( $dbw );
+
+               # three
+               $revisions[3] = new Revision( array(
+                       'page' => $page->getId(),
+                       'timestamp' => '20120101000300',
+                       'user' => $userA->getId(),
+                       'text' => 'three',
+                       'summary' => 'edit three'
+               ) );
+               $revisions[3]->insertOn( $dbw );
+
+               # four
+               $revisions[4] = new Revision( array(
+                       'page' => $page->getId(),
+                       'timestamp' => '20120101000200',
+                       'user' => $userA->getId(),
+                       'text' => 'zero',
+                       'summary' => 'edit four'
+               ) );
+               $revisions[4]->insertOn( $dbw );
+
+               // test it ---------------------------------
+               $since = $revisions[ $sinceIdx ]->getTimestamp();
+
+               $wasLast = Revision::userWasLastToEdit( $dbw, $page->getId(), $userA->getId(), $since );
+
+               $this->assertEquals( $expectedLast, $wasLast );
+       }
 }
index 8fc868d..2edc280 100644 (file)
--- a/thumb.php
+++ b/thumb.php
@@ -96,6 +96,7 @@ function wfThumbHandle404() {
  * @return void
  */
 function wfStreamThumb( array $params ) {
+       global $wgVaryOnXFP;
        wfProfileIn( __METHOD__ );
 
        $headers = array(); // HTTP headers to send
@@ -159,6 +160,7 @@ function wfStreamThumb( array $params ) {
        }
 
        // Check permissions if there are read restrictions
+       $varyHeader = array();
        if ( !in_array( 'read', User::getGroupPermissions( array( '*' ) ), true ) ) {
                if ( !$img->getTitle() || !$img->getTitle()->userCan( 'read' ) ) {
                        wfThumbError( 403, 'Access denied. You do not have permission to access ' .
@@ -167,7 +169,7 @@ function wfStreamThumb( array $params ) {
                        return;
                }
                $headers[] = 'Cache-Control: private';
-               $headers[] = 'Vary: Cookie';
+               $varyHeader[] = 'Cookie';
        }
 
        // Check the source file storage path
@@ -217,19 +219,36 @@ function wfStreamThumb( array $params ) {
 
        // Stream the file if it exists already...
        try {
+               $thumbName2 = $img->thumbName( $params, File::THUMB_FULL_NAME ); // b/c; "long" style
                // For 404 handled thumbnails, we only use the the base name of the URI
                // for the thumb params and the parent directory for the source file name.
                // Check that the zone relative path matches up so squid caches won't pick
                // up thumbs that would not be purged on source file deletion (bug 34231).
-               if ( isset( $params['rel404'] ) // thumbnail was handled via 404
-                       && urldecode( $params['rel404'] ) !== $img->getThumbRel( $thumbName ) )
-               {
-                       wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
-                       wfProfileOut( __METHOD__ );
-                       return;
+               if ( isset( $params['rel404'] ) ) { // thumbnail was handled via 404
+                       if ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName ) ) {
+                               // Request for the canonical thumbnail name
+                       } elseif ( urldecode( $params['rel404'] ) === $img->getThumbRel( $thumbName2 ) ) {
+                               // Request for the "long" thumbnail name; redirect to canonical name
+                               $response = RequestContext::getMain()->getRequest()->response();
+                               $response->header( "HTTP/1.1 301 " . HttpStatus::getMessage( 301 ) );
+                               $response->header( 'Location: ' . wfExpandUrl( $img->getThumbUrl( $thumbName ), PROTO_CURRENT ) );
+                               $response->header( 'Expires: ' .
+                                       gmdate( 'D, d M Y H:i:s', time() + 7*86400 ) . ' GMT' );
+                               if ( $wgVaryOnXFP ) {
+                                       $varyHeader[] = 'X-Forwarded-Proto';
+                               }
+                               $response->header( 'Vary: ' . implode( ', ', $varyHeader ) );
+                               wfProfileOut( __METHOD__ );
+                               return;
+                       } else {
+                               wfThumbError( 404, 'The source file for the specified thumbnail does not exist.' );
+                               wfProfileOut( __METHOD__ );
+                               return;
+                       }
                }
                $thumbPath = $img->getThumbPath( $thumbName );
                if ( $img->getRepo()->fileExists( $thumbPath ) ) {
+                       $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
                        $img->getRepo()->streamFile( $thumbPath, $headers );
                        wfProfileOut( __METHOD__ );
                        return;
@@ -239,6 +258,7 @@ function wfStreamThumb( array $params ) {
                wfProfileOut( __METHOD__ );
                return;
        }
+       $headers[] = 'Vary: ' . implode( ', ', $varyHeader );
 
        // Thumbnail isn't already there, so create the new thumbnail...
        try {